There are three steps in user state transition (see user state transition proof), and they should be performed in order.
/**
* @dev User submit a start user state transition proof
* publicSignals[0] = [ blindedUserState ]
* publicSignals[1] = [ blindedHashChain ]
* publicSignals[2] = [ globalStateTree ]
* @param publicSignals The public signals of the start user state transition proof
* @param proof The The proof of the start user state transition proof
*/
function startUserStateTransition(
uint256[] memory publicSignals,
uint256[8] memory proof
) external
{% hint style="info" %} source: Unirep.sol/startUserStateTransition {% endhint %}
After start user state transition proof event is emitted, the proof will be assign a proof index, which will be attached to updateUserStateRoot function.
The proof index can be queried by proof hash. And the proof hash can be computed by
{% tabs %}
{% tab title="ethers" %}
Generate proof hash from ethers
import ethers from 'ethers'
const proofHash = ethers.utils.solidityKeccak256(
['uint256[]', 'uint256[8]'],
[publicSignals, proof]
)
{% endtab %}
{% tab title="@unirep/contracts" %}
Generate proof hash from @unirep/contracts
import { StartTransitionProof } from '@unirep/contracts'
const proof = new StartTransitionProof(
publicSignals,
proof
)
const proofHash = proof.hash(()
{% endtab %} {% endtabs %}
Then call the UniRep smart contract to query the proof index
const unirepContract = new ethers.Contract(address, abi, provider)
const index = await unirepContract.getProofIndex(
proofHash
)
/**
* @dev User submit a process attestations proof
* publicSignals[0] = [ outputBlindedUserState ]
* publicSignals[1] = [ outputBlindedHashChain ]
* publicSignals[2] = [ inputBlindedUserState ]
* @param publicSignals The public signals of the process attestations proof
* @param proof The process attestations proof
*/
function processAttestations(
uint256[] memory publicSignals,
uint256[8] memory proof
) external
{% hint style="info" %} source: Unirep.sol/processAttestations {% endhint %}
After process attestations proof event is emitted, the proof will be assign a proof index, which will be attached to updateUserStateRoot function.
The proof index can be queried by proof hash. And the proof hash can be computed by
{% tabs %}
{% tab title="ethers" %}
Generate proof hash from ethers
import ethers from 'ethers'
const proofHash = ethers.utils.solidityKeccak256(
['uint256[]', 'uint256[8]'],
[publicSignals, proof]
)Generate proof hash from @unirep/contracts
{% endtab %}
{% tab title="@unirep/contracts" %}
Generate proof hash from @unirep/contracts
import { ProcessAttestationsProof } from '@unirep/contracts'
const proof = new ProcessAttestationsProof(
publicSignals,
proof
)
const proofHash = proof.hash(()
{% endtab %} {% endtabs %}
Then call the UniRep smart contract to query the proof index
const unirepContract = new ethers.Contract(address, abi, provider)
const index = await unirepContract.getProofIndex(
proofHash
)
/**
* @dev User submit the latest user state transition proof
* publicSignals[0] = [ newGlobalStateTreeLeaf ]
* publicSignals[1: numEpochKeyNoncePerEpoch] = [ epkNullifiers ]
* publicSignals[1+ numEpochKeyNoncePerEpoch] = [ transitionFromEpoch ]
* publicSignals[2+ numEpochKeyNoncePerEpoch:
3+ numEpochKeyNoncePerEpoch] = [ blindedUserStates ]
* publicSignals[4+ numEpochKeyNoncePerEpoch] = [ fromGlobalStateTree ]
* publicSignals[5+ numEpochKeyNoncePerEpoch:
4+2*numEpochKeyNoncePerEpoch] = [ blindedHashChains ]
* publicSignals[5+2*numEpochKeyNoncePerEpoch] = [ fromEpochTree ]
* @param publicSignals The the public signals of the user state transition proof
* @param proof The proof of the user state transition proof
* @param proofIndexRecords The proof indexes of the previous start transition proof and process attestations proofs
*/
function updateUserStateRoot(
uint256[] memory publicSignals,
uint256[8] memory proof,
uint256[] memory proofIndexRecords
) external
{% hint style="info" %} source: Unirep.sol/updateUserStateRoot {% endhint %}
The proofIndexRecords
is the proof indexes of all startTransitionProof
and processAttestationsProof
that are submitted sequentially. See Start user state transition and Process attestations.