@@ -22,16 +22,19 @@ use anyhow::{ensure, Context};
22
22
use async_trait:: async_trait;
23
23
use futures:: future:: Future ;
24
24
use hotshot:: types:: { Event , EventType } ;
25
- use hotshot_types:: data:: { VidDisperseShare , VidShare } ;
25
+ use hotshot_types:: { data:: VidCommitment , event :: LeafInfo } ;
26
26
use hotshot_types:: {
27
- data:: Leaf2 ,
27
+ data:: { ns_table :: parse_ns_table , Leaf2 } ,
28
28
traits:: {
29
29
block_contents:: { BlockHeader , BlockPayload , EncodeBytes , GENESIS_VID_NUM_STORAGE_NODES } ,
30
30
node_implementation:: { ConsensusTime , NodeType } ,
31
31
} ,
32
32
vid:: advz:: advz_scheme,
33
33
} ;
34
- use hotshot_types:: { data:: VidCommitment , event:: LeafInfo } ;
34
+ use hotshot_types:: {
35
+ data:: { VidDisperseShare , VidShare } ,
36
+ vid:: avidm:: { init_avidm_param, AvidMScheme } ,
37
+ } ;
35
38
use jf_vid:: VidScheme ;
36
39
use std:: iter:: once;
37
40
@@ -168,19 +171,45 @@ fn genesis_vid<Types: NodeType>(
168
171
) -> anyhow:: Result < ( VidCommonQueryData < Types > , VidShare ) > {
169
172
let payload = Payload :: < Types > :: empty ( ) . 0 ;
170
173
let bytes = payload. encode ( ) ;
171
- let mut disperse = advz_scheme ( GENESIS_VID_NUM_STORAGE_NODES )
172
- . disperse ( bytes)
173
- . context ( "unable to compute VID dispersal for genesis block" ) ?;
174
- ensure ! (
175
- VidCommitment :: V0 ( disperse. commit) == leaf. block_header( ) . payload_commitment( ) ,
176
- "computed VID commit {} for genesis block does not match header commit {}" ,
177
- disperse. commit,
178
- leaf. block_header( ) . payload_commitment( )
179
- ) ;
180
- Ok ( (
181
- VidCommonQueryData :: new ( leaf. block_header ( ) . clone ( ) , Some ( disperse. common ) ) ,
182
- VidShare :: V0 ( disperse. shares . remove ( 0 ) ) ,
183
- ) )
174
+
175
+ match leaf. block_header ( ) . payload_commitment ( ) {
176
+ VidCommitment :: V0 ( commit) => {
177
+ let mut disperse = advz_scheme ( GENESIS_VID_NUM_STORAGE_NODES )
178
+ . disperse ( bytes)
179
+ . context ( "unable to compute VID dispersal for genesis block" ) ?;
180
+
181
+ ensure ! (
182
+ disperse. commit == commit,
183
+ "computed VID commit {} for genesis block does not match header commit {}" ,
184
+ disperse. commit,
185
+ commit
186
+ ) ;
187
+ Ok ( (
188
+ VidCommonQueryData :: new ( leaf. block_header ( ) . clone ( ) , Some ( disperse. common ) ) ,
189
+ VidShare :: V0 ( disperse. shares . remove ( 0 ) ) ,
190
+ ) )
191
+ }
192
+ VidCommitment :: V1 ( commit) => {
193
+ let avidm_param = init_avidm_param ( GENESIS_VID_NUM_STORAGE_NODES ) ?;
194
+ let weights = vec ! [ 1 ; GENESIS_VID_NUM_STORAGE_NODES ] ;
195
+ let ns_table = parse_ns_table ( bytes. len ( ) , & leaf. block_header ( ) . metadata ( ) . encode ( ) ) ;
196
+
197
+ let ( calculated_commit, mut shares) =
198
+ AvidMScheme :: ns_disperse ( & avidm_param, & weights, & bytes, ns_table) . unwrap ( ) ;
199
+
200
+ ensure ! (
201
+ calculated_commit == commit,
202
+ "computed VID commit {} for genesis block does not match header commit {}" ,
203
+ calculated_commit,
204
+ commit
205
+ ) ;
206
+
207
+ Ok ( (
208
+ VidCommonQueryData :: new ( leaf. block_header ( ) . clone ( ) , None ) ,
209
+ VidShare :: V1 ( shares. remove ( 0 ) ) ,
210
+ ) )
211
+ }
212
+ }
184
213
}
185
214
186
215
/// A data source with an atomic transaction-based synchronization interface.
0 commit comments