diff --git a/beacon/types/committee.go b/beacon/types/committee.go index 9d3b9ff9e..5f89c2755 100644 --- a/beacon/types/committee.go +++ b/beacon/types/committee.go @@ -164,44 +164,21 @@ func (sc *SyncCommittee) VerifySignature(signingRoot common.Hash, signature *Syn return bls.FastAggregateVerify(keys, signingRoot[:], &sig) } +//go:generate go run github.com/fjl/gencodec -type SyncAggregate -field-override syncAggregateMarshaling -out gen_syncaggregate_json.go + // SyncAggregate represents an aggregated BLS signature with Signers referring // to a subset of the corresponding sync committee. // // See data structure definition here: // https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/beacon-chain.md#syncaggregate type SyncAggregate struct { - Signers [params.SyncCommitteeBitmaskSize]byte - Signature [params.BLSSignatureSize]byte + Signers [params.SyncCommitteeBitmaskSize]byte `gencodec:"required" json:"sync_committee_bits"` + Signature [params.BLSSignatureSize]byte `gencodec:"required" json:"sync_committee_signature"` } -type jsonSyncAggregate struct { - Signers hexutil.Bytes `json:"sync_committee_bits"` - Signature hexutil.Bytes `json:"sync_committee_signature"` -} - -// MarshalJSON implements json.Marshaler. -func (s *SyncAggregate) MarshalJSON() ([]byte, error) { - return json.Marshal(&jsonSyncAggregate{ - Signers: s.Signers[:], - Signature: s.Signature[:], - }) -} - -// UnmarshalJSON implements json.Marshaler. -func (s *SyncAggregate) UnmarshalJSON(input []byte) error { - var sc jsonSyncAggregate - if err := json.Unmarshal(input, &sc); err != nil { - return err - } - if len(sc.Signers) != params.SyncCommitteeBitmaskSize { - return fmt.Errorf("invalid signature bitmask size %d", len(sc.Signers)) - } - if len(sc.Signature) != params.BLSSignatureSize { - return fmt.Errorf("invalid signature size %d", len(sc.Signature)) - } - copy(s.Signers[:], sc.Signers) - copy(s.Signature[:], sc.Signature) - return nil +type syncAggregateMarshaling struct { + Signers hexutil.Bytes + Signature hexutil.Bytes } // SignerCount returns the number of signers in the aggregate signature. diff --git a/beacon/types/gen_syncaggregate_json.go b/beacon/types/gen_syncaggregate_json.go new file mode 100644 index 000000000..1547ec5f0 --- /dev/null +++ b/beacon/types/gen_syncaggregate_json.go @@ -0,0 +1,51 @@ +// Code generated by github.com/fjl/gencodec. DO NOT EDIT. + +package types + +import ( + "encoding/json" + "errors" + + "github.com/ethereum/go-ethereum/common/hexutil" +) + +var _ = (*syncAggregateMarshaling)(nil) + +// MarshalJSON marshals as JSON. +func (s SyncAggregate) MarshalJSON() ([]byte, error) { + type SyncAggregate struct { + Signers hexutil.Bytes `gencodec:"required" json:"sync_committee_bits"` + Signature hexutil.Bytes `gencodec:"required" json:"sync_committee_signature"` + } + var enc SyncAggregate + enc.Signers = s.Signers[:] + enc.Signature = s.Signature[:] + return json.Marshal(&enc) +} + +// UnmarshalJSON unmarshals from JSON. +func (s *SyncAggregate) UnmarshalJSON(input []byte) error { + type SyncAggregate struct { + Signers *hexutil.Bytes `gencodec:"required" json:"sync_committee_bits"` + Signature *hexutil.Bytes `gencodec:"required" json:"sync_committee_signature"` + } + var dec SyncAggregate + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + if dec.Signers == nil { + return errors.New("missing required field 'sync_committee_bits' for SyncAggregate") + } + if len(*dec.Signers) != len(s.Signers) { + return errors.New("field 'sync_committee_bits' has wrong length, need 64 items") + } + copy(s.Signers[:], *dec.Signers) + if dec.Signature == nil { + return errors.New("missing required field 'sync_committee_signature' for SyncAggregate") + } + if len(*dec.Signature) != len(s.Signature) { + return errors.New("field 'sync_committee_signature' has wrong length, need 96 items") + } + copy(s.Signature[:], *dec.Signature) + return nil +}