prysm-pulse/testing/slasher/simulator/block_generator.go
terence 5a66807989
Update to V5 (#13622)
* First take at updating everything to v5

* Patch gRPC gateway to use prysm v5

Fix patch

* Update go ssz

---------

Co-authored-by: Preston Van Loon <pvanloon@offchainlabs.com>
2024-02-15 05:46:47 +00:00

99 lines
3.0 KiB
Go

package simulator
import (
"context"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/signing"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/state"
"github.com/prysmaticlabs/prysm/v5/config/params"
"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives"
"github.com/prysmaticlabs/prysm/v5/crypto/bls"
"github.com/prysmaticlabs/prysm/v5/crypto/rand"
"github.com/prysmaticlabs/prysm/v5/encoding/bytesutil"
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
)
func (s *Simulator) generateBlockHeadersForSlot(
ctx context.Context, slot primitives.Slot,
) ([]*ethpb.SignedBeaconBlockHeader, []*ethpb.ProposerSlashing, error) {
blocks := make([]*ethpb.SignedBeaconBlockHeader, 0)
slashings := make([]*ethpb.ProposerSlashing, 0)
proposer := rand.NewGenerator().Uint64() % s.srvConfig.Params.NumValidators
var parentRoot [32]byte
beaconState, err := s.srvConfig.StateGen.StateByRoot(ctx, parentRoot)
if err != nil {
return nil, nil, err
}
block := &ethpb.SignedBeaconBlockHeader{
Header: &ethpb.BeaconBlockHeader{
Slot: slot,
ProposerIndex: primitives.ValidatorIndex(proposer),
ParentRoot: bytesutil.PadTo([]byte{}, 32),
StateRoot: bytesutil.PadTo([]byte{}, 32),
BodyRoot: bytesutil.PadTo([]byte("good block"), 32),
},
}
sig, err := s.signBlockHeader(beaconState, block)
if err != nil {
return nil, nil, err
}
block.Signature = sig.Marshal()
blocks = append(blocks, block)
if rand.NewGenerator().Float64() < s.srvConfig.Params.ProposerSlashingProbab {
log.WithField("proposerIndex", proposer).Infof("Slashable block made")
slashableBlock := &ethpb.SignedBeaconBlockHeader{
Header: &ethpb.BeaconBlockHeader{
Slot: slot,
ProposerIndex: primitives.ValidatorIndex(proposer),
ParentRoot: bytesutil.PadTo([]byte{}, 32),
StateRoot: bytesutil.PadTo([]byte{}, 32),
BodyRoot: bytesutil.PadTo([]byte("bad block"), 32),
},
Signature: sig.Marshal(),
}
sig, err = s.signBlockHeader(beaconState, slashableBlock)
if err != nil {
return nil, nil, err
}
slashableBlock.Signature = sig.Marshal()
blocks = append(blocks, slashableBlock)
slashings = append(slashings, &ethpb.ProposerSlashing{
Header_1: block,
Header_2: slashableBlock,
})
}
return blocks, slashings, nil
}
func (s *Simulator) signBlockHeader(
beaconState state.BeaconState,
header *ethpb.SignedBeaconBlockHeader,
) (bls.Signature, error) {
domain, err := signing.Domain(
beaconState.Fork(),
0,
params.BeaconConfig().DomainBeaconProposer,
beaconState.GenesisValidatorsRoot(),
)
if err != nil {
return nil, err
}
htr, err := header.Header.HashTreeRoot()
if err != nil {
return nil, err
}
container := &ethpb.SigningData{
ObjectRoot: htr[:],
Domain: domain,
}
signingRoot, err := container.HashTreeRoot()
if err != nil {
return nil, err
}
validatorPrivKey := s.srvConfig.PrivateKeysByValidatorIndex[header.Header.ProposerIndex]
return validatorPrivKey.Sign(signingRoot[:]), nil
}