@@ -71,7 +71,6 @@ Read the following tutorials before proceeding further.
71
71
type EdDSAMessageBlockType = [Fq ; 4 ];
72
72
73
73
#[repr(C )]
74
- #[derive(Copy , Clone )]
75
74
pub struct BlockDataType {
76
75
prev_block_hash : BlockType ,
77
76
data : BlockType ,
@@ -80,7 +79,6 @@ Read the following tutorials before proceeding further.
80
79
}
81
80
82
81
#[repr(C )]
83
- #[derive(Copy , Clone )]
84
82
pub struct EdDSASignatureType {
85
83
r : EdwardsAffine ,
86
84
s : Fr ,
@@ -91,8 +89,6 @@ Read the following tutorials before proceeding further.
91
89
92
90
:::info[ Rust directives]
93
91
94
- The ` #[derive(Copy, Clone)] ` makes it so functions do not take ownership of the variables belonging to custom structs if these variables are passed by value.
95
-
96
92
To learn more about the ` #[derive(C)] ` directive, [ ** click here** ] ( ../../best-practices-limitations/rust-derive ) .
97
93
98
94
:::
@@ -133,22 +129,22 @@ To learn more about the `#[derive(C)]` directive, [**click here**](../../best-pr
133
129
</TabItem>
134
130
<TabItem value='rust' label='Rust'>
135
131
```rust
136
- pub fn hash_512(r: EdwardsAffine , pk: EdwardsAffine , m: EdDSAMessageBlockType ) - > Fr {
132
+ pub fn hash_512(r: & EdwardsAffine , pk: & EdwardsAffine , m: & EdDSAMessageBlockType ) - > Fr {
137
133
assigner_sha2_512(r.0, pk.0, [m [0 ].0 , m [1 ].0 , m [2 ].0 , m [3 ].0 ]).into()
138
134
}
139
135
140
- pub fn hash_256 (block1 : BlockType , block2 : BlockType ) - > BlockType {
136
+ pub fn hash_256 (block1 : & BlockType , block2 : & BlockType ) - > BlockType {
141
137
let sha = assigner_sha2_256 ([block1 [0 ].0 , block1 [1 ].0 ], [block2 [0 ].0 , block2 [1 ].0 ]);
142
138
[sha [0 ].into (), sha [1 ].into ()]
143
139
}
144
140
145
141
pub fn verify_eddsa_signature(
146
- input: EdDSASignatureType ,
147
- pk: EdwardsAffine ,
148
- m: EdDSAMessageBlockType ,
142
+ input: & EdDSASignatureType ,
143
+ pk: & EdwardsAffine ,
144
+ m: & EdDSAMessageBlockType ,
149
145
) -> bool {
150
146
let b = EdwardsAffine ::one ();
151
- let k = hash_512 (input .r , pk , m );
147
+ let k = hash_512 (& input .r , pk , m );
152
148
b * input .s == input .r + (pk * k )
153
149
}
154
150
@@ -157,7 +153,7 @@ To learn more about the `#[derive(C)]` directive, [**click here**](../../best-pr
157
153
}
158
154
159
155
#[unroll_for_loops ]
160
- pub fn verify_signature(unconfirmed_block: BlockDataType ) - > bool {
156
+ pub fn verify_signature(unconfirmed_block: & BlockDataType ) - > bool {
161
157
let mut is_verified: bool = true ;
162
158
let message : EdDSAMessageBlockType = [
163
159
unconfirmed_block .prev_block_hash [0 ],
@@ -169,9 +165,9 @@ To learn more about the `#[derive(C)]` directive, [**click here**](../../best-pr
169
165
for i in 0..4 {
170
166
is_verified = is_verified
171
167
&& verify_eddsa_signature(
172
- unconfirmed_block.validators_signatures[i ],
173
- unconfirmed_block.validators_keys[i ],
174
- message ,
168
+ & unconfirmed_block.validators_signatures[i ],
169
+ & unconfirmed_block.validators_keys[i ],
170
+ & message ,
175
171
);
176
172
}
177
173
@@ -186,30 +182,21 @@ To learn more about the `#[derive(C)]` directive, [**click here**](../../best-pr
186
182
<Tabs groupId='language'>
187
183
<TabItem value='cpp' label='C++'>
188
184
` ` ` cpp
189
- #[circuit ]
190
- #[unroll_for_loops ]
191
- pub fn verify_protocol_state_proof (
192
- last_confirmed_block_hash : BlockType ,
193
- unconfirmed_blocks : [BlockDataType ; 2 ],
194
- ) - > bool {
195
- let mut is_correct = is_same (
196
- unconfirmed_blocks [0 ].prev_block_hash ,
197
- last_confirmed_block_hash ,
198
- );
199
- is_correct = is_correct && verify_signature (unconfirmed_blocks [0 ]);
200
-
201
- for i in 1..2 {
202
- let evaluated_block_hash: BlockType = hash_256 (
203
- unconfirmed_blocks [i - 1 ].prev_block_hash ,
204
- unconfirmed_blocks [i - 1 ].data ,
205
- );
206
-
207
- is_correct =
208
- is_correct && is_same (unconfirmed_blocks [i ].prev_block_hash , evaluated_block_hash );
209
- is_correct = is_correct && verify_signature (unconfirmed_blocks [i ]);
185
+ [[circuit ]] bool verify_protocol_state_proof (
186
+ typename sha2 < 256 > ::block_type last_confirmed_block_hash ,
187
+ std ::array < block_data_type , 2 > unconfirmed_blocks ) {
188
+ bool res = true ;
189
+ if (!is_same (unconfirmed_blocks [0 ].prev_block_hash, last_confirmed_block_hash )) {
190
+ return false ;
210
191
}
211
-
212
- is_correct
192
+ for (int i = 1 ; i < 2; i ++) {
193
+ typename sha2 < 256 > ::block_type evaluated_block_hash =
194
+ hash < sha2 < 256 >> (
195
+ unconfirmed_blocks [i - 1 ].prev_block_hash ,
196
+ unconfirmed_blocks [i - 1 ].data );
197
+ res = res & is_same (unconfirmed_blocks [i ].prev_block_hash , evaluated_block_hash );
198
+ }
199
+ return res;
213
200
}
214
201
` ` `
215
202
</TabItem>
@@ -225,17 +212,17 @@ To learn more about the `#[derive(C)]` directive, [**click here**](../../best-pr
225
212
unconfirmed_blocks [0 ].prev_block_hash ,
226
213
last_confirmed_block_hash ,
227
214
);
228
- is_correct = is_correct && verify_signature (unconfirmed_blocks [0 ]);
215
+ is_correct = is_correct && verify_signature (& unconfirmed_blocks [0 ]);
229
216
230
217
for i in 1..2 {
231
218
let evaluated_block_hash: BlockType = hash_256 (
232
- unconfirmed_blocks [i - 1 ].prev_block_hash ,
233
- unconfirmed_blocks [i - 1 ].data ,
219
+ & unconfirmed_blocks [i - 1 ].prev_block_hash ,
220
+ & unconfirmed_blocks [i - 1 ].data ,
234
221
);
235
222
236
223
is_correct =
237
224
is_correct && is_same (unconfirmed_blocks [i ].prev_block_hash , evaluated_block_hash );
238
- is_correct = is_correct && verify_signature (unconfirmed_blocks [i ]);
225
+ is_correct = is_correct && verify_signature (& unconfirmed_blocks [i ]);
239
226
}
240
227
241
228
is_correct
@@ -338,7 +325,6 @@ To learn more about the `#[derive(C)]` directive, [**click here**](../../best-pr
338
325
type EdDSAMessageBlockType = [Fq ; 4 ];
339
326
340
327
#[repr (C )]
341
- #[ derive(Copy, Clone)]
342
328
pub struct BlockDataType {
343
329
prev_block_hash: BlockType ,
344
330
data: BlockType ,
@@ -347,28 +333,27 @@ To learn more about the `#[derive(C)]` directive, [**click here**](../../best-pr
347
333
}
348
334
349
335
#[repr (C )]
350
- #[ derive(Copy, Clone)]
351
336
pub struct EdDSASignatureType {
352
337
r: EdwardsAffine ,
353
338
s: Fr ,
354
339
}
355
340
356
- pub fn hash_512(r: EdwardsAffine, pk: EdwardsAffine, m: EdDSAMessageBlockType) -> Fr {
341
+ pub fn hash_512 (r : & EdwardsAffine , pk : & EdwardsAffine , m : & EdDSAMessageBlockType ) - > Fr {
357
342
assigner_sha2_512(r.0, pk.0, [m [0 ].0 , m [1 ].0 , m [2 ].0 , m [3 ].0 ]).into()
358
343
}
359
344
360
- pub fn hash_256(block1: BlockType, block2: BlockType) -> BlockType {
345
+ pub fn hash_256 (block1 : & BlockType , block2 : & BlockType ) - > BlockType {
361
346
let sha = assigner_sha2_256 ([block1 [0 ].0 , block1 [1 ].0 ], [block2 [0 ].0 , block2 [1 ].0 ]);
362
347
[sha [0 ].into (), sha [1 ].into ()]
363
348
}
364
349
365
350
pub fn verify_eddsa_signature(
366
- input: EdDSASignatureType,
367
- pk: EdwardsAffine,
368
- m: EdDSAMessageBlockType,
351
+ input: & EdDSASignatureType ,
352
+ pk: & EdwardsAffine ,
353
+ m: & EdDSAMessageBlockType ,
369
354
) -> bool {
370
355
let b = EdwardsAffine ::one ();
371
- let k = hash_512 (input .r , pk , m );
356
+ let k = hash_512 (& input .r , pk , m );
372
357
b * input .s == input .r + (pk * k )
373
358
}
374
359
@@ -377,7 +362,7 @@ To learn more about the `#[derive(C)]` directive, [**click here**](../../best-pr
377
362
}
378
363
379
364
#[unroll_for_loops ]
380
- pub fn verify_signature(unconfirmed_block: BlockDataType) -> bool {
365
+ pub fn verify_signature(unconfirmed_block: & BlockDataType ) - > bool {
381
366
let mut is_verified: bool = true ;
382
367
let message : EdDSAMessageBlockType = [
383
368
unconfirmed_block .prev_block_hash [0 ],
@@ -389,9 +374,9 @@ To learn more about the `#[derive(C)]` directive, [**click here**](../../best-pr
389
374
for i in 0..4 {
390
375
is_verified = is_verified
391
376
&& verify_eddsa_signature(
392
- unconfirmed_block.validators_signatures[i ],
393
- unconfirmed_block.validators_keys[i ],
394
- message ,
377
+ & unconfirmed_block.validators_signatures[i ],
378
+ & unconfirmed_block.validators_keys[i ],
379
+ & message ,
395
380
);
396
381
}
397
382
@@ -408,17 +393,17 @@ To learn more about the `#[derive(C)]` directive, [**click here**](../../best-pr
408
393
unconfirmed_blocks [0 ].prev_block_hash ,
409
394
last_confirmed_block_hash ,
410
395
);
411
- is_correct = is_correct && verify_signature (unconfirmed_blocks [0 ]);
396
+ is_correct = is_correct && verify_signature (& unconfirmed_blocks [0 ]);
412
397
413
398
for i in 1..2 {
414
399
let evaluated_block_hash: BlockType = hash_256 (
415
- unconfirmed_blocks [i - 1 ].prev_block_hash ,
416
- unconfirmed_blocks [i - 1 ].data ,
400
+ & unconfirmed_blocks [i - 1 ].prev_block_hash ,
401
+ & unconfirmed_blocks [i - 1 ].data ,
417
402
);
418
403
419
404
is_correct =
420
405
is_correct && is_same (unconfirmed_blocks [i ].prev_block_hash , evaluated_block_hash );
421
- is_correct = is_correct && verify_signature (unconfirmed_blocks [i ]);
406
+ is_correct = is_correct && verify_signature (& unconfirmed_blocks [i ]);
422
407
}
423
408
424
409
is_correct
0 commit comments