package blocks_test import ( "testing" "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/config/params" "github.com/prysmaticlabs/prysm/crypto/bls" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" "github.com/prysmaticlabs/prysm/testing/assert" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/util" ) func TestVerifyBlockHeaderSignature(t *testing.T) { beaconState, err := util.NewBeaconState() require.NoError(t, err) privKey, err := bls.RandKey() require.NoError(t, err) validators := make([]*ethpb.Validator, 1) validators[0] = ðpb.Validator{ PublicKey: privKey.PublicKey().Marshal(), WithdrawalCredentials: make([]byte, 32), EffectiveBalance: params.BeaconConfig().MaxEffectiveBalance, } err = beaconState.SetValidators(validators) require.NoError(t, err) // Sign the block header. blockHeader := util.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ Header: ðpb.BeaconBlockHeader{ Slot: 0, ProposerIndex: 0, }, }) domain, err := signing.Domain( beaconState.Fork(), 0, params.BeaconConfig().DomainBeaconProposer, beaconState.GenesisValidatorRoot(), ) require.NoError(t, err) htr, err := blockHeader.Header.HashTreeRoot() require.NoError(t, err) container := ðpb.SigningData{ ObjectRoot: htr[:], Domain: domain, } require.NoError(t, err) signingRoot, err := container.HashTreeRoot() require.NoError(t, err) // Set the signature in the block header. blockHeader.Signature = privKey.Sign(signingRoot[:]).Marshal() // Sig should verify. err = blocks.VerifyBlockHeaderSignature(beaconState, blockHeader) require.NoError(t, err) } func TestVerifyBlockSignatureUsingCurrentFork(t *testing.T) { params.SetupTestConfigCleanup(t) bCfg := params.BeaconConfig() bCfg.AltairForkEpoch = 100 bCfg.ForkVersionSchedule[bytesutil.ToBytes4(bCfg.AltairForkVersion)] = 100 params.OverrideBeaconConfig(bCfg) bState, keys := util.DeterministicGenesisState(t, 100) altairBlk := util.NewBeaconBlockAltair() altairBlk.Block.ProposerIndex = 0 altairBlk.Block.Slot = params.BeaconConfig().SlotsPerEpoch * 100 fData := ðpb.Fork{ Epoch: 100, CurrentVersion: params.BeaconConfig().AltairForkVersion, PreviousVersion: params.BeaconConfig().GenesisForkVersion, } domain, err := signing.Domain(fData, 100, params.BeaconConfig().DomainBeaconProposer, bState.GenesisValidatorRoot()) assert.NoError(t, err) rt, err := signing.ComputeSigningRoot(altairBlk.Block, domain) assert.NoError(t, err) sig := keys[0].Sign(rt[:]).Marshal() altairBlk.Signature = sig wsb, err := wrapper.WrappedAltairSignedBeaconBlock(altairBlk) require.NoError(t, err) assert.NoError(t, blocks.VerifyBlockSignatureUsingCurrentFork(bState, wsb)) }