package wrapper_test import ( "bytes" "testing" types "github.com/prysmaticlabs/eth2-types" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" v1alpha1 "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" "github.com/prysmaticlabs/prysm/shared/bytesutil" "github.com/prysmaticlabs/prysm/shared/testutil" "github.com/prysmaticlabs/prysm/shared/testutil/assert" "github.com/prysmaticlabs/prysm/shared/testutil/require" "github.com/prysmaticlabs/prysm/shared/version" ) func TestAltairSignedBeaconBlock_Signature(t *testing.T) { sig := []byte{0x11, 0x22} wsb, err := wrapper.WrappedAltairSignedBeaconBlock(ðpb.SignedBeaconBlockAltair{Block: ðpb.BeaconBlockAltair{}, Signature: sig}) require.NoError(t, err) if !bytes.Equal(sig, wsb.Signature()) { t.Error("Wrong signature returned") } } func TestAltairSignedBeaconBlock_Block(t *testing.T) { blk := ðpb.BeaconBlockAltair{Slot: 54} wsb, err := wrapper.WrappedAltairSignedBeaconBlock(ðpb.SignedBeaconBlockAltair{Block: blk}) require.NoError(t, err) assert.DeepEqual(t, blk, wsb.Block().Proto()) } func TestAltairSignedBeaconBlock_IsNil(t *testing.T) { _, err := wrapper.WrappedAltairSignedBeaconBlock(nil) require.Equal(t, wrapper.ErrNilObjectWrapped, err) wsb, err := wrapper.WrappedAltairSignedBeaconBlock(ðpb.SignedBeaconBlockAltair{Block: ðpb.BeaconBlockAltair{}}) require.NoError(t, err) assert.Equal(t, false, wsb.IsNil()) } func TestAltairSignedBeaconBlock_Copy(t *testing.T) { t.Skip("TODO: Missing mutation evaluation helpers") } func TestAltairSignedBeaconBlock_Proto(t *testing.T) { sb := ðpb.SignedBeaconBlockAltair{ Block: ðpb.BeaconBlockAltair{Slot: 66}, Signature: []byte{0x11, 0x22}, } wsb, err := wrapper.WrappedAltairSignedBeaconBlock(sb) require.NoError(t, err) assert.Equal(t, sb, wsb.Proto()) } func TestAltairSignedBeaconBlock_PbPhase0Block(t *testing.T) { wsb, err := wrapper.WrappedAltairSignedBeaconBlock(ðpb.SignedBeaconBlockAltair{Block: ðpb.BeaconBlockAltair{}}) require.NoError(t, err) if _, err := wsb.PbPhase0Block(); err != wrapper.ErrUnsupportedPhase0Block { t.Errorf("Wrong error returned. Want %v got %v", wrapper.ErrUnsupportedPhase0Block, err) } } func TestAltairSignedBeaconBlock_PbAltairBlock(t *testing.T) { sb := ðpb.SignedBeaconBlockAltair{ Block: ðpb.BeaconBlockAltair{Slot: 66}, Signature: []byte{0x11, 0x22}, } wsb, err := wrapper.WrappedAltairSignedBeaconBlock(sb) require.NoError(t, err) got, err := wsb.PbAltairBlock() assert.NoError(t, err) assert.Equal(t, sb, got) } func TestAltairSignedBeaconBlock_MarshalSSZTo(t *testing.T) { wsb, err := wrapper.WrappedAltairSignedBeaconBlock(testutil.HydrateSignedBeaconBlockAltair(ðpb.SignedBeaconBlockAltair{})) assert.NoError(t, err) var b []byte b, err = wsb.MarshalSSZTo(b) assert.NoError(t, err) assert.NotEqual(t, 0, len(b)) } func TestAltairSignedBeaconBlock_SSZ(t *testing.T) { wsb, err := wrapper.WrappedAltairSignedBeaconBlock(testutil.HydrateSignedBeaconBlockAltair(ðpb.SignedBeaconBlockAltair{})) assert.NoError(t, err) b, err := wsb.MarshalSSZ() assert.NoError(t, err) assert.NotEqual(t, 0, len(b)) assert.NotEqual(t, 0, wsb.SizeSSZ()) assert.NoError(t, wsb.UnmarshalSSZ(b)) } func TestAltairSignedBeaconBlock_Version(t *testing.T) { wsb, err := wrapper.WrappedAltairSignedBeaconBlock(ðpb.SignedBeaconBlockAltair{Block: ðpb.BeaconBlockAltair{}}) require.NoError(t, err) assert.Equal(t, version.Altair, wsb.Version()) } func TestAltairBeaconBlock_Slot(t *testing.T) { slot := types.Slot(546) wb, err := wrapper.WrappedAltairBeaconBlock(ðpb.BeaconBlockAltair{Slot: slot}) require.NoError(t, err) assert.Equal(t, slot, wb.Slot()) } func TestAltairBeaconBlock_ProposerIndex(t *testing.T) { pi := types.ValidatorIndex(555) wb, err := wrapper.WrappedAltairBeaconBlock(ðpb.BeaconBlockAltair{ProposerIndex: pi}) require.NoError(t, err) assert.Equal(t, pi, wb.ProposerIndex()) } func TestAltairBeaconBlock_ParentRoot(t *testing.T) { root := []byte{0xAA, 0xBF, 0x33, 0x01} wb, err := wrapper.WrappedAltairBeaconBlock(ðpb.BeaconBlockAltair{ParentRoot: root}) require.NoError(t, err) assert.DeepEqual(t, root, wb.ParentRoot()) } func TestAltairBeaconBlock_StateRoot(t *testing.T) { root := []byte{0xAA, 0xBF, 0x33, 0x01} wb, err := wrapper.WrappedAltairBeaconBlock(ðpb.BeaconBlockAltair{StateRoot: root}) require.NoError(t, err) assert.DeepEqual(t, root, wb.StateRoot()) } func TestAltairBeaconBlock_Body(t *testing.T) { body := ðpb.BeaconBlockBodyAltair{Graffiti: []byte{0x44}} wb, err := wrapper.WrappedAltairBeaconBlock(ðpb.BeaconBlockAltair{Body: body}) require.NoError(t, err) assert.Equal(t, body, wb.Body().Proto()) } func TestAltairBeaconBlock_IsNil(t *testing.T) { _, err := wrapper.WrappedAltairBeaconBlock(nil) require.Equal(t, wrapper.ErrNilObjectWrapped, err) wb, err := wrapper.WrappedAltairBeaconBlock(ðpb.BeaconBlockAltair{}) require.NoError(t, err) assert.Equal(t, false, wb.IsNil()) } func TestAltairBeaconBlock_HashTreeRoot(t *testing.T) { wb, err := wrapper.WrappedAltairBeaconBlock(testutil.HydrateBeaconBlockAltair(ðpb.BeaconBlockAltair{})) require.NoError(t, err) rt, err := wb.HashTreeRoot() assert.NoError(t, err) assert.NotEmpty(t, rt) } func TestAltairBeaconBlock_Proto(t *testing.T) { blk := ðpb.BeaconBlockAltair{ProposerIndex: 234} wb, err := wrapper.WrappedAltairBeaconBlock(blk) require.NoError(t, err) assert.Equal(t, blk, wb.Proto()) } func TestAltairBeaconBlock_SSZ(t *testing.T) { wb, err := wrapper.WrappedAltairBeaconBlock(testutil.HydrateBeaconBlockAltair(ðpb.BeaconBlockAltair{})) assert.NoError(t, err) b, err := wb.MarshalSSZ() assert.NoError(t, err) assert.NotEqual(t, 0, len(b)) assert.NotEqual(t, 0, wb.SizeSSZ()) assert.NoError(t, wb.UnmarshalSSZ(b)) } func TestAltairBeaconBlock_Version(t *testing.T) { wb, err := wrapper.WrappedAltairBeaconBlock(ðpb.BeaconBlockAltair{}) require.NoError(t, err) assert.Equal(t, version.Altair, wb.Version()) } func TestAltairBeaconBlockBody_RandaoReveal(t *testing.T) { root := []byte{0xAA, 0xBF, 0x33, 0x01} wbb, err := wrapper.WrappedAltairBeaconBlockBody(ðpb.BeaconBlockBodyAltair{RandaoReveal: root}) require.NoError(t, err) assert.DeepEqual(t, root, wbb.RandaoReveal()) } func TestAltairBeaconBlockBody_Eth1Data(t *testing.T) { data := &v1alpha1.Eth1Data{} body := ðpb.BeaconBlockBodyAltair{ Eth1Data: data, } wbb, err := wrapper.WrappedAltairBeaconBlockBody(body) require.NoError(t, err) assert.Equal(t, data, wbb.Eth1Data()) } func TestAltairBeaconBlockBody_Graffiti(t *testing.T) { graffiti := []byte{0x66, 0xAA} body := ðpb.BeaconBlockBodyAltair{Graffiti: graffiti} wbb, err := wrapper.WrappedAltairBeaconBlockBody(body) require.NoError(t, err) assert.DeepEqual(t, graffiti, wbb.Graffiti()) } func TestAltairBeaconBlockBody_ProposerSlashings(t *testing.T) { ps := []*v1alpha1.ProposerSlashing{ {Header_1: &v1alpha1.SignedBeaconBlockHeader{ Signature: []byte{0x11, 0x20}, }}, } body := ðpb.BeaconBlockBodyAltair{ProposerSlashings: ps} wbb, err := wrapper.WrappedAltairBeaconBlockBody(body) require.NoError(t, err) assert.DeepEqual(t, ps, wbb.ProposerSlashings()) } func TestAltairBeaconBlockBody_AttesterSlashings(t *testing.T) { as := []*v1alpha1.AttesterSlashing{ {Attestation_1: &v1alpha1.IndexedAttestation{Signature: []byte{0x11}}}, } body := ðpb.BeaconBlockBodyAltair{AttesterSlashings: as} wbb, err := wrapper.WrappedAltairBeaconBlockBody(body) require.NoError(t, err) assert.DeepEqual(t, as, wbb.AttesterSlashings()) } func TestAltairBeaconBlockBody_Attestations(t *testing.T) { atts := []*v1alpha1.Attestation{{Signature: []byte{0x88}}} body := ðpb.BeaconBlockBodyAltair{Attestations: atts} wbb, err := wrapper.WrappedAltairBeaconBlockBody(body) require.NoError(t, err) assert.DeepEqual(t, atts, wbb.Attestations()) } func TestAltairBeaconBlockBody_Deposits(t *testing.T) { deposits := []*v1alpha1.Deposit{ {Proof: [][]byte{{0x54, 0x10}}}, } body := ðpb.BeaconBlockBodyAltair{Deposits: deposits} wbb, err := wrapper.WrappedAltairBeaconBlockBody(body) require.NoError(t, err) assert.DeepEqual(t, deposits, wbb.Deposits()) } func TestAltairBeaconBlockBody_VoluntaryExits(t *testing.T) { exits := []*v1alpha1.SignedVoluntaryExit{ {Exit: &v1alpha1.VoluntaryExit{Epoch: 54}}, } body := ðpb.BeaconBlockBodyAltair{VoluntaryExits: exits} wbb, err := wrapper.WrappedAltairBeaconBlockBody(body) require.NoError(t, err) assert.DeepEqual(t, exits, wbb.VoluntaryExits()) } func TestAltairBeaconBlockBody_IsNil(t *testing.T) { _, err := wrapper.WrappedAltairBeaconBlockBody(nil) require.Equal(t, wrapper.ErrNilObjectWrapped, err) wbb, err := wrapper.WrappedAltairBeaconBlockBody(ðpb.BeaconBlockBodyAltair{}) require.NoError(t, err) assert.Equal(t, false, wbb.IsNil()) } func TestAltairBeaconBlockBody_HashTreeRoot(t *testing.T) { wb, err := wrapper.WrappedAltairBeaconBlockBody(testutil.HydrateBeaconBlockBodyAltair(ðpb.BeaconBlockBodyAltair{})) assert.NoError(t, err) rt, err := wb.HashTreeRoot() assert.NoError(t, err) assert.NotEmpty(t, rt) } func TestAltairBeaconBlockBody_Proto(t *testing.T) { body := ðpb.BeaconBlockBodyAltair{Graffiti: []byte{0x66, 0xAA}} wbb, err := wrapper.WrappedAltairBeaconBlockBody(body) require.NoError(t, err) assert.Equal(t, body, wbb.Proto()) } func TestPhase0SignedBeaconBlock_Header(t *testing.T) { root := bytesutil.PadTo([]byte("root"), 32) signature := bytesutil.PadTo([]byte("sig"), 96) body := ðpb.BeaconBlockBody{} body = testutil.HydrateBeaconBlockBody(body) bodyRoot, err := body.HashTreeRoot() require.NoError(t, err) block := ðpb.SignedBeaconBlock{ Block: ðpb.BeaconBlock{ Slot: 1, ProposerIndex: 1, ParentRoot: root, StateRoot: root, Body: body, }, Signature: signature, } wrapped := wrapper.WrappedPhase0SignedBeaconBlock(block) header, err := wrapped.Header() require.NoError(t, err) assert.Equal(t, types.ValidatorIndex(1), header.Header.ProposerIndex) assert.Equal(t, types.Slot(1), header.Header.Slot) assert.DeepEqual(t, bodyRoot[:], header.Header.BodyRoot) assert.DeepEqual(t, root, header.Header.StateRoot) assert.DeepEqual(t, root, header.Header.ParentRoot) assert.DeepEqual(t, signature, header.Signature) } func TestAltairSignedBeaconBlock_Header(t *testing.T) { root := bytesutil.PadTo([]byte("root"), 32) signature := bytesutil.PadTo([]byte("sig"), 96) body := ðpb.BeaconBlockBodyAltair{} body = testutil.HydrateBeaconBlockBodyAltair(body) bodyRoot, err := body.HashTreeRoot() require.NoError(t, err) block := ðpb.SignedBeaconBlockAltair{ Block: ðpb.BeaconBlockAltair{ Slot: 1, ProposerIndex: 1, ParentRoot: root, StateRoot: root, Body: body, }, Signature: signature, } wrapped, err := wrapper.WrappedAltairSignedBeaconBlock(block) require.NoError(t, err) header, err := wrapped.Header() require.NoError(t, err) assert.Equal(t, types.ValidatorIndex(1), header.Header.ProposerIndex) assert.Equal(t, types.Slot(1), header.Header.Slot) assert.DeepEqual(t, bodyRoot[:], header.Header.BodyRoot) assert.DeepEqual(t, root, header.Header.StateRoot) assert.DeepEqual(t, root, header.Header.ParentRoot) assert.DeepEqual(t, signature, header.Signature) }