github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/core/state/transition_no_verify_sig_test.go (about)

     1  package state_test
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
     8  	"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
     9  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
    10  	"github.com/prysmaticlabs/prysm/proto/eth/v1alpha1/wrapper"
    11  	"github.com/prysmaticlabs/prysm/shared/bytesutil"
    12  	"github.com/prysmaticlabs/prysm/shared/params"
    13  	"github.com/prysmaticlabs/prysm/shared/testutil"
    14  	"github.com/prysmaticlabs/prysm/shared/testutil/assert"
    15  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    16  )
    17  
    18  func TestExecuteStateTransitionNoVerify_FullProcess(t *testing.T) {
    19  	beaconState, privKeys := testutil.DeterministicGenesisState(t, 100)
    20  
    21  	eth1Data := &ethpb.Eth1Data{
    22  		DepositCount: 100,
    23  		DepositRoot:  bytesutil.PadTo([]byte{2}, 32),
    24  		BlockHash:    make([]byte, 32),
    25  	}
    26  	require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch-1))
    27  	e := beaconState.Eth1Data()
    28  	e.DepositCount = 100
    29  	require.NoError(t, beaconState.SetEth1Data(e))
    30  	bh := beaconState.LatestBlockHeader()
    31  	bh.Slot = beaconState.Slot()
    32  	require.NoError(t, beaconState.SetLatestBlockHeader(bh))
    33  	require.NoError(t, beaconState.SetEth1DataVotes([]*ethpb.Eth1Data{eth1Data}))
    34  
    35  	require.NoError(t, beaconState.SetSlot(beaconState.Slot()+1))
    36  	epoch := helpers.CurrentEpoch(beaconState)
    37  	randaoReveal, err := testutil.RandaoReveal(beaconState, epoch, privKeys)
    38  	require.NoError(t, err)
    39  	require.NoError(t, beaconState.SetSlot(beaconState.Slot()-1))
    40  
    41  	nextSlotState, err := state.ProcessSlots(context.Background(), beaconState.Copy(), beaconState.Slot()+1)
    42  	require.NoError(t, err)
    43  	parentRoot, err := nextSlotState.LatestBlockHeader().HashTreeRoot()
    44  	require.NoError(t, err)
    45  	proposerIdx, err := helpers.BeaconProposerIndex(nextSlotState)
    46  	require.NoError(t, err)
    47  	block := testutil.NewBeaconBlock()
    48  	block.Block.ProposerIndex = proposerIdx
    49  	block.Block.Slot = beaconState.Slot() + 1
    50  	block.Block.ParentRoot = parentRoot[:]
    51  	block.Block.Body.RandaoReveal = randaoReveal
    52  	block.Block.Body.Eth1Data = eth1Data
    53  
    54  	stateRoot, err := state.CalculateStateRoot(context.Background(), beaconState, wrapper.WrappedPhase0SignedBeaconBlock(block))
    55  	require.NoError(t, err)
    56  
    57  	block.Block.StateRoot = stateRoot[:]
    58  
    59  	sig, err := testutil.BlockSignature(beaconState, block.Block, privKeys)
    60  	require.NoError(t, err)
    61  	block.Signature = sig.Marshal()
    62  
    63  	set, _, err := state.ExecuteStateTransitionNoVerifyAnySig(context.Background(), beaconState, wrapper.WrappedPhase0SignedBeaconBlock(block))
    64  	assert.NoError(t, err)
    65  	verified, err := set.Verify()
    66  	assert.NoError(t, err)
    67  	assert.Equal(t, true, verified, "Could not verify signature set")
    68  }
    69  
    70  func TestExecuteStateTransitionNoVerifySignature_CouldNotVerifyStateRoot(t *testing.T) {
    71  	beaconState, privKeys := testutil.DeterministicGenesisState(t, 100)
    72  
    73  	eth1Data := &ethpb.Eth1Data{
    74  		DepositCount: 100,
    75  		DepositRoot:  bytesutil.PadTo([]byte{2}, 32),
    76  		BlockHash:    make([]byte, 32),
    77  	}
    78  	require.NoError(t, beaconState.SetSlot(params.BeaconConfig().SlotsPerEpoch-1))
    79  	e := beaconState.Eth1Data()
    80  	e.DepositCount = 100
    81  	require.NoError(t, beaconState.SetEth1Data(e))
    82  	bh := beaconState.LatestBlockHeader()
    83  	bh.Slot = beaconState.Slot()
    84  	require.NoError(t, beaconState.SetLatestBlockHeader(bh))
    85  	require.NoError(t, beaconState.SetEth1DataVotes([]*ethpb.Eth1Data{eth1Data}))
    86  
    87  	require.NoError(t, beaconState.SetSlot(beaconState.Slot()+1))
    88  	epoch := helpers.CurrentEpoch(beaconState)
    89  	randaoReveal, err := testutil.RandaoReveal(beaconState, epoch, privKeys)
    90  	require.NoError(t, err)
    91  	require.NoError(t, beaconState.SetSlot(beaconState.Slot()-1))
    92  
    93  	nextSlotState, err := state.ProcessSlots(context.Background(), beaconState.Copy(), beaconState.Slot()+1)
    94  	require.NoError(t, err)
    95  	parentRoot, err := nextSlotState.LatestBlockHeader().HashTreeRoot()
    96  	require.NoError(t, err)
    97  	proposerIdx, err := helpers.BeaconProposerIndex(nextSlotState)
    98  	require.NoError(t, err)
    99  	block := testutil.NewBeaconBlock()
   100  	block.Block.ProposerIndex = proposerIdx
   101  	block.Block.Slot = beaconState.Slot() + 1
   102  	block.Block.ParentRoot = parentRoot[:]
   103  	block.Block.Body.RandaoReveal = randaoReveal
   104  	block.Block.Body.Eth1Data = eth1Data
   105  
   106  	stateRoot, err := state.CalculateStateRoot(context.Background(), beaconState, wrapper.WrappedPhase0SignedBeaconBlock(block))
   107  	require.NoError(t, err)
   108  
   109  	block.Block.StateRoot = stateRoot[:]
   110  
   111  	sig, err := testutil.BlockSignature(beaconState, block.Block, privKeys)
   112  	require.NoError(t, err)
   113  	block.Signature = sig.Marshal()
   114  
   115  	block.Block.StateRoot = bytesutil.PadTo([]byte{'a'}, 32)
   116  	_, _, err = state.ExecuteStateTransitionNoVerifyAnySig(context.Background(), beaconState, wrapper.WrappedPhase0SignedBeaconBlock(block))
   117  	require.ErrorContains(t, "could not validate state root", err)
   118  }
   119  
   120  func TestProcessBlockNoVerify_PassesProcessingConditions(t *testing.T) {
   121  	beaconState, block, _, _, _ := createFullBlockWithOperations(t)
   122  	set, _, err := state.ProcessBlockNoVerifyAnySig(context.Background(), beaconState, wrapper.WrappedPhase0SignedBeaconBlock(block))
   123  	require.NoError(t, err)
   124  	// Test Signature set verifies.
   125  	verified, err := set.Verify()
   126  	require.NoError(t, err)
   127  	assert.Equal(t, true, verified, "Could not verify signature set.")
   128  }