Skip to main content
Version: v1.3_alpha

Tally

The Tally contract is used during votes tallying and by users to verify the tally results.

TREE_ARITY

uint256 TREE_ARITY

VOTE_OPTION_TREE_ARITY

uint256 VOTE_OPTION_TREE_ARITY

tallyCommitment

uint256 tallyCommitment

The commitment to the tally results. Its initial value is 0, but after the tally of each batch is proven on-chain via a zk-SNARK, it should be updated to:

QV: hash3( hashLeftRight(merkle root of current results, salt0) hashLeftRight(number of spent voice credits, salt1), hashLeftRight(merkle root of the no. of spent voice credits per vote option, salt2) )

Non-QV: hash2( hashLeftRight(merkle root of current results, salt0) hashLeftRight(number of spent voice credits, salt1), )

Where each salt is unique and the merkle roots are of arrays of leaves TREE_ARITY ** voteOptionTreeDepth long.

tallyBatchNum

uint256 tallyBatchNum

sbCommitment

uint256 sbCommitment

verifier

contract IVerifier verifier

vkRegistry

contract IVkRegistry vkRegistry

poll

contract IPoll poll

messageProcessor

contract IMessageProcessor messageProcessor

mode

enum DomainObjs.Mode mode

ProcessingNotComplete

error ProcessingNotComplete()

custom errors

InvalidTallyVotesProof

error InvalidTallyVotesProof()

AllBallotsTallied

error AllBallotsTallied()

NumSignUpsTooLarge

error NumSignUpsTooLarge()

BatchStartIndexTooLarge

error BatchStartIndexTooLarge()

TallyBatchSizeTooLarge

error TallyBatchSizeTooLarge()

NotSupported

error NotSupported()

constructor

constructor(address _verifier, address _vkRegistry, address _poll, address _mp, enum DomainObjs.Mode _mode) public payable

Create a new Tally contract

Parameters

NameTypeDescription
_verifieraddressThe Verifier contract
_vkRegistryaddressThe VkRegistry contract
_polladdressThe Poll contract
_mpaddressThe MessageProcessor contract
_modeenum DomainObjs.Mode

genTallyVotesPackedVals

function genTallyVotesPackedVals(uint256 _numSignUps, uint256 _batchStartIndex, uint256 _tallyBatchSize) public pure returns (uint256 result)

Pack the batch start index and number of signups into a 100-bit value.

Parameters

NameTypeDescription
_numSignUpsuint256
_batchStartIndexuint256
_tallyBatchSizeuint256

Return Values

NameTypeDescription
resultuint256an uint256 representing the 3 inputs packed together

isTallied

function isTallied() public view returns (bool tallied)

Check if all ballots are tallied

Return Values

NameTypeDescription
talliedboolwhether all ballots are tallied

genTallyVotesPublicInputHash

function genTallyVotesPublicInputHash(uint256 _numSignUps, uint256 _batchStartIndex, uint256 _tallyBatchSize, uint256 _newTallyCommitment) public view returns (uint256 inputHash)

generate hash of public inputs for tally circuit

Parameters

NameTypeDescription
_numSignUpsuint256
_batchStartIndexuint256
_tallyBatchSizeuint256
_newTallyCommitmentuint256

Return Values

NameTypeDescription
inputHashuint256hash of public inputs

updateSbCommitment

function updateSbCommitment() public

Update the state and ballot root commitment

tallyVotes

function tallyVotes(uint256 _newTallyCommitment, uint256[8] _proof) public

Verify the result of a tally batch

Parameters

NameTypeDescription
_newTallyCommitmentuint256the new tally commitment to be verified
_proofuint256[8]the proof generated after tallying this batch

verifyTallyProof

function verifyTallyProof(uint256[8] _proof, uint256 _numSignUps, uint256 _batchStartIndex, uint256 _tallyBatchSize, uint256 _newTallyCommitment) public view returns (bool isValid)

Verify the tally proof using the verifying key

Parameters

NameTypeDescription
_proofuint256[8]the proof generated after processing all messages
_numSignUpsuint256number of signups for a given poll
_batchStartIndexuint256the number of batches multiplied by the size of the batch
_tallyBatchSizeuint256batch size for the tally
_newTallyCommitmentuint256the tally commitment to be verified at a given batch index

Return Values

NameTypeDescription
isValidboolwhether the proof is valid

computeMerkleRootFromPath

function computeMerkleRootFromPath(uint8 _depth, uint256 _index, uint256 _leaf, uint256[][] _pathElements) internal pure returns (uint256 current)

Compute the merkle root from the path elements and a leaf

Parameters

NameTypeDescription
_depthuint8the depth of the merkle tree
_indexuint256the index of the leaf
_leafuint256the leaf
_pathElementsuint256[][]the path elements to reconstruct the merkle root

Return Values

NameTypeDescription
currentuint256The merkle root

verifySpentVoiceCredits

function verifySpentVoiceCredits(uint256 _totalSpent, uint256 _totalSpentSalt, uint256 _resultCommitment, uint256 _perVOSpentVoiceCreditsHash) public view returns (bool isValid)

Verify the number of spent voice credits from the tally.json

Parameters

NameTypeDescription
_totalSpentuint256spent field retrieved in the totalSpentVoiceCredits object
_totalSpentSaltuint256the corresponding salt in the totalSpentVoiceCredit object
_resultCommitmentuint256hashLeftRight(merkle root of the results.tally, results.salt) in tally.json file
_perVOSpentVoiceCreditsHashuint256only for QV - hashLeftRight(merkle root of the no spent voice credits, salt)

Return Values

NameTypeDescription
isValidboolWhether the provided values are valid

verifyQvSpentVoiceCredits

function verifyQvSpentVoiceCredits(uint256 _totalSpent, uint256 _totalSpentSalt, uint256 _resultCommitment, uint256 _perVOSpentVoiceCreditsHash) internal view returns (bool isValid)

Verify the number of spent voice credits for QV from the tally.json

Parameters

NameTypeDescription
_totalSpentuint256spent field retrieved in the totalSpentVoiceCredits object
_totalSpentSaltuint256the corresponding salt in the totalSpentVoiceCredit object
_resultCommitmentuint256hashLeftRight(merkle root of the results.tally, results.salt) in tally.json file
_perVOSpentVoiceCreditsHashuint256hashLeftRight(merkle root of the no spent voice credits per vote option, salt)

Return Values

NameTypeDescription
isValidboolWhether the provided values are valid

verifyNonQvSpentVoiceCredits

function verifyNonQvSpentVoiceCredits(uint256 _totalSpent, uint256 _totalSpentSalt, uint256 _resultCommitment) internal view returns (bool isValid)

Verify the number of spent voice credits for Non-QV from the tally.json

Parameters

NameTypeDescription
_totalSpentuint256spent field retrieved in the totalSpentVoiceCredits object
_totalSpentSaltuint256the corresponding salt in the totalSpentVoiceCredit object
_resultCommitmentuint256hashLeftRight(merkle root of the results.tally, results.salt) in tally.json file

Return Values

NameTypeDescription
isValidboolWhether the provided values are valid

verifyPerVOSpentVoiceCredits

function verifyPerVOSpentVoiceCredits(uint256 _voteOptionIndex, uint256 _spent, uint256[][] _spentProof, uint256 _spentSalt, uint8 _voteOptionTreeDepth, uint256 _spentVoiceCreditsHash, uint256 _resultCommitment) public view returns (bool isValid)

Return Values

NameTypeDescription
isValidboolWhether the provided proof is valid

verifyTallyResult

function verifyTallyResult(uint256 _voteOptionIndex, uint256 _tallyResult, uint256[][] _tallyResultProof, uint256 _tallyResultSalt, uint8 _voteOptionTreeDepth, uint256 _spentVoiceCreditsHash, uint256 _perVOSpentVoiceCreditsHash) public view returns (bool isValid)

Verify the result generated from the tally.json

Parameters

NameTypeDescription
_voteOptionIndexuint256the index of the vote option to verify the correctness of the tally
_tallyResultuint256Flattened array of the tally
_tallyResultProofuint256[][]Corresponding proof of the tally result
_tallyResultSaltuint256the respective salt in the results object in the tally.json
_voteOptionTreeDepthuint8depth of the vote option tree
_spentVoiceCreditsHashuint256hashLeftRight(number of spent voice credits, spent salt)
_perVOSpentVoiceCreditsHashuint256hashLeftRight(merkle root of the no spent voice credits per vote option, perVOSpentVoiceCredits salt)

Return Values

NameTypeDescription
isValidboolWhether the provided proof is valid