prysm-pulse/beacon-chain/chaintest/backend/helpers.go

141 lines
5.2 KiB
Go
Raw Normal View History

package backend
import (
"fmt"
"strconv"
2019-01-12 01:10:39 +00:00
"time"
"github.com/prysmaticlabs/prysm/shared/ssz"
b "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/trieutil"
)
// Generates a simulated beacon block to use
// in the next state transition given the current state,
// the previous beacon block, and previous beacon block root.
func generateSimulatedBlock(
beaconState *pb.BeaconState,
prevBlockRoot [32]byte,
depositsTrie *trieutil.DepositTrie,
simObjects *SimulatedObjects,
) (*pb.BeaconBlock, [32]byte, error) {
stateRoot, err := ssz.TreeHash(beaconState)
if err != nil {
return nil, [32]byte{}, fmt.Errorf("could not tree hash state: %v", err)
}
randaoReveal := params.BeaconConfig().SimulatedBlockRandao
block := &pb.BeaconBlock{
Slot: beaconState.Slot + 1,
RandaoRevealHash32: randaoReveal[:],
ParentRootHash32: prevBlockRoot[:],
StateRootHash32: stateRoot[:],
Eth1Data: &pb.Eth1Data{
DepositRootHash32: []byte{1},
BlockHash32: []byte{2},
},
Body: &pb.BeaconBlockBody{
ProposerSlashings: []*pb.ProposerSlashing{},
AttesterSlashings: []*pb.AttesterSlashing{},
Attestations: []*pb.Attestation{},
Deposits: []*pb.Deposit{},
Exits: []*pb.Exit{},
},
}
if simObjects.simDeposit != nil {
2019-01-12 01:10:39 +00:00
depositInput := &pb.DepositInput{
Pubkey: []byte(simObjects.simDeposit.Pubkey),
WithdrawalCredentialsHash32: make([]byte, 32),
ProofOfPossession: make([]byte, 96),
2019-01-12 01:10:39 +00:00
}
data, err := b.EncodeDepositData(depositInput, simObjects.simDeposit.Amount, time.Now().Unix())
2019-01-12 01:10:39 +00:00
if err != nil {
return nil, [32]byte{}, fmt.Errorf("could not encode deposit data: %v", err)
}
// We then update the deposits Merkle trie with the deposit data and return
// its Merkle branch leading up to the root of the trie.
depositsTrie.UpdateDepositTrie(data)
merkleBranch := depositsTrie.Branch()
2019-01-12 01:10:39 +00:00
block.Body.Deposits = append(block.Body.Deposits, &pb.Deposit{
DepositData: data,
MerkleBranchHash32S: merkleBranch,
MerkleTreeIndex: simObjects.simDeposit.MerkleIndex,
2019-01-12 01:10:39 +00:00
})
}
if simObjects.simProposerSlashing != nil {
Advance Beacon State Transition Part 4: Simulate Proposer Slashings (#1297) * deposit definition according to latest spec * ssz decode input data tests * fix todo * ignore XXX fields in struct * fix * timestamp * gazelle run processing * process deposit complete * all logic complete * verify merkle branch * gazelle * process deposit func * diff cov 1005 * add todo" * all test cases written down * most tests complete * ttl timestamp fail * 100% code coverage in deposits * fix params * encode deposit data helper func * state transition with no slots failing with panic at calcnewblockhashes * smaller deposits for chain start * state advancement benches * ran go tests * bazel * improve the thing * lint * works works works * all conflicts fixed * edit readme to specify tests format * edit readme to specify tests format * skip slots works yay * gazelle * edit readme to specify tests format * wrapped up all randao simulation * fix * passing * goimports * move to slices pkg * deadcode * deposit yaml tests * created deposit trie implementation in Go * created deposit trie implementation in Go * gazelle * merkle branch generation * merkle branch generation * more merkle debugging * fix deposit trie * include new merkle trie functions * update all deposit operations * capitalize * advancing deposits fully works, grows the validator set * wrap up time formatting * lint fix * include all information in the README * edit conf * revert * clean up before merge * successfully e2e test proposer slashings * fix comments
2019-01-12 02:11:43 +00:00
block.Body.ProposerSlashings = append(block.Body.ProposerSlashings, &pb.ProposerSlashing{
ProposerIndex: simObjects.simProposerSlashing.ProposerIndex,
Advance Beacon State Transition Part 4: Simulate Proposer Slashings (#1297) * deposit definition according to latest spec * ssz decode input data tests * fix todo * ignore XXX fields in struct * fix * timestamp * gazelle run processing * process deposit complete * all logic complete * verify merkle branch * gazelle * process deposit func * diff cov 1005 * add todo" * all test cases written down * most tests complete * ttl timestamp fail * 100% code coverage in deposits * fix params * encode deposit data helper func * state transition with no slots failing with panic at calcnewblockhashes * smaller deposits for chain start * state advancement benches * ran go tests * bazel * improve the thing * lint * works works works * all conflicts fixed * edit readme to specify tests format * edit readme to specify tests format * skip slots works yay * gazelle * edit readme to specify tests format * wrapped up all randao simulation * fix * passing * goimports * move to slices pkg * deadcode * deposit yaml tests * created deposit trie implementation in Go * created deposit trie implementation in Go * gazelle * merkle branch generation * merkle branch generation * more merkle debugging * fix deposit trie * include new merkle trie functions * update all deposit operations * capitalize * advancing deposits fully works, grows the validator set * wrap up time formatting * lint fix * include all information in the README * edit conf * revert * clean up before merge * successfully e2e test proposer slashings * fix comments
2019-01-12 02:11:43 +00:00
ProposalData_1: &pb.ProposalSignedData{
Slot: simObjects.simProposerSlashing.Proposal1Slot,
Shard: simObjects.simProposerSlashing.Proposal1Shard,
BlockRootHash32: []byte(simObjects.simProposerSlashing.Proposal1Root),
Advance Beacon State Transition Part 4: Simulate Proposer Slashings (#1297) * deposit definition according to latest spec * ssz decode input data tests * fix todo * ignore XXX fields in struct * fix * timestamp * gazelle run processing * process deposit complete * all logic complete * verify merkle branch * gazelle * process deposit func * diff cov 1005 * add todo" * all test cases written down * most tests complete * ttl timestamp fail * 100% code coverage in deposits * fix params * encode deposit data helper func * state transition with no slots failing with panic at calcnewblockhashes * smaller deposits for chain start * state advancement benches * ran go tests * bazel * improve the thing * lint * works works works * all conflicts fixed * edit readme to specify tests format * edit readme to specify tests format * skip slots works yay * gazelle * edit readme to specify tests format * wrapped up all randao simulation * fix * passing * goimports * move to slices pkg * deadcode * deposit yaml tests * created deposit trie implementation in Go * created deposit trie implementation in Go * gazelle * merkle branch generation * merkle branch generation * more merkle debugging * fix deposit trie * include new merkle trie functions * update all deposit operations * capitalize * advancing deposits fully works, grows the validator set * wrap up time formatting * lint fix * include all information in the README * edit conf * revert * clean up before merge * successfully e2e test proposer slashings * fix comments
2019-01-12 02:11:43 +00:00
},
ProposalData_2: &pb.ProposalSignedData{
Slot: simObjects.simProposerSlashing.Proposal2Slot,
Shard: simObjects.simProposerSlashing.Proposal2Shard,
BlockRootHash32: []byte(simObjects.simProposerSlashing.Proposal2Root),
Advance Beacon State Transition Part 4: Simulate Proposer Slashings (#1297) * deposit definition according to latest spec * ssz decode input data tests * fix todo * ignore XXX fields in struct * fix * timestamp * gazelle run processing * process deposit complete * all logic complete * verify merkle branch * gazelle * process deposit func * diff cov 1005 * add todo" * all test cases written down * most tests complete * ttl timestamp fail * 100% code coverage in deposits * fix params * encode deposit data helper func * state transition with no slots failing with panic at calcnewblockhashes * smaller deposits for chain start * state advancement benches * ran go tests * bazel * improve the thing * lint * works works works * all conflicts fixed * edit readme to specify tests format * edit readme to specify tests format * skip slots works yay * gazelle * edit readme to specify tests format * wrapped up all randao simulation * fix * passing * goimports * move to slices pkg * deadcode * deposit yaml tests * created deposit trie implementation in Go * created deposit trie implementation in Go * gazelle * merkle branch generation * merkle branch generation * more merkle debugging * fix deposit trie * include new merkle trie functions * update all deposit operations * capitalize * advancing deposits fully works, grows the validator set * wrap up time formatting * lint fix * include all information in the README * edit conf * revert * clean up before merge * successfully e2e test proposer slashings * fix comments
2019-01-12 02:11:43 +00:00
},
})
}
if simObjects.simAttesterSlashing != nil {
block.Body.AttesterSlashings = append(block.Body.AttesterSlashings, &pb.AttesterSlashing{
SlashableAttestation_1: &pb.SlashableAttestation{
Advance Beacon State Transition Part 5: Simulate Casper Slashings (#1298) * deposit definition according to latest spec * ssz decode input data tests * fix todo * ignore XXX fields in struct * fix * timestamp * gazelle run processing * process deposit complete * all logic complete * verify merkle branch * gazelle * process deposit func * diff cov 1005 * add todo" * all test cases written down * most tests complete * ttl timestamp fail * 100% code coverage in deposits * fix params * encode deposit data helper func * state transition with no slots failing with panic at calcnewblockhashes * smaller deposits for chain start * state advancement benches * ran go tests * bazel * improve the thing * lint * works works works * all conflicts fixed * edit readme to specify tests format * edit readme to specify tests format * skip slots works yay * gazelle * edit readme to specify tests format * wrapped up all randao simulation * fix * passing * goimports * move to slices pkg * deadcode * deposit yaml tests * created deposit trie implementation in Go * created deposit trie implementation in Go * gazelle * merkle branch generation * merkle branch generation * more merkle debugging * fix deposit trie * include new merkle trie functions * update all deposit operations * capitalize * advancing deposits fully works, grows the validator set * wrap up time formatting * lint fix * include all information in the README * edit conf * revert * clean up before merge * successfully e2e test proposer slashings * casper advancement * wrap up casper slashings * gazelle * fix conf * fix comments
2019-01-14 15:54:27 +00:00
Data: &pb.AttestationData{
Slot: simObjects.simAttesterSlashing.SlashableAttestation1Slot,
JustifiedEpoch: simObjects.simAttesterSlashing.SlashableAttestation1JustifiedEpoch,
Advance Beacon State Transition Part 5: Simulate Casper Slashings (#1298) * deposit definition according to latest spec * ssz decode input data tests * fix todo * ignore XXX fields in struct * fix * timestamp * gazelle run processing * process deposit complete * all logic complete * verify merkle branch * gazelle * process deposit func * diff cov 1005 * add todo" * all test cases written down * most tests complete * ttl timestamp fail * 100% code coverage in deposits * fix params * encode deposit data helper func * state transition with no slots failing with panic at calcnewblockhashes * smaller deposits for chain start * state advancement benches * ran go tests * bazel * improve the thing * lint * works works works * all conflicts fixed * edit readme to specify tests format * edit readme to specify tests format * skip slots works yay * gazelle * edit readme to specify tests format * wrapped up all randao simulation * fix * passing * goimports * move to slices pkg * deadcode * deposit yaml tests * created deposit trie implementation in Go * created deposit trie implementation in Go * gazelle * merkle branch generation * merkle branch generation * more merkle debugging * fix deposit trie * include new merkle trie functions * update all deposit operations * capitalize * advancing deposits fully works, grows the validator set * wrap up time formatting * lint fix * include all information in the README * edit conf * revert * clean up before merge * successfully e2e test proposer slashings * casper advancement * wrap up casper slashings * gazelle * fix conf * fix comments
2019-01-14 15:54:27 +00:00
},
CustodyBitfield: []byte(simObjects.simAttesterSlashing.SlashableAttestation1CustodyBitField),
ValidatorIndices: simObjects.simAttesterSlashing.SlashableAttestation1ValidatorIndices,
Advance Beacon State Transition Part 5: Simulate Casper Slashings (#1298) * deposit definition according to latest spec * ssz decode input data tests * fix todo * ignore XXX fields in struct * fix * timestamp * gazelle run processing * process deposit complete * all logic complete * verify merkle branch * gazelle * process deposit func * diff cov 1005 * add todo" * all test cases written down * most tests complete * ttl timestamp fail * 100% code coverage in deposits * fix params * encode deposit data helper func * state transition with no slots failing with panic at calcnewblockhashes * smaller deposits for chain start * state advancement benches * ran go tests * bazel * improve the thing * lint * works works works * all conflicts fixed * edit readme to specify tests format * edit readme to specify tests format * skip slots works yay * gazelle * edit readme to specify tests format * wrapped up all randao simulation * fix * passing * goimports * move to slices pkg * deadcode * deposit yaml tests * created deposit trie implementation in Go * created deposit trie implementation in Go * gazelle * merkle branch generation * merkle branch generation * more merkle debugging * fix deposit trie * include new merkle trie functions * update all deposit operations * capitalize * advancing deposits fully works, grows the validator set * wrap up time formatting * lint fix * include all information in the README * edit conf * revert * clean up before merge * successfully e2e test proposer slashings * casper advancement * wrap up casper slashings * gazelle * fix conf * fix comments
2019-01-14 15:54:27 +00:00
},
SlashableAttestation_2: &pb.SlashableAttestation{
Advance Beacon State Transition Part 5: Simulate Casper Slashings (#1298) * deposit definition according to latest spec * ssz decode input data tests * fix todo * ignore XXX fields in struct * fix * timestamp * gazelle run processing * process deposit complete * all logic complete * verify merkle branch * gazelle * process deposit func * diff cov 1005 * add todo" * all test cases written down * most tests complete * ttl timestamp fail * 100% code coverage in deposits * fix params * encode deposit data helper func * state transition with no slots failing with panic at calcnewblockhashes * smaller deposits for chain start * state advancement benches * ran go tests * bazel * improve the thing * lint * works works works * all conflicts fixed * edit readme to specify tests format * edit readme to specify tests format * skip slots works yay * gazelle * edit readme to specify tests format * wrapped up all randao simulation * fix * passing * goimports * move to slices pkg * deadcode * deposit yaml tests * created deposit trie implementation in Go * created deposit trie implementation in Go * gazelle * merkle branch generation * merkle branch generation * more merkle debugging * fix deposit trie * include new merkle trie functions * update all deposit operations * capitalize * advancing deposits fully works, grows the validator set * wrap up time formatting * lint fix * include all information in the README * edit conf * revert * clean up before merge * successfully e2e test proposer slashings * casper advancement * wrap up casper slashings * gazelle * fix conf * fix comments
2019-01-14 15:54:27 +00:00
Data: &pb.AttestationData{
Slot: simObjects.simAttesterSlashing.SlashableAttestation2Slot,
JustifiedEpoch: simObjects.simAttesterSlashing.SlashableAttestation2JustifiedEpoch,
Advance Beacon State Transition Part 5: Simulate Casper Slashings (#1298) * deposit definition according to latest spec * ssz decode input data tests * fix todo * ignore XXX fields in struct * fix * timestamp * gazelle run processing * process deposit complete * all logic complete * verify merkle branch * gazelle * process deposit func * diff cov 1005 * add todo" * all test cases written down * most tests complete * ttl timestamp fail * 100% code coverage in deposits * fix params * encode deposit data helper func * state transition with no slots failing with panic at calcnewblockhashes * smaller deposits for chain start * state advancement benches * ran go tests * bazel * improve the thing * lint * works works works * all conflicts fixed * edit readme to specify tests format * edit readme to specify tests format * skip slots works yay * gazelle * edit readme to specify tests format * wrapped up all randao simulation * fix * passing * goimports * move to slices pkg * deadcode * deposit yaml tests * created deposit trie implementation in Go * created deposit trie implementation in Go * gazelle * merkle branch generation * merkle branch generation * more merkle debugging * fix deposit trie * include new merkle trie functions * update all deposit operations * capitalize * advancing deposits fully works, grows the validator set * wrap up time formatting * lint fix * include all information in the README * edit conf * revert * clean up before merge * successfully e2e test proposer slashings * casper advancement * wrap up casper slashings * gazelle * fix conf * fix comments
2019-01-14 15:54:27 +00:00
},
CustodyBitfield: []byte(simObjects.simAttesterSlashing.SlashableAttestation2CustodyBitField),
ValidatorIndices: simObjects.simAttesterSlashing.SlashableAttestation2ValidatorIndices,
Advance Beacon State Transition Part 5: Simulate Casper Slashings (#1298) * deposit definition according to latest spec * ssz decode input data tests * fix todo * ignore XXX fields in struct * fix * timestamp * gazelle run processing * process deposit complete * all logic complete * verify merkle branch * gazelle * process deposit func * diff cov 1005 * add todo" * all test cases written down * most tests complete * ttl timestamp fail * 100% code coverage in deposits * fix params * encode deposit data helper func * state transition with no slots failing with panic at calcnewblockhashes * smaller deposits for chain start * state advancement benches * ran go tests * bazel * improve the thing * lint * works works works * all conflicts fixed * edit readme to specify tests format * edit readme to specify tests format * skip slots works yay * gazelle * edit readme to specify tests format * wrapped up all randao simulation * fix * passing * goimports * move to slices pkg * deadcode * deposit yaml tests * created deposit trie implementation in Go * created deposit trie implementation in Go * gazelle * merkle branch generation * merkle branch generation * more merkle debugging * fix deposit trie * include new merkle trie functions * update all deposit operations * capitalize * advancing deposits fully works, grows the validator set * wrap up time formatting * lint fix * include all information in the README * edit conf * revert * clean up before merge * successfully e2e test proposer slashings * casper advancement * wrap up casper slashings * gazelle * fix conf * fix comments
2019-01-14 15:54:27 +00:00
},
})
}
if simObjects.simValidatorExit != nil {
Advance Beacon State Transition Part 6: Simulate Validator Exits (#1302) * deposit definition according to latest spec * ssz decode input data tests * fix todo * ignore XXX fields in struct * fix * timestamp * gazelle run processing * process deposit complete * all logic complete * verify merkle branch * gazelle * process deposit func * diff cov 1005 * add todo" * all test cases written down * most tests complete * ttl timestamp fail * 100% code coverage in deposits * fix params * encode deposit data helper func * state transition with no slots failing with panic at calcnewblockhashes * smaller deposits for chain start * state advancement benches * ran go tests * bazel * improve the thing * lint * works works works * all conflicts fixed * edit readme to specify tests format * edit readme to specify tests format * skip slots works yay * gazelle * edit readme to specify tests format * wrapped up all randao simulation * fix * passing * goimports * move to slices pkg * deadcode * deposit yaml tests * created deposit trie implementation in Go * created deposit trie implementation in Go * gazelle * merkle branch generation * merkle branch generation * more merkle debugging * fix deposit trie * include new merkle trie functions * update all deposit operations * capitalize * advancing deposits fully works, grows the validator set * wrap up time formatting * lint fix * include all information in the README * edit conf * revert * clean up before merge * successfully e2e test proposer slashings * casper advancement * wrap up casper slashings * gazelle * fix conf * fix comments * advance validator exits complete * wrap up readme
2019-01-14 17:02:49 +00:00
block.Body.Exits = append(block.Body.Exits, &pb.Exit{
Epoch: simObjects.simValidatorExit.Epoch,
ValidatorIndex: simObjects.simValidatorExit.ValidatorIndex,
Advance Beacon State Transition Part 6: Simulate Validator Exits (#1302) * deposit definition according to latest spec * ssz decode input data tests * fix todo * ignore XXX fields in struct * fix * timestamp * gazelle run processing * process deposit complete * all logic complete * verify merkle branch * gazelle * process deposit func * diff cov 1005 * add todo" * all test cases written down * most tests complete * ttl timestamp fail * 100% code coverage in deposits * fix params * encode deposit data helper func * state transition with no slots failing with panic at calcnewblockhashes * smaller deposits for chain start * state advancement benches * ran go tests * bazel * improve the thing * lint * works works works * all conflicts fixed * edit readme to specify tests format * edit readme to specify tests format * skip slots works yay * gazelle * edit readme to specify tests format * wrapped up all randao simulation * fix * passing * goimports * move to slices pkg * deadcode * deposit yaml tests * created deposit trie implementation in Go * created deposit trie implementation in Go * gazelle * merkle branch generation * merkle branch generation * more merkle debugging * fix deposit trie * include new merkle trie functions * update all deposit operations * capitalize * advancing deposits fully works, grows the validator set * wrap up time formatting * lint fix * include all information in the README * edit conf * revert * clean up before merge * successfully e2e test proposer slashings * casper advancement * wrap up casper slashings * gazelle * fix conf * fix comments * advance validator exits complete * wrap up readme
2019-01-14 17:02:49 +00:00
})
}
blockRoot, err := ssz.TreeHash(block)
if err != nil {
return nil, [32]byte{}, fmt.Errorf("could not tree hash new block: %v", err)
}
return block, blockRoot, nil
}
// Generates initial deposits for creating a beacon state in the simulated
// backend based on the yaml configuration.
func generateInitialSimulatedDeposits(numDeposits uint64) ([]*pb.Deposit, error) {
genesisTime := params.BeaconConfig().GenesisTime.Unix()
deposits := make([]*pb.Deposit, numDeposits)
for i := 0; i < len(deposits); i++ {
depositInput := &pb.DepositInput{
Pubkey: []byte(strconv.Itoa(i)),
WithdrawalCredentialsHash32: make([]byte, 32),
ProofOfPossession: make([]byte, 96),
}
depositData, err := b.EncodeDepositData(
depositInput,
2019-02-09 13:09:09 +00:00
params.BeaconConfig().MaxDepositAmount,
genesisTime,
)
if err != nil {
return nil, fmt.Errorf("could not encode initial block deposits: %v", err)
}
deposits[i] = &pb.Deposit{DepositData: depositData}
}
return deposits, nil
}