An anonymous PoH wrapper

I’ve had a go at implementing a ZKP-based wrapper around PoH that allows you to prove you are an individual human within a service anonymously. Please let me know your thoughts!

(I’ve submitted this as my final project for


Perhaps I should have posted this under the Developers category instead… Is it possible to move the post, or should I delete and repost?

I previously thought there was a data availability problem to update incremental merkle trees in a gas efficient manner. I didn’t know about this implementation used in semaphore. I thought removing profiles would be more gas intensive, but it’s just double the on-chain storage requirements which isn’t that bad.

Yeah actually semaphore could work.

please check if you haven’t already!

Thanks! (I didn’t know of this.) However, from my understanding (I need to read more), Semaphore NFT Group only supports one-shot messages. My wrapper goes further and allows a user to have a long-lived anonymous presence within a service.

1 Like

yeah, its a bit more complicated to update the state. The group mutates overtime as POH members are challenged and removed from the POH group.

Whenever the group mutates, all proofs of membership in the previous group state and associated merkle root should be invalidated, and everyone needs to submit proofs of membership in the updated group. I need to learn more about how nullifiers are managed. It’s not sufficient to take a snapshot of POH and anonymize that. You need to update the anonymity set as it mutates, otherwise sybils begin to accumulate. You can’t just give everyone an NFT, take a snapshot, and anonymize that set.

I’ve addressed this problem by making users place a deposit when they register their identity commitment. When their PoH registration is no longer valid, their deposit becomes fair game, and anybody can submit a proof to have the user removed, and at the same time receive the deposit as a reward. (This can be automated to make sure removal from the group is punctual.)

In this model, a user need only register in the group once, or again if their PoH registration was expired and then renewed. The user’s group inclusion is valid across all services that support the interface. I’ve added an auxiliary ZKP which allows the user to use one identity nullifier to maintain identity proxies on a per service basis. (Each service sees an anonymous stable userId that is sandboxed to the service.)

1 Like

Awesome. has something similar as well and it comes with a non-transferable NFT as a badge.

1 Like