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 = &ethpb.BeaconBlock{
    36  		Body: &ethpb.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 = &ethpb.BeaconBlock{
    55  		Body: &ethpb.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 := &ethpb.BeaconBlock{
    79  		Body: &ethpb.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  }