github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/core/blocks/randao_test.go (about) 1 package blocks_test 2 3 import ( 4 "context" 5 "encoding/binary" 6 "testing" 7 8 types "github.com/prysmaticlabs/eth2-types" 9 "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" 10 "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" 11 pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" 12 ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" 13 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1/wrapper" 14 "github.com/prysmaticlabs/prysm/shared/params" 15 "github.com/prysmaticlabs/prysm/shared/testutil" 16 "github.com/prysmaticlabs/prysm/shared/testutil/assert" 17 "github.com/prysmaticlabs/prysm/shared/testutil/require" 18 ) 19 20 func TestProcessRandao_IncorrectProposerFailsVerification(t *testing.T) { 21 beaconState, privKeys := testutil.DeterministicGenesisState(t, 100) 22 // We fetch the proposer's index as that is whom the RANDAO will be verified against. 23 proposerIdx, err := helpers.BeaconProposerIndex(beaconState) 24 require.NoError(t, err) 25 epoch := types.Epoch(0) 26 buf := make([]byte, 32) 27 binary.LittleEndian.PutUint64(buf, uint64(epoch)) 28 domain, err := helpers.Domain(beaconState.Fork(), epoch, params.BeaconConfig().DomainRandao, beaconState.GenesisValidatorRoot()) 29 require.NoError(t, err) 30 root, err := (&pb.SigningData{ObjectRoot: buf, Domain: domain}).HashTreeRoot() 31 require.NoError(t, err) 32 // We make the previous validator's index sign the message instead of the proposer. 33 epochSignature := privKeys[proposerIdx-1].Sign(root[:]) 34 b := testutil.NewBeaconBlock() 35 b.Block = ðpb.BeaconBlock{ 36 Body: ðpb.BeaconBlockBody{ 37 RandaoReveal: epochSignature.Marshal(), 38 }, 39 } 40 41 want := "block randao: signature did not verify" 42 _, err = blocks.ProcessRandao(context.Background(), beaconState, wrapper.WrappedPhase0SignedBeaconBlock(b)) 43 assert.ErrorContains(t, want, err) 44 } 45 46 func TestProcessRandao_SignatureVerifiesAndUpdatesLatestStateMixes(t *testing.T) { 47 beaconState, privKeys := testutil.DeterministicGenesisState(t, 100) 48 49 epoch := helpers.CurrentEpoch(beaconState) 50 epochSignature, err := testutil.RandaoReveal(beaconState, epoch, privKeys) 51 require.NoError(t, err) 52 53 b := testutil.NewBeaconBlock() 54 b.Block = ðpb.BeaconBlock{ 55 Body: ðpb.BeaconBlockBody{ 56 RandaoReveal: epochSignature, 57 }, 58 } 59 60 newState, err := blocks.ProcessRandao( 61 context.Background(), 62 beaconState, 63 wrapper.WrappedPhase0SignedBeaconBlock(b), 64 ) 65 require.NoError(t, err, "Unexpected error processing block randao") 66 currentEpoch := helpers.CurrentEpoch(beaconState) 67 mix := newState.RandaoMixes()[currentEpoch%params.BeaconConfig().EpochsPerHistoricalVector] 68 assert.DeepNotEqual(t, params.BeaconConfig().ZeroHash[:], mix, "Expected empty signature to be overwritten by randao reveal") 69 } 70 71 func TestRandaoSignatureSet_OK(t *testing.T) { 72 beaconState, privKeys := testutil.DeterministicGenesisState(t, 100) 73 74 epoch := helpers.CurrentEpoch(beaconState) 75 epochSignature, err := testutil.RandaoReveal(beaconState, epoch, privKeys) 76 require.NoError(t, err) 77 78 block := ðpb.BeaconBlock{ 79 Body: ðpb.BeaconBlockBody{ 80 RandaoReveal: epochSignature, 81 }, 82 } 83 84 set, err := blocks.RandaoSignatureSet(beaconState, block.Body.RandaoReveal) 85 require.NoError(t, err) 86 verified, err := set.Verify() 87 require.NoError(t, err) 88 assert.Equal(t, true, verified, "Unable to verify randao signature set") 89 }