Skip to content

Commit 8e46b60

Browse files
authored
feat: move attestation committee at the end of attestation (#6883)
1 parent c653ba8 commit 8e46b60

File tree

4 files changed

+20
-18
lines changed

4 files changed

+20
-18
lines changed

packages/beacon-node/src/chain/validation/attestation.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ async function validateGossipAttestationNoSignatureCheck(
456456
let attDataRootHex: RootHex;
457457
const signature = attestationOrCache.attestation
458458
? attestationOrCache.attestation.signature
459-
: getSignatureFromAttestationSerialized(fork, attestationOrCache.serializedData);
459+
: getSignatureFromAttestationSerialized(attestationOrCache.serializedData);
460460
if (signature === null) {
461461
throw new AttestationError(GossipAction.REJECT, {
462462
code: AttestationErrorCode.INVALID_SERIALIZED_BYTES,

packages/beacon-node/src/util/sszBytes.ts

+14-12
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ export type AttDataCommitteeBitsBase64 = string;
2626
// class Attestation(Container):
2727
// aggregation_bits: BitList[MAX_VALIDATORS_PER_COMMITTEE * MAX_COMMITTEES_PER_SLOT] - offset 4
2828
// data: AttestationData - target data - 128
29-
// committee_bits: BitVector[MAX_COMMITTEES_PER_SLOT]
3029
// signature: BLSSignature - 96
30+
// committee_bits: BitVector[MAX_COMMITTEES_PER_SLOT]
3131
//
3232
// for all forks
3333
// class AttestationData(Container): 128 bytes fixed size
@@ -82,14 +82,19 @@ export function getSeenAttDataKey(forkSeq: ForkSeq, data: Uint8Array): SeenAttDa
8282
* Return null if data is not long enough to extract attestation data.
8383
*/
8484
export function getSeenAttDataKeyElectra(electraAttestationBytes: Uint8Array): AttDataCommitteeBitsBase64 | null {
85-
const startIndex = VARIABLE_FIELD_OFFSET;
86-
const seenKeyLength = ATTESTATION_DATA_SIZE + COMMITTEE_BITS_SIZE;
85+
const attestationData = getSeenAttDataKeyPhase0(electraAttestationBytes);
8786

88-
if (electraAttestationBytes.length < startIndex + seenKeyLength) {
87+
if (attestationData === null) {
8988
return null;
9089
}
9190

92-
return toBase64(electraAttestationBytes.subarray(startIndex, startIndex + seenKeyLength));
91+
const committeeBits = getCommitteeBitsFromAttestationSerialized(electraAttestationBytes);
92+
93+
if (committeeBits === null) {
94+
return null;
95+
}
96+
97+
return attestationData + toBase64(committeeBits.uint8Array);
9398
}
9499

95100
/**
@@ -112,7 +117,7 @@ export function getSeenAttDataKeyPhase0(data: Uint8Array): AttDataBase64 | null
112117
export function getAggregationBitsFromAttestationSerialized(fork: ForkName, data: Uint8Array): BitArray | null {
113118
const aggregationBitsStartIndex =
114119
ForkSeq[fork] >= ForkSeq.electra
115-
? VARIABLE_FIELD_OFFSET + ATTESTATION_DATA_SIZE + COMMITTEE_BITS_SIZE + SIGNATURE_SIZE
120+
? VARIABLE_FIELD_OFFSET + ATTESTATION_DATA_SIZE + SIGNATURE_SIZE + COMMITTEE_BITS_SIZE
116121
: VARIABLE_FIELD_OFFSET + ATTESTATION_DATA_SIZE + SIGNATURE_SIZE;
117122

118123
if (data.length < aggregationBitsStartIndex) {
@@ -127,11 +132,8 @@ export function getAggregationBitsFromAttestationSerialized(fork: ForkName, data
127132
* Extract signature from attestation serialized bytes.
128133
* Return null if data is not long enough to extract signature.
129134
*/
130-
export function getSignatureFromAttestationSerialized(fork: ForkName, data: Uint8Array): BLSSignature | null {
131-
const signatureStartIndex =
132-
ForkSeq[fork] >= ForkSeq.electra
133-
? VARIABLE_FIELD_OFFSET + ATTESTATION_DATA_SIZE + COMMITTEE_BITS_SIZE
134-
: VARIABLE_FIELD_OFFSET + ATTESTATION_DATA_SIZE;
135+
export function getSignatureFromAttestationSerialized(data: Uint8Array): BLSSignature | null {
136+
const signatureStartIndex = VARIABLE_FIELD_OFFSET + ATTESTATION_DATA_SIZE;
135137

136138
if (data.length < signatureStartIndex + SIGNATURE_SIZE) {
137139
return null;
@@ -145,7 +147,7 @@ export function getSignatureFromAttestationSerialized(fork: ForkName, data: Uint
145147
* Return null if data is not long enough to extract committee bits.
146148
*/
147149
export function getCommitteeBitsFromAttestationSerialized(data: Uint8Array): BitArray | null {
148-
const committeeBitsStartIndex = VARIABLE_FIELD_OFFSET + ATTESTATION_DATA_SIZE;
150+
const committeeBitsStartIndex = VARIABLE_FIELD_OFFSET + ATTESTATION_DATA_SIZE + SIGNATURE_SIZE;
149151

150152
if (data.length < committeeBitsStartIndex + COMMITTEE_BITS_SIZE) {
151153
return null;

packages/beacon-node/test/unit/util/sszBytes.test.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ describe("attestation SSZ serialized picking", () => {
5454
attestation.aggregationBits.toBoolArray()
5555
);
5656
expect(getCommitteeBitsFromAttestationSerialized(bytes)).toEqual(attestation.committeeBits);
57-
expect(getSignatureFromAttestationSerialized(ForkName.electra, bytes)).toEqual(attestation.signature);
57+
expect(getSignatureFromAttestationSerialized(bytes)).toEqual(attestation.signature);
5858
} else {
5959
expect(getAggregationBitsFromAttestationSerialized(ForkName.phase0, bytes)?.toBoolArray()).toEqual(
6060
attestation.aggregationBits.toBoolArray()
6161
);
62-
expect(getSignatureFromAttestationSerialized(ForkName.phase0, bytes)).toEqual(attestation.signature);
62+
expect(getSignatureFromAttestationSerialized(bytes)).toEqual(attestation.signature);
6363
}
6464

6565
const attDataBase64 = ssz.phase0.AttestationData.serialize(attestation.data);
@@ -99,8 +99,8 @@ describe("attestation SSZ serialized picking", () => {
9999
it("getSignatureFromAttestationSerialized - invalid data", () => {
100100
const invalidSignatureDataSizes = [0, 4, 100, 128, 227];
101101
for (const size of invalidSignatureDataSizes) {
102-
expect(getSignatureFromAttestationSerialized(ForkName.phase0, Buffer.alloc(size))).toBeNull();
103-
expect(getSignatureFromAttestationSerialized(ForkName.electra, Buffer.alloc(size))).toBeNull();
102+
expect(getSignatureFromAttestationSerialized(Buffer.alloc(size))).toBeNull();
103+
expect(getSignatureFromAttestationSerialized(Buffer.alloc(size))).toBeNull();
104104
}
105105
});
106106
});

packages/types/src/electra/sszTypes.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ export const Attestation = new ContainerType(
6262
{
6363
aggregationBits: AggregationBits, // Modified in ELECTRA
6464
data: phase0Ssz.AttestationData,
65-
committeeBits: CommitteeBits, // New in ELECTRA
6665
signature: BLSSignature,
66+
committeeBits: CommitteeBits, // New in ELECTRA
6767
},
6868
{typeName: "Attestation", jsonCase: "eth2"}
6969
);

0 commit comments

Comments
 (0)