Skip to content

Commit dcdd507

Browse files
authored
Add documentation about VoteCast transaction structure (#141)
This PR is a port of the following one input-output-hk/chain-libs#836
2 parents 439f084 + 7a01cc6 commit dcdd507

File tree

3 files changed

+123
-2
lines changed

3 files changed

+123
-2
lines changed

src/chain-libs/chain-impl-mockchain/doc/format.abnf

+59-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ FRAGMENT-SPEC = %x00 INITIAL
4444
/ %x07 POOL-UPDATE
4545
/ %x08 UPDATE-PROPOSAL
4646
/ %x09 UPDATE-VOTE
47+
/ %x0a VOTE-PLAN
48+
/ %x0b VOTE-CAST
49+
/ %x0c VOTE-TALLY
50+
/ %x0d MINT-TOKEN
51+
/ %x0e EVM
52+
/ %x0f EVM-MAPPING
4753

4854
; ####################
4955
; FRAGMENT only present in genesis block
@@ -139,6 +145,52 @@ CHANGES = SIZE-ELEMENT-16BIT ; number of changes
139145

140146
PROPOSAL-ID = FRAGMENT-ID
141147

148+
149+
; ####################
150+
; FRAGMENT Vote plan, vote cast, vote tally
151+
; ####################
152+
153+
VOTE-PLAN = PLAN-CERT IOW ED25519-SIGNATURE
154+
VOTE-CAST = CAST-CERT IOW
155+
VOTE-TALLY = TALLY-CERT IOW
156+
157+
PLAN-CERT = VOTE-START VOTE-END COMMITTE-END PROPOSALS PAYLOAD-TYPE
158+
159+
VOTE-START = BLOCK-DATE
160+
VOTE-END = BLOCK-DATE
161+
COMMITTE-END = BLOCK-DATE
162+
PROPOSALS = SIZE-ELEMENT-8BIT *PROPOSAL-ELEMENT
163+
PROPOSAL-ELEMENT = TODO
164+
165+
CAST-CERT = VOTE-PLAN-ID PROPOSAL-INDEX CAST-PAYLOAD
166+
PROPOSAL-INDEX = U8
167+
CAST-PAYLOAD = %x01 CHOICE; Public payload
168+
/ %x02 ENCRYPTED-VOTE PROOF-VOTE ; Private payload
169+
CHOICE = U8
170+
ENCRYPTED-VOTE = SIZE-ELEMENT-8BIT *CYPHERTEXT
171+
CYPHERTEXT = E1 E2
172+
PROOF-VOTE = SIZE-ELEMENT-8BIT *ANNOUNCEMENT *CYPHERTEXT *R-RESPONSE SCALAR ; size of the *ANNOUNCEMENT, *CYPHERTEXT, *R-RESPONSE are equal to SIZE-ELEMENT-8BIT value
173+
ANNOUNCEMENT = I A B
174+
R-RESPONSE = 3 * SCALAR
175+
I = GROUP-ELEMENT
176+
A = GROUP-ELEMENT
177+
B = GROUP-ELEMENT
178+
E1 = GROUP-ELEMENT
179+
E2 = GROUP-ELEMENT
180+
181+
TALLY-CERT = VOTE-PLAN-ID TALLY-PAYLOAD
182+
TALLY-PAYLOAD = %x01 ; Public payload
183+
/ %x02 PRIVATE-TALLY ; Private payload
184+
PRIVATE-TALLY = SIZE-ELEMENT-8BIT *TALLY-ELEMENT
185+
TALLY-ELEMENT = MEMBERS-SIZE OPTIONS-SIZE *MEMBER-ELEMENT *OPTION-ELEMENT
186+
MEMBERS-SIZE = SIZE-ELEMENT-8BIT
187+
OPTIONS-SIZE = SIZE-ELEMENT-8BIT
188+
MEMBER-ELEMENT = *SHARE-ELEMENT ; size is equal to the OPTIONS-SIZE value
189+
SHARE-ELEMENT = SIZE-ELEMENT-64BIT SIZE-ELEMENT-65BIT
190+
OPTION-ELEMENT = U64
191+
192+
VOTE-PLAN-ID = 32OCTET
193+
142194
; ####################
143195
; TRANSACTION CONSTRUCTION
144196
;
@@ -151,7 +203,7 @@ IOW = BLOCK-DATE ; end validity of this IOW
151203
*INPUT ; as many as indicated in the number of inputs
152204
*OUTPUT ; sa many as indicated in the number of outputs
153205
*WITNESS ; as many as indicated in the number of inputs
154-
INPUT = INPUT-UTXO / INPUT_ACCOUNT
206+
INPUT = INPUT-UTXO / INPUT-ACCOUNT
155207
INPUT-UTXO = IDX VALUE FRAGMENT-ID
156208
INPUT-ACCOUNT = %xff VALUE UNTAG-ACCOUNT-ID
157209
IDX = %x00-fe
@@ -218,3 +270,9 @@ U8 = OCTET ; unsigned integer 8 bit
218270
U16 = 2OCTET ; unsigned integer 16 bit (BE)
219271
U32 = 4OCTET ; unsigned integer 32 bit (BE)
220272
U64 = 8OCTET ; unsigned integer 64 bit (BE)
273+
SIZE-BYTES-32BYTE = 32OCTET ; unsigned integer 256 bit (32 bytes) (BE)
274+
SIZE-BYTES-64BYTE = 64OCTET ; unsigned integer 512 bit (64 bytes) (BE)
275+
SIZE-BYTES-65BYTE = 65OCTET ; unsigned integer 520 bit (65 bytes) (BE)
276+
SCALAR = SIZE-BYTES-32BYTE
277+
GROUP-ELEMENT = SIZE-BYTES-32BYTE ; ristretto255 backend (build with the feature=ristretto255, it is enabled by default)
278+
/ SIZE-BYTES-65BYTE ; p256k1 backend (build with the feature=p256k1)

src/chain-libs/chain-impl-mockchain/doc/format.md

+63
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,69 @@ message, `VoterId` is an ed25519 extended public key, and `Signature`
304304
is a signature by the corresponding secret key over `ProposalId |
305305
VoterId`.
306306

307+
## Type 11: Vote Cast
308+
309+
VoteCast message is used to vote for a particular voting event.
310+
311+
VoteCast transaction should have only 1 input, 0 output and 1 witness (signature).
312+
313+
Full fragment representation in hex:
314+
```
315+
0000037e000b36ad42885189a0ac3438cdb57bc8ac7f6542e05a59d1f2e4d1d38194c9d4ac7b000203f6639bdbc9235103825a9f025eae5cff3bd9c9dcc0f5a4b286909744746c8b6fb0018773d3b4308344d2e90599cd03749658561787eab714b542a5ccaf078846f6639bdbc9235103825a9f025eae5cff3bd9c9dcc0f5a4b286909744746c8b6fc8f58976fc0e951ba284a24f3fc190d914ae53aebcc523e7a4a330c8655b4908f6639bdbc9235103825a9f025eae5cff3bd9c9dcc0f5a4b286909744746c8b6fb0018773d3b4308344d2e90599cd03749658561787eab714b542a5ccaf078846021c76d0a50054ef7205cb95c1fd3f928f224fab8a8d70feaf4f5db90630c3845a06df2f11c881e396318bd8f9e9f135c2477e923c3decfd6be5466d6166fb3c702edd0d1d0a201fb8c51a91d01328da257971ca78cc566d4b518cb2cd261f96644067a7359a745fe239db8e73059883aece4d506be71c1262b137e295ce5f8a0aac22c1d8d343e5c8b5be652573b85cba8f4dcb46cfa4aafd8d59974e2eb65f480cf85ab522e23203c4f2faa9f95ebc0cd75b04f04fef5d4001d349d1307bb5570af4a91d8af4a489297a3f5255c1e12948787271275c50386ab2ef3980d882228e5f3c82d386e6a4ccf7663df5f6bbd9cbbadd6b2fea2668a8bf5603be29546152902a35fc44aae80d9dcd85fad6cde5b47a6bdc6257c5937f8de877d5ca0356ee9f12a061e03b99ab9dfea56295485cb5ce38cd37f56c396949f58b0627f455d26e4c5ff0bc61ab0ff05ffa07880d0e5c540bc45b527e8e85bb1da469935e0d3ada75d7d41d785d67d1d0732d7d6cbb12b23bfc21dfb4bbe3d933eaa1e5190a85d6e028706ab18d262375dd22a7c1a0e7efa11851ea29b4c92739aaabfee40353453ece16bda2f4a2c2f86e6b37f6de92dc45dba2eb811413c4af2c89f5fc0859718d7cd9888cd8d813da2e93726484ea5ce5be8ecf1e1490b874bd897ccd0cbc33db0a1751f813683724b7f5cf750f2497953607d1e82fb5d1429cbfd7a40ccbdba04fb648203c91e0809e497e80e9fad7895b844ba6da6ac690c7ce49c10e00000000000000000100ff00000000000000036d2ac8ddbf6eaac95401f91baca7f068e3c237386d7c9a271f5187ed909155870200000000e6c8aa48925e37fdab75db13aca7c4f39068e12eeb3af8fd1f342005cae5ab9a1ef5344fab2374e9436a67f57041899693d333610dfe785d329988736797950d
316+
```
317+
1. Fragment size (u32): `0000037e`
318+
2. `00`
319+
3. Fragment id tag (u8): `0b` == `11` (it is equal to VoteCast tag)
320+
4. Vote plan id (32 byte hash): `36ad42885189a0ac3438cdb57bc8ac7f6542e05a59d1f2e4d1d38194c9d4ac7b`
321+
5. Proposal index (u8): `00`
322+
6. Payload type tag (u8): `02`
323+
7. Encrypted vote:
324+
`03|f6639bdbc9235103825a9f025eae5cff3bd9c9dcc0f5a4b286909744746c8b6f|b0018773d3b4308344d2e90599cd03749658561787eab714b542a5ccaf078846|f6639bdbc9235103825a9f025eae5cff3bd9c9dcc0f5a4b286909744746c8b6f|c8f58976fc0e951ba284a24f3fc190d914ae53aebcc523e7a4a330c8655b4908|f6639bdbc9235103825a9f025eae5cff3bd9c9dcc0f5a4b286909744746c8b6f|b0018773d3b4308344d2e90599cd03749658561787eab714b542a5ccaf078846`
325+
- size (u8): `03`
326+
- ciphertext (group element (32 byte), group element (32 byte)): `f6639bdbc9235103825a9f025eae5cff3bd9c9dcc0f5a4b286909744746c8b6f|b0018773d3b4308344d2e90599cd03749658561787eab714b542a5ccaf078846|f6639bdbc9235103825a9f025eae5cff3bd9c9dcc0f5a4b286909744746c8b6f|c8f58976fc0e951ba284a24f3fc190d914ae53aebcc523e7a4a330c8655b4908|f6639bdbc9235103825a9f025eae5cff3bd9c9dcc0f5a4b286909744746c8b6f|b0018773d3b4308344d2e90599cd03749658561787eab714b542a5ccaf078846`
327+
8. Proof: `02|1c76d0a50054ef7205cb95c1fd3f928f224fab8a8d70feaf4f5db90630c3845a|06df2f11c881e396318bd8f9e9f135c2477e923c3decfd6be5466d6166fb3c70|2edd0d1d0a201fb8c51a91d01328da257971ca78cc566d4b518cb2cd261f9664|4067a7359a745fe239db8e73059883aece4d506be71c1262b137e295ce5f8a0a|ac22c1d8d343e5c8b5be652573b85cba8f4dcb46cfa4aafd8d59974e2eb65f48|0cf85ab522e23203c4f2faa9f95ebc0cd75b04f04fef5d4001d349d1307bb557|0af4a91d8af4a489297a3f5255c1e12948787271275c50386ab2ef3980d88222|8e5f3c82d386e6a4ccf7663df5f6bbd9cbbadd6b2fea2668a8bf5603be295461|52902a35fc44aae80d9dcd85fad6cde5b47a6bdc6257c5937f8de877d5ca0356|ee9f12a061e03b99ab9dfea56295485cb5ce38cd37f56c396949f58b0627f455|d26e4c5ff0bc61ab0ff05ffa07880d0e5c540bc45b527e8e85bb1da469935e0d|3ada75d7d41d785d67d1d0732d7d6cbb12b23bfc21dfb4bbe3d933eaa1e5190a|85d6e028706ab18d262375dd22a7c1a0e7efa11851ea29b4c92739aaabfee403|53453ece16bda2f4a2c2f86e6b37f6de92dc45dba2eb811413c4af2c89f5fc08|59718d7cd9888cd8d813da2e93726484ea5ce5be8ecf1e1490b874bd897ccd0c|bc33db0a1751f813683724b7f5cf750f2497953607d1e82fb5d1429cbfd7a40c|cbdba04fb648203c91e0809e497e80e9fad7895b844ba6da6ac690c7ce49c10e`
328+
- size (u8): `02`
329+
- announcements (group element (32 byte), group element (32 byte), group element (32 byte)): `1c76d0a50054ef7205cb95c1fd3f928f224fab8a8d70feaf4f5db90630c3845a|06df2f11c881e396318bd8f9e9f135c2477e923c3decfd6be5466d6166fb3c70|2edd0d1d0a201fb8c51a91d01328da257971ca78cc566d4b518cb2cd261f9664|4067a7359a745fe239db8e73059883aece4d506be71c1262b137e295ce5f8a0a|ac22c1d8d343e5c8b5be652573b85cba8f4dcb46cfa4aafd8d59974e2eb65f48|0cf85ab522e23203c4f2faa9f95ebc0cd75b04f04fef5d4001d349d1307bb557`
330+
- ciphertext (group element (32 byte), group element (32 byte)): `0af4a91d8af4a489297a3f5255c1e12948787271275c50386ab2ef3980d88222|8e5f3c82d386e6a4ccf7663df5f6bbd9cbbadd6b2fea2668a8bf5603be295461|52902a35fc44aae80d9dcd85fad6cde5b47a6bdc6257c5937f8de877d5ca0356|ee9f12a061e03b99ab9dfea56295485cb5ce38cd37f56c396949f58b0627f455`
331+
- response randomness (scalar (32 byte), scalar (32 byte), scalar (32 byte)): `d26e4c5ff0bc61ab0ff05ffa07880d0e5c540bc45b527e8e85bb1da469935e0d|3ada75d7d41d785d67d1d0732d7d6cbb12b23bfc21dfb4bbe3d933eaa1e5190a|85d6e028706ab18d262375dd22a7c1a0e7efa11851ea29b4c92739aaabfee403|53453ece16bda2f4a2c2f86e6b37f6de92dc45dba2eb811413c4af2c89f5fc08|59718d7cd9888cd8d813da2e93726484ea5ce5be8ecf1e1490b874bd897ccd0c|bc33db0a1751f813683724b7f5cf750f2497953607d1e82fb5d1429cbfd7a40c`
332+
- scalar (32 byte): `cbdba04fb648203c91e0809e497e80e9fad7895b844ba6da6ac690c7ce49c10e`
333+
9. IOW stand for Inputs-Outputs-Witnesses: `00000000000000000100ff00000000000000036d2ac8ddbf6eaac95401f91baca7f068e3c237386d7c9a271f5187ed909155870200000000e6c8aa48925e37fdab75db13aca7c4f39068e12eeb3af8fd1f342005cae5ab9a1ef5344fab2374e9436a67f57041899693d333610dfe785d329988736797950d`
334+
- block date (epoch (u32), slot (u32)): `00000000|00000000`
335+
- number of inputs and witnesses (u8): `01`
336+
- number of outputs (u8): `00`
337+
- Inputs
338+
1.
339+
- index or accout (u8): `ff` (index)
340+
- value (u64): `0000000000000003`
341+
- input pointer (32 byte): `6d2ac8ddbf6eaac95401f91baca7f068e3c237386d7c9a271f5187ed90915587`
342+
- Witnesses
343+
1.
344+
- witness type tag (u8): `02`
345+
- nonce (u32): `00000000`
346+
- legacy signature (64 byte): `e6c8aa48925e37fdab75db13aca7c4f39068e12eeb3af8fd1f342005cae5ab9a1ef5344fab2374e9436a67f57041899693d333610dfe785d329988736797950d`
347+
348+
Signing valid VoteCast fragment example (witness generation).
349+
350+
351+
Transaction data to sign:
352+
```
353+
36ad42885189a0ac3438cdb57bc8ac7f6542e05a59d1f2e4d1d38194c9d4ac7b000203f6639bdbc9235103825a9f025eae5cff3bd9c9dcc0f5a4b286909744746c8b6fb0018773d3b4308344d2e90599cd03749658561787eab714b542a5ccaf078846f6639bdbc9235103825a9f025eae5cff3bd9c9dcc0f5a4b286909744746c8b6fc8f58976fc0e951ba284a24f3fc190d914ae53aebcc523e7a4a330c8655b4908f6639bdbc9235103825a9f025eae5cff3bd9c9dcc0f5a4b286909744746c8b6fb0018773d3b4308344d2e90599cd03749658561787eab714b542a5ccaf078846021c76d0a50054ef7205cb95c1fd3f928f224fab8a8d70feaf4f5db90630c3845a06df2f11c881e396318bd8f9e9f135c2477e923c3decfd6be5466d6166fb3c702edd0d1d0a201fb8c51a91d01328da257971ca78cc566d4b518cb2cd261f96644067a7359a745fe239db8e73059883aece4d506be71c1262b137e295ce5f8a0aac22c1d8d343e5c8b5be652573b85cba8f4dcb46cfa4aafd8d59974e2eb65f480cf85ab522e23203c4f2faa9f95ebc0cd75b04f04fef5d4001d349d1307bb5570af4a91d8af4a489297a3f5255c1e12948787271275c50386ab2ef3980d882228e5f3c82d386e6a4ccf7663df5f6bbd9cbbadd6b2fea2668a8bf5603be29546152902a35fc44aae80d9dcd85fad6cde5b47a6bdc6257c5937f8de877d5ca0356ee9f12a061e03b99ab9dfea56295485cb5ce38cd37f56c396949f58b0627f455d26e4c5ff0bc61ab0ff05ffa07880d0e5c540bc45b527e8e85bb1da469935e0d3ada75d7d41d785d67d1d0732d7d6cbb12b23bfc21dfb4bbe3d933eaa1e5190a85d6e028706ab18d262375dd22a7c1a0e7efa11851ea29b4c92739aaabfee40353453ece16bda2f4a2c2f86e6b37f6de92dc45dba2eb811413c4af2c89f5fc0859718d7cd9888cd8d813da2e93726484ea5ce5be8ecf1e1490b874bd897ccd0cbc33db0a1751f813683724b7f5cf750f2497953607d1e82fb5d1429cbfd7a40ccbdba04fb648203c91e0809e497e80e9fad7895b844ba6da6ac690c7ce49c10e00000000000000000100ff00000000000000036d2ac8ddbf6eaac95401f91baca7f068e3c237386d7c9a271f5187ed90915587
354+
```
355+
It consists of (detailed representation you can see below):
356+
1. Vote plan id
357+
2. Proposal index
358+
3. Payload type tag
359+
4. Encrypted vote
360+
5. Proof
361+
6. Inputs
362+
363+
`blake2b256` hash of the transaction data to sign equals to `f51473df863be3e0383ce5a8da79c7ff51b3d98dadbbefbf9f042e8601901269`
364+
365+
Expected witness (includes signature)
366+
```
367+
0200000000e6c8aa48925e37fdab75db13aca7c4f39068e12eeb3af8fd1f342005cae5ab9a1ef5344fab2374e9436a67f57041899693d333610dfe785d329988736797950d
368+
```
369+
307370
## Shared formats
308371

309372
Delegation Type has 3 different encodings:

src/chain-libs/chain-impl-mockchain/src/fragment/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ impl Serialize for Fragment {
209209
Fragment::UpdateProposal(proposal) => proposal.serialized_size(),
210210
Fragment::UpdateVote(vote) => vote.serialized_size(),
211211
Fragment::VotePlan(vote_plan) => vote_plan.serialized_size(),
212-
Fragment::VoteCast(vote_plan) => vote_plan.serialized_size(),
212+
Fragment::VoteCast(vote_cast) => vote_cast.serialized_size(),
213213
Fragment::VoteTally(vote_tally) => vote_tally.serialized_size(),
214214
Fragment::MintToken(mint_token) => mint_token.serialized_size(),
215215
Fragment::Evm(deployment) => deployment.serialized_size(),

0 commit comments

Comments
 (0)