There are QR-code based services to speed up transactions, but sometimes scanning QR codes can be tricky. Taking inpiration from Web2 finance, I developed a contact-less-based crypto payment service. In this way the data is shared using near-field communication (NFC). I implemented two different protocols:
Implementing noir was tricky. Thankfully the mentors have been really supportive and I have been able to deploy a working solution. The only "workaround" I had to implement is that this kind of zk-proof is really complex: it compiles a rust code into a circuit (similar to VHDL for FPGA design), so all types have to be of strictly rigorous sizes. The problem is that to store a transaction hash I need 256 bits, so I had to split the hash into 8 different parts to be able to make use of zkVerify's technologies. I also had some issues compiling a cli tool needed to generate the zk-proof, basically my computer runs Ubuntu 22.04 and the only operating system able to compile that tool is Ubuntu 24.04. I solved using a Docker container.
Another problem I ran across is that the NFC reader I bought (just before leaving to Poland) doesn't natively support card emulation mode. To get it working was a lot of pain and a lot of low-level codes to be sent through PCSC protocol.
The last issue is the smart contract part, which currently is not the safest possible idea. I still chose to deploy it to have a backbone of what future developments of this project can look like. In the repository I also put a more complex smart contract that is trying to do asymmetric encryption (similar to credit cards), but since I ran out of time I couldn't implement it. My idea was to generate the challenge, then sign it using a Python script and use my phone to write the signed challenge on a tag before scanning it and sending such information back to the smart contract (those operations can be handled directly by a smart card, but I currently don't have an SDK for them). The problem I faced was that not all ECDSA functionalities are available in Solidity and that key size in Python and Solidity are different, thus increasing complexity when having to check for digital signatures.
I also had problems with ENS, since I'm using raw HTML for my web app and all examples are made for React or TS.
Tracks Applied (10)
Request Network
Ethereum Name Service
DBForest
zkVerify
zkVerify
Celo
Aleph Zero
Starknet
Zircuit
Optimism
Discussion