Ethereum Nullifier is used in semaphore 64 to limit the rate at which someone can signal. However, if someone violates this, we won’t be able to punish them because we won’t be able to trace the signal to them.
As a result, Anon rep proposal 32 was born. In some instances, this solution should work nicely. It comes at a significant cost because it requires every member of the group to act in the event of a fork. This can be addressed with a stake, but the gas block limit sets a limit on how many people can be in these groups.
This excludes a number of interesting use cases, so we propose a new type of nullifier that reveals no information for a single external nullifier, but reveals the user’s private key if they repeat the same external nullifier with a different signal (i.e. they spam), allowing us to remove them from the tree.
We intend to expand on this work in order to define
Combine networks that are both spam-resistant and have a high level of privacy.
Universal logins were restricted due to the anonymous rate; Participants are not allowed to make more than x requests per second, and if they do, they will be thrown out.
Background of Ethereum Nullifier
A list of our members is stored in a Merkle tree. Each member of the tree has a public key for which they know the secret key.
Each member of the group has the ability to signal. They utilize a snark to demonstrate that they are a group member without exposing who they are. The public parameters for each signal are as follows:
- Signal; What you are saying
- External_nullfiers; This prevents the linking of different signals together.
- nullifiers;
hash(extrenal_nullfier , leaf_private_key)
which is a fingerprint uniuq to this member for thisexternal_nullifier
.
The main weakness here is that it does not let us remove anyone for bad behavior as every time they use a different external_nullifier
they are anonymous again.
We define one class of “bad behavior” is making more than X signals per second. Where X is some parameter that we define about our system.
To enforce this we can set the external_nullifier
to be a timestamp and each epoch every member is allowed to make one signal. Participants can ignore a signal if it comes from a future epoch or an epoch in the past.
Method of Ethereum Nullifier
To begin, we have a smart contract that allows anyone to join our organization by depositing some bitcoin. If someone runs a function using their private key as an input, they can be removed from the group at any time. Anyone who does this will receive 33% of the stake that has been slashed; the rest will be burned.
As a result, we’d like to be able to compel anyone who spams the network to divulge their private key so that they can be destroyed.
In the previous snark the nullifier is hash(external_nullifier, leaf_private_key)
We need to add a few things to the snark
- We generate a
nullifier_private_key
based uponhash(external_nullifier, leaf_private_key)
- We encrypt the
leaf_private_key
with thenullfier_private_key
and reveal the result as a public input. - We user shamir secret sharing to encode the
nullifier_private_key
so that 51% of the shares are required to reconstruct the secret. - We then use
signal
to randomly select 50% of the shares and reveal them.
Now each time you create a signal with the same external_nullifier
but different signal
it
- calculates the same
nullifier_private_key
key and encrypts yourleaf_private_key
with it. - It calculates the same shamir secret and shares.
- But it reveals a different 50% of the shares.
The chances are very small that a different signal will result in the same 50% of the share being revealed. So we are confident that any spammer will reveal their whole private key on their second message.
Limitations of Ethereum Nullifier
- In the p2p context, it’s difficult to identify users who are spamming because sharing every message would be very expensive.
We should also include a public parameter the hash(external_nullifier, leaf_private_key, constant)
so it’s easy to see if two signals were created with the same member for the same external_nullifier
but different signals. Furthermore, we could share a bloom filter of these with our peers who can then request the snark from us and slash the participant.