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

297 lines
10 KiB
Go
Raw Normal View History

// Package backend contains utilities for simulating an entire
// ETH 2.0 beacon chain for e2e tests and benchmarking
// purposes.
package backend
import (
"context"
"fmt"
"reflect"
"time"
"github.com/ethereum/go-ethereum/common"
"github.com/gogo/protobuf/proto"
"github.com/prysmaticlabs/prysm/beacon-chain/blockchain"
b "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks"
"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
"github.com/prysmaticlabs/prysm/beacon-chain/core/validators"
"github.com/prysmaticlabs/prysm/beacon-chain/db"
"github.com/prysmaticlabs/prysm/beacon-chain/utils"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared/hashutil"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/slices"
"github.com/prysmaticlabs/prysm/shared/trie"
log "github.com/sirupsen/logrus"
)
// SimulatedBackend allowing for a programmatic advancement
// of an in-memory beacon chain for client test runs
// and other e2e use cases.
type SimulatedBackend struct {
chainService *blockchain.ChainService
beaconDB *db.BeaconDB
}
// NewSimulatedBackend creates an instance by initializing a chain service
// utilizing a mockDB which will act according to test run parameters specified
// in the common ETH 2.0 client test YAML format.
func NewSimulatedBackend() (*SimulatedBackend, error) {
db, err := setupDB()
if err != nil {
return nil, fmt.Errorf("could not setup simulated backend db: %v", err)
}
cs, err := blockchain.NewChainService(context.Background(), &blockchain.Config{
BeaconDB: db,
IncomingBlockBuf: 0,
EnablePOWChain: false,
})
if err != nil {
return nil, err
}
return &SimulatedBackend{
chainService: cs,
beaconDB: db,
}, nil
}
// RunForkChoiceTest uses a parsed set of chaintests from a YAML file
// according to the ETH 2.0 client chain test specification and runs them
// against the simulated backend.
func (sb *SimulatedBackend) RunForkChoiceTest(testCase *ForkChoiceTestCase) error {
defer teardownDB(sb.beaconDB)
// Utilize the config parameters in the test case to setup
// the DB and set global config parameters accordingly.
// Config parameters include: ValidatorCount, ShardCount,
// CycleLength, MinCommitteeSize, and more based on the YAML
// test language specification.
c := params.BeaconConfig()
c.ShardCount = testCase.Config.ShardCount
c.EpochLength = testCase.Config.CycleLength
2018-11-21 01:41:20 +00:00
c.TargetCommitteeSize = testCase.Config.MinCommitteeSize
params.OverrideBeaconConfig(c)
// Then, we create the validators based on the custom test config.
randaoPreCommit := [32]byte{}
randaoReveal := hashutil.Hash(randaoPreCommit[:])
validators := make([]*pb.ValidatorRecord, testCase.Config.ValidatorCount)
for i := uint64(0); i < testCase.Config.ValidatorCount; i++ {
validators[i] = &pb.ValidatorRecord{
ExitSlot: params.BeaconConfig().EntryExitDelay,
2018-12-03 02:17:48 +00:00
Pubkey: []byte{},
RandaoCommitmentHash32: randaoReveal[:],
}
}
// TODO(#718): Next step is to update and save the blocks specified
// in the case case into the DB.
//
// Then, we call the updateHead routine and confirm the
// chain's head is the expected result from the test case.
return nil
}
// RunShuffleTest uses validator set specified from a YAML file, runs the validator shuffle
// algorithm, then compare the output with the expected output from the YAML file.
func (sb *SimulatedBackend) RunShuffleTest(testCase *ShuffleTestCase) error {
defer teardownDB(sb.beaconDB)
seed := common.BytesToHash([]byte(testCase.Seed))
output, err := utils.ShuffleIndices(seed, testCase.Input)
if err != nil {
return err
}
if !reflect.DeepEqual(output, testCase.Output) {
return fmt.Errorf("shuffle result error: expected %v, actual %v", testCase.Output, output)
}
return nil
}
// RunStateTransitionTest advances a beacon chain state transition an N amount of
// slots from a genesis state, with a block being processed at every iteration
// of the state transition function.
func (sb *SimulatedBackend) RunStateTransitionTest(testCase *StateTestCase) error {
defer teardownDB(sb.beaconDB)
// We setup the initial configuration for running state
// transition tests below.
c := params.BeaconConfig()
c.EpochLength = testCase.Config.EpochLength
c.DepositsForChainStart = testCase.Config.DepositsForChainStart
params.OverrideBeaconConfig(c)
// We create a list of randao hash onions for the given number of slots
// the simulation will attempt.
hashOnions := generateSimulatedRandaoHashOnions(testCase.Config.NumSlots)
// We then generate initial validator deposits for initializing the
// beacon state based where every validator will use the last layer in the randao
// onions list as the commitment in the deposit instance.
lastRandaoLayer := hashOnions[len(hashOnions)-1]
initialDeposits, err := generateInitialSimulatedDeposits(lastRandaoLayer)
if err != nil {
return fmt.Errorf("could not simulate initial validator deposits: %v", err)
}
genesisTime := params.BeaconConfig().GenesisTime.Unix()
beaconState, err := state.InitialBeaconState(initialDeposits, uint64(genesisTime), nil)
if err != nil {
return fmt.Errorf("could not initialize simulated beacon state")
}
// We do not expect hashing initial beacon state and genesis block to
// fail, so we can safely ignore the error below.
// #nosec G104
encodedState, _ := proto.Marshal(beaconState)
stateRoot := hashutil.Hash(encodedState)
genesisBlock := b.NewGenesisBlock(stateRoot[:])
// #nosec G104
encodedGenesisBlock, _ := proto.Marshal(genesisBlock)
genesisBlockRoot := hashutil.Hash(encodedGenesisBlock)
// We now keep track of generated blocks for each state transition in
// a slice.
prevBlockRoots := [][32]byte{genesisBlockRoot}
// We keep track of the randao layers peeled for each proposer index in a map.
layersPeeledForProposer := make(map[uint32]int, len(beaconState.ValidatorRegistry))
for idx := range beaconState.ValidatorRegistry {
layersPeeledForProposer[uint32(idx)] = 0
}
2019-01-12 01:10:39 +00:00
depositsTrie := trie.NewDepositTrie()
averageTimesPerTransition := []time.Duration{}
for i := uint64(0); i < testCase.Config.NumSlots; i++ {
prevBlockRoot := prevBlockRoots[len(prevBlockRoots)-1]
committeeArray, err := validators.CrosslinkCommitteesAtSlot(beaconState, i)
if err != nil {
return fmt.Errorf("could not get crosslink committee: %v", err)
}
firstCommittee := committeeArray[0].Committee
proposerIndex := firstCommittee[i%uint64(len(firstCommittee))]
// If the slot is marked as skipped in the configuration options,
// we simply run the state transition with a nil block argument.
if slices.IsInUint64(i, testCase.Config.SkipSlots) {
newState, err := state.ExecuteStateTransition(beaconState, nil, prevBlockRoot)
if err != nil {
return fmt.Errorf("could not execute state transition: %v", err)
}
beaconState = newState
layersPeeledForProposer[proposerIndex]++
continue
}
2019-01-12 01:10:39 +00:00
// If the slot is not skipped, we check if we are simulating a deposit at the current slot.
var simulatedDeposit *StateTestDeposit
for _, deposit := range testCase.Config.Deposits {
if deposit.Slot == i {
simulatedDeposit = deposit
break
}
}
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
var simulatedProposerSlashing *StateTestProposerSlashing
for _, pSlashing := range testCase.Config.ProposerSlashings {
if pSlashing.Slot == i {
simulatedProposerSlashing = pSlashing
break
}
}
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
var simulatedCasperSlashing *StateTestCasperSlashing
for _, cSlashing := range testCase.Config.CasperSlashings {
if cSlashing.Slot == i {
simulatedCasperSlashing = cSlashing
break
}
}
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
var simulatedValidatorExit *StateTestValidatorExit
for _, exit := range testCase.Config.ValidatorExits {
if exit.Slot == i {
simulatedValidatorExit = exit
break
}
}
2019-01-12 01:10:39 +00:00
layersPeeled := layersPeeledForProposer[proposerIndex]
blockRandaoReveal := determineSimulatedBlockRandaoReveal(layersPeeled, hashOnions)
// We generate a new block to pass into the state transition.
newBlock, newBlockRoot, err := generateSimulatedBlock(
beaconState,
prevBlockRoot,
blockRandaoReveal,
2019-01-12 01:10:39 +00:00
lastRandaoLayer,
simulatedDeposit,
depositsTrie,
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
simulatedProposerSlashing,
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
simulatedCasperSlashing,
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
simulatedValidatorExit,
)
if err != nil {
return fmt.Errorf("could not generate simulated beacon block %v", err)
}
2019-01-12 01:10:39 +00:00
latestRoot := depositsTrie.Root()
beaconState.LatestDepositRootHash32 = latestRoot[:]
startTime := time.Now()
newState, err := state.ExecuteStateTransition(beaconState, newBlock, prevBlockRoot)
if err != nil {
return fmt.Errorf("could not execute state transition: %v", err)
}
2019-01-12 01:10:39 +00:00
endTime := time.Now()
averageTimesPerTransition = append(averageTimesPerTransition, endTime.Sub(startTime))
// We then keep track of information about the state after the
// state transition was applied.
beaconState = newState
prevBlockRoots = append(prevBlockRoots, newBlockRoot)
layersPeeledForProposer[proposerIndex]++
}
log.Infof(
2019-01-12 01:10:39 +00:00
"with %d initial deposits, each state transition took average time = %v",
testCase.Config.DepositsForChainStart,
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
averageDuration(averageTimesPerTransition),
)
2019-01-12 01:10:39 +00:00
if beaconState.Slot != testCase.Results.Slot {
return fmt.Errorf(
"incorrect state slot after %d state transitions without blocks, wanted %d, received %d",
testCase.Config.NumSlots,
testCase.Config.NumSlots,
testCase.Results.Slot,
)
}
2019-01-12 01:10:39 +00:00
if len(beaconState.ValidatorRegistry) != testCase.Results.NumValidators {
return fmt.Errorf(
"incorrect num validators after %d state transitions without blocks, wanted %d, received %d",
testCase.Config.NumSlots,
testCase.Results.NumValidators,
len(beaconState.ValidatorRegistry),
)
}
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
for _, penalized := range testCase.Results.PenalizedValidators {
if beaconState.ValidatorRegistry[penalized].PenalizedSlot == params.BeaconConfig().FarFutureSlot {
return fmt.Errorf(
"expected validator at index %d to have been penalized",
penalized,
)
}
}
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
for _, exited := range testCase.Results.ExitedValidators {
if beaconState.ValidatorRegistry[exited].StatusFlags != pb.ValidatorRecord_INITIATED_EXIT {
return fmt.Errorf(
"expected validator at index %d to have exited",
exited,
)
}
}
return nil
}
2019-01-12 01:10:39 +00:00
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
func averageDuration(times []time.Duration) time.Duration {
2019-01-12 01:10:39 +00:00
sum := int64(0)
for _, t := range times {
sum += t.Nanoseconds()
}
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
return time.Duration(sum / int64(len(times)))
2019-01-12 01:10:39 +00:00
}