@maci-protocol/website 0.0.0-ci.2df0337 → 0.0.0-ci.2ea88a0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -2
- package/blog/2024-02-28-maci-v1.2.0.md +2 -2
- package/blog/2024-08-10-maci-v2.md +1 -1
- package/blog/2025-03-21-roadmap-2025.md +1 -1
- package/blog/2025-08-18-maci-aragon-plugin.md +107 -0
- package/blog/2025-09-05-maci-coordinator-service.md +167 -0
- package/docusaurus.config.ts +9 -3
- package/package.json +17 -16
- package/src/pages/roadmap.md +39 -80
- package/static/img/circuits/MACI-Circuits.excalidraw +69 -69
- package/static/img/circuits/messageValidator.svg +1 -1
- package/static/img/circuits/processMessages.svg +1 -1
- package/static/img/circuits/processMessagesInputHasher.svg +1 -1
- package/static/img/circuits/processMessages_2_0.svg +1 -1
- package/static/img/circuits/processOne.svg +1 -1
- package/static/img/circuits/processTopup.svg +1 -1
- package/static/img/circuits/quinBatchLeavesExists.svg +1 -1
- package/static/img/circuits/quinCheckRoot.svg +1 -1
- package/static/img/circuits/quinGeneratePathIndices.svg +1 -1
- package/static/img/circuits/quinSelector.svg +1 -1
- package/static/img/circuits/resultsCommitmentVerifier.svg +1 -1
- package/static/img/circuits/splicer.svg +1 -1
- package/static/img/circuits/tallyInputHasher.svg +1 -1
- package/static/img/circuits/tallyVotes.svg +1 -1
- package/versioned_docs/version-v0.x/contract.md +1 -1
- package/versioned_docs/version-v0.x/introduction.md +0 -4
- package/versioned_docs/version-v0.x/quadratic-vote-tallying-circuit.md +16 -16
- package/versioned_docs/version-v1.2/circuits.md +8 -8
- package/versioned_docs/version-v1.2/contributing/contributing.md +4 -4
- package/versioned_docs/version-v1.2/deployment.md +1 -1
- package/versioned_docs/version-v1.2/integrating.md +1 -1
- package/versioned_docs/version-v1.2/key-change.md +1 -1
- package/versioned_docs/version-v1.2/poll-types.md +1 -1
- package/versioned_docs/version-v1.2/testing-in-detail.md +3 -3
- package/versioned_docs/version-v1.2/testing.md +1 -1
- package/versioned_docs/version-v1.2/topup.md +1 -1
- package/versioned_docs/version-v1.2/typedoc/core/index.md +2 -2
- package/versioned_docs/version-v1.2/versioning.md +3 -3
- package/versioned_docs/version-v1.2/workflow.md +1 -1
- package/versioned_docs/version-v2.x/contributing/contributing.md +4 -4
- package/versioned_docs/version-v2.x/core-concepts/key-change.md +1 -1
- package/versioned_docs/version-v2.x/core-concepts/merkle-trees.md +1 -1
- package/versioned_docs/version-v2.x/core-concepts/poll-types.md +1 -1
- package/versioned_docs/version-v2.x/core-concepts/workflow.md +1 -1
- package/versioned_docs/version-v2.x/guides/integrating.md +1 -1
- package/versioned_docs/version-v2.x/guides/testing/testing-in-detail.md +3 -3
- package/versioned_docs/version-v2.x/guides/testing/testing.md +1 -1
- package/versioned_docs/version-v2.x/processes/versioning.md +3 -3
- package/versioned_docs/version-v2.x/supported-networks/deployed-contracts.md +7 -7
- package/versioned_docs/version-v2.x/technical-references/smart-contracts/AccQueue.md +1 -1
- package/versioned_docs/version-v2.x/technical-references/smart-contracts/MACI.md +1 -1
- package/versioned_docs/version-v2.x/technical-references/smart-contracts/MessageProcessor.md +1 -1
- package/versioned_docs/version-v2.x/technical-references/smart-contracts/Params.md +1 -1
- package/versioned_docs/version-v2.x/technical-references/smart-contracts/Poll.md +1 -1
- package/versioned_docs/version-v2.x/technical-references/smart-contracts/PollFactory.md +1 -1
- package/versioned_docs/version-v2.x/technical-references/smart-contracts/Tally.md +1 -1
- package/versioned_docs/version-v2.x/technical-references/smart-contracts/VkRegistry.md +1 -1
- package/versioned_docs/version-v2.x/technical-references/smart-contracts/VoiceCreditProxy.md +1 -1
- package/versioned_docs/version-v2.x/technical-references/zk-snark-circuits/processMessages.md +4 -4
- package/versioned_docs/version-v2.x/technical-references/zk-snark-circuits/tallyVotes.md +2 -2
- package/versioned_docs/version-v2.x/technical-references/zk-snark-circuits/zk-snark-circuits.md +3 -3
- package/versioned_docs/version-v3.x/contributing/contributing.md +11 -5
- package/versioned_docs/version-v3.x/core-concepts/key-change.md +14 -14
- package/versioned_docs/version-v3.x/core-concepts/maci-keys.md +1 -1
- package/versioned_docs/version-v3.x/core-concepts/poll-types.md +33 -9
- package/versioned_docs/version-v3.x/core-concepts/polls.md +34 -10
- package/versioned_docs/version-v3.x/core-concepts/spec.md +39 -105
- package/versioned_docs/version-v3.x/core-concepts/workflow.md +2 -2
- package/versioned_docs/version-v3.x/guides/compile-circuits.md +36 -20
- package/versioned_docs/version-v3.x/guides/integrating.md +10 -10
- package/versioned_docs/version-v3.x/guides/sdk.md +121 -0
- package/versioned_docs/version-v3.x/guides/testing/testing-in-detail.md +4 -4
- package/versioned_docs/version-v3.x/guides/testing/testing-introduction.md +38 -6
- package/versioned_docs/version-v3.x/guides/troubleshooting.md +64 -19
- package/versioned_docs/version-v3.x/processes/versioning.md +3 -3
- package/versioned_docs/version-v3.x/quick-start.md +29 -21
- package/versioned_docs/version-v3.x/resources.md +1 -0
- package/versioned_docs/version-v3.x/security/audit.md +2 -2
- package/versioned_docs/version-v3.x/security/trusted-setup.md +36 -36
- package/versioned_docs/version-v3.x/supported-networks/costs.md +725 -0
- package/versioned_docs/version-v3.x/supported-networks/deployed-contracts.md +9 -9
- package/versioned_docs/version-v3.x/supported-networks/supported-networks.md +16 -0
- package/versioned_docs/version-v3.x/technical-references/coordinator-service/index.md +15 -1
- package/versioned_docs/version-v3.x/technical-references/coordinator-service/installation.md +5 -33
- package/versioned_docs/version-v3.x/technical-references/coordinator-service/usage.md +64 -0
- package/versioned_docs/version-v3.x/technical-references/smart-contracts/MACI.md +7 -7
- package/versioned_docs/version-v3.x/technical-references/smart-contracts/MessageProcessor.md +1 -1
- package/versioned_docs/version-v3.x/technical-references/smart-contracts/Params.md +2 -2
- package/versioned_docs/version-v3.x/technical-references/smart-contracts/Policies.md +1 -1
- package/versioned_docs/version-v3.x/technical-references/smart-contracts/Poll.md +8 -8
- package/versioned_docs/version-v3.x/technical-references/smart-contracts/PollFactory.md +1 -1
- package/versioned_docs/version-v3.x/technical-references/smart-contracts/Tally.md +4 -4
- package/versioned_docs/version-v3.x/technical-references/smart-contracts/VkRegistry.md +8 -8
- package/versioned_docs/version-v3.x/technical-references/smart-contracts/VoiceCreditProxy.md +1 -1
- package/versioned_docs/version-v3.x/technical-references/technical-references.md +8 -8
- package/versioned_docs/version-v3.x/technical-references/zk-snark-circuits/joinPoll.md +2 -2
- package/versioned_docs/version-v3.x/technical-references/zk-snark-circuits/processMessages.md +81 -17
- package/versioned_docs/version-v3.x/technical-references/zk-snark-circuits/setup.md +3 -3
- package/versioned_docs/version-v3.x/technical-references/zk-snark-circuits/tallyVotes.md +6 -6
- package/versioned_docs/version-v3.x/technical-references/zk-snark-circuits/utilities.md +9 -9
- package/versioned_docs/version-v3.x/technical-references/zk-snark-circuits/zk-snark-circuits.md +3 -3
|
@@ -77,28 +77,28 @@ Remember that if on a ARM64 chip, you will not be able to compile the c++ witnes
|
|
|
77
77
|
|
|
78
78
|
### Configure circomkit
|
|
79
79
|
|
|
80
|
-
Edit `circuits/circom/circuits` to include the circuits you would like to compile. This comes already configured with the
|
|
80
|
+
Edit `circuits/circom/circuits` to include the circuits you would like to compile. This comes already configured with the main coordinator circuits, in qv, non qv and full credits variants, as well as the client side circuit. The parameters are designed to support testing use cases:
|
|
81
81
|
|
|
82
82
|
```json
|
|
83
83
|
{
|
|
84
84
|
"PollJoining_10_test": {
|
|
85
|
-
"file": "./
|
|
85
|
+
"file": "./voter/PollJoining",
|
|
86
86
|
"template": "PollJoining",
|
|
87
87
|
"params": [10],
|
|
88
|
-
"pubs": ["nullifier", "stateRoot", "
|
|
88
|
+
"pubs": ["nullifier", "stateRoot", "pollPublicKey", "pollId"]
|
|
89
89
|
},
|
|
90
90
|
"PollJoined_10_test": {
|
|
91
|
-
"file": "./
|
|
91
|
+
"file": "./voter/PollJoined",
|
|
92
92
|
"template": "PollJoined",
|
|
93
93
|
"params": [10],
|
|
94
94
|
"pubs": ["stateRoot"]
|
|
95
95
|
},
|
|
96
|
-
"
|
|
97
|
-
"file": "./
|
|
98
|
-
"template": "
|
|
96
|
+
"MessageProcessorQv_10-20-2_test": {
|
|
97
|
+
"file": "./coordinator/qv/MessageProcessor",
|
|
98
|
+
"template": "MessageProcessorQv",
|
|
99
99
|
"params": [10, 20, 2],
|
|
100
100
|
"pubs": [
|
|
101
|
-
"
|
|
101
|
+
"totalSignups",
|
|
102
102
|
"index",
|
|
103
103
|
"batchEndIndex",
|
|
104
104
|
"currentSbCommitment",
|
|
@@ -109,12 +109,12 @@ Edit `circuits/circom/circuits` to include the circuits you would like to compil
|
|
|
109
109
|
"voteOptions"
|
|
110
110
|
]
|
|
111
111
|
},
|
|
112
|
-
"
|
|
113
|
-
"file": "./
|
|
114
|
-
"template": "
|
|
112
|
+
"MessageProcessorNonQv_10-20-2_test": {
|
|
113
|
+
"file": "./coordinator/non-qv/MessageProcessor",
|
|
114
|
+
"template": "MessageProcessorNonQv",
|
|
115
115
|
"params": [10, 20, 2],
|
|
116
116
|
"pubs": [
|
|
117
|
-
"
|
|
117
|
+
"totalSignups",
|
|
118
118
|
"index",
|
|
119
119
|
"batchEndIndex",
|
|
120
120
|
"currentSbCommitment",
|
|
@@ -125,17 +125,33 @@ Edit `circuits/circom/circuits` to include the circuits you would like to compil
|
|
|
125
125
|
"voteOptions"
|
|
126
126
|
]
|
|
127
127
|
},
|
|
128
|
-
"
|
|
129
|
-
"file": "./
|
|
130
|
-
"template": "
|
|
128
|
+
"ProcessMessagesFull_10-20-2_test": {
|
|
129
|
+
"file": "./coordinator/non-qv/MessageProcessor",
|
|
130
|
+
"template": "MessageProcessorFull",
|
|
131
|
+
"params": [10, 20, 2],
|
|
132
|
+
"pubs": [
|
|
133
|
+
"totalSignups",
|
|
134
|
+
"index",
|
|
135
|
+
"batchEndIndex",
|
|
136
|
+
"currentSbCommitment",
|
|
137
|
+
"newSbCommitment",
|
|
138
|
+
"outputBatchHash",
|
|
139
|
+
"actualStateTreeDepth",
|
|
140
|
+
"coordinatorPublicKeyHash",
|
|
141
|
+
"voteOptions"
|
|
142
|
+
]
|
|
143
|
+
},
|
|
144
|
+
"VoteTallyQv_10-1-2_test": {
|
|
145
|
+
"file": "./coordinator/qv/VoteTally",
|
|
146
|
+
"template": "VoteTallyQv",
|
|
131
147
|
"params": [10, 1, 2],
|
|
132
|
-
"pubs": ["index", "
|
|
148
|
+
"pubs": ["index", "totalSignups", "sbCommitment", "currentTallyCommitment", "newTallyCommitment"]
|
|
133
149
|
},
|
|
134
|
-
"
|
|
135
|
-
"file": "./
|
|
136
|
-
"template": "
|
|
150
|
+
"VoteTallyNonQv_10-1-2_test": {
|
|
151
|
+
"file": "./coordinator/non-qv/VoteTally",
|
|
152
|
+
"template": "VoteTallyNonQv",
|
|
137
153
|
"params": [10, 1, 2],
|
|
138
|
-
"pubs": ["index", "
|
|
154
|
+
"pubs": ["index", "totalSignups", "sbCommitment", "currentTallyCommitment", "newTallyCommitment"]
|
|
139
155
|
}
|
|
140
156
|
}
|
|
141
157
|
```
|
|
@@ -17,12 +17,12 @@ As an example, a [contract](https://github.com/ctrlc03/minimalQF/blob/main/contr
|
|
|
17
17
|
|
|
18
18
|
```javascript
|
|
19
19
|
/// @inheritdoc IMACI
|
|
20
|
-
function signUp(
|
|
20
|
+
function signUp(PublicKey memory _publicKey, bytes memory _signUpPolicyData) public virtual {
|
|
21
21
|
// ensure we do not have more signups than what the circuits support
|
|
22
22
|
if (leanIMTData.size >= maxSignups) revert TooManySignups();
|
|
23
23
|
|
|
24
24
|
// ensure that the public key is on the baby jubjub curve
|
|
25
|
-
if (!CurveBabyJubJub.isOnCurve(
|
|
25
|
+
if (!CurveBabyJubJub.isOnCurve(_publicKey.x, _publicKey.y)) {
|
|
26
26
|
revert InvalidPubKey();
|
|
27
27
|
}
|
|
28
28
|
|
|
@@ -31,19 +31,19 @@ function signUp(PubKey memory _pubKey, bytes memory _signUpPolicyData) public vi
|
|
|
31
31
|
signUpPolicy.enforce(msg.sender, _signUpPolicyData);
|
|
32
32
|
|
|
33
33
|
// Hash the public key and insert it into the tree.
|
|
34
|
-
uint256 pubKeyHash = hashLeftRight(
|
|
34
|
+
uint256 pubKeyHash = hashLeftRight(_publicKey.x, _publicKey.y);
|
|
35
35
|
uint256 stateRoot = InternalLeanIMT._insert(leanIMTData, pubKeyHash);
|
|
36
36
|
|
|
37
37
|
// Store the current state tree root in the array
|
|
38
38
|
stateRootsOnSignUp.push(stateRoot);
|
|
39
39
|
|
|
40
|
-
emit SignUp(leanIMTData.size - 1, block.timestamp,
|
|
40
|
+
emit SignUp(leanIMTData.size - 1, block.timestamp, _publicKey.x, _publicKey.y);
|
|
41
41
|
}
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
## InitialVoiceCreditProxy
|
|
45
45
|
|
|
46
|
-
If you'd like to extend the functionality of how votes are distributed among users, you need to
|
|
46
|
+
If you'd like to extend the functionality of how votes are distributed among users, you'll need to build you own initial voice credit proxy contract by following the [IInitialVoiceCreditProxy interface](https://github.com/privacy-scaling-explorations/maci/blob/main/packages/contracts/contracts/interfaces/IInitialVoiceCreditProxy.sol). You can see our [basic example](https://github.com/privacy-scaling-explorations/maci/blob/main/packages/contracts/contracts/initialVoiceCreditProxy/ConstantInitialVoiceCreditProxy.sol) how it's implemented for constant distribution.
|
|
47
47
|
|
|
48
48
|
```ts
|
|
49
49
|
contract ConstantInitialVoiceCreditProxy is InitialVoiceCreditProxy {
|
|
@@ -71,7 +71,7 @@ On the other hand, the Poll contract can be inherited to expand functionality su
|
|
|
71
71
|
```javascript
|
|
72
72
|
function joinPoll(
|
|
73
73
|
uint256 _nullifier,
|
|
74
|
-
|
|
74
|
+
PublicKey calldata _publicKey,
|
|
75
75
|
uint256 _stateRootIndex,
|
|
76
76
|
uint256[8] calldata _proof,
|
|
77
77
|
bytes memory _signUpPolicyData,
|
|
@@ -86,7 +86,7 @@ function joinPoll(
|
|
|
86
86
|
pollNullifiers[_nullifier] = true;
|
|
87
87
|
|
|
88
88
|
// Verify user's proof
|
|
89
|
-
if (!verifyJoiningPollProof(_nullifier, _stateRootIndex,
|
|
89
|
+
if (!verifyJoiningPollProof(_nullifier, _stateRootIndex, _publicKey, _proof)) {
|
|
90
90
|
revert InvalidPollProof();
|
|
91
91
|
}
|
|
92
92
|
|
|
@@ -100,7 +100,7 @@ function joinPoll(
|
|
|
100
100
|
);
|
|
101
101
|
|
|
102
102
|
// Store user in the pollStateTree
|
|
103
|
-
uint256 stateLeaf = hashStateLeaf(StateLeaf(
|
|
103
|
+
uint256 stateLeaf = hashStateLeaf(StateLeaf(_publicKey, voiceCreditBalance, block.timestamp));
|
|
104
104
|
|
|
105
105
|
uint256 stateRoot = InternalLazyIMT._insert(pollStateTree, stateLeaf);
|
|
106
106
|
|
|
@@ -108,7 +108,7 @@ function joinPoll(
|
|
|
108
108
|
pollStateRootsOnJoin.push(stateRoot);
|
|
109
109
|
|
|
110
110
|
uint256 pollStateIndex = pollStateTree.numberOfLeaves - 1;
|
|
111
|
-
emit PollJoined(
|
|
111
|
+
emit PollJoined(_publicKey.x, _publicKey.y, voiceCreditBalance, block.timestamp, _nullifier, pollStateIndex);
|
|
112
112
|
}
|
|
113
113
|
```
|
|
114
114
|
|
|
@@ -118,7 +118,7 @@ Given the verification functions being exposed by the Tally contract, quadratic
|
|
|
118
118
|
|
|
119
119
|
## SDK
|
|
120
120
|
|
|
121
|
-
Another important component of MACI is the [SDK](https://github.com/privacy-scaling-explorations/maci/tree/
|
|
121
|
+
Another important component of MACI is the [SDK](https://github.com/privacy-scaling-explorations/maci/tree/main/packages/sdk). This is a TypeScript library that allows you to interact with MACI.
|
|
122
122
|
|
|
123
123
|
You can find the following subdirectories, where functions are organised as follows:
|
|
124
124
|
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: MACI SDK
|
|
3
|
+
description: How to use the MACI SDK
|
|
4
|
+
sidebar_label: MACI SDK
|
|
5
|
+
sidebar_position: 6
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
In this guide we will be looking at how to use the MACI SDK to interact with the MACI protocol.
|
|
9
|
+
|
|
10
|
+
## Installation
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install @maci-protocol/sdk
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Browser compatibility
|
|
17
|
+
|
|
18
|
+
As the SDK imports functions from the `@maci-protocol/contracts` package which uses hardhat, certain functionality is not browser compatible.
|
|
19
|
+
However, all it takes to use browser compatible functions is to import from `@maci-protocol/sdk/browser`.
|
|
20
|
+
|
|
21
|
+
As an example, we can import the `signUp` function from the `@maci-protocol/sdk/browser` package.
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { signUp } from "@maci-protocol/sdk/browser";
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Let's take a look at an example of how to use the `joinPoll` function to register a user to a poll.
|
|
28
|
+
|
|
29
|
+
### JoinPoll
|
|
30
|
+
|
|
31
|
+
This step is required to register a user to a specific poll for which they want to vote. In short, it requires the user to generate a zk-SNARK proof that they know the private key to a public key registered to the MACI contract (proving they passed the initial gatekeeping requirements). This forces them to join with the same MACI key to each poll, greatly increasing the value of the key. Should they have been allowed to join with a throwaway key, they could simply sell their key for polls they do not care about.
|
|
32
|
+
|
|
33
|
+
**How does the flow look like?**
|
|
34
|
+
|
|
35
|
+
1. Reconstruct the MACI state tree by pulling all public keys from the MACI contract (events from RPC or from Subgraph)
|
|
36
|
+
2. Generate a merkle tree inclusion proof for the user's public key
|
|
37
|
+
3. Generate a zk-SNARK proof that the user knows the private key to the public key in the merkle tree inclusion proof
|
|
38
|
+
4. Call the `joinPoll` function on the Poll smart contract
|
|
39
|
+
|
|
40
|
+
**How to use the SDK for this?**
|
|
41
|
+
|
|
42
|
+
> This example is browser specific, as it uses the `@maci-protocol/sdk/browser` package and WASM for witness generation
|
|
43
|
+
|
|
44
|
+
Option 1: Use the `joinPoll` function from the `@maci-protocol/sdk/browser` package.
|
|
45
|
+
|
|
46
|
+
1. Download the `pollJoining` zk artifacts using [downloadPollJoiningArtifactsBrowser](https://github.com/privacy-scaling-explorations/maci/blob/main/packages/sdk/ts/proof/download.ts#L46)
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
import { downloadPollJoiningArtifactsBrowser } from "@maci-protocol/sdk/browser";
|
|
50
|
+
|
|
51
|
+
const artifacts = await downloadPollJoiningArtifactsBrowser({
|
|
52
|
+
testing: true,
|
|
53
|
+
stateTreeDepth: 10,
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
2. Use the `joinPoll` function to join the poll
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { joinPoll } from "@maci-protocol/sdk/browser";
|
|
61
|
+
|
|
62
|
+
const joinedPollData = await joinPoll({
|
|
63
|
+
maciAddress: PUBLIC_MACI_ADDRESS,
|
|
64
|
+
privateKey: maciKeypair.privateKey.serialize(),
|
|
65
|
+
signer,
|
|
66
|
+
pollId,
|
|
67
|
+
inclusionProof,
|
|
68
|
+
pollJoiningZkey: artifacts.zKey as unknown as string,
|
|
69
|
+
pollJoiningWasm: artifacts.wasm as unknown as string,
|
|
70
|
+
sgDataArg: DEFAULT_SG_DATA,
|
|
71
|
+
ivcpDataArg: DEFAULT_IVCP_DATA,
|
|
72
|
+
blocksPerBatch: 1000,
|
|
73
|
+
});
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
This is not really efficient, as we are using the user RPC to fetch events, which can be quite slow and prone to errors. A better approach is to use a Subgraph to fetch the events.
|
|
77
|
+
|
|
78
|
+
Option 2: Fetch the MACI keys using a subgraph and reconstruct the state tree locally.
|
|
79
|
+
|
|
80
|
+
1. Deploy the subgraph - instructions [here](/guides/subgraph)
|
|
81
|
+
2. Fetch the MACI keys
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
import { MaciSubgraph } from "@maci-protocol/sdk/browser";
|
|
85
|
+
|
|
86
|
+
const subgraph = new MaciSubgraph("https://api.studio.thegraph.com/query/x/maci/version/latest");
|
|
87
|
+
|
|
88
|
+
const keys = await subgraph.getKeys();
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
3. Generate the merkle tree
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
import { generateSignUpTreeFromKeys } from "@maci-protocol/sdk/browser";
|
|
95
|
+
|
|
96
|
+
const signUpTree = generateSignUpTreeFromKeys(keys);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
4. Generate the inclusion proof - you will need to know the index of the user's public key in the merkle tree
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
const inclusionProof = signUpTree.generateProof(publicKeyIndex);
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
5. Generate the zk-SNARK proof and join the poll
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
import { joinPoll } from "@maci-protocol/sdk/browser";
|
|
109
|
+
|
|
110
|
+
const joinedPollData = await joinPoll({
|
|
111
|
+
maciAddress: PUBLIC_MACI_ADDRESS,
|
|
112
|
+
privateKey: maciKeypair.privateKey.serialize(),
|
|
113
|
+
signer,
|
|
114
|
+
pollId,
|
|
115
|
+
inclusionProof,
|
|
116
|
+
pollJoiningZkey: artifacts.zKey as unknown as string,
|
|
117
|
+
pollJoiningWasm: artifacts.wasm as unknown as string,
|
|
118
|
+
sgDataArg: DEFAULT_SG_DATA,
|
|
119
|
+
ivcpDataArg: DEFAULT_IVCP_DATA,
|
|
120
|
+
});
|
|
121
|
+
```
|
|
@@ -154,7 +154,7 @@ Within the circuits folder, there are a number of tests that are used to verify
|
|
|
154
154
|
|
|
155
155
|
These tests often use mock data from the `core` package. For instance, when testing the `processMessages` circuit, we are required to generate the parameters from the `core` packing, using the `Poll:processMessages` function. The same applies to vote tallying, where we need the `Poll:tally` function to be run first with mock users and vote messages.
|
|
156
156
|
|
|
157
|
-
All of the tests run using test parameters, usually `10, 20, 2`, aside from the tests inside: [`ceremonyParam`](https://github.com/privacy-scaling-explorations/maci/blob/
|
|
157
|
+
All of the tests run using test parameters, usually `10, 20, 2`, aside from the tests inside: [`ceremonyParam`](https://github.com/privacy-scaling-explorations/maci/blob/main/circuits/ts/__tests__/CeremonyParams.test.ts) which use the parameters of the latest MACI ceremony. More details on the trusted setup can be found [here](/docs/security/trusted-setup).
|
|
158
158
|
|
|
159
159
|
### Core
|
|
160
160
|
|
|
@@ -162,7 +162,7 @@ The core package contains a number of tests that are used to verify that the cor
|
|
|
162
162
|
|
|
163
163
|
These tests interact with the crypto and dombinobjs packages, where mock data comes from. Their main goal is to ensure that the core functions work as expected, and that the state is as expected after a series of operations.
|
|
164
164
|
|
|
165
|
-
Currently, there is a blend of e2e and unit tests, where e2e tests are used to verify that the entire MACI local processing works as expected (users signup, publish votes, messages are processed and finally these votes are tallied). Unit tests on the other hand are used to verify that the core functions work as expected, such as `
|
|
165
|
+
Currently, there is a blend of e2e and unit tests, where e2e tests are used to verify that the entire MACI local processing works as expected (users signup, publish votes, messages are processed and finally these votes are tallied). Unit tests on the other hand are used to verify that the core functions work as expected, such as `MessageProcessor` and `VoteTally`. You will find them in separate files, with e2e being [here](https://github.com/privacy-scaling-explorations/maci/blob/main/core/ts/__tests__/e2e.test.ts) and unit tests in the other files.
|
|
166
166
|
|
|
167
167
|
### Domainobjs/Crypto tests
|
|
168
168
|
|
|
@@ -170,13 +170,13 @@ These tests are used to verify that MACI's primitives such as private keys work
|
|
|
170
170
|
|
|
171
171
|
## "Manual" Testing
|
|
172
172
|
|
|
173
|
-
To ensure that the MACI stack works as expected, without having to run the entire test suite (or even just the e2e tests), there is a [bash script](https://github.com/privacy-scaling-explorations/maci/blob/
|
|
173
|
+
To ensure that the MACI stack works as expected, without having to run the entire test suite (or even just the e2e tests), there is a [bash script](https://github.com/privacy-scaling-explorations/maci/blob/main/packages/contracts/testScriptLocalhost.sh) inside the contracts folder which can be used.
|
|
174
174
|
|
|
175
175
|
This script contains a number of actions which touch all of the parts of MACI, and resemble exactly what other e2e tests do.
|
|
176
176
|
|
|
177
177
|
Looking at this in more details we do the following:
|
|
178
178
|
|
|
179
|
-
1. Deploy a `
|
|
179
|
+
1. Deploy a `VerifyingKeysRegistry` contract
|
|
180
180
|
2. Set the verification keys on this smart contract
|
|
181
181
|
3. Deploy a `MACI` contract (and associated utility contracts)
|
|
182
182
|
4. Deploy a Poll from the MACI contract.
|
|
@@ -53,6 +53,32 @@ To run Contracts only tests, run:
|
|
|
53
53
|
pnpm run test
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
+
To run e2e tests for hardhat tasks for `contracts` using the in-memory hardhat network:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
pnpm run test:hardhat
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
You can update the `deploy-config.json` file to change policies or other deployment settings used by the test.
|
|
63
|
+
|
|
64
|
+
You can enhance test reporting and gas cost estimation by adding the following variables to your `.env` file:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# CoinMarkerCap api key for prices (gas reporter)
|
|
68
|
+
COINMARKETCAP_API_KEY=
|
|
69
|
+
# Gas price for gas reporter
|
|
70
|
+
# Allows you to manually specify the gas price (e.g. 3 gwei)
|
|
71
|
+
GAS_REPORTER_PRICE=
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
These variables are used by `hardhat-gas-reporter` to show cost estimates for gas usage in the test reports.
|
|
75
|
+
|
|
76
|
+
If you would like to run these E2E tests against a different [supported networks](/docs/supported-networks/), you can override the network like this:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
pnpm exec hardhat test --network {NETWORK} ./tests/e2e/hardhatTasks.test.ts
|
|
80
|
+
```
|
|
81
|
+
|
|
56
82
|
### Circuits
|
|
57
83
|
|
|
58
84
|
To test the circuits, from the main `maci/` directory, run:
|
|
@@ -71,10 +97,10 @@ or download them. Please remember to not use these testing `.zkey` files in prod
|
|
|
71
97
|
|
|
72
98
|
### Download `.zkey` files or the witness generation binaries
|
|
73
99
|
|
|
74
|
-
MACI has two main zk-SNARK circuits, `
|
|
100
|
+
MACI has two main zk-SNARK circuits, `MessageProcessor` and `VoteTally`.
|
|
75
101
|
|
|
76
102
|
:::info
|
|
77
|
-
The `
|
|
103
|
+
The `MessageProcessor` and `VoteTally` circuits are also provided in a non-quadratic voting (non-QV) and in a full credits voting (full) versions. Currently these new versions have not undergone a trusted setup ceremony.
|
|
78
104
|
:::
|
|
79
105
|
|
|
80
106
|
Each circuit is parameterised and there should be one
|
|
@@ -86,7 +112,7 @@ circuits.
|
|
|
86
112
|
|
|
87
113
|
Note the locations of the `.zkey` files as the smart contract tasks require them as part of the JSON configuration file.
|
|
88
114
|
|
|
89
|
-
For testing purposes you can download the required artifacts using the [`download-zkeys:test`](https://github.com/privacy-scaling-explorations/maci/blob/
|
|
115
|
+
For testing purposes you can download the required artifacts using the [`download-zkeys:test`](https://github.com/privacy-scaling-explorations/maci/blob/main/package.json#L15). The script will place all required artifacts inside the `cli/zkeys` folder.
|
|
90
116
|
|
|
91
117
|
You can run the script directly with bash or use pnpm: `pnpm run download:test-zkeys` from the monorepo root.
|
|
92
118
|
|
|
@@ -97,19 +123,19 @@ From the root folder, run:
|
|
|
97
123
|
**for c++ witness generator**
|
|
98
124
|
|
|
99
125
|
```bash
|
|
100
|
-
pnpm build:circuits-c -- --outPath
|
|
126
|
+
pnpm build:circuits-c -- --outPath ../../zkeys
|
|
101
127
|
```
|
|
102
128
|
|
|
103
129
|
**for wasm witness generator**
|
|
104
130
|
|
|
105
131
|
```bash
|
|
106
|
-
pnpm build:circuits-wasm -- --outPath
|
|
132
|
+
pnpm build:circuits-wasm -- --outPath ../../zkeys
|
|
107
133
|
```
|
|
108
134
|
|
|
109
135
|
**generate zkeys**
|
|
110
136
|
|
|
111
137
|
```bash
|
|
112
|
-
pnpm setup:zkeys --outPath
|
|
138
|
+
pnpm setup:zkeys --outPath ../../zkeys
|
|
113
139
|
```
|
|
114
140
|
|
|
115
141
|
### Check the Rapidsnark binary
|
|
@@ -151,6 +177,12 @@ To run e2e tests with normal voting (not quadratic voting):
|
|
|
151
177
|
pnpm run test:e2e-non-qv
|
|
152
178
|
```
|
|
153
179
|
|
|
180
|
+
To run e2e tests with full credits voting (full):
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
pnpm run test:e2e-full
|
|
184
|
+
```
|
|
185
|
+
|
|
154
186
|
To run integration tests:
|
|
155
187
|
|
|
156
188
|
```bash
|
|
@@ -7,21 +7,21 @@ sidebar_position: 5
|
|
|
7
7
|
|
|
8
8
|
# Troubleshooting
|
|
9
9
|
|
|
10
|
-
## cli: `
|
|
10
|
+
## cli: `generateProofs` command failure
|
|
11
11
|
|
|
12
12
|
### Case: missing `.dat` files
|
|
13
13
|
|
|
14
|
-
If your logs look like the following, then make sure you have `
|
|
14
|
+
If your logs look like the following, then make sure you have `MessageProcessorQv_10-2-1-2_test.dat` and `VoteTallyQv_10-1-2_test.dat` files in the same directory as your zkeys:
|
|
15
15
|
|
|
16
16
|
```
|
|
17
|
-
node build/ts/index.js
|
|
17
|
+
node build/ts/index.js generateProofs -x 0xf204a4Ef082f5c04bB89F7D5E6568B796096735a \
|
|
18
18
|
> -sk macisk.49953af3585856f539d194b46c82f4ed54ec508fb9b882940cbe68bbc57e59e \
|
|
19
19
|
> -o 0 \
|
|
20
20
|
> -r ~/rapidsnark/build/prover \
|
|
21
|
-
> -wp ./zkeys/
|
|
22
|
-
> -wt ./zkeys/
|
|
23
|
-
> -zp ./zkeys/
|
|
24
|
-
> -zt ./zkeys/
|
|
21
|
+
> -wp ./zkeys/MessageProcessorQv_10-2-1-2_test \
|
|
22
|
+
> -wt ./zkeys/VoteTallyQv_10-1-2_test \
|
|
23
|
+
> -zp ./zkeys/MessageProcessorQv_10-2-1-2_test.0.zkey \
|
|
24
|
+
> -zt ./zkeys/VoteTallyQv_10-1-2_test.0.zkey \
|
|
25
25
|
> -t tally.json \
|
|
26
26
|
> -f proofs
|
|
27
27
|
|
|
@@ -36,12 +36,12 @@ terminate called after throwing an instance of 'std::system_error'
|
|
|
36
36
|
Aborted (core dumped)
|
|
37
37
|
|
|
38
38
|
Error: could not generate proof.
|
|
39
|
-
Error: Error executing ./zkeys/
|
|
39
|
+
Error: Error executing ./zkeys/MessageProcessorQv_10-2-1-2_test /tmp/tmp-9904-zG0k8YPTATWB/input.json /tmp/tmp-9904-zG0k8YPTATWB/output.wtns
|
|
40
40
|
at genProof (/home/ubuntu/maci/circuits/ts/index.ts:44:15)
|
|
41
|
-
at /home/ubuntu/maci/cli/ts/
|
|
42
|
-
at step (/home/ubuntu/maci/cli/build/
|
|
43
|
-
at Object.next (/home/ubuntu/maci/cli/build/
|
|
44
|
-
at fulfilled (/home/ubuntu/maci/cli/build/
|
|
41
|
+
at /home/ubuntu/maci/cli/ts/generateProofs.ts:339:25
|
|
42
|
+
at step (/home/ubuntu/maci/cli/build/generateProofs.js:33:23)
|
|
43
|
+
at Object.next (/home/ubuntu/maci/cli/build/generateProofs.js:14:53)
|
|
44
|
+
at fulfilled (/home/ubuntu/maci/cli/build/generateProofs.js:5:58)
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
You can generate the missing `.dat` files using the following command:
|
|
@@ -54,7 +54,7 @@ pnpm build:circuits-c -- --outPath ../cli/zkeys
|
|
|
54
54
|
|
|
55
55
|
### Case `Commitment mismatch`
|
|
56
56
|
|
|
57
|
-
If your log looks like the following, that's because you have already run the `prove` command. You can access the `cli` and attempt again by executing the `
|
|
57
|
+
If your log looks like the following, that's because you have already run the `prove` command. You can access the `cli` and attempt again by executing the `generateProofs` command.
|
|
58
58
|
|
|
59
59
|
```
|
|
60
60
|
Error: commitment mismatch
|
|
@@ -69,9 +69,9 @@ Error: commitment mismatch
|
|
|
69
69
|
ELIFECYCLE Command failed with exit code 1.
|
|
70
70
|
```
|
|
71
71
|
|
|
72
|
-
This is because commitments are generated using random salts, thus will differ at each `
|
|
72
|
+
This is because commitments are generated using random salts, thus will differ at each `generateProofs` run.
|
|
73
73
|
|
|
74
|
-
In [core/Poll.ts](https://github.com/privacy-scaling-explorations/maci/blob/
|
|
74
|
+
In [core/Poll.ts](https://github.com/privacy-scaling-explorations/maci/blob/main/packages/core/ts/Poll.ts):
|
|
75
75
|
|
|
76
76
|
```
|
|
77
77
|
let newSbSalt = genRandomSalt();
|
|
@@ -84,7 +84,7 @@ while (this.sbSalts[this.currentMessageBatchIndex!] === newSbSalt) {
|
|
|
84
84
|
|
|
85
85
|
### Case `AssertionError`
|
|
86
86
|
|
|
87
|
-
This could happen when you run `prove` in the `contracts` package, or run `
|
|
87
|
+
This could happen when you run `prove` in the `contracts` package, or run `generateProofs` in the `cli` package. If your log looks like the following, there are two possible reasons:
|
|
88
88
|
|
|
89
89
|
1. If your MACI keypair for the coordinator was generated based on a previous version, it may have been generated incorrectly due to a breaking change in a third-party package (`zk-kit/eddsa-poseidon`). Please generate a new pair and run the whole process again.
|
|
90
90
|
2. The provided private key is unmatched to the public key which deployed the poll, you will need to input the correct private key.
|
|
@@ -130,7 +130,7 @@ TypeError: cannot filter non-indexed parameters; must be null (argument="contrac
|
|
|
130
130
|
}
|
|
131
131
|
```
|
|
132
132
|
|
|
133
|
-
This could happen during running `
|
|
133
|
+
This could happen during running `generateProofs` in `cli` package, or running `prove` in `contracts` package.
|
|
134
134
|
Be aware that we updated several parameters to `indexed`:
|
|
135
135
|
|
|
136
136
|
```javascript
|
|
@@ -140,11 +140,11 @@ event MergeMessageAqSubRoots(uint256 indexed _numSrQueueOps);
|
|
|
140
140
|
event MergeMessageAq(uint256 indexed _messageRoot);
|
|
141
141
|
```
|
|
142
142
|
|
|
143
|
-
Please remember to pull the latest MACI repo updates(`git fetch origin && git pull origin
|
|
143
|
+
Please remember to pull the latest MACI repo updates(`git fetch origin && git pull origin main`) and run `pnpm build` in the root of this monorepo.
|
|
144
144
|
|
|
145
145
|
### Verifier contract found the proof invalid
|
|
146
146
|
|
|
147
|
-
If your log looks like the following, that's because the zkey and wasm files added to the [`
|
|
147
|
+
If your log looks like the following, that's because the zkey and wasm files added to the [`VerifyingKeysRegistry` contract](/docs/technical-references/smart-contracts/VerifyingKeysRegistry) are different from what you use to run the **prove** command. Check if you're using the correct zkey and wasm files.
|
|
148
148
|
|
|
149
149
|
```
|
|
150
150
|
Error: The verifier contract found the proof invalid.
|
|
@@ -159,3 +159,48 @@ Error: The verifier contract found the proof invalid.
|
|
|
159
159
|
### The on-chain verification of total spent voice credits failed
|
|
160
160
|
|
|
161
161
|
If you ran the `verify` command and got this error, please ensure consistency in your use of quadratic voting throughout interactions with MACI, including poll deployment, proof generation, and verification.
|
|
162
|
+
|
|
163
|
+
### Proof generation process is killed
|
|
164
|
+
|
|
165
|
+
If your terminal output ends like this:
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
[i] Starting to fetch logs from block 8386826
|
|
169
|
+
[i] Generating proofs of message processing...
|
|
170
|
+
[i] Progress: 1 / 1
|
|
171
|
+
[i] Wait until proof generation is finished
|
|
172
|
+
Killed
|
|
173
|
+
ELIFECYCLE Command failed with exit code 137.
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
This typically indicates the proof generation process was terminated due to exceeding the system's available memory limit (exit code `137` = SIGKILL by the OS, often due to OOM).
|
|
177
|
+
|
|
178
|
+
Increase Node.js' memory allocation by setting the `NODE_OPTIONS` environment variable before running the command:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
export NODE_OPTIONS="--max-old-space-size=4096"
|
|
182
|
+
# You can increase the value further (e.g., 8192 for 8GB) if your system has enough RAM:
|
|
183
|
+
export NODE_OPTIONS="--max-old-space-size=8192"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Error: Not enough or too many values for input signals
|
|
187
|
+
|
|
188
|
+
If you see errors like:
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
Error: Not enough values for input signal currentVoteWeightsPathElements
|
|
192
|
+
at /home/maci/node_modules/.pnpm/circom_runtime@0.1.28/node_modules/circom_runtime/build/main.cjs:513:27
|
|
193
|
+
...
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
Error: Too many values for input signal ballots
|
|
198
|
+
at /home/maci/node_modules/.pnpm/circom_runtime@0.1.28/node_modules/circom_runtime/build/main.cjs:513:27
|
|
199
|
+
...
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
This usually happens when the Merkle tree depth configured in your MACI deployment does not match the depth expected by the zkey files used during proof generation.
|
|
203
|
+
To solve this:
|
|
204
|
+
|
|
205
|
+
- Download the correct zkey files from a trusted source.
|
|
206
|
+
- Verify that the `stateTreeDepth`, `messageTreeDepth`, and `voteOptionTreeDepth` used in your CLI or config match the values used to generate those zkey files.
|
|
@@ -19,7 +19,7 @@ MACI follows the [Semantic Versioning Specification (SemVer)](https://semver.org
|
|
|
19
19
|
|
|
20
20
|
All MACI packages are organized in our monorepo and follow a global release approach, meaning that all packages have the same version.
|
|
21
21
|
|
|
22
|
-
Currently, MACI core team manually decides when to release and what the version should be. Packages are released [automatically via CI](https://github.com/privacy-scaling-explorations/maci/blob/
|
|
22
|
+
Currently, MACI core team manually decides when to release and what the version should be. Packages are released [automatically via CI](https://github.com/privacy-scaling-explorations/maci/blob/main/.github/workflows/release.yml) when a new tag is created in GitHub. [You can view our releases and tags in GitHub](https://github.com/privacy-scaling-explorations/maci/releases).
|
|
23
23
|
|
|
24
24
|
## MACI Release Process
|
|
25
25
|
|
|
@@ -37,10 +37,10 @@ Version number '1.2.3' is used here as an example. You should replace the versio
|
|
|
37
37
|
git clone https://github.com/privacy-scaling-explorations/maci
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
3. Switch to the `
|
|
40
|
+
3. Switch to the `main` branch:
|
|
41
41
|
|
|
42
42
|
```
|
|
43
|
-
git checkout
|
|
43
|
+
git checkout main
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
4. Install required dependencies:
|