go-dvote/cmd/censushttp/README.md
cmd/censushttp/README.mdRaw
1## Census HTTP service
2
3Reference implementation of a voting census service running on the Vocdoni platform
4
5## Compile
6
7In a GO ready environment:
8
9```
10go get -u github.com/vocdoni/dvote-census/...
11go build -o censusHttpService github.com/vocdoni/dvote-census/cmd/censushttp
12```
13
14## Usage
15
16`./censusHttpService <port> <censusId>[:pubKey] [<censusId>[:pubKey] ...]`
17
18Example
19
20```
21./censusHttpService 1500 Got_Favorite
222019/02/12 10:20:16 Starting process HTTP service on port 1500 for namespace GoT_Favorite
232019/02/12 10:20:16 Starting server in http mode
24```
25
26## API
27
28A HTTP jSON endpoint is available with the following possible fields: `censusId`, `claimData`, `rootHash` and `proofData`.
29
30If `pubKey` has been configured for a specific `censusId`, then two more methods are available (`timeStamp` and `signature`) to provide authentication.
31
32The next table shows the available methods and its relation with the fields.
33
34| method | censusId | claimData | rootHash | proofData | protected? | description |
35|------------|-----------|-----------|----------|-----------|------------|------------|
36| `addCLaim` | mandatory | mandatory | none | none | yes | adds a new claim to the merkle tree |
37| `getRoot` | mandatory | none | none | none | no | get the current merkletree root hash
38| `genProof` | mandatory | mandatory | optional | none | no | generate the merkle proof for a given claim
39| `checkProof` | mandatory | mandatory | optional | mandatory | no | check a claim and its merkle proof
40| `getIdx` | mandatory | mandatory | optional | none | no | get the merkletree data index of a given claim
41| `dump` | mandatory | none | optional | none | yes | list the contents of the census for a given hash
42
43
44## Signature
45
46The signature provides authentication by signing a concatenation of the following strings (even if empty) without spaces: `censusId rootHash claimData timeStamp`.
47
48The `timeStamp` when received on the server side must not differ more than 10 seconds from the current UNIX time.
49
50## Examples
51
52#### add claims
53
54Add two new claims, one for `Jon Snow` and another for `Tyrion`.
55```
56curl -d '{"censusID":"GoT_Favorite","claimData":"Jon Snow"}' http://localhost:1500/addClaim
57
58{"error":false,"response":""}
59```
60
61```
62curl -d '{"censusID":"GoT_Favorite","claimData":"Tyrion"}' http://localhost:1500/addClaim
63
64{"error":false,"response":""}
65```
66
67In case signature is enabled:
68
69```
70curl -d '{
71"censusID":"GoT_Favorite",
72"claimData":"Jon Snow",
73"timeStamp":"1547814675",
74"signature":"a117c4ce12b29090884112ffe57e664f007e7ef142a1679996e2d34fd2b852fe76966e47932f1e9d3a54610d0f361383afe2d9aab096e15d136c236abb0a0d0e" }' http://localhost:1500/addClaim
75
76{"error":false,"response":""}
77```
78
79
80#### generate proof
81
82Generate a merkle proof for the claim `Jon Snow`
83
84```
85curl -d '{"censusID":"GoT_Favorite","claimData":"Jon Snow"}' http://localhost:1500/genProof
86
87{"error":false,"response":"0x000200000000000000000000000000000000000000000000000000000000000212f8134039730791388a9bd0460f9fbd0757327212a64b3a2b0f0841ce561ee3"}
88```
89
90If `rootHash` is specified, the proof will be calculated for the given root hash.
91
92#### get root
93
94The previous merkle proof is valid only for the current root hash. Let's get it
95
96```
97curl -d '{"censusID":"GoT_Favorite"}' http://localhost:1500/getRoot
98
99{"error":false,"response":"0x2f0ddde5cb995eae23dc3b75a5c0333f1cc89b73f3a00b0fe71996fb90fef04b"}
100```
101
102
103#### check proof
104
105Now let's check if the proof is valid
106
107```
108curl -d '{
109"censusID":"GoT_Favorite","claimData":"Jon Snow",
110"rootHash":"0x2f0ddde5cb995eae23dc3b75a5c0333f1cc89b73f3a00b0fe71996fb90fef04b",
111"proofData":"0x000200000000000000000000000000000000000000000000000000000000000212f8134039730791388a9bd0460f9fbd0757327212a64b3a2b0f0841ce561ee3"}' http://localhost:1500/checkProof
112
113{"error":false,"response":"valid"}
114```
115
116If `rootHash` is not specified, the current root hash is used.
117
118#### dump
119
120Dump contents of a specific censusId (values)
121
122```
123curl -d '{"censusID":"GoT_Favorite"}' http://localhost:1500/dump
124
125{"error":false,"response":"[\"Tyrion\",\"Jon Snow\"]"}
126```
127
128If `rootHash` is specified, dump will return the values for the merkle tree with the given root hash.