Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Latest commit

 

History

History
160 lines (129 loc) · 5.14 KB

user-state-transition.md

File metadata and controls

160 lines (129 loc) · 5.14 KB

User state transition

There are three steps in user state transition (see user state transition proof), and they should be performed in order.

Start user state transition

/**
* @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
)

Process attestations

/**
* @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
)

User State Transition

/**
* @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.