1
1
import { describe , it , expect } from "vitest" ;
2
2
import { BitArray } from "@chainsafe/ssz" ;
3
- import { allForks , deneb , Epoch , isElectraAttestation , phase0 , RootHex , Slot , ssz } from "@lodestar/types" ;
3
+ import { allForks , deneb , electra , Epoch , isElectraAttestation , phase0 , RootHex , Slot , ssz } from "@lodestar/types" ;
4
4
import { fromHex , toHex } from "@lodestar/utils" ;
5
5
import { ForkName , MAX_COMMITTEES_PER_SLOT } from "@lodestar/params" ;
6
6
import {
7
7
getSeenAttDataKeyPhase0 ,
8
- getAttDataBase64FromSignedAggregateAndProofSerialized ,
8
+ getSeenAttDataKeyFromSignedAggregateAndProofPhase0 ,
9
9
getAggregationBitsFromAttestationSerialized as getAggregationBitsFromAttestationSerialized ,
10
10
getBlockRootFromAttestationSerialized ,
11
11
getBlockRootFromSignedAggregateAndProofSerialized ,
@@ -15,6 +15,7 @@ import {
15
15
getSlotFromSignedBeaconBlockSerialized ,
16
16
getSlotFromBlobSidecarSerialized ,
17
17
getCommitteeBitsFromAttestationSerialized ,
18
+ getSeenAttDataKeyFromSignedAggregateAndProofElectra ,
18
19
} from "../../../src/util/sszBytes.js" ;
19
20
20
21
describe ( "attestation SSZ serialized picking" , ( ) => {
@@ -104,16 +105,15 @@ describe("attestation SSZ serialized picking", () => {
104
105
} ) ;
105
106
} ) ;
106
107
107
- describe ( "aggregateAndProof SSZ serialized picking" , ( ) => {
108
+ describe ( "phase0 SignedAggregateAndProof SSZ serialized picking" , ( ) => {
108
109
const testCases : phase0 . SignedAggregateAndProof [ ] = [
109
110
ssz . phase0 . SignedAggregateAndProof . defaultValue ( ) ,
110
- signedAggregateAndProofFromValues (
111
+ phase0SignedAggregateAndProofFromValues (
111
112
4_000_000 ,
112
113
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" ,
113
114
200_00 ,
114
115
"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffffffffff"
115
116
) ,
116
- ssz . electra . SignedAggregateAndProof . defaultValue ( ) ,
117
117
] ;
118
118
119
119
for ( const [ i , signedAggregateAndProof ] of testCases . entries ( ) ) {
@@ -128,7 +128,7 @@ describe("aggregateAndProof SSZ serialized picking", () => {
128
128
) ;
129
129
130
130
const attDataBase64 = ssz . phase0 . AttestationData . serialize ( signedAggregateAndProof . message . aggregate . data ) ;
131
- expect ( getAttDataBase64FromSignedAggregateAndProofSerialized ( bytes ) ) . toBe (
131
+ expect ( getSeenAttDataKeyFromSignedAggregateAndProofPhase0 ( bytes ) ) . toBe (
132
132
Buffer . from ( attDataBase64 ) . toString ( "base64" )
133
133
) ;
134
134
} ) ;
@@ -151,7 +151,60 @@ describe("aggregateAndProof SSZ serialized picking", () => {
151
151
it ( "getAttDataBase64FromSignedAggregateAndProofSerialized - invalid data" , ( ) => {
152
152
const invalidAttDataBase64DataSizes = [ 0 , 4 , 100 , 128 , 339 ] ;
153
153
for ( const size of invalidAttDataBase64DataSizes ) {
154
- expect ( getAttDataBase64FromSignedAggregateAndProofSerialized ( Buffer . alloc ( size ) ) ) . toBeNull ( ) ;
154
+ expect ( getSeenAttDataKeyFromSignedAggregateAndProofPhase0 ( Buffer . alloc ( size ) ) ) . toBeNull ( ) ;
155
+ }
156
+ } ) ;
157
+ } ) ;
158
+
159
+ describe ( "electra SignedAggregateAndProof SSZ serialized picking" , ( ) => {
160
+ const testCases : electra . SignedAggregateAndProof [ ] = [
161
+ ssz . electra . SignedAggregateAndProof . defaultValue ( ) ,
162
+ electraSignedAggregateAndProofFromValues (
163
+ 4_000_000 ,
164
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" ,
165
+ 200_00 ,
166
+ "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffffffffff"
167
+ ) ,
168
+ ] ;
169
+
170
+ for ( const [ i , signedAggregateAndProof ] of testCases . entries ( ) ) {
171
+ it ( `signedAggregateAndProof ${ i } ` , ( ) => {
172
+ const bytes = ssz . electra . SignedAggregateAndProof . serialize ( signedAggregateAndProof ) ;
173
+
174
+ expect ( getSlotFromSignedAggregateAndProofSerialized ( bytes ) ) . toBe (
175
+ signedAggregateAndProof . message . aggregate . data . slot
176
+ ) ;
177
+ expect ( getBlockRootFromSignedAggregateAndProofSerialized ( bytes ) ) . toBe (
178
+ toHex ( signedAggregateAndProof . message . aggregate . data . beaconBlockRoot )
179
+ ) ;
180
+
181
+ const attDataBase64 = ssz . phase0 . AttestationData . serialize ( signedAggregateAndProof . message . aggregate . data ) ;
182
+ const committeeBits = ssz . electra . CommitteeBits . serialize (
183
+ signedAggregateAndProof . message . aggregate . committeeBits
184
+ ) ;
185
+ const seenKey = Buffer . concat ( [ attDataBase64 , committeeBits ] ) . toString ( "base64" ) ;
186
+ expect ( getSeenAttDataKeyFromSignedAggregateAndProofElectra ( bytes ) ) . toBe ( seenKey ) ;
187
+ } ) ;
188
+ }
189
+
190
+ it ( "getSlotFromSignedAggregateAndProofSerialized - invalid data" , ( ) => {
191
+ const invalidSlotDataSizes = [ 0 , 4 , 11 ] ;
192
+ for ( const size of invalidSlotDataSizes ) {
193
+ expect ( getSlotFromSignedAggregateAndProofSerialized ( Buffer . alloc ( size ) ) ) . toBeNull ( ) ;
194
+ }
195
+ } ) ;
196
+
197
+ it ( "getBlockRootFromSignedAggregateAndProofSerialized - invalid data" , ( ) => {
198
+ const invalidBlockRootDataSizes = [ 0 , 4 , 20 , 227 ] ;
199
+ for ( const size of invalidBlockRootDataSizes ) {
200
+ expect ( getBlockRootFromSignedAggregateAndProofSerialized ( Buffer . alloc ( size ) ) ) . toBeNull ( ) ;
201
+ }
202
+ } ) ;
203
+
204
+ it ( "getAttDataBase64FromSignedAggregateAndProofSerialized - invalid data" , ( ) => {
205
+ const invalidAttDataBase64DataSizes = [ 0 , 4 , 100 , 128 , 339 ] ;
206
+ for ( const size of invalidAttDataBase64DataSizes ) {
207
+ expect ( getSeenAttDataKeyFromSignedAggregateAndProofPhase0 ( Buffer . alloc ( size ) ) ) . toBeNull ( ) ;
155
208
}
156
209
} ) ;
157
210
} ) ;
@@ -206,7 +259,7 @@ function attestationFromValues(
206
259
return attestation ;
207
260
}
208
261
209
- function signedAggregateAndProofFromValues (
262
+ function phase0SignedAggregateAndProofFromValues (
210
263
slot : Slot ,
211
264
blockRoot : RootHex ,
212
265
targetEpoch : Epoch ,
@@ -220,6 +273,21 @@ function signedAggregateAndProofFromValues(
220
273
return signedAggregateAndProof ;
221
274
}
222
275
276
+ function electraSignedAggregateAndProofFromValues (
277
+ slot : Slot ,
278
+ blockRoot : RootHex ,
279
+ targetEpoch : Epoch ,
280
+ targetRoot : RootHex
281
+ ) : electra . SignedAggregateAndProof {
282
+ const signedAggregateAndProof = ssz . electra . SignedAggregateAndProof . defaultValue ( ) ;
283
+ signedAggregateAndProof . message . aggregate . data . slot = slot ;
284
+ signedAggregateAndProof . message . aggregate . data . beaconBlockRoot = fromHex ( blockRoot ) ;
285
+ signedAggregateAndProof . message . aggregate . data . target . epoch = targetEpoch ;
286
+ signedAggregateAndProof . message . aggregate . data . target . root = fromHex ( targetRoot ) ;
287
+ signedAggregateAndProof . message . aggregate . committeeBits = BitArray . fromSingleBit ( MAX_COMMITTEES_PER_SLOT , 1 ) ;
288
+ return signedAggregateAndProof ;
289
+ }
290
+
223
291
function signedBeaconBlockFromValues ( slot : Slot ) : phase0 . SignedBeaconBlock {
224
292
const signedBeaconBlock = ssz . phase0 . SignedBeaconBlock . defaultValue ( ) ;
225
293
signedBeaconBlock . message . slot = slot ;
0 commit comments