Skip to content

Commit

Permalink
Merge pull request #163 from pk910/pk910/spec-15.0-alpha.6
Browse files Browse the repository at this point in the history
update electra specs to `v1.5.0-alpha.6`
  • Loading branch information
mcdee authored Sep 25, 2024
2 parents 07eba3e + 01a8d4d commit 393fff1
Show file tree
Hide file tree
Showing 48 changed files with 1,002 additions and 1,930 deletions.
5 changes: 5 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@ output:

# All available settings of specific linters.
linters-settings:
gosec:
excludes:
- G115 # This generates a lot of false positives.

lll:
line-length: 132

Expand Down Expand Up @@ -162,6 +166,7 @@ linters:
- execinquery
- exhaustive
- exhaustruct
- exportloopref
- forcetypeassert
- funlen
- gci
Expand Down
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
dev:
- add attester_slashing, block_gossip, bls_to_execution_change and proposer_slashing events

0.21.10:
- better validator state when balance not supplied

Expand Down
11 changes: 8 additions & 3 deletions api/attestationpoolopts.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright © 2023 Attestant Limited.
// Copyright © 2023, 2024 Attestant Limited.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
Expand All @@ -19,6 +19,11 @@ import "github.com/attestantio/go-eth2-client/spec/phase0"
type AttestationPoolOpts struct {
Common CommonOpts

// Slot is the slot for which the data is obtained.
Slot phase0.Slot
// Slot is the slot for which the data is obtained. If not present then
// data for all slots will be obtained.
Slot *phase0.Slot

// CommmitteeIndex is the committee index for which the data is obtained.
// If not present then data for all committee indices will be obtained.
CommitteeIndex *phase0.CommitteeIndex
}
86 changes: 86 additions & 0 deletions api/v1/blockgossipevent.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// Copyright © 2024 Attestant Limited.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package v1

import (
"encoding/hex"
"encoding/json"
"fmt"
"strconv"
"strings"

"github.com/attestantio/go-eth2-client/spec/phase0"
"github.com/pkg/errors"
)

// BlockGossipEvent is the data for the block gossip event.
type BlockGossipEvent struct {
Slot phase0.Slot
Block phase0.Root
}

// blockGossipEventJSON is the spec representation of the struct.
type blockGossipEventJSON struct {
Slot string `json:"slot"`
Block string `json:"block"`
}

// MarshalJSON implements json.Marshaler.
func (e *BlockGossipEvent) MarshalJSON() ([]byte, error) {
return json.Marshal(&blockGossipEventJSON{
Slot: fmt.Sprintf("%d", e.Slot),
Block: fmt.Sprintf("%#x", e.Block),
})
}

// UnmarshalJSON implements json.Unmarshaler.
func (e *BlockGossipEvent) UnmarshalJSON(input []byte) error {
var err error

var data blockGossipEventJSON
if err = json.Unmarshal(input, &data); err != nil {
return errors.Wrap(err, "invalid JSON")
}
if data.Slot == "" {
return errors.New("slot missing")
}
slot, err := strconv.ParseUint(data.Slot, 10, 64)
if err != nil {
return errors.Wrap(err, "invalid value for slot")
}
e.Slot = phase0.Slot(slot)
if data.Block == "" {
return errors.New("block missing")
}
block, err := hex.DecodeString(strings.TrimPrefix(data.Block, "0x"))
if err != nil {
return errors.Wrap(err, "invalid value for block")
}
if len(block) != rootLength {
return fmt.Errorf("incorrect length %d for block", len(block))
}
copy(e.Block[:], block)

return nil
}

// String returns a string version of the structure.
func (e *BlockGossipEvent) String() string {
data, err := json.Marshal(e)
if err != nil {
return fmt.Sprintf("ERR: %v", err)
}

return string(data)
}
101 changes: 101 additions & 0 deletions api/v1/blockgossipevent_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// Copyright © 2024 Attestant Limited.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package v1_test

import (
"encoding/json"
"testing"

api "github.com/attestantio/go-eth2-client/api/v1"
"github.com/stretchr/testify/assert"
require "github.com/stretchr/testify/require"
)

func TestBlockGossipEventJSON(t *testing.T) {
tests := []struct {
name string
input []byte
err string
}{
{
name: "Empty",
err: "unexpected end of JSON input",
},
{
name: "JSONBad",
input: []byte("[]"),
err: "invalid JSON: json: cannot unmarshal array into Go value of type v1.blockGossipEventJSON",
},
{
name: "SlotMissing",
input: []byte(`{"block":"0x99e3f24aab3dd084045a0c927a33b8463eb5c7b17eeadfecdcf4e4badf7b6028"}`),
err: "slot missing",
},
{
name: "SlotWrongType",
input: []byte(`{"slot":true,"block":"0x99e3f24aab3dd084045a0c927a33b8463eb5c7b17eeadfecdcf4e4badf7b6028"}`),
err: "invalid JSON: json: cannot unmarshal bool into Go struct field blockGossipEventJSON.slot of type string",
},
{
name: "SlotInvalid",
input: []byte(`{"slot":"-1","block":"0x99e3f24aab3dd084045a0c927a33b8463eb5c7b17eeadfecdcf4e4badf7b6028"}`),
err: "invalid value for slot: strconv.ParseUint: parsing \"-1\": invalid syntax",
},
{
name: "BlockMissing",
input: []byte(`{"slot":"525277"}`),
err: "block missing",
},
{
name: "BlockWrongType",
input: []byte(`{"slot":"525277","block":true}`),
err: "invalid JSON: json: cannot unmarshal bool into Go struct field blockGossipEventJSON.block of type string",
},
{
name: "BlockInvalid",
input: []byte(`{"slot":"525277","block":"invalid"}`),
err: "invalid value for block: encoding/hex: invalid byte: U+0069 'i'",
},
{
name: "BlockShort",
input: []byte(`{"slot":"525277","block":"0xe3f24aab3dd084045a0c927a33b8463eb5c7b17eeadfecdcf4e4badf7b6028"}`),
err: "incorrect length 31 for block",
},
{
name: "BlockLong",
input: []byte(`{"slot":"525277","block":"0x9999e3f24aab3dd084045a0c927a33b8463eb5c7b17eeadfecdcf4e4badf7b6028"}`),
err: "incorrect length 33 for block",
},
{
name: "Good",
input: []byte(`{"slot":"525277","block":"0x99e3f24aab3dd084045a0c927a33b8463eb5c7b17eeadfecdcf4e4badf7b6028"}`),
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
var res api.BlockGossipEvent
err := json.Unmarshal(test.input, &res)
if test.err != "" {
require.EqualError(t, err, test.err)
} else {
require.NoError(t, err)
rt, err := json.Marshal(&res)
require.NoError(t, err)
assert.Equal(t, string(test.input), string(rt))
assert.Equal(t, string(rt), res.String())
}
})
}
}
3 changes: 2 additions & 1 deletion api/v1/electra/blindedbeaconblockbody.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,10 @@ type BlindedBeaconBlockBody struct {
Deposits []*phase0.Deposit `ssz-max:"16"`
VoluntaryExits []*phase0.SignedVoluntaryExit `ssz-max:"16"`
SyncAggregate *altair.SyncAggregate
ExecutionPayloadHeader *electra.ExecutionPayloadHeader
ExecutionPayloadHeader *deneb.ExecutionPayloadHeader
BLSToExecutionChanges []*capella.SignedBLSToExecutionChange `ssz-max:"16"`
BlobKZGCommitments []deneb.KZGCommitment `ssz-max:"4096" ssz-size:"?,48"`
ExecutionRequests *electra.ExecutionRequests
}

// String returns a string version of the structure.
Expand Down
4 changes: 3 additions & 1 deletion api/v1/electra/blindedbeaconblockbody_json.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,10 @@ type blindedBeaconBlockBodyJSON struct {
Deposits []*phase0.Deposit `json:"deposits"`
VoluntaryExits []*phase0.SignedVoluntaryExit `json:"voluntary_exits"`
SyncAggregate *altair.SyncAggregate `json:"sync_aggregate"`
ExecutionPayloadHeader *electra.ExecutionPayloadHeader `json:"execution_payload_header"`
ExecutionPayloadHeader *deneb.ExecutionPayloadHeader `json:"execution_payload_header"`
BLSToExecutionChanges []*capella.SignedBLSToExecutionChange `json:"bls_to_execution_changes"`
BlobKZGCommitments []string `json:"blob_kzg_commitments"`
ExecutionRequests *electra.ExecutionRequests `json:"execution_requests"`
}

// MarshalJSON implements json.Marshaler.
Expand All @@ -64,6 +65,7 @@ func (b *BlindedBeaconBlockBody) MarshalJSON() ([]byte, error) {
ExecutionPayloadHeader: b.ExecutionPayloadHeader,
BLSToExecutionChanges: b.BLSToExecutionChanges,
BlobKZGCommitments: blobKZGCommitments,
ExecutionRequests: b.ExecutionRequests,
})
}

Expand Down
Loading

0 comments on commit 393fff1

Please sign in to comment.