@@ -835,12 +835,17 @@ impl StacksMessageCodec for StackerDBChunkInvData {
835
835
return Err ( codec_error:: ArrayTooLong ) ;
836
836
}
837
837
write_next ( fd, & self . slot_versions ) ?;
838
+ write_next ( fd, & self . num_outbound_replicas ) ?;
838
839
Ok ( ( ) )
839
840
}
840
841
841
842
fn consensus_deserialize < R : Read > ( fd : & mut R ) -> Result < StackerDBChunkInvData , codec_error > {
842
843
let slot_versions: Vec < u32 > = read_next_at_most ( fd, stackerdb:: STACKERDB_INV_MAX . into ( ) ) ?;
843
- Ok ( StackerDBChunkInvData { slot_versions } )
844
+ let num_outbound_replicas: u32 = read_next ( fd) ?;
845
+ Ok ( StackerDBChunkInvData {
846
+ slot_versions,
847
+ num_outbound_replicas,
848
+ } )
844
849
}
845
850
}
846
851
@@ -890,6 +895,26 @@ impl StacksMessageCodec for StackerDBChunkData {
890
895
}
891
896
}
892
897
898
+ impl StacksMessageCodec for StackerDBPushChunkData {
899
+ fn consensus_serialize < W : Write > ( & self , fd : & mut W ) -> Result < ( ) , codec_error > {
900
+ contract_id_consensus_serialize ( fd, & self . contract_id ) ?;
901
+ write_next ( fd, & self . rc_consensus_hash ) ?;
902
+ write_next ( fd, & self . chunk_data ) ?;
903
+ Ok ( ( ) )
904
+ }
905
+
906
+ fn consensus_deserialize < R : Read > ( fd : & mut R ) -> Result < StackerDBPushChunkData , codec_error > {
907
+ let contract_id: ContractId = contract_id_consensus_deserialize ( fd) ?;
908
+ let rc_consensus_hash: ConsensusHash = read_next ( fd) ?;
909
+ let chunk_data: StackerDBChunkData = read_next ( fd) ?;
910
+ Ok ( StackerDBPushChunkData {
911
+ contract_id,
912
+ rc_consensus_hash,
913
+ chunk_data,
914
+ } )
915
+ }
916
+ }
917
+
893
918
impl StacksMessageCodec for RelayData {
894
919
fn consensus_serialize < W : Write > ( & self , fd : & mut W ) -> Result < ( ) , codec_error > {
895
920
write_next ( fd, & self . peer ) ?;
@@ -937,6 +962,7 @@ impl StacksMessageType {
937
962
StacksMessageType :: StackerDBChunkInv ( ref _m) => StacksMessageID :: StackerDBChunkInv ,
938
963
StacksMessageType :: StackerDBGetChunk ( ref _m) => StacksMessageID :: StackerDBGetChunk ,
939
964
StacksMessageType :: StackerDBChunk ( ref _m) => StacksMessageID :: StackerDBChunk ,
965
+ StacksMessageType :: StackerDBPushChunk ( ref _m) => StacksMessageID :: StackerDBPushChunk ,
940
966
}
941
967
}
942
968
@@ -968,6 +994,7 @@ impl StacksMessageType {
968
994
StacksMessageType :: StackerDBChunkInv ( ref _m) => "StackerDBChunkInv" ,
969
995
StacksMessageType :: StackerDBGetChunk ( ref _m) => "StackerDBGetChunk" ,
970
996
StacksMessageType :: StackerDBChunk ( ref _m) => "StackerDBChunk" ,
997
+ StacksMessageType :: StackerDBPushChunk ( ref _m) => "StackerDBPushChunk" ,
971
998
}
972
999
}
973
1000
@@ -1058,6 +1085,17 @@ impl StacksMessageType {
1058
1085
m. data. len( )
1059
1086
)
1060
1087
}
1088
+ StacksMessageType :: StackerDBPushChunk ( ref m) => {
1089
+ format ! (
1090
+ "StackerDBPushChunk({},{},{},{},{},sz={})" ,
1091
+ & m. contract_id,
1092
+ & m. rc_consensus_hash,
1093
+ m. chunk_data. slot_id,
1094
+ m. chunk_data. slot_version,
1095
+ & m. chunk_data. sig,
1096
+ m. chunk_data. data. len( )
1097
+ )
1098
+ }
1061
1099
}
1062
1100
}
1063
1101
}
@@ -1104,6 +1142,9 @@ impl StacksMessageCodec for StacksMessageID {
1104
1142
StacksMessageID :: StackerDBGetChunk
1105
1143
}
1106
1144
x if x == StacksMessageID :: StackerDBChunk as u8 => StacksMessageID :: StackerDBChunk ,
1145
+ x if x == StacksMessageID :: StackerDBPushChunk as u8 => {
1146
+ StacksMessageID :: StackerDBPushChunk
1147
+ }
1107
1148
_ => {
1108
1149
return Err ( codec_error:: DeserializeError (
1109
1150
"Unknown message ID" . to_string ( ) ,
@@ -1145,6 +1186,7 @@ impl StacksMessageCodec for StacksMessageType {
1145
1186
StacksMessageType :: StackerDBChunkInv ( ref m) => write_next ( fd, m) ?,
1146
1187
StacksMessageType :: StackerDBGetChunk ( ref m) => write_next ( fd, m) ?,
1147
1188
StacksMessageType :: StackerDBChunk ( ref m) => write_next ( fd, m) ?,
1189
+ StacksMessageType :: StackerDBPushChunk ( ref m) => write_next ( fd, m) ?,
1148
1190
}
1149
1191
Ok ( ( ) )
1150
1192
}
@@ -1243,6 +1285,10 @@ impl StacksMessageCodec for StacksMessageType {
1243
1285
let m: StackerDBChunkData = read_next ( fd) ?;
1244
1286
StacksMessageType :: StackerDBChunk ( m)
1245
1287
}
1288
+ StacksMessageID :: StackerDBPushChunk => {
1289
+ let m: StackerDBPushChunkData = read_next ( fd) ?;
1290
+ StacksMessageType :: StackerDBPushChunk ( m)
1291
+ }
1246
1292
StacksMessageID :: Reserved => {
1247
1293
return Err ( codec_error:: DeserializeError (
1248
1294
"Unsupported message ID 'reserved'" . to_string ( ) ,
@@ -2215,6 +2261,7 @@ pub mod test {
2215
2261
fn codec_StackerDBChunkInvData ( ) {
2216
2262
let data = StackerDBChunkInvData {
2217
2263
slot_versions : vec ! [ 0 , 1 , 2 , 3 ] ,
2264
+ num_outbound_replicas : 4 ,
2218
2265
} ;
2219
2266
2220
2267
let bytes = vec ! [
@@ -2223,7 +2270,8 @@ pub mod test {
2223
2270
0x00 , 0x00 , 0x00 , 0x00 , // 1u32
2224
2271
0x00 , 0x00 , 0x00 , 0x01 , // 2u32
2225
2272
0x00 , 0x00 , 0x00 , 0x02 , // 3u32
2226
- 0x00 , 0x00 , 0x00 , 0x03 ,
2273
+ 0x00 , 0x00 , 0x00 , 0x03 , // num_outbound_replicas
2274
+ 0x00 , 0x00 , 0x00 , 0x04 ,
2227
2275
] ;
2228
2276
2229
2277
check_codec_and_corruption :: < StackerDBChunkInvData > ( & data, & bytes) ;
@@ -2280,6 +2328,45 @@ pub mod test {
2280
2328
check_codec_and_corruption :: < StackerDBChunkData > ( & data, & bytes) ;
2281
2329
}
2282
2330
2331
+ #[ test]
2332
+ fn codec_StackerDBPushChunkData ( ) {
2333
+ let data = StackerDBChunkData {
2334
+ slot_id : 2 ,
2335
+ slot_version : 3 ,
2336
+ sig : MessageSignature :: from_raw ( & vec ! [ 0x44 ; 65 ] ) ,
2337
+ data : vec ! [
2338
+ 0x55 , 0x66 , 0x77 , 0x88 , 0x99 , 0xaa , 0xbb , 0xcc , 0xdd , 0xee , 0xff ,
2339
+ ] ,
2340
+ } ;
2341
+
2342
+ let push_data = StackerDBPushChunkData {
2343
+ contract_id : ContractId :: parse ( "SP8QPP8TVXYAXS1VFSERG978A6WKBF59NSYJQEMN.foo" ) . unwrap ( ) ,
2344
+ rc_consensus_hash : ConsensusHash ( [ 0x01 ; 20 ] ) ,
2345
+ chunk_data : data,
2346
+ } ;
2347
+
2348
+ let bytes = vec ! [
2349
+ // SP8QPP8TVXYAXS1VFSERG978A6WKBF59NSYJQEMN
2350
+ 0x16 , 0x11 , 0x7b , 0x59 , 0x1a , 0xdf , 0x7c , 0xae , 0xe4 , 0x3b , 0x7e , 0x5d , 0x88 , 0x24 ,
2351
+ 0xe8 , 0x51 , 0xb9 , 0x35 , 0xbc , 0xa9 , 0xae , // len(foo)
2352
+ 0x03 , // foo
2353
+ 0x66 , 0x6f , 0x6f , // rc consensus hash
2354
+ 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 ,
2355
+ 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , // slot id
2356
+ 0x00 , 0x00 , 0x00 , 0x02 , // slot version
2357
+ 0x00 , 0x00 , 0x00 , 0x03 , // signature
2358
+ 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 ,
2359
+ 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 ,
2360
+ 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 ,
2361
+ 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 ,
2362
+ 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , 0x44 , // length
2363
+ 0x00 , 0x00 , 0x00 , 0x0b , // data
2364
+ 0x55 , 0x66 , 0x77 , 0x88 , 0x99 , 0xaa , 0xbb , 0xcc , 0xdd , 0xee , 0xff ,
2365
+ ] ;
2366
+
2367
+ check_codec_and_corruption :: < StackerDBPushChunkData > ( & push_data, & bytes) ;
2368
+ }
2369
+
2283
2370
#[ test]
2284
2371
fn codec_StacksMessage ( ) {
2285
2372
let payloads: Vec < StacksMessageType > = vec ! [
@@ -2429,6 +2516,7 @@ pub mod test {
2429
2516
} ) ,
2430
2517
StacksMessageType :: StackerDBChunkInv ( StackerDBChunkInvData {
2431
2518
slot_versions: vec![ 0 , 1 , 2 , 3 ] ,
2519
+ num_outbound_replicas: 4 ,
2432
2520
} ) ,
2433
2521
StacksMessageType :: StackerDBGetChunk ( StackerDBGetChunkData {
2434
2522
contract_id: ContractId :: parse( "SP8QPP8TVXYAXS1VFSERG978A6WKBF59NSYJQEMN.foo" ) . unwrap( ) ,
@@ -2442,6 +2530,16 @@ pub mod test {
2442
2530
sig: MessageSignature :: from_raw( & vec![ 0x44 ; 65 ] ) ,
2443
2531
data: vec![ 0x55 , 0x66 , 0x77 , 0x88 , 0x99 , 0xaa , 0xbb , 0xcc , 0xdd , 0xee , 0xff ]
2444
2532
} ) ,
2533
+ StacksMessageType :: StackerDBPushChunk ( StackerDBPushChunkData {
2534
+ contract_id: ContractId :: parse( "SP8QPP8TVXYAXS1VFSERG978A6WKBF59NSYJQEMN.foo" ) . unwrap( ) ,
2535
+ rc_consensus_hash: ConsensusHash ( [ 0x01 ; 20 ] ) ,
2536
+ chunk_data: StackerDBChunkData {
2537
+ slot_id: 2 ,
2538
+ slot_version: 3 ,
2539
+ sig: MessageSignature :: from_raw( & vec![ 0x44 ; 65 ] ) ,
2540
+ data: vec![ 0x55 , 0x66 , 0x77 , 0x88 , 0x99 , 0xaa , 0xbb , 0xcc , 0xdd , 0xee , 0xff ]
2541
+ }
2542
+ } ) ,
2445
2543
] ;
2446
2544
2447
2545
let mut maximal_relayers: Vec < RelayData > = vec ! [ ] ;
0 commit comments