Generate a reputation proof
See 4. Epoch key proof to know how to generate a current user state.
Specify what will be included in the reputation proof:
Prove the minimum posRep-negRep
that an attester gives: minRep
Prove the graffiti pre-image: graffitiPreImage
User should also specify the attesterId
and epochKeyNonce
to generate an output epoch key.
Copy const attesterID = await contract.attesters(attester.address)
const epkNonce = 0
const rep = userState.getRepByAttester(BigInt(attesterId))
const minRep = Number(rep.posRep) - Number(rep.negRep)
const proveGraffiti = 0 // 0 then it will not prove the pre-image
const nonceList = 0 // 0 or [-1,..,-1] with length 'maxReputationBudget' means the proof will not generate reputation nullifiers.
const proof = await userState.genProveReputationProof(
attesterId,
epkNonce,
minRep,
proveGraffiti,
graffitiPreImage,
nonceList
)
Spend reputation
Call the spendReputation in UniRep smart contract
Copy const tx = await contract.spendReputation(
proof.publicSignals,
proof.proof,
{
value: attestingFee,
}
)
Get the proof index
Copy const fromIndex = await contract.getProofIndex(
proof.hash()
)
Use the reputation proof to attest others. To construct another attestation
, epochKey
, and index
, see 5. Attest
Copy const tx = await unirepContract
.connect(attester)
.submitAttestation(
attestation,
epochKey,
index,
fromIndex,
{
value: attestingFee,
}
)
Verify the proof
with UniRep smart contract:
Copy const isValid = await contract.verifyReputation(
proof.publicSignals,
proof.proof
)
with a prover:
Copy const isValid = await proof.verify()
Verify UniRep state
Check global state tree root exits.
Copy const isGSTRootExisted = await unirepState.GSTRootExists(
proof.globalStateTree,
proof.epoch
)
console.log(isGSTRootExisted) // false then the proof will be invalid
Verify reputation nullifiers.
Copy const repNullifiers = proof.repNullifiers.map((i) => i.toString())
for (const nullifier of repNullifiers) {
if (await unirepState.nullifierExist(nullifier)) {
return false // then the proof will be invalid
}
}