diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md index c5a6a673da..027b622bf1 100644 --- a/DEPENDENCIES.md +++ b/DEPENDENCIES.md @@ -34,7 +34,6 @@ also be updated and checked in as frequently. ```bash ./scripts/update-go-pbs.sh -./scripts/update-go-ssz.sh ``` *Recommendation: Use go build only for local development and use bazel build for production.* diff --git a/WORKSPACE b/WORKSPACE index b68d53d8c0..d5799efe1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -363,10 +363,6 @@ load("//:deps.bzl", "prysm_deps") # gazelle:repository_macro deps.bzl%prysm_deps prysm_deps() -load("@com_github_prysmaticlabs_go_ssz//:deps.bzl", "go_ssz_dependencies") - -go_ssz_dependencies() - load("@prysm//third_party/herumi:herumi.bzl", "bls_dependencies") bls_dependencies() diff --git a/beacon-chain/blockchain/BUILD.bazel b/beacon-chain/blockchain/BUILD.bazel index 9827f00c1e..c01aca6845 100644 --- a/beacon-chain/blockchain/BUILD.bazel +++ b/beacon-chain/blockchain/BUILD.bazel @@ -116,7 +116,6 @@ go_test( "@com_github_ethereum_go_ethereum//core/types:go_default_library", "@com_github_gogo_protobuf//proto:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@com_github_sirupsen_logrus//:go_default_library", "@com_github_sirupsen_logrus//hooks/test:go_default_library", "@in_gopkg_d4l3k_messagediff_v1//:go_default_library", @@ -165,7 +164,6 @@ go_test( "@com_github_ethereum_go_ethereum//core/types:go_default_library", "@com_github_gogo_protobuf//proto:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@com_github_sirupsen_logrus//:go_default_library", "@com_github_sirupsen_logrus//hooks/test:go_default_library", "@org_golang_x_net//context:go_default_library", diff --git a/beacon-chain/core/blocks/BUILD.bazel b/beacon-chain/core/blocks/BUILD.bazel index ba7aba31b7..3c7808d001 100644 --- a/beacon-chain/core/blocks/BUILD.bazel +++ b/beacon-chain/core/blocks/BUILD.bazel @@ -69,6 +69,7 @@ go_test( shard_count = 2, deps = [ "//beacon-chain/core/helpers:go_default_library", + "//beacon-chain/p2p/types:go_default_library", "//beacon-chain/state:go_default_library", "//proto/beacon/p2p/v1:go_default_library", "//shared/aggregation:go_default_library", diff --git a/beacon-chain/core/blocks/header_test.go b/beacon-chain/core/blocks/header_test.go index 81a0a5e3b8..cbda78bf01 100644 --- a/beacon-chain/core/blocks/header_test.go +++ b/beacon-chain/core/blocks/header_test.go @@ -7,16 +7,16 @@ import ( "github.com/gogo/protobuf/proto" ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" - "github.com/sirupsen/logrus" - "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" + p2ptypes "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" "github.com/prysmaticlabs/prysm/shared/bls" "github.com/prysmaticlabs/prysm/shared/bytesutil" "github.com/prysmaticlabs/prysm/shared/params" "github.com/prysmaticlabs/prysm/shared/testutil" "github.com/prysmaticlabs/prysm/shared/testutil/assert" "github.com/prysmaticlabs/prysm/shared/testutil/require" + "github.com/sirupsen/logrus" ) func init() { @@ -119,7 +119,8 @@ func TestProcessBlockHeader_DifferentSlots(t *testing.T) { priv, err := bls.RandKey() require.NoError(t, err) - blockSig, err := helpers.ComputeDomainAndSign(state, currentEpoch, []byte("hello"), params.BeaconConfig().DomainBeaconProposer, priv) + sszBytes := p2ptypes.SSZBytes("hello") + blockSig, err := helpers.ComputeDomainAndSign(state, currentEpoch, &sszBytes, params.BeaconConfig().DomainBeaconProposer, priv) require.NoError(t, err) validators[5896].PublicKey = priv.PublicKey().Marshal() block := ðpb.SignedBeaconBlock{ @@ -158,7 +159,8 @@ func TestProcessBlockHeader_PreviousBlockRootNotSignedRoot(t *testing.T) { currentEpoch := helpers.CurrentEpoch(state) priv, err := bls.RandKey() require.NoError(t, err) - blockSig, err := helpers.ComputeDomainAndSign(state, currentEpoch, []byte("hello"), params.BeaconConfig().DomainBeaconProposer, priv) + sszBytes := p2ptypes.SSZBytes("hello") + blockSig, err := helpers.ComputeDomainAndSign(state, currentEpoch, &sszBytes, params.BeaconConfig().DomainBeaconProposer, priv) require.NoError(t, err) validators[5896].PublicKey = priv.PublicKey().Marshal() pID, err := helpers.BeaconProposerIndex(state) @@ -197,7 +199,8 @@ func TestProcessBlockHeader_SlashedProposer(t *testing.T) { currentEpoch := helpers.CurrentEpoch(state) priv, err := bls.RandKey() require.NoError(t, err) - blockSig, err := helpers.ComputeDomainAndSign(state, currentEpoch, []byte("hello"), params.BeaconConfig().DomainBeaconProposer, priv) + sszBytes := p2ptypes.SSZBytes("hello") + blockSig, err := helpers.ComputeDomainAndSign(state, currentEpoch, &sszBytes, params.BeaconConfig().DomainBeaconProposer, priv) require.NoError(t, err) validators[12683].PublicKey = priv.PublicKey().Marshal() diff --git a/beacon-chain/core/blocks/spectest/BUILD.bazel b/beacon-chain/core/blocks/spectest/BUILD.bazel index cdbb348890..0769238784 100644 --- a/beacon-chain/core/blocks/spectest/BUILD.bazel +++ b/beacon-chain/core/blocks/spectest/BUILD.bazel @@ -44,7 +44,6 @@ go_test( "//shared/testutil/require:go_default_library", "@com_github_gogo_protobuf//proto:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@in_gopkg_d4l3k_messagediff_v1//:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", ], @@ -80,7 +79,6 @@ go_test( "//shared/testutil/require:go_default_library", "@com_github_gogo_protobuf//proto:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@in_gopkg_d4l3k_messagediff_v1//:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", ], diff --git a/beacon-chain/core/epoch/precompute/spectest/BUILD.bazel b/beacon-chain/core/epoch/precompute/spectest/BUILD.bazel index 423a8e4302..08fd16a837 100644 --- a/beacon-chain/core/epoch/precompute/spectest/BUILD.bazel +++ b/beacon-chain/core/epoch/precompute/spectest/BUILD.bazel @@ -37,7 +37,6 @@ go_test( "//shared/testutil/require:go_default_library", "@com_github_ghodss_yaml//:go_default_library", "@com_github_gogo_protobuf//proto:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@in_gopkg_d4l3k_messagediff_v1//:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", ], @@ -71,7 +70,6 @@ go_test( "//shared/testutil/require:go_default_library", "@com_github_ghodss_yaml//:go_default_library", "@com_github_gogo_protobuf//proto:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@in_gopkg_d4l3k_messagediff_v1//:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", ], diff --git a/beacon-chain/core/epoch/spectest/BUILD.bazel b/beacon-chain/core/epoch/spectest/BUILD.bazel index 835a6a5c52..768e32f5d4 100644 --- a/beacon-chain/core/epoch/spectest/BUILD.bazel +++ b/beacon-chain/core/epoch/spectest/BUILD.bazel @@ -35,7 +35,6 @@ go_test( "//shared/testutil:go_default_library", "//shared/testutil/require:go_default_library", "@com_github_gogo_protobuf//proto:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@in_gopkg_d4l3k_messagediff_v1//:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", ], diff --git a/beacon-chain/core/helpers/BUILD.bazel b/beacon-chain/core/helpers/BUILD.bazel index 95ffba8121..5ab9fddef4 100644 --- a/beacon-chain/core/helpers/BUILD.bazel +++ b/beacon-chain/core/helpers/BUILD.bazel @@ -45,7 +45,6 @@ go_library( "@com_github_pkg_errors//:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", "@com_github_prysmaticlabs_go_bitfield//:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", ], ) diff --git a/beacon-chain/core/helpers/signing_root.go b/beacon-chain/core/helpers/signing_root.go index 1516e611c4..8696420ebe 100644 --- a/beacon-chain/core/helpers/signing_root.go +++ b/beacon-chain/core/helpers/signing_root.go @@ -4,7 +4,6 @@ import ( fssz "github.com/ferranbt/fastssz" "github.com/pkg/errors" ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" - "github.com/prysmaticlabs/go-ssz" "github.com/prysmaticlabs/prysm/beacon-chain/state" pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" "github.com/prysmaticlabs/prysm/shared/bls" @@ -23,7 +22,7 @@ const DomainByteLength = 4 var ErrSigFailedToVerify = errors.New("signature did not verify") // ComputeDomainAndSign computes the domain and signing root and sign it using the passed in private key. -func ComputeDomainAndSign(st *state.BeaconState, epoch uint64, obj interface{}, domain [4]byte, key bls.SecretKey) ([]byte, error) { +func ComputeDomainAndSign(st *state.BeaconState, epoch uint64, obj fssz.HashRoot, domain [4]byte, key bls.SecretKey) ([]byte, error) { d, err := Domain(st.Fork(), epoch, domain, st.GenesisValidatorRoot()) if err != nil { return nil, err @@ -46,16 +45,8 @@ func ComputeDomainAndSign(st *state.BeaconState, epoch uint64, obj interface{}, // object_root=hash_tree_root(ssz_object), // domain=domain, // )) -func ComputeSigningRoot(object interface{}, domain []byte) ([32]byte, error) { - if object == nil { - return [32]byte{}, errors.New("cannot compute signing root of nil") - } - return signingData(func() ([32]byte, error) { - if v, ok := object.(fssz.HashRoot); ok { - return v.HashTreeRoot() - } - return ssz.HashTreeRoot(object) - }, domain) +func ComputeSigningRoot(object fssz.HashRoot, domain []byte) ([32]byte, error) { + return signingData(object.HashTreeRoot, domain) } // Computes the signing data by utilising the provided root function and then @@ -73,7 +64,7 @@ func signingData(rootFunc func() ([32]byte, error), domain []byte) ([32]byte, er } // ComputeDomainVerifySigningRoot computes domain and verifies signing root of an object given the beacon state, validator index and signature. -func ComputeDomainVerifySigningRoot(st *state.BeaconState, index, epoch uint64, obj interface{}, domain [4]byte, sig []byte) error { +func ComputeDomainVerifySigningRoot(st *state.BeaconState, index, epoch uint64, obj fssz.HashRoot, domain [4]byte, sig []byte) error { v, err := st.ValidatorAtIndex(index) if err != nil { return err @@ -86,7 +77,7 @@ func ComputeDomainVerifySigningRoot(st *state.BeaconState, index, epoch uint64, } // VerifySigningRoot verifies the signing root of an object given it's public key, signature and domain. -func VerifySigningRoot(obj interface{}, pub, signature, domain []byte) error { +func VerifySigningRoot(obj fssz.HashRoot, pub, signature, domain []byte) error { publicKey, err := bls.PublicKeyFromBytes(pub) if err != nil { return errors.Wrap(err, "could not convert bytes to public key") diff --git a/beacon-chain/core/state/BUILD.bazel b/beacon-chain/core/state/BUILD.bazel index b32b09effe..6302f47247 100644 --- a/beacon-chain/core/state/BUILD.bazel +++ b/beacon-chain/core/state/BUILD.bazel @@ -112,6 +112,5 @@ go_test( "//shared/params:go_default_library", "//shared/testutil/require:go_default_library", "@com_github_gogo_protobuf//proto:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", ], ) diff --git a/beacon-chain/core/state/spectest/BUILD.bazel b/beacon-chain/core/state/spectest/BUILD.bazel index 707375b79f..e05d26311d 100644 --- a/beacon-chain/core/state/spectest/BUILD.bazel +++ b/beacon-chain/core/state/spectest/BUILD.bazel @@ -34,7 +34,6 @@ go_test( "//shared/testutil/require:go_default_library", "@com_github_gogo_protobuf//proto:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@com_github_urfave_cli_v2//:go_default_library", "@in_gopkg_d4l3k_messagediff_v1//:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", @@ -69,7 +68,6 @@ go_test( "//shared/testutil/require:go_default_library", "@com_github_gogo_protobuf//proto:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@com_github_urfave_cli_v2//:go_default_library", "@in_gopkg_d4l3k_messagediff_v1//:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", diff --git a/beacon-chain/db/kafka/BUILD.bazel b/beacon-chain/db/kafka/BUILD.bazel index 57a3d89731..7823631ca5 100644 --- a/beacon-chain/db/kafka/BUILD.bazel +++ b/beacon-chain/db/kafka/BUILD.bazel @@ -23,10 +23,10 @@ go_library( "@com_github_golang_protobuf//jsonpb:go_default_library_gen", "@com_github_golang_protobuf//proto:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@com_github_sirupsen_logrus//:go_default_library", "@in_gopkg_confluentinc_confluent_kafka_go_v1//kafka:go_default_library", "@in_gopkg_confluentinc_confluent_kafka_go_v1//kafka/librdkafka:go_default_library", + "@in_gopkg_errgo_v2//fmt/errors:go_default_library", "@io_opencensus_go//trace:go_default_library", ], ) diff --git a/beacon-chain/db/kafka/export_wrapper.go b/beacon-chain/db/kafka/export_wrapper.go index 82bf46196c..f0dd2afbab 100644 --- a/beacon-chain/db/kafka/export_wrapper.go +++ b/beacon-chain/db/kafka/export_wrapper.go @@ -10,13 +10,13 @@ import ( "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" eth "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" - "github.com/prysmaticlabs/go-ssz" "github.com/prysmaticlabs/prysm/beacon-chain/db/iface" "github.com/prysmaticlabs/prysm/shared/featureconfig" "github.com/prysmaticlabs/prysm/shared/traceutil" "go.opencensus.io/trace" "gopkg.in/confluentinc/confluent-kafka-go.v1/kafka" _ "gopkg.in/confluentinc/confluent-kafka-go.v1/kafka/librdkafka" // Required for c++ kafka library. + "gopkg.in/errgo.v2/fmt/errors" ) var _ iface.Database = (*Exporter)(nil) @@ -59,7 +59,7 @@ func (e Exporter) publish(ctx context.Context, topic string, msg proto.Message) if v, ok := msg.(fssz.HashRoot); ok { key, err = v.HashTreeRoot() } else { - key, err = ssz.HashTreeRoot(msg) + err = errors.New("object does not follow hash tree root interface") } if err != nil { traceutil.AnnotateError(span, err) diff --git a/beacon-chain/p2p/types/BUILD.bazel b/beacon-chain/p2p/types/BUILD.bazel index 6df6a488d8..4a63169406 100644 --- a/beacon-chain/p2p/types/BUILD.bazel +++ b/beacon-chain/p2p/types/BUILD.bazel @@ -9,8 +9,14 @@ go_library( "types.go", ], importpath = "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types", - visibility = ["//beacon-chain:__subpackages__"], + visibility = [ + "//beacon-chain:__subpackages__", + "//shared/testutil:__pkg__", + "//slasher/rpc:__pkg__", + "//validator/client:__pkg__", + ], deps = [ + "//shared/htrutils:go_default_library", "//shared/params:go_default_library", "@com_github_ferranbt_fastssz//:go_default_library", "@com_github_pkg_errors//:go_default_library", diff --git a/beacon-chain/p2p/types/types.go b/beacon-chain/p2p/types/types.go index e2daabc159..d11d0553ca 100644 --- a/beacon-chain/p2p/types/types.go +++ b/beacon-chain/p2p/types/types.go @@ -6,16 +6,22 @@ package types import ( ssz "github.com/ferranbt/fastssz" "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/shared/htrutils" "github.com/prysmaticlabs/prysm/shared/params" ) -// SSZUint64 is a uint64 type that satisfies the fast-ssz interface. -type SSZUint64 uint64 - const rootLength = 32 const maxErrorLength = 256 +// SSZUint64 is a uint64 type that satisfies the fast-ssz interface. +type SSZUint64 uint64 + +// SizeSSZ returns the size of the serialized representation. +func (s *SSZUint64) SizeSSZ() int { + return 8 +} + // MarshalSSZTo marshals the uint64 with the provided byte slice. func (s *SSZUint64) MarshalSSZTo(dst []byte) ([]byte, error) { marshalledObj, err := s.MarshalSSZ() @@ -31,11 +37,6 @@ func (s *SSZUint64) MarshalSSZ() ([]byte, error) { return marshalledObj, nil } -// SizeSSZ returns the size of the serialized representation. -func (s *SSZUint64) SizeSSZ() int { - return 8 -} - // UnmarshalSSZ unmarshals the provided bytes buffer into the // uint64 object. func (s *SSZUint64) UnmarshalSSZ(buf []byte) error { @@ -46,6 +47,35 @@ func (s *SSZUint64) UnmarshalSSZ(buf []byte) error { return nil } +// HashTreeRoot hashes the uint64 object following the SSZ standard. +func (s *SSZUint64) HashTreeRoot() ([32]byte, error) { + return htrutils.Uint64Root(uint64(*s)), nil +} + +// HashTreeRootWith hashes the uint64 object with the given hasher. +func (s *SSZUint64) HashTreeRootWith(hh *ssz.Hasher) error { + indx := hh.Index() + hh.PutUint64(uint64(*s)) + hh.Merkleize(indx) + return nil +} + +// SSZUint64 is a bytes slice that satisfies the fast-ssz interface. +type SSZBytes []byte + +// HashTreeRoot hashes the uint64 object following the SSZ standard. +func (b *SSZBytes) HashTreeRoot() ([32]byte, error) { + return ssz.HashWithDefaultHasher(b) +} + +// HashTreeRootWith hashes the uint64 object with the given hasher. +func (b *SSZBytes) HashTreeRootWith(hh *ssz.Hasher) error { + indx := hh.Index() + hh.PutBytes(*b) + hh.Merkleize(indx) + return nil +} + // BeaconBlockByRootsReq specifies the block by roots request type. type BeaconBlockByRootsReq [][rootLength]byte diff --git a/beacon-chain/p2p/types/types_test.go b/beacon-chain/p2p/types/types_test.go index cd243bde65..b3801088ea 100644 --- a/beacon-chain/p2p/types/types_test.go +++ b/beacon-chain/p2p/types/types_test.go @@ -1,6 +1,8 @@ package types import ( + "bytes" + "encoding/hex" "testing" "github.com/prysmaticlabs/prysm/shared/params" @@ -89,3 +91,94 @@ func roundTripTestErrorMessage(t *testing.T) { require.NoError(t, newVal.UnmarshalSSZ(marshalledObj)) assert.DeepEqual(t, []byte(newVal), errMsg) } + +func TestSSZUint64(t *testing.T) { + tests := []struct { + name string + serializedBytes []byte + actualValue uint64 + root []byte + wantErr bool + }{ + { + name: "max", + serializedBytes: hexDecodeOrDie(t, "ffffffffffffffff"), + actualValue: 18446744073709551615, + root: hexDecodeOrDie(t, "ffffffffffffffff000000000000000000000000000000000000000000000000"), + wantErr: false, + }, + { + name: "random", + serializedBytes: hexDecodeOrDie(t, "357c8de9d7204577"), + actualValue: 8594311575614880821, + root: hexDecodeOrDie(t, "357c8de9d7204577000000000000000000000000000000000000000000000000"), + wantErr: false, + }, + { + name: "zero", + serializedBytes: hexDecodeOrDie(t, "0000000000000000"), + actualValue: 0, + root: hexDecodeOrDie(t, "0000000000000000000000000000000000000000000000000000000000000000"), + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var s SSZUint64 + if err := s.UnmarshalSSZ(tt.serializedBytes); (err != nil) != tt.wantErr { + t.Errorf("UnmarshalSSZ() error = %v, wantErr %v", err, tt.wantErr) + } + require.Equal(t, uint64(s), tt.actualValue) + + serializedBytes, err := s.MarshalSSZ() + require.NoError(t, err) + require.Equal(t, true, bytes.Equal(serializedBytes, tt.serializedBytes), "serialized does not equal") + + htr, err := s.HashTreeRoot() + require.NoError(t, err) + require.Equal(t, true, bytes.Equal(htr[:], tt.root), "root does not equal") + }) + } +} + +func TestSSZBytes_HashTreeRoot(t *testing.T) { + tests := []struct { + name string + actualValue []byte + root []byte + wantErr bool + }{ + { + name: "random1", + actualValue: hexDecodeOrDie(t, "844e1063e0b396eed17be8eddb7eecd1fe3ea46542a4b72f7466e77325e5aa6d"), + root: hexDecodeOrDie(t, "844e1063e0b396eed17be8eddb7eecd1fe3ea46542a4b72f7466e77325e5aa6d"), + wantErr: false, + }, + { + name: "random1", + actualValue: hexDecodeOrDie(t, "7b16162ecd9a28fa80a475080b0e4fff4c27efe19ce5134ce3554b72274d59fd534400ba4c7f699aa1c307cd37c2b103"), + root: hexDecodeOrDie(t, "128ed34ee798b9f00716f9ba5c000df5c99443dabc4d3f2e9bb86c77c732e007"), + wantErr: false, + }, + { + name: "random2", + actualValue: []byte{}, + root: hexDecodeOrDie(t, "0000000000000000000000000000000000000000000000000000000000000000"), + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + s := SSZBytes(tt.actualValue) + htr, err := s.HashTreeRoot() + require.NoError(t, err) + require.Equal(t, true, bytes.Equal(htr[:], tt.root), "root does not equal") + }) + } +} + +func hexDecodeOrDie(t *testing.T, str string) []byte { + decoded, err := hex.DecodeString(str) + require.NoError(t, err) + return decoded +} diff --git a/beacon-chain/state/stateutil/BUILD.bazel b/beacon-chain/state/stateutil/BUILD.bazel index b6afa0553e..1b89e73247 100644 --- a/beacon-chain/state/stateutil/BUILD.bazel +++ b/beacon-chain/state/stateutil/BUILD.bazel @@ -85,6 +85,5 @@ go_test( "//shared/testutil:go_default_library", "@com_github_protolambda_zssz//merkle:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", ], ) diff --git a/beacon-chain/state/types_test.go b/beacon-chain/state/types_test.go index 6791891cf4..85e551c908 100644 --- a/beacon-chain/state/types_test.go +++ b/beacon-chain/state/types_test.go @@ -228,5 +228,4 @@ func TestForkManualCopy_OK(t *testing.T) { if !sszutil.DeepEqual(newState.Fork, wantedFork) { t.Errorf("Wanted %v but got %v", wantedFork, newState.Fork) } - } diff --git a/beacon-chain/sync/BUILD.bazel b/beacon-chain/sync/BUILD.bazel index 5a5eeca76d..582f1d8482 100644 --- a/beacon-chain/sync/BUILD.bazel +++ b/beacon-chain/sync/BUILD.bazel @@ -178,11 +178,8 @@ go_test( "@com_github_libp2p_go_libp2p_pubsub//:go_default_library", "@com_github_libp2p_go_libp2p_pubsub//pb:go_default_library", "@com_github_patrickmn_go_cache//:go_default_library", - "@com_github_protolambda_zssz//:go_default_library", - "@com_github_protolambda_zssz//types:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", "@com_github_prysmaticlabs_go_bitfield//:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@com_github_sirupsen_logrus//:go_default_library", "@com_github_sirupsen_logrus//hooks/test:go_default_library", ], diff --git a/beacon-chain/sync/pending_attestations_queue_test.go b/beacon-chain/sync/pending_attestations_queue_test.go index fa284b8eab..2b3218049e 100644 --- a/beacon-chain/sync/pending_attestations_queue_test.go +++ b/beacon-chain/sync/pending_attestations_queue_test.go @@ -16,6 +16,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/operations/attestations" "github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers" p2ptest "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" + p2ptypes "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" "github.com/prysmaticlabs/prysm/shared/abool" "github.com/prysmaticlabs/prysm/shared/attestationutil" @@ -93,7 +94,8 @@ func TestProcessPendingAtts_HasBlockSaveUnAggregatedAtt(t *testing.T) { // Arbitrary aggregator index for testing purposes. aggregatorIndex := committee[0] - sig, err := helpers.ComputeDomainAndSign(beaconState, 0, att.Data.Slot, params.BeaconConfig().DomainSelectionProof, privKeys[aggregatorIndex]) + sszUint := p2ptypes.SSZUint64(att.Data.Slot) + sig, err := helpers.ComputeDomainAndSign(beaconState, 0, &sszUint, params.BeaconConfig().DomainSelectionProof, privKeys[aggregatorIndex]) require.NoError(t, err) aggregateAndProof := ðpb.AggregateAttestationAndProof{ SelectionProof: sig, @@ -205,7 +207,8 @@ func TestProcessPendingAtts_NoBroadcastWithBadSignature(t *testing.T) { // Arbitrary aggregator index for testing purposes. aggregatorIndex := committee[0] - sig, err := helpers.ComputeDomainAndSign(s, 0, att.Data.Slot, params.BeaconConfig().DomainSelectionProof, privKeys[aggregatorIndex]) + sszSlot := p2ptypes.SSZUint64(att.Data.Slot) + sig, err := helpers.ComputeDomainAndSign(s, 0, &sszSlot, params.BeaconConfig().DomainSelectionProof, privKeys[aggregatorIndex]) require.NoError(t, err) aggregateAndProof := ðpb.AggregateAttestationAndProof{ SelectionProof: sig, @@ -281,7 +284,8 @@ func TestProcessPendingAtts_HasBlockSaveAggregatedAtt(t *testing.T) { // Arbitrary aggregator index for testing purposes. aggregatorIndex := committee[0] - sig, err := helpers.ComputeDomainAndSign(beaconState, 0, att.Data.Slot, params.BeaconConfig().DomainSelectionProof, privKeys[aggregatorIndex]) + sszUint := p2ptypes.SSZUint64(att.Data.Slot) + sig, err := helpers.ComputeDomainAndSign(beaconState, 0, &sszUint, params.BeaconConfig().DomainSelectionProof, privKeys[aggregatorIndex]) require.NoError(t, err) aggregateAndProof := ðpb.AggregateAttestationAndProof{ SelectionProof: sig, diff --git a/beacon-chain/sync/rpc_beacon_blocks_by_root_test.go b/beacon-chain/sync/rpc_beacon_blocks_by_root_test.go index 2ccbe6c29e..21b42c68bd 100644 --- a/beacon-chain/sync/rpc_beacon_blocks_by_root_test.go +++ b/beacon-chain/sync/rpc_beacon_blocks_by_root_test.go @@ -1,9 +1,7 @@ package sync import ( - "bytes" "context" - "reflect" "sync" "testing" "time" @@ -12,10 +10,7 @@ import ( "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/protocol" gcache "github.com/patrickmn/go-cache" - "github.com/protolambda/zssz" - "github.com/protolambda/zssz/types" ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" - "github.com/prysmaticlabs/go-ssz" mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/state" db "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" @@ -175,27 +170,3 @@ func TestRecentBeaconBlocksRPCHandler_HandleZeroBlocks(t *testing.T) { require.NoError(t, err) assert.Equal(t, 1, int(lter.Count(stream1.Conn().RemotePeer().String()))) } - -type testList [][32]byte - -func (*testList) Limit() uint64 { - return 2 << 10 -} - -func TestSSZCompatibility(t *testing.T) { - rootA := [32]byte{'a'} - rootB := [32]byte{'B'} - rootC := [32]byte{'C'} - list := testList{rootA, rootB, rootC} - writer := bytes.NewBuffer([]byte{}) - sszType, err := types.SSZFactory(reflect.TypeOf(list)) - assert.NoError(t, err) - n, err := zssz.Encode(writer, list, sszType) - assert.NoError(t, err) - encodedPart := writer.Bytes()[:n] - fastSSZ, err := ssz.Marshal(list) - assert.NoError(t, err) - if !bytes.Equal(fastSSZ, encodedPart) { - t.Errorf("Wanted the same result as ZSSZ of %#x but got %#X", encodedPart, fastSSZ) - } -} diff --git a/beacon-chain/sync/validate_aggregate_proof.go b/beacon-chain/sync/validate_aggregate_proof.go index 2c10be61f5..3d2f23784a 100644 --- a/beacon-chain/sync/validate_aggregate_proof.go +++ b/beacon-chain/sync/validate_aggregate_proof.go @@ -11,6 +11,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/state" + p2ptypes "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" stateTrie "github.com/prysmaticlabs/prysm/beacon-chain/state" "github.com/prysmaticlabs/prysm/shared/bls" "github.com/prysmaticlabs/prysm/shared/bytesutil" @@ -261,7 +262,8 @@ func validateSelectionIndex(ctx context.Context, bs *stateTrie.BeaconState, data if err != nil { return nil, err } - root, err := helpers.ComputeSigningRoot(data.Slot, d) + sszUint := p2ptypes.SSZUint64(data.Slot) + root, err := helpers.ComputeSigningRoot(&sszUint, d) if err != nil { return nil, err } diff --git a/beacon-chain/sync/validate_aggregate_proof_test.go b/beacon-chain/sync/validate_aggregate_proof_test.go index b475d67141..e3ee89f8b2 100644 --- a/beacon-chain/sync/validate_aggregate_proof_test.go +++ b/beacon-chain/sync/validate_aggregate_proof_test.go @@ -18,6 +18,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/operations/attestations" "github.com/prysmaticlabs/prysm/beacon-chain/p2p" p2ptest "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing" + p2ptypes "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" "github.com/prysmaticlabs/prysm/shared/attestationutil" "github.com/prysmaticlabs/prysm/shared/bls" @@ -330,7 +331,8 @@ func TestValidateAggregateAndProof_CanValidate(t *testing.T) { } att.Signature = bls.AggregateSignatures(sigs).Marshal() ai := committee[0] - sig, err := helpers.ComputeDomainAndSign(beaconState, 0, att.Data.Slot, params.BeaconConfig().DomainSelectionProof, privKeys[ai]) + sszUint := p2ptypes.SSZUint64(att.Data.Slot) + sig, err := helpers.ComputeDomainAndSign(beaconState, 0, &sszUint, params.BeaconConfig().DomainSelectionProof, privKeys[ai]) require.NoError(t, err) aggregateAndProof := ðpb.AggregateAttestationAndProof{ SelectionProof: sig, @@ -417,7 +419,8 @@ func TestVerifyIndexInCommittee_SeenAggregatorEpoch(t *testing.T) { } att.Signature = bls.AggregateSignatures(sigs).Marshal() ai := committee[0] - sig, err := helpers.ComputeDomainAndSign(beaconState, 0, att.Data.Slot, params.BeaconConfig().DomainSelectionProof, privKeys[ai]) + sszUint := p2ptypes.SSZUint64(att.Data.Slot) + sig, err := helpers.ComputeDomainAndSign(beaconState, 0, &sszUint, params.BeaconConfig().DomainSelectionProof, privKeys[ai]) require.NoError(t, err) aggregateAndProof := ðpb.AggregateAttestationAndProof{ SelectionProof: sig, @@ -523,7 +526,8 @@ func TestValidateAggregateAndProof_BadBlock(t *testing.T) { } att.Signature = bls.AggregateSignatures(sigs).Marshal() ai := committee[0] - sig, err := helpers.ComputeDomainAndSign(beaconState, 0, att.Data.Slot, params.BeaconConfig().DomainSelectionProof, privKeys[ai]) + sszUint := p2ptypes.SSZUint64(att.Data.Slot) + sig, err := helpers.ComputeDomainAndSign(beaconState, 0, &sszUint, params.BeaconConfig().DomainSelectionProof, privKeys[ai]) require.NoError(t, err) aggregateAndProof := ðpb.AggregateAttestationAndProof{ @@ -611,7 +615,8 @@ func TestValidateAggregateAndProof_RejectWhenAttEpochDoesntEqualTargetEpoch(t *t } att.Signature = bls.AggregateSignatures(sigs).Marshal() ai := committee[0] - sig, err := helpers.ComputeDomainAndSign(beaconState, 0, att.Data.Slot, params.BeaconConfig().DomainSelectionProof, privKeys[ai]) + sszUint := p2ptypes.SSZUint64(att.Data.Slot) + sig, err := helpers.ComputeDomainAndSign(beaconState, 0, &sszUint, params.BeaconConfig().DomainSelectionProof, privKeys[ai]) require.NoError(t, err) aggregateAndProof := ðpb.AggregateAttestationAndProof{ SelectionProof: sig, diff --git a/deps.bzl b/deps.bzl index 5de89dbcbb..fc7e9a2eca 100644 --- a/deps.bzl +++ b/deps.bzl @@ -2569,13 +2569,6 @@ def prysm_deps(): version = "v0.10.0", ) - go_repository( - name = "com_github_protolambda_zssz", - importpath = "github.com/protolambda/zssz", - sum = "h1:7fjJjissZIIaa2QcvmhS/pZISMX21zVITt49sW1ouek=", - version = "v0.1.5", - ) - go_repository( name = "com_github_prysmaticlabs_ethereumapis", build_file_generation = "off", @@ -2590,12 +2583,6 @@ def prysm_deps(): version = "v0.0.0-20210120104942-c3214972eb2e", ) - go_repository( - name = "com_github_prysmaticlabs_go_ssz", - importpath = "github.com/prysmaticlabs/go-ssz", - sum = "h1:7qd0Af1ozWKBU3c93YW2RH+/09hJns9+ftqWUZyts9c=", - version = "v0.0.0-20200612203617-6d5c9aa213ae", - ) go_repository( name = "com_github_prysmaticlabs_prombbolt", importpath = "github.com/prysmaticlabs/prombbolt", @@ -3004,7 +2991,6 @@ def prysm_deps(): name = "com_github_wealdtech_go_eth2_types_v2", build_directives = [ "gazelle:resolve go github.com/herumi/bls-eth-go-binary/bls @herumi_bls_eth_go_binary//:go_default_library", - "gazelle:resolve go github.com/prysmaticlabs/go-ssz @com_github_prysmaticlabs_go_ssz//:go_default_library", ], importpath = "github.com/wealdtech/go-eth2-types/v2", sum = "h1:59VZuwgqRaTjBu3b3CCaxG05XTmANtuTKA8hy3C6IFQ=", diff --git a/fuzz/BUILD.bazel b/fuzz/BUILD.bazel index c258f250a8..412dbe5759 100644 --- a/fuzz/BUILD.bazel +++ b/fuzz/BUILD.bazel @@ -28,7 +28,6 @@ IMPORT_PATH = "github.com/prysmaticlabs/prysm/fuzz" COMMON_DEPS = [ "//beacon-chain/state:go_default_library", "//shared/featureconfig:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", ] + SSZ_DEPS @@ -195,7 +194,6 @@ go_library( "@com_github_libp2p_go_libp2p//:go_default_library", "@com_github_pkg_errors//:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@com_github_sirupsen_logrus//:go_default_library", ] + SSZ_DEPS, # keep ) diff --git a/go.mod b/go.mod index f32a6e1b46..291aa0502d 100644 --- a/go.mod +++ b/go.mod @@ -83,10 +83,8 @@ require ( github.com/prestonvanloon/go-recaptcha v0.0.0-20190217191114-0834cef6e8bd github.com/prometheus/client_golang v1.9.0 github.com/prometheus/tsdb v0.10.0 // indirect - github.com/protolambda/zssz v0.1.5 github.com/prysmaticlabs/ethereumapis v0.0.0-20210115110118-c595a4e0c0a5 github.com/prysmaticlabs/go-bitfield v0.0.0-20210120104942-c3214972eb2e - github.com/prysmaticlabs/go-ssz v0.0.0-20200612203617-6d5c9aa213ae github.com/prysmaticlabs/prombbolt v0.0.0-20200324184628-09789ef63796 github.com/rs/cors v1.7.0 github.com/schollz/progressbar/v3 v3.3.4 @@ -119,6 +117,7 @@ require ( google.golang.org/protobuf v1.25.0 gopkg.in/confluentinc/confluent-kafka-go.v1 v1.4.2 gopkg.in/d4l3k/messagediff.v1 v1.2.1 + gopkg.in/errgo.v2 v2.1.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.18.3 k8s.io/apimachinery v0.18.3 diff --git a/go.sum b/go.sum index d83469307a..4439219506 100644 --- a/go.sum +++ b/go.sum @@ -1103,8 +1103,6 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= -github.com/protolambda/zssz v0.1.5 h1:7fjJjissZIIaa2QcvmhS/pZISMX21zVITt49sW1ouek= -github.com/protolambda/zssz v0.1.5/go.mod h1:a4iwOX5FE7/JkKA+J/PH0Mjo9oXftN6P8NZyL28gpag= github.com/prysmaticlabs/bazel-go-ethereum v0.0.0-20201126065335-1fb46e307951 h1:Jncuyb/nIJgXbEe0iGz3MN5JmijPVGzwk3G5FR01phI= github.com/prysmaticlabs/bazel-go-ethereum v0.0.0-20201126065335-1fb46e307951/go.mod h1:JIfVb6esrqALTExdz9hRYvrP0xBDf6wCncIu1hNwHpM= github.com/prysmaticlabs/ethereumapis v0.0.0-20210115110118-c595a4e0c0a5 h1:roqXwVG8cKjq6sOCbB+T5Kh+dYr1wpkk00c7/DdrqLg= @@ -1113,8 +1111,6 @@ github.com/prysmaticlabs/go-bitfield v0.0.0-20200322041314-62c2aee71669 h1:cX6YR github.com/prysmaticlabs/go-bitfield v0.0.0-20200322041314-62c2aee71669/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= github.com/prysmaticlabs/go-bitfield v0.0.0-20210120104942-c3214972eb2e h1:teHQyJxTD1ZOLmdnIgNYFBruxZX9Cjo/NlSU2AmumwI= github.com/prysmaticlabs/go-bitfield v0.0.0-20210120104942-c3214972eb2e/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= -github.com/prysmaticlabs/go-ssz v0.0.0-20200612203617-6d5c9aa213ae h1:7qd0Af1ozWKBU3c93YW2RH+/09hJns9+ftqWUZyts9c= -github.com/prysmaticlabs/go-ssz v0.0.0-20200612203617-6d5c9aa213ae/go.mod h1:VecIJZrewdAuhVckySLFt2wAAHRME934bSDurP8ftkc= github.com/prysmaticlabs/prombbolt v0.0.0-20200324184628-09789ef63796 h1:bVD46NhbqEE6bsIqj42TCS3ELUdumti3WfAw9DXNtkg= github.com/prysmaticlabs/prombbolt v0.0.0-20200324184628-09789ef63796/go.mod h1:5JkKm84FcLZQPNuHwjX8Mtd5emni/PH5CylWCNqnKos= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -1741,6 +1737,7 @@ gopkg.in/confluentinc/confluent-kafka-go.v1 v1.4.2 h1:JabkIV98VYFqYKHHzXtgGMFuRg gopkg.in/confluentinc/confluent-kafka-go.v1 v1.4.2/go.mod h1:ZdI3yfYmdNSLQPNCpO1y00EHyWaHG5EnQEyL/ntAegY= gopkg.in/d4l3k/messagediff.v1 v1.2.1 h1:70AthpjunwzUiarMHyED52mj9UwtAnE89l1Gmrt3EU0= gopkg.in/d4l3k/messagediff.v1 v1.2.1/go.mod h1:EUzikiKadqXWcD1AzJLagx0j/BeeWGtn++04Xniyg44= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= diff --git a/proto/testing/BUILD.bazel b/proto/testing/BUILD.bazel index f14bccfe2a..408c1cf589 100644 --- a/proto/testing/BUILD.bazel +++ b/proto/testing/BUILD.bazel @@ -35,7 +35,6 @@ go_test( name = "go_default_test", size = "small", srcs = [ - "ssz_regression_test.go", "ssz_static_test.go", "tags_test.go", ], @@ -59,8 +58,6 @@ go_test( "@com_github_ferranbt_fastssz//:go_default_library", "@com_github_ghodss_yaml//:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", - "@com_github_prysmaticlabs_go_ssz//spectests:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", ], ) @@ -94,8 +91,6 @@ go_test( "@com_github_ferranbt_fastssz//:go_default_library", "@com_github_ghodss_yaml//:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", - "@com_github_prysmaticlabs_go_ssz//spectests:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", ], ) @@ -125,8 +120,6 @@ go_test( "@com_github_ferranbt_fastssz//:go_default_library", "@com_github_ghodss_yaml//:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", - "@com_github_prysmaticlabs_go_ssz//spectests:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", ], ) diff --git a/proto/testing/ssz_regression_test.go b/proto/testing/ssz_regression_test.go deleted file mode 100644 index 12f80c6283..0000000000 --- a/proto/testing/ssz_regression_test.go +++ /dev/null @@ -1,109 +0,0 @@ -package testing - -import ( - "encoding/hex" - "fmt" - "io/ioutil" - "testing" - - ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" - "github.com/prysmaticlabs/go-ssz" - sszspectest "github.com/prysmaticlabs/go-ssz/spectests" - "github.com/prysmaticlabs/prysm/shared/bytesutil" - "github.com/prysmaticlabs/prysm/shared/testutil/assert" - "github.com/prysmaticlabs/prysm/shared/testutil/require" -) - -// Regression tests for investigating discrepancies between ssz signing root of -// our protobuf, simple struct, and python result expected signing root. -// See comments in: https://github.com/prysmaticlabs/prysm/pull/2828 -func TestBlockHeaderSigningRoot(t *testing.T) { - t.Skip("Needs updated data after v0.9.3 rm signing root PR") - tests := []struct { - header1 *ethpb.BeaconBlockHeader - header2 sszspectest.MainnetBlockHeader - expectedRoot [32]byte - }{ - { - // Arbitrary example, validated by running in python. - //header = spec.BeaconBlockHeader( - // slot = uint64(0), - // parent_root = Bytes32(bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')), - // state_root = Bytes32(bytes.fromhex('03f33c7c997b39605f1fff2b5fa4db1405b193bb9611206cc50afb460960fd6f')), - // body_root = Bytes32(bytes.fromhex('0221fd9ca547ba21c5f8df076c7f1b824aeaa208253c63e0ba6c4f6d669d4a5b')), - // signature = Bytes96(bytes.fromhex('000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')), - //) - header1: ðpb.BeaconBlockHeader{ - StateRoot: hexDecodeOrDie(t, "03f33c7c997b39605f1fff2b5fa4db1405b193bb9611206cc50afb460960fd6f"), - BodyRoot: hexDecodeOrDie(t, "0221fd9ca547ba21c5f8df076c7f1b824aeaa208253c63e0ba6c4f6d669d4a5b"), - }, - header2: sszspectest.MainnetBlockHeader{ - StateRoot: hexDecodeOrDie(t, "03f33c7c997b39605f1fff2b5fa4db1405b193bb9611206cc50afb460960fd6f"), - BodyRoot: hexDecodeOrDie(t, "0221fd9ca547ba21c5f8df076c7f1b824aeaa208253c63e0ba6c4f6d669d4a5b"), - }, - expectedRoot: bytesutil.ToBytes32(hexDecodeOrDie(t, "fa9dfee90cd22268800a48023e7875dd6a67b79fee240b367634fddcc14ed232")), - }, - { - // First example from 0.8 ssz_mainnet_random.yaml. - // value: {slot: 14215038047959786547, parent_root: '0xf9b2785de53069d4ad16cc0ec729afe9f879e391433ec120bb15b5082a486705', - // state_root: '0x737d1c6ff6e2edf7f0627bf55381e6b08f6c2c56ed8d1895ae47a782dc09382e', - // body_root: '0xaffff5006c34a3a2bf7f18b7860675f002187ea809f708fa8f44c424321bcd1c', - // signature: '0x17d25044259a0ccd99d1b45eeec4e084e5fb0fef98d5805001b248feb555b947ecf6842b9ad546f98f63ef89117575d73223e9fb9ee8143857b6fcc79600fffed1966cea46f7524236cd1e83531aef906cb8b4c296d50695bb83efa84075d309'} - // serialized: '0x33244e45caf545c5f9b2785de53069d4ad16cc0ec729afe9f879e391433ec120bb15b5082a486705737d1c6ff6e2edf7f0627bf55381e6b08f6c2c56ed8d1895ae47a782dc09382eaffff5006c34a3a2bf7f18b7860675f002187ea809f708fa8f44c424321bcd1c17d25044259a0ccd99d1b45eeec4e084e5fb0fef98d5805001b248feb555b947ecf6842b9ad546f98f63ef89117575d73223e9fb9ee8143857b6fcc79600fffed1966cea46f7524236cd1e83531aef906cb8b4c296d50695bb83efa84075d309' - // root: '0x6ae0bafe59ff0bab856c3f26c392dfca9c32d395b0ceccdddf0bee95120facd9' - // signing_root: '0xa7b0199ee4cd6b9d764ca93ee285fb98313ddd4994c52b5d64dd75a3c4b2b85a' - header1: ðpb.BeaconBlockHeader{ - Slot: 14215038047959786547, - ParentRoot: hexDecodeOrDie(t, "f9b2785de53069d4ad16cc0ec729afe9f879e391433ec120bb15b5082a486705"), - StateRoot: hexDecodeOrDie(t, "737d1c6ff6e2edf7f0627bf55381e6b08f6c2c56ed8d1895ae47a782dc09382e"), - BodyRoot: hexDecodeOrDie(t, "affff5006c34a3a2bf7f18b7860675f002187ea809f708fa8f44c424321bcd1c"), - }, - header2: sszspectest.MainnetBlockHeader{ - Slot: 14215038047959786547, - ParentRoot: hexDecodeOrDie(t, "f9b2785de53069d4ad16cc0ec729afe9f879e391433ec120bb15b5082a486705"), - StateRoot: hexDecodeOrDie(t, "737d1c6ff6e2edf7f0627bf55381e6b08f6c2c56ed8d1895ae47a782dc09382e"), - BodyRoot: hexDecodeOrDie(t, "affff5006c34a3a2bf7f18b7860675f002187ea809f708fa8f44c424321bcd1c"), - Signature: hexDecodeOrDie(t, "17d25044259a0ccd99d1b45eeec4e084e5fb0fef98d5805001b248feb555b947ecf6842b9ad546f98f63ef89117575d73223e9fb9ee8143857b6fcc79600fffed1966cea46f7524236cd1e83531aef906cb8b4c296d50695bb83efa84075d309"), - }, - expectedRoot: bytesutil.ToBytes32(hexDecodeOrDie(t, "a7b0199ee4cd6b9d764ca93ee285fb98313ddd4994c52b5d64dd75a3c4b2b85a")), - }, - } - - for i, tt := range tests { - t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { - root1, err := tt.header1.HashTreeRoot() - assert.NoError(t, err) - root2, err := ssz.HashTreeRoot(tt.header2) - assert.NoError(t, err) - assert.Equal(t, root1, root2) - assert.Equal(t, tt.expectedRoot, root1) - }) - } -} - -func hexDecodeOrDie(t *testing.T, h string) []byte { - b, err := hex.DecodeString(h) - require.NoError(t, err) - return b -} - -func TestFastSSZBitlistBug(t *testing.T) { - // See fix: https://github.com/ferranbt/fastssz/pull/18 - // beacon_block_151906.ssz hashes to 0x684fd51e500001fd596ef4d4061863b6713846133f7d48e828cee4e15a0d7978. - // This test can be removed when this case is included as an upstream spec test. - b, err := ioutil.ReadFile("data/beacon_block_151906.ssz") - if err != nil { - t.Fatal(err) - } - sb := ðpb.SignedBeaconBlock{} - if err := sb.UnmarshalSSZ(b); err != nil { - t.Fatal(err) - } - r, err := sb.HashTreeRoot() - if err != nil { - t.Fatal(err) - } - if rStr := fmt.Sprintf("%#x", r); rStr != "0x684fd51e500001fd596ef4d4061863b6713846133f7d48e828cee4e15a0d7978" { - t.Errorf("Received wrong root. Got %s, wanted %s", rStr, "0x684fd51e500001fd596ef4d4061863b6713846133f7d48e828cee4e15a0d7978") - } -} diff --git a/proto/testing/ssz_static_test.go b/proto/testing/ssz_static_test.go index cc2a97bfb7..8858e56a70 100644 --- a/proto/testing/ssz_static_test.go +++ b/proto/testing/ssz_static_test.go @@ -9,7 +9,6 @@ import ( fssz "github.com/ferranbt/fastssz" ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" - "github.com/prysmaticlabs/go-ssz" "github.com/prysmaticlabs/prysm/beacon-chain/state" pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" "github.com/prysmaticlabs/prysm/shared/params/spectest" @@ -52,7 +51,13 @@ func runSSZStaticTests(t *testing.T, config string) { return beaconState.HashTreeRoot(context.Background()) } } else { - htr = ssz.HashTreeRoot + htr = func(s interface{}) ([32]byte, error) { + sszObj, ok := s.(fssz.HashRoot) + if !ok { + return [32]byte{}, errors.New("could not get hash root, not compatible object") + } + return sszObj.HashTreeRoot() + } } root, err := htr(object) @@ -146,7 +151,7 @@ func UnmarshalledSSZ(t *testing.T, serializedBytes []byte, folderName string) (i if o, ok := obj.(fssz.Unmarshaler); ok { err = o.UnmarshalSSZ(serializedBytes) } else { - err = ssz.Unmarshal(serializedBytes, obj) + err = errors.New("could not unmarshal object, not a fastssz compatible object") } return obj, err } diff --git a/shared/testutil/BUILD.bazel b/shared/testutil/BUILD.bazel index 08fa5680cb..5dc8ed5f66 100644 --- a/shared/testutil/BUILD.bazel +++ b/shared/testutil/BUILD.bazel @@ -18,6 +18,7 @@ go_library( deps = [ "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/state:go_default_library", + "//beacon-chain/p2p/types:go_default_library", "//beacon-chain/state:go_default_library", "//proto/beacon/p2p/v1:go_default_library", "//shared/bls:go_default_library", @@ -54,6 +55,7 @@ go_test( "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/state:go_default_library", "//beacon-chain/core/state/stateutils:go_default_library", + "//beacon-chain/p2p/types:go_default_library", "//proto/beacon/p2p/v1:go_default_library", "//shared/bytesutil:go_default_library", "//shared/params:go_default_library", diff --git a/shared/testutil/helpers.go b/shared/testutil/helpers.go index d92f4b60e8..ebf87d8eff 100644 --- a/shared/testutil/helpers.go +++ b/shared/testutil/helpers.go @@ -9,6 +9,7 @@ import ( ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/state" + p2ptypes "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" stateTrie "github.com/prysmaticlabs/prysm/beacon-chain/state" "github.com/prysmaticlabs/prysm/shared/bls" "github.com/prysmaticlabs/prysm/shared/params" @@ -26,7 +27,8 @@ func RandaoReveal(beaconState *stateTrie.BeaconState, epoch uint64, privKeys []b binary.LittleEndian.PutUint64(buf, epoch) // We make the previous validator's index sign the message instead of the proposer. - return helpers.ComputeDomainAndSign(beaconState, epoch, epoch, params.BeaconConfig().DomainRandao, privKeys[proposerIdx]) + sszEpoch := p2ptypes.SSZUint64(epoch) + return helpers.ComputeDomainAndSign(beaconState, epoch, &sszEpoch, params.BeaconConfig().DomainRandao, privKeys[proposerIdx]) } // BlockSignature calculates the post-state root of the block and returns the signature. diff --git a/shared/testutil/helpers_test.go b/shared/testutil/helpers_test.go index b54ae09baa..ce6cd486f5 100644 --- a/shared/testutil/helpers_test.go +++ b/shared/testutil/helpers_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" + p2ptypes "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" "github.com/prysmaticlabs/prysm/shared/params" "github.com/prysmaticlabs/prysm/shared/testutil/assert" "github.com/prysmaticlabs/prysm/shared/testutil/require" @@ -45,7 +46,8 @@ func TestRandaoReveal(t *testing.T) { buf := make([]byte, 32) binary.LittleEndian.PutUint64(buf, epoch) // We make the previous validator's index sign the message instead of the proposer. - epochSignature, err := helpers.ComputeDomainAndSign(beaconState, epoch, epoch, params.BeaconConfig().DomainRandao, privKeys[proposerIdx]) + sszUint := p2ptypes.SSZUint64(epoch) + epochSignature, err := helpers.ComputeDomainAndSign(beaconState, epoch, &sszUint, params.BeaconConfig().DomainRandao, privKeys[proposerIdx]) require.NoError(t, err) if !bytes.Equal(randaoReveal, epochSignature) { diff --git a/slasher/rpc/BUILD.bazel b/slasher/rpc/BUILD.bazel index e19fc033b4..f04a897ba2 100644 --- a/slasher/rpc/BUILD.bazel +++ b/slasher/rpc/BUILD.bazel @@ -48,6 +48,7 @@ go_test( embed = [":go_default_library"], deps = [ "//beacon-chain/core/helpers:go_default_library", + "//beacon-chain/p2p/types:go_default_library", "//beacon-chain/state:go_default_library", "//shared/bls:go_default_library", "//shared/bytesutil:go_default_library", diff --git a/slasher/rpc/server_test.go b/slasher/rpc/server_test.go index 3da51321a5..e439af51ef 100644 --- a/slasher/rpc/server_test.go +++ b/slasher/rpc/server_test.go @@ -9,6 +9,7 @@ import ( "github.com/golang/mock/gomock" ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" + "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" "github.com/prysmaticlabs/prysm/beacon-chain/state" "github.com/prysmaticlabs/prysm/shared/bls" "github.com/prysmaticlabs/prysm/shared/bytesutil" @@ -235,7 +236,8 @@ func TestServer_IsSlashableBlock(t *testing.T) { sbbh.Header.BodyRoot = bytesutil.PadTo([]byte(fmt.Sprintf("%d", j)), 32) bhr, err := sbbh.Header.HashTreeRoot() assert.NoError(t, err) - root, err := helpers.ComputeSigningRoot(bhr, domain) + sszBytes := types.SSZBytes(bhr[:]) + root, err := helpers.ComputeSigningRoot(&sszBytes, domain) assert.NoError(t, err) sbbh.Signature = keys[sbbh.Header.ProposerIndex].Sign(root[:]).Marshal() slashings, err := server.IsSlashableBlock(ctx, sbbh) @@ -303,7 +305,8 @@ func TestServer_IsSlashableBlockNoUpdate(t *testing.T) { require.NoError(t, err) bhr, err := savedBlock.Header.HashTreeRoot() require.NoError(t, err) - root, err := helpers.ComputeSigningRoot(bhr, domain) + sszBytes := types.SSZBytes(bhr[:]) + root, err := helpers.ComputeSigningRoot(&sszBytes, domain) require.NoError(t, err) blockSig := keys[savedBlock.Header.ProposerIndex].Sign(root[:]) marshalledSig := blockSig.Marshal() diff --git a/tools/pcli/BUILD.bazel b/tools/pcli/BUILD.bazel index 91170f110c..165763372e 100644 --- a/tools/pcli/BUILD.bazel +++ b/tools/pcli/BUILD.bazel @@ -15,9 +15,9 @@ go_library( "//proto/beacon/p2p/v1:go_default_library", "//shared/sszutil:go_default_library", "//shared/version:go_default_library", + "@com_github_ferranbt_fastssz//:go_default_library", "@com_github_kr_pretty//:go_default_library", "@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library", - "@com_github_prysmaticlabs_go_ssz//:go_default_library", "@com_github_sirupsen_logrus//:go_default_library", "@com_github_urfave_cli_v2//:go_default_library", "@com_github_x_cray_logrus_prefixed_formatter//:go_default_library", diff --git a/tools/pcli/main.go b/tools/pcli/main.go index 49f2727cf6..dde5c52689 100644 --- a/tools/pcli/main.go +++ b/tools/pcli/main.go @@ -9,9 +9,9 @@ import ( "regexp" "strings" + fssz "github.com/ferranbt/fastssz" "github.com/kr/pretty" ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" - "github.com/prysmaticlabs/go-ssz" "github.com/prysmaticlabs/prysm/beacon-chain/core/state" stateTrie "github.com/prysmaticlabs/prysm/beacon-chain/state" pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" @@ -68,7 +68,7 @@ func main() { }, }, Action: func(c *cli.Context) error { - var data interface{} + var data fssz.Unmarshaler switch sszType { case "block": data = ðpb.BeaconBlock{} @@ -80,6 +80,8 @@ func main() { data = ðpb.BeaconBlockHeader{} case "deposit": data = ðpb.Deposit{} + case "deposit_message": + data = &pb.DepositMessage{} case "proposer_slashing": data = ðpb.ProposerSlashing{} case "signed_block_header": @@ -205,15 +207,15 @@ func main() { } // dataFetcher fetches and unmarshals data from file to provided data structure. -func dataFetcher(fPath string, data interface{}) error { +func dataFetcher(fPath string, data fssz.Unmarshaler) error { rawFile, err := ioutil.ReadFile(fPath) if err != nil { return err } - return ssz.Unmarshal(rawFile, data) + return data.UnmarshalSSZ(rawFile) } -func prettyPrint(sszPath string, data interface{}) { +func prettyPrint(sszPath string, data fssz.Unmarshaler) { if err := dataFetcher(sszPath, data); err != nil { log.Fatal(err) } diff --git a/validator/client/BUILD.bazel b/validator/client/BUILD.bazel index 4feceef4ae..462284a28f 100644 --- a/validator/client/BUILD.bazel +++ b/validator/client/BUILD.bazel @@ -22,6 +22,7 @@ go_library( visibility = ["//validator:__subpackages__"], deps = [ "//beacon-chain/core/helpers:go_default_library", + "//beacon-chain/p2p/types:go_default_library", "//proto/validator/accounts/v2:go_default_library", "//shared/blockutil:go_default_library", "//shared/bls:go_default_library", diff --git a/validator/client/aggregate.go b/validator/client/aggregate.go index 752a8371d8..a17f7e6903 100644 --- a/validator/client/aggregate.go +++ b/validator/client/aggregate.go @@ -7,6 +7,7 @@ import ( ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" + p2ptypes "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" validatorpb "github.com/prysmaticlabs/prysm/proto/validator/accounts/v2" "github.com/prysmaticlabs/prysm/shared/bls" "github.com/prysmaticlabs/prysm/shared/params" @@ -123,7 +124,8 @@ func (v *validator) signSlot(ctx context.Context, pubKey [48]byte, slot uint64) } var sig bls.Signature - root, err := helpers.ComputeSigningRoot(slot, domain.SignatureDomain) + sszUint := p2ptypes.SSZUint64(slot) + root, err := helpers.ComputeSigningRoot(&sszUint, domain.SignatureDomain) if err != nil { return nil, err } diff --git a/validator/client/propose.go b/validator/client/propose.go index 7b4c0db518..5df475223f 100644 --- a/validator/client/propose.go +++ b/validator/client/propose.go @@ -10,6 +10,7 @@ import ( "github.com/pkg/errors" ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1" "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" + p2ptypes "github.com/prysmaticlabs/prysm/beacon-chain/p2p/types" validatorpb "github.com/prysmaticlabs/prysm/proto/validator/accounts/v2" "github.com/prysmaticlabs/prysm/shared/bls" "github.com/prysmaticlabs/prysm/shared/bytesutil" @@ -191,7 +192,8 @@ func (v *validator) signRandaoReveal(ctx context.Context, pubKey [48]byte, epoch } var randaoReveal bls.Signature - root, err := helpers.ComputeSigningRoot(epoch, domain.SignatureDomain) + sszUint := p2ptypes.SSZUint64(epoch) + root, err := helpers.ComputeSigningRoot(&sszUint, domain.SignatureDomain) if err != nil { return nil, err }