Skip to main content
Version: 1.0.1

7. User state transition

See how to generate a user state: 4. Epoch key proof. Then use the user state to generate user state transition proofs.

const {
startTransitionProof,
processAttestationProofs,
finalTransitionProof,
} = await userState.genUserStateTransitionProofs()

Submit start transition proof

const tx = await contract.startUserStateTransition(
startTransitionProof.publicSignals,
startTransitionProof.proof
)
await tx.wait()

Submit process attestations proofs

Submit all process attestations proofs and get the proof indexes.

for (let i = 0; i < processAttestationProofs.length; i++) {
const tx = await contract.processAttestations(
processAttestationProofs[i].publicSignals,
processAttestationProofs[i].proof
)
await tx.wait() // wait until the transaction is confirmed
}

Submit user state transition proof

const tx = await contract.updateUserStateRoot(
finalTransitionProof.publicSignals,
finalTransitionProof.proof
)

Verify UniRep state

It can be checked with either a Synchronizer object or a UserState object. See: 4. Epoch Key Proof.

Check if global state tree root exists in the current UniRep state

const fromEpoch = Number(finalTransitionProof.transitionFromEpoch)
const GSTRoot = finalTransitionProof.fromGlobalStateTree.toString()
const isGSTRootExisted = await userState.GSTRootExists(
GSTRoot,
fromEpoch
)
console.log(isGSTRootExisted) // false then the proof will be invalid

Check if epoch tree root matches the epoch

const fromEpoch = Number(finalTransitionProof.transitionFromEpoch)
const epochTreeRoot = finalTransitionProof.fromEpochTree.toString()
const isEpochTreeExisted = await userState.epochTreeRootExists(
epochTreeRoot,
fromEpoch
)
console.log(isEpochTreeExisted) // false then the proof will be invalid

Check epoch key nullifiers are not existed

const epkNullifiers = finalTransitionProof.epkNullifiers.map((i) => i.toString())
for (const nullifier of epkNullifiers) {
if (await userState.nullifierExist(nullifier)) {
console.log(false) // then the proof will be invalid
}
}