mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-09 15:37:56 -05:00
* WIP * WIP * WIP * Remove unused parameter * Address PR comments Co-authored-by: Radosław Kapka <rkapka@wp.pl>
1188 lines
32 KiB
Go
1188 lines
32 KiB
Go
package beacon_api
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
"github.com/prysmaticlabs/prysm/v3/beacon-chain/rpc/apimiddleware"
|
|
ethpb "github.com/prysmaticlabs/prysm/v3/proto/prysm/v1alpha1"
|
|
"github.com/prysmaticlabs/prysm/v3/testing/assert"
|
|
"github.com/prysmaticlabs/prysm/v3/testing/require"
|
|
)
|
|
|
|
func TestBeaconBlockProtoHelpers_ConvertProposerSlashingsToProto(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
generateInput func() []*apimiddleware.ProposerSlashingJson
|
|
expectedResult []*ethpb.ProposerSlashing
|
|
expectedErrorMessage string
|
|
}{
|
|
{
|
|
name: "nil proposer slashing",
|
|
expectedErrorMessage: "proposer slashing at index `0` is nil",
|
|
generateInput: func() []*apimiddleware.ProposerSlashingJson {
|
|
return []*apimiddleware.ProposerSlashingJson{
|
|
nil,
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "bad header 1",
|
|
expectedErrorMessage: "failed to get proposer header 1",
|
|
generateInput: func() []*apimiddleware.ProposerSlashingJson {
|
|
return []*apimiddleware.ProposerSlashingJson{
|
|
{
|
|
Header_1: nil,
|
|
Header_2: nil,
|
|
},
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "bad header 2",
|
|
expectedErrorMessage: "failed to get proposer header 2",
|
|
generateInput: func() []*apimiddleware.ProposerSlashingJson {
|
|
input := generateProposerSlashings()
|
|
input[0].Header_2 = nil
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "valid",
|
|
generateInput: generateProposerSlashings,
|
|
expectedResult: []*ethpb.ProposerSlashing{
|
|
{
|
|
Header_1: ðpb.SignedBeaconBlockHeader{
|
|
Header: ðpb.BeaconBlockHeader{
|
|
Slot: 1,
|
|
ProposerIndex: 2,
|
|
ParentRoot: []byte{3},
|
|
StateRoot: []byte{4},
|
|
BodyRoot: []byte{5},
|
|
},
|
|
Signature: []byte{6},
|
|
},
|
|
Header_2: ðpb.SignedBeaconBlockHeader{
|
|
Header: ðpb.BeaconBlockHeader{
|
|
Slot: 7,
|
|
ProposerIndex: 8,
|
|
ParentRoot: []byte{9},
|
|
StateRoot: []byte{10},
|
|
BodyRoot: []byte{11},
|
|
},
|
|
Signature: []byte{12},
|
|
},
|
|
},
|
|
{
|
|
Header_1: ðpb.SignedBeaconBlockHeader{
|
|
Header: ðpb.BeaconBlockHeader{
|
|
Slot: 13,
|
|
ProposerIndex: 14,
|
|
ParentRoot: []byte{15},
|
|
StateRoot: []byte{16},
|
|
BodyRoot: []byte{17},
|
|
},
|
|
Signature: []byte{18},
|
|
},
|
|
Header_2: ðpb.SignedBeaconBlockHeader{
|
|
Header: ðpb.BeaconBlockHeader{
|
|
Slot: 19,
|
|
ProposerIndex: 20,
|
|
ParentRoot: []byte{21},
|
|
StateRoot: []byte{22},
|
|
BodyRoot: []byte{23},
|
|
},
|
|
Signature: []byte{24},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, testCase := range testCases {
|
|
t.Run(testCase.name, func(t *testing.T) {
|
|
result, err := convertProposerSlashingsToProto(testCase.generateInput())
|
|
|
|
if testCase.expectedResult != nil {
|
|
require.NoError(t, err)
|
|
assert.DeepEqual(t, testCase.expectedResult, result)
|
|
} else if testCase.expectedErrorMessage != "" {
|
|
assert.ErrorContains(t, testCase.expectedErrorMessage, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBeaconBlockProtoHelpers_ConvertProposerSlashingSignedHeaderToProto(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
generateInput func() *apimiddleware.SignedBeaconBlockHeaderJson
|
|
expectedResult *ethpb.SignedBeaconBlockHeader
|
|
expectedErrorMessage string
|
|
}{
|
|
{
|
|
name: "nil signed header",
|
|
expectedErrorMessage: "signed header is nil",
|
|
generateInput: func() *apimiddleware.SignedBeaconBlockHeaderJson { return nil },
|
|
},
|
|
{
|
|
name: "nil header",
|
|
expectedErrorMessage: "header is nil",
|
|
generateInput: func() *apimiddleware.SignedBeaconBlockHeaderJson {
|
|
input := generateSignedBeaconBlockHeader()
|
|
input.Header = nil
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad slot",
|
|
expectedErrorMessage: "failed to parse header slot `foo`",
|
|
generateInput: func() *apimiddleware.SignedBeaconBlockHeaderJson {
|
|
input := generateSignedBeaconBlockHeader()
|
|
input.Header.Slot = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad proposer index",
|
|
expectedErrorMessage: "failed to parse header proposer index `bar`",
|
|
generateInput: func() *apimiddleware.SignedBeaconBlockHeaderJson {
|
|
input := generateSignedBeaconBlockHeader()
|
|
input.Header.ProposerIndex = "bar"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad parent root",
|
|
expectedErrorMessage: "failed to decode header parent root `foo`",
|
|
generateInput: func() *apimiddleware.SignedBeaconBlockHeaderJson {
|
|
input := generateSignedBeaconBlockHeader()
|
|
input.Header.ParentRoot = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad state root",
|
|
expectedErrorMessage: "failed to decode header state root `bar`",
|
|
generateInput: func() *apimiddleware.SignedBeaconBlockHeaderJson {
|
|
input := generateSignedBeaconBlockHeader()
|
|
input.Header.StateRoot = "bar"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad body root",
|
|
expectedErrorMessage: "failed to decode header body root `foo`",
|
|
generateInput: func() *apimiddleware.SignedBeaconBlockHeaderJson {
|
|
input := generateSignedBeaconBlockHeader()
|
|
input.Header.BodyRoot = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad parent root",
|
|
expectedErrorMessage: "failed to decode signature `bar`",
|
|
generateInput: func() *apimiddleware.SignedBeaconBlockHeaderJson {
|
|
input := generateSignedBeaconBlockHeader()
|
|
input.Signature = "bar"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "valid",
|
|
generateInput: generateSignedBeaconBlockHeader,
|
|
expectedResult: ðpb.SignedBeaconBlockHeader{
|
|
Header: ðpb.BeaconBlockHeader{
|
|
Slot: 1,
|
|
ProposerIndex: 2,
|
|
ParentRoot: []byte{3},
|
|
StateRoot: []byte{4},
|
|
BodyRoot: []byte{5},
|
|
},
|
|
Signature: []byte{6},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, testCase := range testCases {
|
|
t.Run(testCase.name, func(t *testing.T) {
|
|
result, err := convertProposerSlashingSignedHeaderToProto(testCase.generateInput())
|
|
|
|
if testCase.expectedResult != nil {
|
|
require.NoError(t, err)
|
|
assert.DeepEqual(t, testCase.expectedResult, result)
|
|
} else if testCase.expectedErrorMessage != "" {
|
|
assert.ErrorContains(t, testCase.expectedErrorMessage, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBeaconBlockProtoHelpers_ConvertAttesterSlashingsToProto(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
generateInput func() []*apimiddleware.AttesterSlashingJson
|
|
expectedResult []*ethpb.AttesterSlashing
|
|
expectedErrorMessage string
|
|
}{
|
|
{
|
|
name: "nil attester slashing",
|
|
expectedErrorMessage: "attester slashing at index `0` is nil",
|
|
generateInput: func() []*apimiddleware.AttesterSlashingJson {
|
|
return []*apimiddleware.AttesterSlashingJson{
|
|
nil,
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "bad attestation 1",
|
|
expectedErrorMessage: "failed to get attestation 1",
|
|
generateInput: func() []*apimiddleware.AttesterSlashingJson {
|
|
return []*apimiddleware.AttesterSlashingJson{
|
|
{
|
|
Attestation_1: nil,
|
|
Attestation_2: nil,
|
|
},
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "bad attestation 2",
|
|
expectedErrorMessage: "failed to get attestation 2",
|
|
generateInput: func() []*apimiddleware.AttesterSlashingJson {
|
|
input := generateAttesterSlashings()
|
|
input[0].Attestation_2 = nil
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "valid",
|
|
generateInput: generateAttesterSlashings,
|
|
expectedResult: []*ethpb.AttesterSlashing{
|
|
{
|
|
Attestation_1: ðpb.IndexedAttestation{
|
|
AttestingIndices: []uint64{1, 2},
|
|
Data: ðpb.AttestationData{
|
|
Slot: 3,
|
|
CommitteeIndex: 4,
|
|
BeaconBlockRoot: []byte{5},
|
|
Source: ðpb.Checkpoint{
|
|
Epoch: 6,
|
|
Root: []byte{7},
|
|
},
|
|
Target: ðpb.Checkpoint{
|
|
Epoch: 8,
|
|
Root: []byte{9},
|
|
},
|
|
},
|
|
Signature: []byte{10},
|
|
},
|
|
Attestation_2: ðpb.IndexedAttestation{
|
|
AttestingIndices: []uint64{11, 12},
|
|
Data: ðpb.AttestationData{
|
|
Slot: 13,
|
|
CommitteeIndex: 14,
|
|
BeaconBlockRoot: []byte{15},
|
|
Source: ðpb.Checkpoint{
|
|
Epoch: 16,
|
|
Root: []byte{17},
|
|
},
|
|
Target: ðpb.Checkpoint{
|
|
Epoch: 18,
|
|
Root: []byte{19},
|
|
},
|
|
},
|
|
Signature: []byte{20},
|
|
},
|
|
},
|
|
{
|
|
Attestation_1: ðpb.IndexedAttestation{
|
|
AttestingIndices: []uint64{21, 22},
|
|
Data: ðpb.AttestationData{
|
|
Slot: 23,
|
|
CommitteeIndex: 24,
|
|
BeaconBlockRoot: []byte{25},
|
|
Source: ðpb.Checkpoint{
|
|
Epoch: 26,
|
|
Root: []byte{27},
|
|
},
|
|
Target: ðpb.Checkpoint{
|
|
Epoch: 28,
|
|
Root: []byte{29},
|
|
},
|
|
},
|
|
Signature: []byte{30},
|
|
},
|
|
Attestation_2: ðpb.IndexedAttestation{
|
|
AttestingIndices: []uint64{31, 32},
|
|
Data: ðpb.AttestationData{
|
|
Slot: 33,
|
|
CommitteeIndex: 34,
|
|
BeaconBlockRoot: []byte{35},
|
|
Source: ðpb.Checkpoint{
|
|
Epoch: 36,
|
|
Root: []byte{37},
|
|
},
|
|
Target: ðpb.Checkpoint{
|
|
Epoch: 38,
|
|
Root: []byte{39},
|
|
},
|
|
},
|
|
Signature: []byte{40},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, testCase := range testCases {
|
|
t.Run(testCase.name, func(t *testing.T) {
|
|
result, err := convertAttesterSlashingsToProto(testCase.generateInput())
|
|
|
|
if testCase.expectedResult != nil {
|
|
require.NoError(t, err)
|
|
assert.DeepEqual(t, testCase.expectedResult, result)
|
|
} else if testCase.expectedErrorMessage != "" {
|
|
assert.ErrorContains(t, testCase.expectedErrorMessage, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBeaconBlockProtoHelpers_ConvertAttestationToProto(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
generateInput func() *apimiddleware.IndexedAttestationJson
|
|
expectedResult *ethpb.IndexedAttestation
|
|
expectedErrorMessage string
|
|
}{
|
|
{
|
|
name: "nil indexed attestation",
|
|
expectedErrorMessage: "indexed attestation is nil",
|
|
generateInput: func() *apimiddleware.IndexedAttestationJson { return nil },
|
|
},
|
|
{
|
|
name: "bad attesting index",
|
|
expectedErrorMessage: "failed to parse attesting index `foo`",
|
|
generateInput: func() *apimiddleware.IndexedAttestationJson {
|
|
input := generateIndexedAttestation()
|
|
input.AttestingIndices[0] = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad signature",
|
|
expectedErrorMessage: "failed to decode attestation signature `bar`",
|
|
generateInput: func() *apimiddleware.IndexedAttestationJson {
|
|
input := generateIndexedAttestation()
|
|
input.Signature = "bar"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad data",
|
|
expectedErrorMessage: "failed to get attestation data",
|
|
generateInput: func() *apimiddleware.IndexedAttestationJson {
|
|
input := generateIndexedAttestation()
|
|
input.Data = nil
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "valid",
|
|
generateInput: generateIndexedAttestation,
|
|
expectedResult: ðpb.IndexedAttestation{
|
|
AttestingIndices: []uint64{1, 2},
|
|
Data: ðpb.AttestationData{
|
|
Slot: 3,
|
|
CommitteeIndex: 4,
|
|
BeaconBlockRoot: []byte{5},
|
|
Source: ðpb.Checkpoint{
|
|
Epoch: 6,
|
|
Root: []byte{7},
|
|
},
|
|
Target: ðpb.Checkpoint{
|
|
Epoch: 8,
|
|
Root: []byte{9},
|
|
},
|
|
},
|
|
Signature: []byte{10},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, testCase := range testCases {
|
|
t.Run(testCase.name, func(t *testing.T) {
|
|
result, err := convertAttestationToProto(testCase.generateInput())
|
|
|
|
if testCase.expectedResult != nil {
|
|
require.NoError(t, err)
|
|
assert.DeepEqual(t, testCase.expectedResult, result)
|
|
} else if testCase.expectedErrorMessage != "" {
|
|
assert.ErrorContains(t, testCase.expectedErrorMessage, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBeaconBlockProtoHelpers_ConvertCheckpointToProto(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
generateInput func() *apimiddleware.CheckpointJson
|
|
expectedResult *ethpb.Checkpoint
|
|
expectedErrorMessage string
|
|
}{
|
|
{
|
|
name: "nil checkpoint",
|
|
expectedErrorMessage: "checkpoint is nil",
|
|
generateInput: func() *apimiddleware.CheckpointJson { return nil },
|
|
},
|
|
{
|
|
name: "bad epoch",
|
|
expectedErrorMessage: "failed to parse checkpoint epoch `foo`",
|
|
generateInput: func() *apimiddleware.CheckpointJson {
|
|
input := generateCheckpoint()
|
|
input.Epoch = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad root",
|
|
expectedErrorMessage: "failed to decode checkpoint root `bar`",
|
|
generateInput: func() *apimiddleware.CheckpointJson {
|
|
input := generateCheckpoint()
|
|
input.Root = "bar"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "valid",
|
|
generateInput: generateCheckpoint,
|
|
expectedResult: ðpb.Checkpoint{
|
|
Epoch: 1,
|
|
Root: []byte{2},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, testCase := range testCases {
|
|
t.Run(testCase.name, func(t *testing.T) {
|
|
result, err := convertCheckpointToProto(testCase.generateInput())
|
|
|
|
if testCase.expectedResult != nil {
|
|
require.NoError(t, err)
|
|
assert.DeepEqual(t, testCase.expectedResult, result)
|
|
} else if testCase.expectedErrorMessage != "" {
|
|
assert.ErrorContains(t, testCase.expectedErrorMessage, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBeaconBlockProtoHelpers_ConvertAttestationsToProto(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
generateInput func() []*apimiddleware.AttestationJson
|
|
expectedResult []*ethpb.Attestation
|
|
expectedErrorMessage string
|
|
}{
|
|
{
|
|
name: "nil attestation",
|
|
expectedErrorMessage: "attestation at index `0` is nil",
|
|
generateInput: func() []*apimiddleware.AttestationJson {
|
|
return []*apimiddleware.AttestationJson{
|
|
nil,
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "bad aggregation bits",
|
|
expectedErrorMessage: "failed to decode aggregation bits `foo`",
|
|
generateInput: func() []*apimiddleware.AttestationJson {
|
|
input := generateAttestations()
|
|
input[0].AggregationBits = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad data",
|
|
expectedErrorMessage: "failed to get attestation data",
|
|
generateInput: func() []*apimiddleware.AttestationJson {
|
|
input := generateAttestations()
|
|
input[0].Data = nil
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad signature",
|
|
expectedErrorMessage: "failed to decode attestation signature `bar`",
|
|
generateInput: func() []*apimiddleware.AttestationJson {
|
|
input := generateAttestations()
|
|
input[0].Signature = "bar"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "valid",
|
|
generateInput: generateAttestations,
|
|
expectedResult: []*ethpb.Attestation{
|
|
{
|
|
AggregationBits: []byte{1},
|
|
Data: ðpb.AttestationData{
|
|
Slot: 2,
|
|
CommitteeIndex: 3,
|
|
BeaconBlockRoot: []byte{4},
|
|
Source: ðpb.Checkpoint{
|
|
Epoch: 5,
|
|
Root: []byte{6},
|
|
},
|
|
Target: ðpb.Checkpoint{
|
|
Epoch: 7,
|
|
Root: []byte{8},
|
|
},
|
|
},
|
|
Signature: []byte{9},
|
|
},
|
|
{
|
|
AggregationBits: []byte{10},
|
|
Data: ðpb.AttestationData{
|
|
Slot: 11,
|
|
CommitteeIndex: 12,
|
|
BeaconBlockRoot: []byte{13},
|
|
Source: ðpb.Checkpoint{
|
|
Epoch: 14,
|
|
Root: []byte{15},
|
|
},
|
|
Target: ðpb.Checkpoint{
|
|
Epoch: 16,
|
|
Root: []byte{17},
|
|
},
|
|
},
|
|
Signature: []byte{18},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, testCase := range testCases {
|
|
t.Run(testCase.name, func(t *testing.T) {
|
|
result, err := convertAttestationsToProto(testCase.generateInput())
|
|
|
|
if testCase.expectedResult != nil {
|
|
require.NoError(t, err)
|
|
assert.DeepEqual(t, testCase.expectedResult, result)
|
|
} else if testCase.expectedErrorMessage != "" {
|
|
assert.ErrorContains(t, testCase.expectedErrorMessage, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBeaconBlockProtoHelpers_ConvertAttestationDataToProto(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
generateInput func() *apimiddleware.AttestationDataJson
|
|
expectedResult *ethpb.AttestationData
|
|
expectedErrorMessage string
|
|
}{
|
|
{
|
|
name: "nil attestation data",
|
|
expectedErrorMessage: "attestation data is nil",
|
|
generateInput: func() *apimiddleware.AttestationDataJson { return nil },
|
|
},
|
|
{
|
|
name: "bad slot",
|
|
expectedErrorMessage: "failed to parse attestation slot `foo`",
|
|
generateInput: func() *apimiddleware.AttestationDataJson {
|
|
input := generateAttestationData()
|
|
input.Slot = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad committee index",
|
|
expectedErrorMessage: "failed to parse attestation committee index `bar`",
|
|
generateInput: func() *apimiddleware.AttestationDataJson {
|
|
input := generateAttestationData()
|
|
input.CommitteeIndex = "bar"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad beacon block root",
|
|
expectedErrorMessage: "failed to decode attestation beacon block root `foo`",
|
|
generateInput: func() *apimiddleware.AttestationDataJson {
|
|
input := generateAttestationData()
|
|
input.BeaconBlockRoot = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad source checkpoint",
|
|
expectedErrorMessage: "failed to get attestation source checkpoint",
|
|
generateInput: func() *apimiddleware.AttestationDataJson {
|
|
input := generateAttestationData()
|
|
input.Source = nil
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad target checkpoint",
|
|
expectedErrorMessage: "failed to get attestation target checkpoint",
|
|
generateInput: func() *apimiddleware.AttestationDataJson {
|
|
input := generateAttestationData()
|
|
input.Target = nil
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "valid",
|
|
generateInput: generateAttestationData,
|
|
expectedResult: ðpb.AttestationData{
|
|
Slot: 1,
|
|
CommitteeIndex: 2,
|
|
BeaconBlockRoot: []byte{3},
|
|
Source: ðpb.Checkpoint{
|
|
Epoch: 4,
|
|
Root: []byte{5},
|
|
},
|
|
Target: ðpb.Checkpoint{
|
|
Epoch: 6,
|
|
Root: []byte{7},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, testCase := range testCases {
|
|
t.Run(testCase.name, func(t *testing.T) {
|
|
result, err := convertAttestationDataToProto(testCase.generateInput())
|
|
|
|
if testCase.expectedResult != nil {
|
|
require.NoError(t, err)
|
|
assert.DeepEqual(t, testCase.expectedResult, result)
|
|
} else if testCase.expectedErrorMessage != "" {
|
|
assert.ErrorContains(t, testCase.expectedErrorMessage, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBeaconBlockProtoHelpers_ConvertDepositsToProto(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
generateInput func() []*apimiddleware.DepositJson
|
|
expectedResult []*ethpb.Deposit
|
|
expectedErrorMessage string
|
|
}{
|
|
{
|
|
name: "nil deposit",
|
|
expectedErrorMessage: "deposit at index `0` is nil",
|
|
generateInput: func() []*apimiddleware.DepositJson {
|
|
return []*apimiddleware.DepositJson{
|
|
nil,
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "bad proof",
|
|
expectedErrorMessage: "failed to decode deposit proof `foo`",
|
|
generateInput: func() []*apimiddleware.DepositJson {
|
|
input := generateDeposits()
|
|
input[0].Proof[0] = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "nil data",
|
|
expectedErrorMessage: "deposit data at index `0` is nil",
|
|
generateInput: func() []*apimiddleware.DepositJson {
|
|
input := generateDeposits()
|
|
input[0].Data = nil
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad public key",
|
|
expectedErrorMessage: "failed to decode deposit public key `bar`",
|
|
generateInput: func() []*apimiddleware.DepositJson {
|
|
input := generateDeposits()
|
|
input[0].Data.PublicKey = "bar"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad withdrawal credentials",
|
|
expectedErrorMessage: "failed to decode deposit withdrawal credentials `foo`",
|
|
generateInput: func() []*apimiddleware.DepositJson {
|
|
input := generateDeposits()
|
|
input[0].Data.WithdrawalCredentials = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad amount",
|
|
expectedErrorMessage: "failed to parse deposit amount `bar`",
|
|
generateInput: func() []*apimiddleware.DepositJson {
|
|
input := generateDeposits()
|
|
input[0].Data.Amount = "bar"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad signature",
|
|
expectedErrorMessage: "failed to decode signature `foo`",
|
|
generateInput: func() []*apimiddleware.DepositJson {
|
|
input := generateDeposits()
|
|
input[0].Data.Signature = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "valid",
|
|
generateInput: generateDeposits,
|
|
expectedResult: []*ethpb.Deposit{
|
|
{
|
|
Proof: [][]byte{
|
|
{1},
|
|
{2},
|
|
},
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte{3},
|
|
WithdrawalCredentials: []byte{4},
|
|
Amount: 5,
|
|
Signature: []byte{6},
|
|
},
|
|
},
|
|
{
|
|
Proof: [][]byte{
|
|
{7},
|
|
{8},
|
|
},
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte{9},
|
|
WithdrawalCredentials: []byte{10},
|
|
Amount: 11,
|
|
Signature: []byte{12},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, testCase := range testCases {
|
|
t.Run(testCase.name, func(t *testing.T) {
|
|
result, err := convertDepositsToProto(testCase.generateInput())
|
|
|
|
if testCase.expectedResult != nil {
|
|
require.NoError(t, err)
|
|
assert.DeepEqual(t, testCase.expectedResult, result)
|
|
} else if testCase.expectedErrorMessage != "" {
|
|
assert.ErrorContains(t, testCase.expectedErrorMessage, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBeaconBlockProtoHelpers_ConvertVoluntaryExitsToProto(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
generateInput func() []*apimiddleware.SignedVoluntaryExitJson
|
|
expectedResult []*ethpb.SignedVoluntaryExit
|
|
expectedErrorMessage string
|
|
}{
|
|
{
|
|
name: "nil voluntary exit",
|
|
expectedErrorMessage: "signed voluntary exit at index `0` is nil",
|
|
generateInput: func() []*apimiddleware.SignedVoluntaryExitJson {
|
|
return []*apimiddleware.SignedVoluntaryExitJson{
|
|
nil,
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "nil data",
|
|
expectedErrorMessage: "voluntary exit at index `0` is nil",
|
|
generateInput: func() []*apimiddleware.SignedVoluntaryExitJson {
|
|
input := generateSignedVoluntaryExits()
|
|
input[0].Exit = nil
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad epoch",
|
|
expectedErrorMessage: "failed to parse voluntary exit epoch `foo`",
|
|
generateInput: func() []*apimiddleware.SignedVoluntaryExitJson {
|
|
input := generateSignedVoluntaryExits()
|
|
input[0].Exit.Epoch = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad validator index",
|
|
expectedErrorMessage: "failed to parse voluntary exit validator index `bar`",
|
|
generateInput: func() []*apimiddleware.SignedVoluntaryExitJson {
|
|
input := generateSignedVoluntaryExits()
|
|
input[0].Exit.ValidatorIndex = "bar"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "bad signature",
|
|
expectedErrorMessage: "failed to decode signature `foo`",
|
|
generateInput: func() []*apimiddleware.SignedVoluntaryExitJson {
|
|
input := generateSignedVoluntaryExits()
|
|
input[0].Signature = "foo"
|
|
return input
|
|
},
|
|
},
|
|
{
|
|
name: "valid",
|
|
generateInput: generateSignedVoluntaryExits,
|
|
expectedResult: []*ethpb.SignedVoluntaryExit{
|
|
{
|
|
Exit: ðpb.VoluntaryExit{
|
|
Epoch: 1,
|
|
ValidatorIndex: 2,
|
|
},
|
|
Signature: []byte{3},
|
|
},
|
|
{
|
|
Exit: ðpb.VoluntaryExit{
|
|
Epoch: 4,
|
|
ValidatorIndex: 5,
|
|
},
|
|
Signature: []byte{6},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, testCase := range testCases {
|
|
t.Run(testCase.name, func(t *testing.T) {
|
|
result, err := convertVoluntaryExitsToProto(testCase.generateInput())
|
|
|
|
if testCase.expectedResult != nil {
|
|
require.NoError(t, err)
|
|
assert.DeepEqual(t, testCase.expectedResult, result)
|
|
} else if testCase.expectedErrorMessage != "" {
|
|
assert.ErrorContains(t, testCase.expectedErrorMessage, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBeaconBlockProtoHelpers_ConvertTransactionsToProto(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
generateInput func() []string
|
|
expectedResult [][]byte
|
|
expectedErrorMessage string
|
|
}{
|
|
{
|
|
name: "bad transaction",
|
|
expectedErrorMessage: "failed to decode transaction `foo`",
|
|
generateInput: func() []string {
|
|
return []string{
|
|
"foo",
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: "valid",
|
|
generateInput: func() []string {
|
|
return []string{
|
|
hexutil.Encode([]byte{1}),
|
|
hexutil.Encode([]byte{2}),
|
|
}
|
|
},
|
|
expectedResult: [][]byte{
|
|
{1},
|
|
{2},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, testCase := range testCases {
|
|
t.Run(testCase.name, func(t *testing.T) {
|
|
result, err := convertTransactionsToProto(testCase.generateInput())
|
|
|
|
if testCase.expectedResult != nil {
|
|
require.NoError(t, err)
|
|
assert.DeepEqual(t, testCase.expectedResult, result)
|
|
} else if testCase.expectedErrorMessage != "" {
|
|
assert.ErrorContains(t, testCase.expectedErrorMessage, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func generateProposerSlashings() []*apimiddleware.ProposerSlashingJson {
|
|
return []*apimiddleware.ProposerSlashingJson{
|
|
{
|
|
Header_1: &apimiddleware.SignedBeaconBlockHeaderJson{
|
|
Header: &apimiddleware.BeaconBlockHeaderJson{
|
|
Slot: "1",
|
|
ProposerIndex: "2",
|
|
ParentRoot: hexutil.Encode([]byte{3}),
|
|
StateRoot: hexutil.Encode([]byte{4}),
|
|
BodyRoot: hexutil.Encode([]byte{5}),
|
|
},
|
|
Signature: hexutil.Encode([]byte{6}),
|
|
},
|
|
Header_2: &apimiddleware.SignedBeaconBlockHeaderJson{
|
|
Header: &apimiddleware.BeaconBlockHeaderJson{
|
|
Slot: "7",
|
|
ProposerIndex: "8",
|
|
ParentRoot: hexutil.Encode([]byte{9}),
|
|
StateRoot: hexutil.Encode([]byte{10}),
|
|
BodyRoot: hexutil.Encode([]byte{11}),
|
|
},
|
|
Signature: hexutil.Encode([]byte{12}),
|
|
},
|
|
},
|
|
{
|
|
Header_1: &apimiddleware.SignedBeaconBlockHeaderJson{
|
|
Header: &apimiddleware.BeaconBlockHeaderJson{
|
|
Slot: "13",
|
|
ProposerIndex: "14",
|
|
ParentRoot: hexutil.Encode([]byte{15}),
|
|
StateRoot: hexutil.Encode([]byte{16}),
|
|
BodyRoot: hexutil.Encode([]byte{17}),
|
|
},
|
|
Signature: hexutil.Encode([]byte{18}),
|
|
},
|
|
Header_2: &apimiddleware.SignedBeaconBlockHeaderJson{
|
|
Header: &apimiddleware.BeaconBlockHeaderJson{
|
|
Slot: "19",
|
|
ProposerIndex: "20",
|
|
ParentRoot: hexutil.Encode([]byte{21}),
|
|
StateRoot: hexutil.Encode([]byte{22}),
|
|
BodyRoot: hexutil.Encode([]byte{23}),
|
|
},
|
|
Signature: hexutil.Encode([]byte{24}),
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func generateSignedBeaconBlockHeader() *apimiddleware.SignedBeaconBlockHeaderJson {
|
|
return &apimiddleware.SignedBeaconBlockHeaderJson{
|
|
Header: &apimiddleware.BeaconBlockHeaderJson{
|
|
Slot: "1",
|
|
ProposerIndex: "2",
|
|
ParentRoot: hexutil.Encode([]byte{3}),
|
|
StateRoot: hexutil.Encode([]byte{4}),
|
|
BodyRoot: hexutil.Encode([]byte{5}),
|
|
},
|
|
Signature: hexutil.Encode([]byte{6}),
|
|
}
|
|
}
|
|
|
|
func generateAttesterSlashings() []*apimiddleware.AttesterSlashingJson {
|
|
return []*apimiddleware.AttesterSlashingJson{
|
|
{
|
|
Attestation_1: &apimiddleware.IndexedAttestationJson{
|
|
AttestingIndices: []string{"1", "2"},
|
|
Data: &apimiddleware.AttestationDataJson{
|
|
Slot: "3",
|
|
CommitteeIndex: "4",
|
|
BeaconBlockRoot: hexutil.Encode([]byte{5}),
|
|
Source: &apimiddleware.CheckpointJson{
|
|
Epoch: "6",
|
|
Root: hexutil.Encode([]byte{7}),
|
|
},
|
|
Target: &apimiddleware.CheckpointJson{
|
|
Epoch: "8",
|
|
Root: hexutil.Encode([]byte{9}),
|
|
},
|
|
},
|
|
Signature: hexutil.Encode([]byte{10}),
|
|
},
|
|
Attestation_2: &apimiddleware.IndexedAttestationJson{
|
|
AttestingIndices: []string{"11", "12"},
|
|
Data: &apimiddleware.AttestationDataJson{
|
|
Slot: "13",
|
|
CommitteeIndex: "14",
|
|
BeaconBlockRoot: hexutil.Encode([]byte{15}),
|
|
Source: &apimiddleware.CheckpointJson{
|
|
Epoch: "16",
|
|
Root: hexutil.Encode([]byte{17}),
|
|
},
|
|
Target: &apimiddleware.CheckpointJson{
|
|
Epoch: "18",
|
|
Root: hexutil.Encode([]byte{19}),
|
|
},
|
|
},
|
|
Signature: hexutil.Encode([]byte{20}),
|
|
},
|
|
},
|
|
{
|
|
Attestation_1: &apimiddleware.IndexedAttestationJson{
|
|
AttestingIndices: []string{"21", "22"},
|
|
Data: &apimiddleware.AttestationDataJson{
|
|
Slot: "23",
|
|
CommitteeIndex: "24",
|
|
BeaconBlockRoot: hexutil.Encode([]byte{25}),
|
|
Source: &apimiddleware.CheckpointJson{
|
|
Epoch: "26",
|
|
Root: hexutil.Encode([]byte{27}),
|
|
},
|
|
Target: &apimiddleware.CheckpointJson{
|
|
Epoch: "28",
|
|
Root: hexutil.Encode([]byte{29}),
|
|
},
|
|
},
|
|
Signature: hexutil.Encode([]byte{30}),
|
|
},
|
|
Attestation_2: &apimiddleware.IndexedAttestationJson{
|
|
AttestingIndices: []string{"31", "32"},
|
|
Data: &apimiddleware.AttestationDataJson{
|
|
Slot: "33",
|
|
CommitteeIndex: "34",
|
|
BeaconBlockRoot: hexutil.Encode([]byte{35}),
|
|
Source: &apimiddleware.CheckpointJson{
|
|
Epoch: "36",
|
|
Root: hexutil.Encode([]byte{37}),
|
|
},
|
|
Target: &apimiddleware.CheckpointJson{
|
|
Epoch: "38",
|
|
Root: hexutil.Encode([]byte{39}),
|
|
},
|
|
},
|
|
Signature: hexutil.Encode([]byte{40}),
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func generateIndexedAttestation() *apimiddleware.IndexedAttestationJson {
|
|
return &apimiddleware.IndexedAttestationJson{
|
|
AttestingIndices: []string{"1", "2"},
|
|
Data: &apimiddleware.AttestationDataJson{
|
|
Slot: "3",
|
|
CommitteeIndex: "4",
|
|
BeaconBlockRoot: hexutil.Encode([]byte{5}),
|
|
Source: &apimiddleware.CheckpointJson{
|
|
Epoch: "6",
|
|
Root: hexutil.Encode([]byte{7}),
|
|
},
|
|
Target: &apimiddleware.CheckpointJson{
|
|
Epoch: "8",
|
|
Root: hexutil.Encode([]byte{9}),
|
|
},
|
|
},
|
|
Signature: hexutil.Encode([]byte{10}),
|
|
}
|
|
}
|
|
|
|
func generateCheckpoint() *apimiddleware.CheckpointJson {
|
|
return &apimiddleware.CheckpointJson{
|
|
Epoch: "1",
|
|
Root: hexutil.Encode([]byte{2}),
|
|
}
|
|
}
|
|
|
|
func generateAttestations() []*apimiddleware.AttestationJson {
|
|
return []*apimiddleware.AttestationJson{
|
|
{
|
|
AggregationBits: hexutil.Encode([]byte{1}),
|
|
Data: &apimiddleware.AttestationDataJson{
|
|
Slot: "2",
|
|
CommitteeIndex: "3",
|
|
BeaconBlockRoot: hexutil.Encode([]byte{4}),
|
|
Source: &apimiddleware.CheckpointJson{
|
|
Epoch: "5",
|
|
Root: hexutil.Encode([]byte{6}),
|
|
},
|
|
Target: &apimiddleware.CheckpointJson{
|
|
Epoch: "7",
|
|
Root: hexutil.Encode([]byte{8}),
|
|
},
|
|
},
|
|
Signature: hexutil.Encode([]byte{9}),
|
|
},
|
|
{
|
|
AggregationBits: hexutil.Encode([]byte{10}),
|
|
Data: &apimiddleware.AttestationDataJson{
|
|
Slot: "11",
|
|
CommitteeIndex: "12",
|
|
BeaconBlockRoot: hexutil.Encode([]byte{13}),
|
|
Source: &apimiddleware.CheckpointJson{
|
|
Epoch: "14",
|
|
Root: hexutil.Encode([]byte{15}),
|
|
},
|
|
Target: &apimiddleware.CheckpointJson{
|
|
Epoch: "16",
|
|
Root: hexutil.Encode([]byte{17}),
|
|
},
|
|
},
|
|
Signature: hexutil.Encode([]byte{18}),
|
|
},
|
|
}
|
|
}
|
|
|
|
func generateAttestationData() *apimiddleware.AttestationDataJson {
|
|
return &apimiddleware.AttestationDataJson{
|
|
Slot: "1",
|
|
CommitteeIndex: "2",
|
|
BeaconBlockRoot: hexutil.Encode([]byte{3}),
|
|
Source: &apimiddleware.CheckpointJson{
|
|
Epoch: "4",
|
|
Root: hexutil.Encode([]byte{5}),
|
|
},
|
|
Target: &apimiddleware.CheckpointJson{
|
|
Epoch: "6",
|
|
Root: hexutil.Encode([]byte{7}),
|
|
},
|
|
}
|
|
}
|
|
|
|
func generateDeposits() []*apimiddleware.DepositJson {
|
|
return []*apimiddleware.DepositJson{
|
|
{
|
|
Proof: []string{
|
|
hexutil.Encode([]byte{1}),
|
|
hexutil.Encode([]byte{2}),
|
|
},
|
|
Data: &apimiddleware.Deposit_DataJson{
|
|
PublicKey: hexutil.Encode([]byte{3}),
|
|
WithdrawalCredentials: hexutil.Encode([]byte{4}),
|
|
Amount: "5",
|
|
Signature: hexutil.Encode([]byte{6}),
|
|
},
|
|
},
|
|
{
|
|
Proof: []string{
|
|
hexutil.Encode([]byte{7}),
|
|
hexutil.Encode([]byte{8}),
|
|
},
|
|
Data: &apimiddleware.Deposit_DataJson{
|
|
PublicKey: hexutil.Encode([]byte{9}),
|
|
WithdrawalCredentials: hexutil.Encode([]byte{10}),
|
|
Amount: "11",
|
|
Signature: hexutil.Encode([]byte{12}),
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func generateSignedVoluntaryExits() []*apimiddleware.SignedVoluntaryExitJson {
|
|
return []*apimiddleware.SignedVoluntaryExitJson{
|
|
{
|
|
Exit: &apimiddleware.VoluntaryExitJson{
|
|
Epoch: "1",
|
|
ValidatorIndex: "2",
|
|
},
|
|
Signature: hexutil.Encode([]byte{3}),
|
|
},
|
|
{
|
|
Exit: &apimiddleware.VoluntaryExitJson{
|
|
Epoch: "4",
|
|
ValidatorIndex: "5",
|
|
},
|
|
Signature: hexutil.Encode([]byte{6}),
|
|
},
|
|
}
|
|
}
|