Fckuipaid
Anonymized login lib for paywalled web2 services
Created on 21st June 2025
•
Fckuipaid
Anonymized login lib for paywalled web2 services
The problem Fckuipaid solves
Problem
Imagine you want to create a web2 website vitalikfeetpicsmonthly.com that provides quality content for a modest fee. Your users would be happy to pay, but they would not want to be tracked in any way, even correlating different login sessions.
fckuipaid.xyz is a website and a login flow that could be integrated into a website allowing you exactly that. Users pay monthly fee to a smart contract on Arbitrum and log in with a zk proof of payment, so web2 service knows that they paid.
How fckuipaid works
Flow
- User approves spending to the payment contract
- User calls pay(month) function on the payment contract that pulls the required fee and registers payment for a given month
- User uses Boundless Steel coprocessor to generate a proof of payment. For this user signs a Metamask message, the following is proved: signature is valid (i.e. user controls the privKey), hasPaid function returns true for the given month and user (checked against the current state root). The proof could be generated locally in theory (not in our impl)
- User copies the zk proof together with the public inputs (current block hash, month number) and pastes it to the website. The proof is verified against public inputs, on success user is logged in.
Components
- fckuipaid.xyz: Website that provides a convenient UI for paying the monthly fee for a chosen service and requests the backend to generate a valid proof of payment.
- Boundless: Boundless SDK is used on the backend to generate a zk proof of payment agains the current state root. We make a request to boundless prover market.
- vitalikfeetpics.com: web2 website that verifies the zk proof of payment. It also checks that the payment month from the public inputs is the current month.
Challenges we ran into
Boundless challenges
- The last error message: Error cannot upload input using StorageLayer with no storage_provider; input length of 15396 bytes exceeds inline limit of 2048 bytes
, we don't have time to update the setup to send program inputs over IPFS (
with_input_url()`). - No fitting example on GitHub. Fckuipaid requires very simple functionality: basically proving a state entry against a state root + verifying EcDSA signature. Several examples of boundless usage are more elaborate, but contain many interconnected pieces so cutting out extra stuff is not trivial. It would be helpful if one example focused on proving onchain state, one example focused on interactions with prover network, one example focused on verifying a generated proof onchain (and maybe one example focused on some elaborate zkVM program).
- Difficulties with dependencies for existing examples. Examples from github repo risc0-ethereum refer to crates in this repo directly (e.g. risc0-build-ethereum = { path = "../../build" }), making it more complicated to just copy an example into a new project.
- Impossible to generate zk proof locally on Mac. Local proof generation would be perfect for our use case, and would be easier to implement (e.g. we spent several hours until we realized that prover network payments are done on Eth Sepolia but our proof should be generated against Arbitrum Sepolia state - network mismatch). Also debugging locally would have been much easier.
- No SDK command for template project. Something like forge init would be cool.
Tracks Applied (4)
ZK Hack Berlin Winners
Build with Boundless
Boundless
Best ZK App with Product-Market Fit
Arbitrum
Best ZK app with No Product-Market Fit
Arbitrum
Discussion
Builders also viewed
See more projects on Devfolio
