mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-29 06:37:17 +00:00
cb045dd0e3
* Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * add in new patch and workspace * update cloners * Handle rewards overflow (#5122) * Refactoring of initial sync (#5096) * implements blocks queue * refactors updateCounter method * fixes deadlock on stop w/o start * refactors updateSchedulerState * more tests on schduler * parseFetchResponse tests * wraps up tests for blocks queue * eod commit * fixes data race in round robin * revamps fetcher * fixes race conditions + livelocks + deadlocks * less verbose output * fixes data race, by isolating critical sections * minor refactoring: resolves blocking calls * implements init-sync queue * udpate fetch/send buffers in blocks fetcher * blockState enum-like type alias * refactors common code into releaseTicket() * better gc * linter * minor fix to round robin * moves original round robin into its own package * adds enableInitSyncQueue flag * fixes issue with init-sync service selection * Update beacon-chain/sync/initial-sync/round_robin.go Co-Authored-By: terence tsao <terence@prysmaticlabs.com> * initsyncv1 -> initsyncold * adds span Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: Raul Jordan <raul@prysmaticlabs.com> Co-authored-by: terence tsao <terence@prysmaticlabs.com> * Handle rewards overflow * Revert "Refactoring of initial sync (#5096)" This reverts commit3ec2a0f9e0
. Co-authored-by: Victor Farazdagi <simple.square@gmail.com> Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: Raul Jordan <raul@prysmaticlabs.com> * updated block operations * updated validator client * Merge refs/heads/master into v0.10.1 * updated block operations test * skip benchmark test * updated transition test * updated db kv tests * updated ops tests * updated ops tests * updated slashing tests * updated rpc tests * updated state utils * updated test utils and miscs * Temp skips minimal spec tests * Fixed proposer slashing test * Gaz * Skip 2 more minimal tests * Skip 2 more minimal tests * Update readme * gaz * Conflict * Fix import and not use * Update workspace for new spec test * Fix workspace * Merge refs/heads/master into v0.10.1 * Update workspace with new ethapi commit * Unblock a few tests * Merge refs/heads/master into v0.10.1 * fixed block op test * gaz * Merge refs/heads/master into v0.10.1 * Skip gen state test (test setup issue * Updated hysteresis config * Updated epoch processing for new hyteresis * Updated tests * regen proto beacon * update state util for state root * update state types * update getter and setters * update compute domain and get domain and tests * update validators * Add forkdata proto * Updated compute domain api, moved it to helper pkg * Merge refs/heads/master into v0.10.1 * Fixed all core tests * Fixed all the sync tests * Fixed all the rpc tests * Merge refs/heads/master into v0.10.1 * Merge refs/heads/master into v0.10.1 * Fixed conflict * Fixed conflict * Conflict fix * visibility * Fixed validator tests * Fixing test util * Fixed rest of non spec tests * Fixed a bug proposer index wasn't included * gaz * Merge branch 'v0.11' of github.com:prysmaticlabs/prysm into v0.11 * Updated eth1 data voting period to epoch based * Fixed failed tests * fix bug * fix error * Fixed more misc tests * Add new SignedAggregateAndProof to pass spec test * Update minimalConfig.PersistentCommitteePeriod * allow to rebuild trie * Merge branch 'v0.11' of github.com:prysmaticlabs/prysm into v0.11 * Skip e2e tests * Merge branch 'v0.11' of github.com:prysmaticlabs/prysm into v0.11 * Align aggregator action with v0.11 (#5146) * Remove Head Root from Beacon Block by Range Request (#5165) * make proto changes * remove head root * Merge branch 'master' of https://github.com/prysmaticlabs/geth-sharding into v0.11 * add back herumi's library * Update ethapi in workspace, started fixing test. Hand off to Nishant * fix build * All tests passing * Align finalized slot check with v0.11 (#5166) * Merge branch 'master' into v0.11 * Add DoS resistance for v0.11 (#5158) * Add Fork Digest Helper (#5173) * Extend DoS prevention to rest of operation objects (#5174) * Update mapping * Add caches * Update seen block in validation pipeline * Update seen att in validation pipeline * Update seen att in validation pipeline * Fixed rest of tests * Gazelle * Better writes * Lint * Preston's feedback * Switched to LRU cache and fixed tests * Gazelle * Fix test * Update proposer slashing * Update proposer slashing * Fixed a block test * Update exit * Update atteser slashing * Raul's feedback Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Add remote keymanager (#5133) * Add remote keymanager * Add generic signRoot() helper * Add tests for remote keymanager * NewRemote -> NewRemoteWallet * signRoot -> signOject, to increase reuse * Fix end-to-end compile error Co-authored-by: Preston Van Loon <preston@prysmaticlabs.com> * Add Snappy Framing to the Encoder (#5172) * change to framing * more fixes * fix everything * add stricter limits * preston feedback Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: rauljordan <raul@prysmaticlabs.com> * Merge branch 'v0.11' of github.com:prysmaticlabs/prysm into v0.11 * Move Subnet Functionality to its Own File (#5179) * move subnets to their own file * fix build fail * build * Update beacon-chain/p2p/discovery_test.go Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Sync with master * Verify proposer signature in sync (#5206) * Fix Signed Attestation In Sync (#5207) * Add Eth2 Fork ENR Functionality (#5181) * add fork entry enr * add in fork * add the required fork entry to node * add and retrieve fork entry * await state initialized * utilize new structure * more progress, utilizing a config map instead * send the genesis validators root via the event feed * struct method for discovery * fix broken builds * fixed up more tsts using state feed initializer * fix up most tests * only one more failing test * almost done with tests * p2p tests all pass * config fix * fix blockchain test * gaz * add in todo * lint * add compare func * ensure fork ENR versions match between peers * add in test for discovery * test name * tests complete * tests done * done * comments * fix all flakes * addressed comments * build using ssz gen * marshal record * use custom ssz * deduplicate import * fix build * add enr proto * p2p tests done Co-authored-by: nisdas <nishdas93@gmail.com> Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Verify aggregator signature in sync (#5208) * Add Fork Digest For Gossip Topics (#5191) * update for the day * fix remaining failing test * fix one more test * change message * Apply suggestions from code review Co-Authored-By: terence tsao <terence@prysmaticlabs.com> * terence's review * implement fork digest' * align digest to interface' * passed all tests * spawn in goroutine Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: terence tsao <terence@prysmaticlabs.com> Co-authored-by: Raul Jordan <raul@prysmaticlabs.com> * Fix Incorrect Attester Slashing Method (#5229) * Merge branch 'v0.11' of github.com:prysmaticlabs/prysm into v0.11 * Remove keystore keymanager from validator (#5236) * Remove keystore keymanager from validator * Update dependency * Update validator/flags/flags.go * Update validator/flags/flags.go Co-authored-by: Ivan Martinez <ivanthegreatdev@gmail.com> * fix broadcaster * update metrics with fork digest for p2p (#5251) * update metrics with fork digest for p2p * update p2p metrics * update metrics using att values * wrapped up * fix bug Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Fix incorrect domain type comments (#5250) * Fix incorrect domain type comments * resolve conflicts * fix broken broadcast test * fix tests * include protocol suffix * fix confs * lint * fix test * Merge branch 'v0.11' of github.com:prysmaticlabs/prysm into v0.11 * Merge branch 'master' of github.com:prysmaticlabs/prysm into v0.11 * resolve broken slasher test' * Merge branch 'v0.11' of github.com:prysmaticlabs/prysm into v0.11 * Merge branch 'master' into v0.11 * fix config override * Remove deprecated parameters (#5249) * Avoid div by zero in extreme balance case (#5273) * Return effective balance increment instead of 1 * Update to new spec tests v0.11.1 * Revert "Regen historical states for `new-state-mgmt` compatibility (#5261)" This reverts commitdf9a534826
. Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Revert "Remove deprecated parameters (#5249)" (#5276) This reverts commit 7d17c9ac3455ee15c67b3645485693309216bc97. * Verify block proposer index before gossip (#5274) * Update pipeline * Update tests Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Add in Proposer Index to Custom HTR (#5269) * fix test * Update beacon-chain/state/stateutil/blocks_test.go Co-authored-by: terence tsao <terence@prysmaticlabs.com> Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Resolve Flakey P2P Tests (#5285) * double time for flakey test * fix test flakeyness in p2p: * flakey * time tolerance * greater tolerance * Merge branch 'master' into v0.11 * release resources correctly (#5287) * Merge refs/heads/master into v0.11 * Enable NOISE Handshake by Default v0.11 (#5272) * noise handshakes by default * fix build * noisy noise everywhere * deprecated noisy noise flag with more noise * add secio as fallback Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: nisdas <nishdas93@gmail.com> * Merge refs/heads/master into v0.11 * new ports * fix broken build * Make `new-state-mgmt` canonical (#5289) * Invert the flags * Update checking messages * Fixed all db tests * Fixed rest of the block chain tests * Fix chain race tests * Fixed rpc tests * Disable soudns better... * Merge branch 'v0.11' into invert-new-state-mgmt * Merge refs/heads/v0.11 into invert-new-state-mgmt * Fix export * Merge branch 'invert-new-state-mgmt' of github.com:prysmaticlabs/prysm into invert-new-state-mgmt * Fix conflict tests * Gazelle * Merge refs/heads/v0.11 into invert-new-state-mgmt * Merge refs/heads/v0.11 into invert-new-state-mgmt * Merge branch 'master' into v0.11 * resolve flakeyness * Merge refs/heads/master into v0.11 * Merge refs/heads/master into v0.11 * Detect Proposer Slashing Implementation (#5139) * detect blocks * detect blocks * use stub * use stub * use stub * todo * fix test * add tests and utils * fix imports * fix imports * fix comment * todo * proposerIndex * fix broken test * formatting and simplified if * Update slasher/detection/service.go * Update slasher/detection/testing/utils.go Co-Authored-By: terence tsao <terence@prysmaticlabs.com> * fixed up final comments * better naming * Update slasher/detection/service.go * Update slasher/detection/service.go * Update slasher/detection/service.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * no more named args Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: Raul Jordan <raul@prysmaticlabs.com> Co-authored-by: terence tsao <terence@prysmaticlabs.com> Co-authored-by: Ivan Martinez <ivanthegreatdev@gmail.com> * Merge branch 'master' of https://github.com/prysmaticlabs/geth-sharding into v0.11 * Add Metadata And Ping RPC methods (#5271) * add new proto files * add flag and helper * add initializer * imports * add ping method * add receive/send ping request * add ping test * refactor rpc methods and add ping test * finish adding all tests * fix up tests * Apply suggestions from code review * lint * imports * lint * Update beacon-chain/p2p/service.go * Update shared/cmd/flags.go Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: terence tsao <terence@prysmaticlabs.com> * Merge branch 'master' of https://github.com/prysmaticlabs/geth-sharding into v0.11 * Updates for remote keymanager (#5260) * Merge branch 'spec-v0.11' of github.com:prysmaticlabs/prysm into v0.11 * Merge remote-tracking branch 'origin' into v0.11 * Update to slash by slot instead of epoch (#5297) * change to slash by slot instead of epoch * gaz * fix test * fix test * fix infinite loop on error parse * Sync with master * Merge branch 'v0.11' of github.com:prysmaticlabs/prysm into v0.11 * Update proposer protection to v0.11 (#5292) * Complete most of changes * Fix other tests * Test progress * Tests * Finish tests * update pbs * Fix mocked tests * Gazelle * pt 2 * Fix * Fixes * Fix tests wit hwrong copying * Merge refs/heads/master into v0.11 * Merge refs/heads/master into v0.11 * Implement `SubscribeCommitteeSubnet` method (#5299) * Add client implementation * Update workspace * Update server * Update service * Gaz * Mocks * Fixed validator tests * Add round tirp tests * Fixed subnet test * Comment * Update committee cache * Comment * Update RPC * Fixed test * Nishant's comment * Gaz * Refresh ENR is for epoch * Needs to be append * Merge refs/heads/master into v0.11 * resolve confs * Validator subscribe subnet to next epoch (#5312) * Alert to subscribe to next epoch * Fixed tests * Comments * Fixed tests * Update validator/client/validator.go Co-authored-by: Ivan Martinez <ivanthegreatdev@gmail.com> Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Revert "Revert "Remove deprecated parameters (#5249)" (#5276)" (#5277) This reverts commit 47e5a2cf96f5add151bf135a5352c2dad7922615. * Aggregate on demand for v0.11 (#5302) * Add client implementation * Update workspace * Update server * Update service * Gaz * Mocks * Fixed validator tests * Add round tirp tests * Fixed subnet test * Wait 1/3 on validator side * Lint * Comment * Update committee cache * Comment * Update RPC * Fixed test * Nishant's comment * Gaz * Refresh ENR is for epoch * Needs to be append * Fixed duplication * Tests * Skip e2e * Update beacon-chain/rpc/validator/aggregator.go Co-Authored-By: shayzluf <thezluf@gmail.com> * Apply suggestions from code review Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: shayzluf <thezluf@gmail.com> Co-authored-by: Raul Jordan <raul@prysmaticlabs.com> * Refactor Dynamic Subscriptions (#5318) * clean up * comment * metrics * fix Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Merge refs/heads/master into v0.11 * Fix listindexed attestations and detect historic attestations (#5321) * fix list indexed attestations * fix tests * goimports * names * Add check for slot == 0 (#5322) * Change attester protection to return default if DB is empty (#5323) * Change how default values are set * Remove unused imports * Remove wasteful db call * Fix db tests * Fix db test * Merge refs/heads/master into v0.11 * fix it (#5326) * V0.11 run time fixes to use interop config (#5324) * Started testing * Bunch of fixes * use-interop * Sync with v0.11 * Conflict * Uncomment wait for activation * Move pending block queue from subscriber to validator pipeline * Merge branch 'v0.11' into use-interop-config * passing tests * Merge refs/heads/v0.11 into use-interop-config * Merge refs/heads/v0.11 into use-interop-config * Merge refs/heads/master into v0.11 * Merge refs/heads/master into v0.11 * Merge refs/heads/master into v0.11 * Nil Checks in Process Attestation v0.11 (#5331) * Started testing * Bunch of fixes * use-interop * Sync with v0.11 * Uncomment wait for activation * Move pending block queue from subscriber to validator pipeline * passing tests * nil checks to prevent panics * lint Co-authored-by: terence tsao <terence@prysmaticlabs.com> * Validator batch subscribe subnets (#5332) * Update both beacon node and validator * Comments * Tests * Lint Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Validator smarter subscribe (#5334) * Fix incorrect proposer index calculation (#5336) * Use correct parent state * Fixed test Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * enhance error * enhance error * Update P2P Service to Handle Local Metadata (#5319) * add metadata to ENR * add new methods * glue everything * fix all tests and refs * add tests * add more tests * Apply suggestions from code review * fix method * raul's review * gaz * fix test setup * fix all tests * better naming * fix broken test * validate nil Co-authored-by: rauljordan <raul@prysmaticlabs.com> Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Merge branch 'v0.11' of github.com:prysmaticlabs/prysm into v0.11 * Revert "Revert "Revert "Remove deprecated parameters (#5249)" (#5276)" (#5277)" (#5343) This reverts commit e5aef1686e582fc2077767c42187c8527f3a742f. * Wait for Genesis Event to Start P2P (#5303) * use event feed for state initialized events * add in handler for tests * wait till genesis for p2p * Apply suggestions from code review Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Merge refs/heads/master into v0.11 * Avoid duplicated aggregation request (#5346) * Avoid duplicated aggregation request * Test and lock * Gaz * Fix Validate For Metadata (#5348) * return true * shay's review Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Multiple Proposer Slots Allowed Per Epoch for Validators (#5344) * allow multiple proposer slots * multi propose * proposer indices to slots map * remove deprecated comm assign * Apply suggestions from code review * resolve broken tests, add logic in validator client * fix val tests Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Networking Fixes (#5349) * close stream later * add ping method * add method * lint * More efficient aggregation on demand (#5354) * Return Nil Error if Pre-Genesis in P2P Service Healthz Check (#5355) * pregenesis healthz check: * optimal * right order * Update beacon-chain/p2p/service.go Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com> * Update beacon-chain/p2p/service.go Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com> * no comment Co-authored-by: Preston Van Loon <preston@prysmaticlabs.com> * Release DiscoveryV5 for Testnet Restart (#5357) * release discv5 * fix build * Fix Overflow in Status Check (#5361) * fix overflow * Apply suggestions from code review * Merge branch 'master' of github.com:prysmaticlabs/prysm into v0.11 * fix after merge * Merge refs/heads/master into v0.11 * Make Mainnet Config Default, No More Demo Config (#5367) * bye bye demo config * gaz * fix usage * fix dep * gaz * Update default balance for sendDeposits Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: Preston Van Loon <preston@prysmaticlabs.com> * Use FastSSZ Marshal/Unmarshal for DB Encodings in v0.11.1 (#5351) * try * use marshaler structure for db instead of proto * white list types * attempt * revert * testutil.NewBeaconState() * Fully populate fields for round trip ssz marshal * fix //beacon-chain/db/kv:go_default_test * more passing tests * another test target passed * fixed stategen * blockchain tests green * passing sync * more targets fixed * more test fixes in rpc/validator * most rpc val * validators test fixes * skip round robin old * aggregate test * whitelist done * Update beacon-chain/rpc/validator/attester_test.go * edit baz * Fixed tests * Fixed getblock test * Add back init * reduce test size * fix broken build * tests pass Co-authored-by: Preston Van Loon <preston@prysmaticlabs.com> Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: terence tsao <terence@prysmaticlabs.com> * Reconnect slasher streams on beacon node shutdown (#5376) * restart streams on beacon node shutdown * fix comment * remove export * ivan feedback * ivan feedback * case insensitive * Update slasher/beaconclient/receivers.go * raul feedback Co-authored-by: Ivan Martinez <ivanthegreatdev@gmail.com> Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Merge branch 'master' into v0.11 * Merge refs/heads/master into v0.11 * Amend Faucet to Offer 32.5 ETH for v0.11 (#5378) * deposit amount in faucet * fix eth amount * gas cost * unskip exec transition test * Revert "Enable NOISE Handshake by Default v0.11 (#5272)" (#5381) This reverts commit a8d32d504a8f923cdf7fa9dfc2684f8804fbab92. * Merge refs/heads/master into v0.11 * use string for deposit flag * Update Bootnode to v0.11 (#5387) * fix bootnode * add changes * gaz * fix docker * Merge branch 'master' of github.com:prysmaticlabs/prysm into v0.11 * build fix * fix flaky test * Merge refs/heads/master into v0.11 * Unskip E2E for V0.11 (#5386) * Begin work on fixing e2e for v0.11 * Start bootnode work * Begin implementing bootnode into e2e * Fix E2E for v0.11 * Remove extra * gaz * Remove unused key gen code * Remove trailing multiaddr code * add skip for slashing * Fix slashing e2e * Fix docker image build * Merge branch 'master' of https://github.com/prysmaticlabs/prysm into v0.11 * Merge refs/heads/master into v0.11 * Merge branch 'master' of github.com:prysmaticlabs/prysm into v0.11 * Update beacon-chain/p2p/broadcaster_test.go * Merge refs/heads/master into v0.11 * Pass E2E Tests for v0.11 and Enable Attestation Subnets By Default (#5407) * Update README.md Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com> * Apply suggestions from code review Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com> * Update beacon-chain/p2p/config.go Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com> * Update shared/keystore/deposit_input.go Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com> * Update tools/faucet/server.go Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com> * Update beacon-chain/p2p/service.go Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com> * Update shared/benchutil/pregen_test.go Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com> * Update shared/benchutil/pregen_test.go Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com> * Update proto/beacon/p2p/v1/BUILD.bazel Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com> * Update shared/benchutil/pregen_test.go Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com> * Update shared/bls/spectest/aggregate_verify_test.go * Addressed feedback. All test passing * Merge branch 'v0.11' of github.com:prysmaticlabs/prysm into v0.11 * Update beacon-chain/core/blocks/block_operations_fuzz_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/core/blocks/block_operations_test.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update shared/testutil/helpers.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update beacon-chain/core/helpers/signing_root.go Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Resolve Misc v0.11 Items (Raul) (#5414) * address all comments * set faucet * nishant feedback * Update beacon-chain/p2p/service.go Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Revert keymanager changes (#5416) * Revert "Updates for remote keymanager (#5260)" This reverts commit bbcd895db50ce5e7c0ecb64210471cf56f63b373. * Revert "Remove keystore keymanager from validator (#5236)" This reverts commit 46008770c162e741251e13772fd7356b43a9af87. * Revert "Update eth2 wallet keymanager (#4984)" This reverts commit 7f7ef43f218598a671aaeb327342d7e5130fe8b1. Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> * Update BLS and limit visibility (#5415) * remove duplicated BLS, add golang.org/x/mod * Update BLS and restrict visibility * fix build * Fix eth1data test and fix order of ops (#5413) * use multiaddr builder (#5419) * Unskip benchutil and minor v0.11 fixes (#5417) * Unskip benchutil tests * Remove protos and gaz * Fixes * Networking Fixes (#5421) * check * fix test * fix size * fix test * more fixes * fix test again * Update ethereum APIs with latest master * Error handling for v0.11 tests (#5428) * Proper err handling for tests * Lint * Fixed rest of the tests * Gaz * Fixed old master tests * Sync with master * Rm old aggregate_test.go
1614 lines
46 KiB
Go
1614 lines
46 KiB
Go
package validator
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"math/big"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/gogo/protobuf/proto"
|
|
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
|
"github.com/prysmaticlabs/go-bitfield"
|
|
"github.com/prysmaticlabs/go-ssz"
|
|
mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing"
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/cache"
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/cache/depositcache"
|
|
b "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks"
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
|
|
dbutil "github.com/prysmaticlabs/prysm/beacon-chain/db/testing"
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/operations/attestations"
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/operations/slashings"
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/operations/voluntaryexits"
|
|
mockPOW "github.com/prysmaticlabs/prysm/beacon-chain/powchain/testing"
|
|
beaconstate "github.com/prysmaticlabs/prysm/beacon-chain/state"
|
|
"github.com/prysmaticlabs/prysm/beacon-chain/state/stategen"
|
|
mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing"
|
|
dbpb "github.com/prysmaticlabs/prysm/proto/beacon/db"
|
|
pbp2p "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
|
|
"github.com/prysmaticlabs/prysm/shared/attestationutil"
|
|
"github.com/prysmaticlabs/prysm/shared/bls"
|
|
"github.com/prysmaticlabs/prysm/shared/bytesutil"
|
|
"github.com/prysmaticlabs/prysm/shared/hashutil"
|
|
"github.com/prysmaticlabs/prysm/shared/params"
|
|
"github.com/prysmaticlabs/prysm/shared/testutil"
|
|
"github.com/prysmaticlabs/prysm/shared/trieutil"
|
|
)
|
|
|
|
func init() {
|
|
// Use minimal config to reduce test setup time.
|
|
params.OverrideBeaconConfig(params.MinimalSpecConfig())
|
|
}
|
|
|
|
func TestGetBlock_OK(t *testing.T) {
|
|
db := dbutil.SetupDB(t)
|
|
defer dbutil.TeardownDB(t, db)
|
|
ctx := context.Background()
|
|
|
|
testutil.ResetCache()
|
|
params.OverrideBeaconConfig(params.MainnetConfig())
|
|
defer params.OverrideBeaconConfig(params.MinimalSpecConfig())
|
|
beaconState, privKeys := testutil.DeterministicGenesisState(t, 64)
|
|
|
|
stateRoot, err := beaconState.HashTreeRoot(ctx)
|
|
if err != nil {
|
|
t.Fatalf("Could not hash genesis state: %v", err)
|
|
}
|
|
|
|
genesis := b.NewGenesisBlock(stateRoot[:])
|
|
if err := db.SaveBlock(ctx, genesis); err != nil {
|
|
t.Fatalf("Could not save genesis block: %v", err)
|
|
}
|
|
|
|
parentRoot, err := ssz.HashTreeRoot(genesis.Block)
|
|
if err != nil {
|
|
t.Fatalf("Could not get signing root %v", err)
|
|
}
|
|
if err := db.SaveState(ctx, beaconState, parentRoot); err != nil {
|
|
t.Fatalf("Could not save genesis state: %v", err)
|
|
}
|
|
if err := db.SaveHeadBlockRoot(ctx, parentRoot); err != nil {
|
|
t.Fatalf("Could not save genesis state: %v", err)
|
|
}
|
|
|
|
proposerServer := &Server{
|
|
BeaconDB: db,
|
|
HeadFetcher: &mock.ChainService{State: beaconState, Root: parentRoot[:]},
|
|
SyncChecker: &mockSync.Sync{IsSyncing: false},
|
|
BlockReceiver: &mock.ChainService{},
|
|
ChainStartFetcher: &mockPOW.POWChain{},
|
|
Eth1InfoFetcher: &mockPOW.POWChain{},
|
|
Eth1BlockFetcher: &mockPOW.POWChain{},
|
|
MockEth1Votes: true,
|
|
AttPool: attestations.NewPool(),
|
|
SlashingsPool: slashings.NewPool(),
|
|
ExitPool: voluntaryexits.NewPool(),
|
|
StateGen: stategen.New(db, cache.NewStateSummaryCache()),
|
|
}
|
|
|
|
randaoReveal, err := testutil.RandaoReveal(beaconState, 0, privKeys)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
graffiti := bytesutil.ToBytes32([]byte("eth2"))
|
|
req := ðpb.BlockRequest{
|
|
Slot: 1,
|
|
RandaoReveal: randaoReveal,
|
|
Graffiti: graffiti[:],
|
|
}
|
|
|
|
// We include max proposer slashings which is currently 1 in the pool.
|
|
proposerSlashing, err := testutil.GenerateProposerSlashingForValidator(
|
|
beaconState,
|
|
privKeys[0],
|
|
0, /* validator index */
|
|
)
|
|
if err := proposerServer.SlashingsPool.InsertProposerSlashing(context.Background(), beaconState, proposerSlashing); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// We include max attester slashings which is currently 1 in the pool.
|
|
attesterSlashing, err := testutil.GenerateAttesterSlashingForValidator(
|
|
beaconState,
|
|
privKeys[1],
|
|
1, /* validator index */
|
|
)
|
|
if err := proposerServer.SlashingsPool.InsertAttesterSlashing(context.Background(), beaconState, attesterSlashing); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
block, err := proposerServer.GetBlock(ctx, req)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if block.Slot != req.Slot {
|
|
t.Fatal("Expected block to have slot of 1")
|
|
}
|
|
if !bytes.Equal(block.ParentRoot, parentRoot[:]) {
|
|
t.Fatal("Expected block to have correct parent root")
|
|
}
|
|
if !bytes.Equal(block.Body.RandaoReveal, randaoReveal) {
|
|
t.Fatal("Expected block to have correct randao reveal")
|
|
}
|
|
if !bytes.Equal(block.Body.Graffiti, req.Graffiti) {
|
|
t.Fatal("Expected block to have correct graffiti")
|
|
}
|
|
if len(block.Body.ProposerSlashings) != 1 {
|
|
t.Fatalf("Wanted %d proposer slashings, got %d", 1, len(block.Body.ProposerSlashings))
|
|
}
|
|
if !reflect.DeepEqual(block.Body.ProposerSlashings[0], proposerSlashing) {
|
|
t.Errorf("Wanted proposer slashing %v, got %v", proposerSlashing, block.Body.ProposerSlashings[0])
|
|
}
|
|
if len(block.Body.AttesterSlashings) != 1 {
|
|
t.Fatalf("Wanted %d attester slashings, got %d", 1, len(block.Body.AttesterSlashings))
|
|
}
|
|
if !reflect.DeepEqual(block.Body.AttesterSlashings[0], attesterSlashing) {
|
|
t.Errorf("Wanted attester slashing %v, got %v", attesterSlashing, block.Body.AttesterSlashings)
|
|
}
|
|
}
|
|
|
|
func TestGetBlock_AddsUnaggregatedAtts(t *testing.T) {
|
|
db := dbutil.SetupDB(t)
|
|
defer dbutil.TeardownDB(t, db)
|
|
ctx := context.Background()
|
|
|
|
params.OverrideBeaconConfig(params.MainnetConfig())
|
|
defer params.OverrideBeaconConfig(params.MinimalSpecConfig())
|
|
beaconState, privKeys := testutil.DeterministicGenesisState(t, params.BeaconConfig().MinGenesisActiveValidatorCount)
|
|
|
|
stateRoot, err := beaconState.HashTreeRoot(ctx)
|
|
if err != nil {
|
|
t.Fatalf("Could not hash genesis state: %v", err)
|
|
}
|
|
|
|
genesis := b.NewGenesisBlock(stateRoot[:])
|
|
if err := db.SaveBlock(ctx, genesis); err != nil {
|
|
t.Fatalf("Could not save genesis block: %v", err)
|
|
}
|
|
|
|
parentRoot, err := ssz.HashTreeRoot(genesis.Block)
|
|
if err != nil {
|
|
t.Fatalf("Could not get signing root %v", err)
|
|
}
|
|
if err := db.SaveState(ctx, beaconState, parentRoot); err != nil {
|
|
t.Fatalf("Could not save genesis state: %v", err)
|
|
}
|
|
if err := db.SaveHeadBlockRoot(ctx, parentRoot); err != nil {
|
|
t.Fatalf("Could not save genesis state: %v", err)
|
|
}
|
|
|
|
proposerServer := &Server{
|
|
BeaconDB: db,
|
|
HeadFetcher: &mock.ChainService{State: beaconState, Root: parentRoot[:]},
|
|
SyncChecker: &mockSync.Sync{IsSyncing: false},
|
|
BlockReceiver: &mock.ChainService{},
|
|
ChainStartFetcher: &mockPOW.POWChain{},
|
|
Eth1InfoFetcher: &mockPOW.POWChain{},
|
|
Eth1BlockFetcher: &mockPOW.POWChain{},
|
|
MockEth1Votes: true,
|
|
SlashingsPool: slashings.NewPool(),
|
|
AttPool: attestations.NewPool(),
|
|
ExitPool: voluntaryexits.NewPool(),
|
|
StateGen: stategen.New(db, cache.NewStateSummaryCache()),
|
|
}
|
|
|
|
// Generate a bunch of random attestations at slot. These would be considered double votes, but
|
|
// we don't care for the purpose of this test.
|
|
var atts []*ethpb.Attestation
|
|
for i := uint64(0); len(atts) < int(params.BeaconConfig().MaxAttestations); i++ {
|
|
a, err := testutil.GenerateAttestations(beaconState, privKeys, 2, 1, true)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
atts = append(atts, a...)
|
|
}
|
|
// Max attestations minus one so we can almost fill the block and then include 1 unaggregated
|
|
// att to maximize inclusion.
|
|
atts = atts[:params.BeaconConfig().MaxAttestations-1]
|
|
if err := proposerServer.AttPool.SaveAggregatedAttestations(atts); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Generate some more random attestations with a larger spread so that we can capture at least
|
|
// one unaggregated attestation.
|
|
if atts, err := testutil.GenerateAttestations(beaconState, privKeys, 300, 1, true); err != nil {
|
|
t.Fatal(err)
|
|
} else {
|
|
found := false
|
|
for _, a := range atts {
|
|
if !helpers.IsAggregated(a) {
|
|
found = true
|
|
if err := proposerServer.AttPool.SaveUnaggregatedAttestation(a); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
}
|
|
if !found {
|
|
t.Fatal("No unaggregated attestations were generated")
|
|
}
|
|
}
|
|
|
|
randaoReveal, err := testutil.RandaoReveal(beaconState, 0, privKeys)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
graffiti := bytesutil.ToBytes32([]byte("eth2"))
|
|
req := ðpb.BlockRequest{
|
|
Slot: 1,
|
|
RandaoReveal: randaoReveal,
|
|
Graffiti: graffiti[:],
|
|
}
|
|
|
|
block, err := proposerServer.GetBlock(ctx, req)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if block.Slot != req.Slot {
|
|
t.Fatal("Expected block to have slot of 1")
|
|
}
|
|
if !bytes.Equal(block.ParentRoot, parentRoot[:]) {
|
|
t.Fatal("Expected block to have correct parent root")
|
|
}
|
|
if !bytes.Equal(block.Body.RandaoReveal, randaoReveal) {
|
|
t.Fatal("Expected block to have correct randao reveal")
|
|
}
|
|
if !bytes.Equal(block.Body.Graffiti, req.Graffiti) {
|
|
t.Fatal("Expected block to have correct graffiti")
|
|
}
|
|
if len(block.Body.Attestations) != int(params.BeaconConfig().MaxAttestations) {
|
|
t.Fatalf("Expected a full block of attestations, only received %d", len(block.Body.Attestations))
|
|
}
|
|
hasUnaggregatedAtt := false
|
|
for _, a := range block.Body.Attestations {
|
|
if !helpers.IsAggregated(a) {
|
|
hasUnaggregatedAtt = true
|
|
break
|
|
}
|
|
}
|
|
if !hasUnaggregatedAtt {
|
|
t.Fatal("Expected block to contain at least one unaggregated attestation")
|
|
}
|
|
}
|
|
|
|
func TestProposeBlock_OK(t *testing.T) {
|
|
db := dbutil.SetupDB(t)
|
|
defer dbutil.TeardownDB(t, db)
|
|
ctx := context.Background()
|
|
params.OverrideBeaconConfig(params.MainnetConfig())
|
|
defer params.OverrideBeaconConfig(params.MinimalSpecConfig())
|
|
|
|
genesis := b.NewGenesisBlock([]byte{})
|
|
if err := db.SaveBlock(context.Background(), genesis); err != nil {
|
|
t.Fatalf("Could not save genesis block: %v", err)
|
|
}
|
|
|
|
numDeposits := uint64(64)
|
|
beaconState, _ := testutil.DeterministicGenesisState(t, numDeposits)
|
|
|
|
genesisRoot, err := ssz.HashTreeRoot(genesis.Block)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := db.SaveState(ctx, beaconState, genesisRoot); err != nil {
|
|
t.Fatalf("Could not save genesis state: %v", err)
|
|
}
|
|
|
|
c := &mock.ChainService{}
|
|
proposerServer := &Server{
|
|
BeaconDB: db,
|
|
ChainStartFetcher: &mockPOW.POWChain{},
|
|
Eth1InfoFetcher: &mockPOW.POWChain{},
|
|
Eth1BlockFetcher: &mockPOW.POWChain{},
|
|
BlockReceiver: c,
|
|
HeadFetcher: c,
|
|
BlockNotifier: c.BlockNotifier(),
|
|
}
|
|
req := ðpb.SignedBeaconBlock{
|
|
Block: ðpb.BeaconBlock{
|
|
Slot: 5,
|
|
ParentRoot: []byte("parent-hash"),
|
|
Body: ðpb.BeaconBlockBody{},
|
|
},
|
|
}
|
|
if err := db.SaveBlock(ctx, req); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := proposerServer.ProposeBlock(context.Background(), req); err != nil {
|
|
t.Errorf("Could not propose block correctly: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestComputeStateRoot_OK(t *testing.T) {
|
|
db := dbutil.SetupDB(t)
|
|
defer dbutil.TeardownDB(t, db)
|
|
ctx := context.Background()
|
|
|
|
params.OverrideBeaconConfig(params.MainnetConfig())
|
|
defer params.OverrideBeaconConfig(params.MinimalSpecConfig())
|
|
beaconState, privKeys := testutil.DeterministicGenesisState(t, 100)
|
|
|
|
stateRoot, err := beaconState.HashTreeRoot(ctx)
|
|
if err != nil {
|
|
t.Fatalf("Could not hash genesis state: %v", err)
|
|
}
|
|
|
|
genesis := b.NewGenesisBlock(stateRoot[:])
|
|
if err := db.SaveBlock(ctx, genesis); err != nil {
|
|
t.Fatalf("Could not save genesis block: %v", err)
|
|
}
|
|
|
|
parentRoot, err := ssz.HashTreeRoot(genesis.Block)
|
|
if err != nil {
|
|
t.Fatalf("Could not get signing root %v", err)
|
|
}
|
|
if err := db.SaveState(ctx, beaconState, parentRoot); err != nil {
|
|
t.Fatalf("Could not save genesis state: %v", err)
|
|
}
|
|
if err := db.SaveHeadBlockRoot(ctx, parentRoot); err != nil {
|
|
t.Fatalf("Could not save genesis state: %v", err)
|
|
}
|
|
|
|
proposerServer := &Server{
|
|
BeaconDB: db,
|
|
ChainStartFetcher: &mockPOW.POWChain{},
|
|
Eth1InfoFetcher: &mockPOW.POWChain{},
|
|
Eth1BlockFetcher: &mockPOW.POWChain{},
|
|
StateGen: stategen.New(db, cache.NewStateSummaryCache()),
|
|
}
|
|
|
|
req := ðpb.SignedBeaconBlock{
|
|
Block: ðpb.BeaconBlock{
|
|
ProposerIndex: 41,
|
|
ParentRoot: parentRoot[:],
|
|
Slot: 1,
|
|
Body: ðpb.BeaconBlockBody{
|
|
RandaoReveal: nil,
|
|
ProposerSlashings: nil,
|
|
AttesterSlashings: nil,
|
|
Eth1Data: ðpb.Eth1Data{},
|
|
},
|
|
},
|
|
}
|
|
if err := beaconState.SetSlot(beaconState.Slot() + 1); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
randaoReveal, err := testutil.RandaoReveal(beaconState, 0, privKeys)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
proposerIdx, err := helpers.BeaconProposerIndex(beaconState)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
if err := beaconState.SetSlot(beaconState.Slot() - 1); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
req.Block.Body.RandaoReveal = randaoReveal[:]
|
|
currentEpoch := helpers.CurrentEpoch(beaconState)
|
|
domain, err := helpers.Domain(beaconState.Fork(), currentEpoch, params.BeaconConfig().DomainBeaconProposer, beaconState.GenesisValidatorRoot())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
signingRoot, err := helpers.ComputeSigningRoot(req.Block, domain)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
blockSig := privKeys[proposerIdx].Sign(signingRoot[:]).Marshal()
|
|
req.Signature = blockSig[:]
|
|
|
|
_, err = proposerServer.computeStateRoot(context.Background(), req)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
|
|
func TestPendingDeposits_Eth1DataVoteOK(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
height := big.NewInt(int64(params.BeaconConfig().Eth1FollowDistance))
|
|
newHeight := big.NewInt(height.Int64() + 11000)
|
|
p := &mockPOW.POWChain{
|
|
LatestBlockNumber: height,
|
|
HashesByHeight: map[int][]byte{
|
|
int(height.Int64()): []byte("0x0"),
|
|
int(newHeight.Int64()): []byte("0x1"),
|
|
},
|
|
}
|
|
|
|
var votes []*ethpb.Eth1Data
|
|
|
|
blockHash := make([]byte, 32)
|
|
copy(blockHash, "0x1")
|
|
vote := ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, 32),
|
|
BlockHash: blockHash,
|
|
DepositCount: 3,
|
|
}
|
|
period := params.BeaconConfig().EpochsPerEth1VotingPeriod * params.BeaconConfig().SlotsPerEpoch
|
|
for i := 0; i <= int(period/2); i++ {
|
|
votes = append(votes, vote)
|
|
}
|
|
|
|
blockHash = make([]byte, 32)
|
|
copy(blockHash, "0x0")
|
|
beaconState, err := beaconstate.InitializeFromProto(&pbp2p.BeaconState{
|
|
Eth1Data: ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, 32),
|
|
BlockHash: blockHash,
|
|
DepositCount: 2,
|
|
},
|
|
Eth1DepositIndex: 2,
|
|
Eth1DataVotes: votes,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
blk := ðpb.BeaconBlock{
|
|
Body: ðpb.BeaconBlockBody{Eth1Data: ðpb.Eth1Data{}},
|
|
}
|
|
|
|
blkRoot, err := ssz.HashTreeRoot(blk)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
bs := &Server{
|
|
ChainStartFetcher: p,
|
|
Eth1InfoFetcher: p,
|
|
Eth1BlockFetcher: p,
|
|
BlockReceiver: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
HeadFetcher: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
}
|
|
|
|
// It should also return the recent deposits after their follow window.
|
|
p.LatestBlockNumber = big.NewInt(0).Add(p.LatestBlockNumber, big.NewInt(10000))
|
|
_, eth1Height, err := bs.canonicalEth1Data(ctx, beaconState, ðpb.Eth1Data{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if eth1Height.Cmp(height) != 0 {
|
|
t.Errorf("Wanted Eth1 height of %d but got %d", height.Uint64(), eth1Height.Uint64())
|
|
}
|
|
|
|
newState, err := b.ProcessEth1DataInBlock(beaconState, blk)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if proto.Equal(newState.Eth1Data(), vote) {
|
|
t.Errorf("eth1data in the state equal to vote, when not expected to"+
|
|
"have majority: Got %v", vote)
|
|
}
|
|
|
|
blk = ðpb.BeaconBlock{
|
|
Body: ðpb.BeaconBlockBody{Eth1Data: vote},
|
|
}
|
|
|
|
_, eth1Height, err = bs.canonicalEth1Data(ctx, beaconState, vote)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if eth1Height.Cmp(newHeight) != 0 {
|
|
t.Errorf("Wanted Eth1 height of %d but got %d", newHeight.Uint64(), eth1Height.Uint64())
|
|
}
|
|
|
|
newState, err = b.ProcessEth1DataInBlock(beaconState, blk)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if !proto.Equal(newState.Eth1Data(), vote) {
|
|
t.Errorf("eth1data in the state not of the expected kind: Got %v but wanted %v", newState.Eth1Data(), vote)
|
|
}
|
|
}
|
|
|
|
func TestPendingDeposits_OutsideEth1FollowWindow(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
height := big.NewInt(int64(params.BeaconConfig().Eth1FollowDistance))
|
|
p := &mockPOW.POWChain{
|
|
LatestBlockNumber: height,
|
|
HashesByHeight: map[int][]byte{
|
|
int(height.Int64()): []byte("0x0"),
|
|
},
|
|
}
|
|
|
|
beaconState, err := beaconstate.InitializeFromProto(&pbp2p.BeaconState{
|
|
Eth1Data: ðpb.Eth1Data{
|
|
BlockHash: []byte("0x0"),
|
|
},
|
|
Eth1DepositIndex: 2,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
var mockSig [96]byte
|
|
var mockCreds [32]byte
|
|
|
|
// Using the merkleTreeIndex as the block number for this test...
|
|
readyDeposits := []*dbpb.DepositContainer{
|
|
{
|
|
Index: 0,
|
|
Eth1BlockHeight: 2,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("a"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
{
|
|
Index: 1,
|
|
Eth1BlockHeight: 8,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("b"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
}
|
|
|
|
recentDeposits := []*dbpb.DepositContainer{
|
|
{
|
|
Index: 2,
|
|
Eth1BlockHeight: 400,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("c"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
{
|
|
Index: 3,
|
|
Eth1BlockHeight: 600,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("d"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
}
|
|
depositCache := depositcache.NewDepositCache()
|
|
depositTrie, err := trieutil.NewTrie(int(params.BeaconConfig().DepositContractTreeDepth))
|
|
if err != nil {
|
|
t.Fatalf("could not setup deposit trie: %v", err)
|
|
}
|
|
for _, dp := range append(readyDeposits, recentDeposits...) {
|
|
depositHash, err := ssz.HashTreeRoot(dp.Deposit.Data)
|
|
if err != nil {
|
|
t.Fatalf("Unable to determine hashed value of deposit %v", err)
|
|
}
|
|
|
|
depositTrie.Insert(depositHash[:], int(dp.Index))
|
|
depositCache.InsertDeposit(ctx, dp.Deposit, dp.Eth1BlockHeight, dp.Index, depositTrie.Root())
|
|
}
|
|
for _, dp := range recentDeposits {
|
|
depositCache.InsertPendingDeposit(ctx, dp.Deposit, dp.Eth1BlockHeight, dp.Index, depositTrie.Root())
|
|
}
|
|
|
|
blk := ðpb.BeaconBlock{
|
|
Slot: beaconState.Slot(),
|
|
}
|
|
|
|
blkRoot, err := ssz.HashTreeRoot(blk)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
bs := &Server{
|
|
ChainStartFetcher: p,
|
|
Eth1InfoFetcher: p,
|
|
Eth1BlockFetcher: p,
|
|
DepositFetcher: depositCache,
|
|
PendingDepositsFetcher: depositCache,
|
|
BlockReceiver: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
HeadFetcher: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
}
|
|
|
|
deposits, err := bs.deposits(ctx, ðpb.Eth1Data{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(deposits) != 0 {
|
|
t.Errorf("Received unexpected list of deposits: %+v, wanted: 0", len(deposits))
|
|
}
|
|
|
|
// It should not return the recent deposits after their follow window.
|
|
// as latest block number makes no difference in retrieval of deposits
|
|
p.LatestBlockNumber = big.NewInt(0).Add(p.LatestBlockNumber, big.NewInt(10000))
|
|
deposits, err = bs.deposits(ctx, ðpb.Eth1Data{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(deposits) != 0 {
|
|
t.Errorf(
|
|
"Received unexpected number of pending deposits: %d, wanted: %d",
|
|
len(deposits),
|
|
len(recentDeposits),
|
|
)
|
|
}
|
|
}
|
|
|
|
func TestPendingDeposits_FollowsCorrectEth1Block(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
height := big.NewInt(int64(params.BeaconConfig().Eth1FollowDistance))
|
|
newHeight := big.NewInt(height.Int64() + 11000)
|
|
p := &mockPOW.POWChain{
|
|
LatestBlockNumber: height,
|
|
HashesByHeight: map[int][]byte{
|
|
int(height.Int64()): []byte("0x0"),
|
|
int(newHeight.Int64()): []byte("0x1"),
|
|
},
|
|
}
|
|
|
|
var votes []*ethpb.Eth1Data
|
|
|
|
vote := ðpb.Eth1Data{
|
|
BlockHash: []byte("0x1"),
|
|
DepositCount: 7,
|
|
}
|
|
period := params.BeaconConfig().EpochsPerEth1VotingPeriod * params.BeaconConfig().SlotsPerEpoch
|
|
for i := 0; i <= int(period/2); i++ {
|
|
votes = append(votes, vote)
|
|
}
|
|
|
|
beaconState, err := beaconstate.InitializeFromProto(&pbp2p.BeaconState{
|
|
Eth1Data: ðpb.Eth1Data{
|
|
BlockHash: []byte("0x0"),
|
|
DepositCount: 5,
|
|
},
|
|
Eth1DepositIndex: 1,
|
|
Eth1DataVotes: votes,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
blk := ðpb.BeaconBlock{
|
|
Slot: beaconState.Slot(),
|
|
}
|
|
|
|
blkRoot, err := ssz.HashTreeRoot(blk)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
var mockSig [96]byte
|
|
var mockCreds [32]byte
|
|
|
|
// Using the merkleTreeIndex as the block number for this test...
|
|
readyDeposits := []*dbpb.DepositContainer{
|
|
{
|
|
Index: 0,
|
|
Eth1BlockHeight: 8,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("a"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
{
|
|
Index: 1,
|
|
Eth1BlockHeight: 14,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("b"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
}
|
|
|
|
recentDeposits := []*dbpb.DepositContainer{
|
|
{
|
|
Index: 2,
|
|
Eth1BlockHeight: 5000,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("c"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
{
|
|
Index: 3,
|
|
Eth1BlockHeight: 6000,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("d"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
}
|
|
depositCache := depositcache.NewDepositCache()
|
|
depositTrie, err := trieutil.NewTrie(int(params.BeaconConfig().DepositContractTreeDepth))
|
|
if err != nil {
|
|
t.Fatalf("could not setup deposit trie: %v", err)
|
|
}
|
|
for _, dp := range append(readyDeposits, recentDeposits...) {
|
|
depositHash, err := ssz.HashTreeRoot(dp.Deposit.Data)
|
|
if err != nil {
|
|
t.Fatalf("Unable to determine hashed value of deposit %v", err)
|
|
}
|
|
|
|
depositTrie.Insert(depositHash[:], int(dp.Index))
|
|
depositCache.InsertDeposit(ctx, dp.Deposit, dp.Eth1BlockHeight, dp.Index, depositTrie.Root())
|
|
}
|
|
for _, dp := range recentDeposits {
|
|
depositCache.InsertPendingDeposit(ctx, dp.Deposit, dp.Eth1BlockHeight, dp.Index, depositTrie.Root())
|
|
}
|
|
|
|
bs := &Server{
|
|
ChainStartFetcher: p,
|
|
Eth1InfoFetcher: p,
|
|
Eth1BlockFetcher: p,
|
|
DepositFetcher: depositCache,
|
|
PendingDepositsFetcher: depositCache,
|
|
BlockReceiver: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
HeadFetcher: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
}
|
|
|
|
deposits, err := bs.deposits(ctx, ðpb.Eth1Data{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(deposits) != 0 {
|
|
t.Errorf("Received unexpected list of deposits: %+v, wanted: 0", len(deposits))
|
|
}
|
|
|
|
// It should also return the recent deposits after their follow window.
|
|
p.LatestBlockNumber = big.NewInt(0).Add(p.LatestBlockNumber, big.NewInt(10000))
|
|
// we should get our pending deposits once this vote pushes the vote tally to include
|
|
// the updated eth1 data.
|
|
deposits, err = bs.deposits(ctx, vote)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(deposits) != len(recentDeposits) {
|
|
t.Errorf(
|
|
"Received unexpected number of pending deposits: %d, wanted: %d",
|
|
len(deposits),
|
|
len(recentDeposits),
|
|
)
|
|
}
|
|
}
|
|
|
|
func TestPendingDeposits_CantReturnBelowStateEth1DepositIndex(t *testing.T) {
|
|
ctx := context.Background()
|
|
height := big.NewInt(int64(params.BeaconConfig().Eth1FollowDistance))
|
|
p := &mockPOW.POWChain{
|
|
LatestBlockNumber: height,
|
|
HashesByHeight: map[int][]byte{
|
|
int(height.Int64()): []byte("0x0"),
|
|
},
|
|
}
|
|
|
|
beaconState, err := beaconstate.InitializeFromProto(&pbp2p.BeaconState{
|
|
Eth1Data: ðpb.Eth1Data{
|
|
BlockHash: []byte("0x0"),
|
|
DepositCount: 100,
|
|
},
|
|
Eth1DepositIndex: 10,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
blk := ðpb.BeaconBlock{
|
|
Slot: beaconState.Slot(),
|
|
}
|
|
blkRoot, err := ssz.HashTreeRoot(blk)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
var mockSig [96]byte
|
|
var mockCreds [32]byte
|
|
|
|
readyDeposits := []*dbpb.DepositContainer{
|
|
{
|
|
Index: 0,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("a"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
{
|
|
Index: 1,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("b"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
}
|
|
|
|
var recentDeposits []*dbpb.DepositContainer
|
|
for i := int64(2); i < 16; i++ {
|
|
recentDeposits = append(recentDeposits, &dbpb.DepositContainer{
|
|
Index: i,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte{byte(i)},
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
})
|
|
}
|
|
depositTrie, err := trieutil.NewTrie(int(params.BeaconConfig().DepositContractTreeDepth))
|
|
if err != nil {
|
|
t.Fatalf("could not setup deposit trie: %v", err)
|
|
}
|
|
depositCache := depositcache.NewDepositCache()
|
|
for _, dp := range append(readyDeposits, recentDeposits...) {
|
|
depositHash, err := ssz.HashTreeRoot(dp.Deposit.Data)
|
|
if err != nil {
|
|
t.Fatalf("Unable to determine hashed value of deposit %v", err)
|
|
}
|
|
|
|
depositTrie.Insert(depositHash[:], int(dp.Index))
|
|
depositCache.InsertDeposit(ctx, dp.Deposit, uint64(dp.Index), dp.Index, depositTrie.Root())
|
|
}
|
|
for _, dp := range recentDeposits {
|
|
depositCache.InsertPendingDeposit(ctx, dp.Deposit, uint64(dp.Index), dp.Index, depositTrie.Root())
|
|
}
|
|
|
|
bs := &Server{
|
|
ChainStartFetcher: p,
|
|
Eth1InfoFetcher: p,
|
|
Eth1BlockFetcher: p,
|
|
DepositFetcher: depositCache,
|
|
PendingDepositsFetcher: depositCache,
|
|
BlockReceiver: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
HeadFetcher: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
}
|
|
|
|
// It should also return the recent deposits after their follow window.
|
|
p.LatestBlockNumber = big.NewInt(0).Add(p.LatestBlockNumber, big.NewInt(10000))
|
|
deposits, err := bs.deposits(ctx, ðpb.Eth1Data{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
expectedDeposits := 6
|
|
if len(deposits) != expectedDeposits {
|
|
t.Errorf(
|
|
"Received unexpected number of pending deposits: %d, wanted: %d",
|
|
len(deposits),
|
|
expectedDeposits,
|
|
)
|
|
}
|
|
}
|
|
|
|
func TestPendingDeposits_CantReturnMoreThanMax(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
height := big.NewInt(int64(params.BeaconConfig().Eth1FollowDistance))
|
|
p := &mockPOW.POWChain{
|
|
LatestBlockNumber: height,
|
|
HashesByHeight: map[int][]byte{
|
|
int(height.Int64()): []byte("0x0"),
|
|
},
|
|
}
|
|
|
|
beaconState, err := beaconstate.InitializeFromProto(&pbp2p.BeaconState{
|
|
Eth1Data: ðpb.Eth1Data{
|
|
BlockHash: []byte("0x0"),
|
|
DepositCount: 100,
|
|
},
|
|
Eth1DepositIndex: 2,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
blk := ðpb.BeaconBlock{
|
|
Slot: beaconState.Slot(),
|
|
}
|
|
blkRoot, err := ssz.HashTreeRoot(blk)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var mockSig [96]byte
|
|
var mockCreds [32]byte
|
|
|
|
readyDeposits := []*dbpb.DepositContainer{
|
|
{
|
|
Index: 0,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("a"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
{
|
|
Index: 1,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("b"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
}
|
|
|
|
var recentDeposits []*dbpb.DepositContainer
|
|
for i := int64(2); i < 22; i++ {
|
|
recentDeposits = append(recentDeposits, &dbpb.DepositContainer{
|
|
Index: i,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte{byte(i)},
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
})
|
|
}
|
|
depositTrie, err := trieutil.NewTrie(int(params.BeaconConfig().DepositContractTreeDepth))
|
|
if err != nil {
|
|
t.Fatalf("could not setup deposit trie: %v", err)
|
|
}
|
|
depositCache := depositcache.NewDepositCache()
|
|
for _, dp := range append(readyDeposits, recentDeposits...) {
|
|
depositHash, err := ssz.HashTreeRoot(dp.Deposit.Data)
|
|
if err != nil {
|
|
t.Fatalf("Unable to determine hashed value of deposit %v", err)
|
|
}
|
|
|
|
depositTrie.Insert(depositHash[:], int(dp.Index))
|
|
depositCache.InsertDeposit(ctx, dp.Deposit, height.Uint64(), dp.Index, depositTrie.Root())
|
|
}
|
|
for _, dp := range recentDeposits {
|
|
depositCache.InsertPendingDeposit(ctx, dp.Deposit, height.Uint64(), dp.Index, depositTrie.Root())
|
|
}
|
|
|
|
bs := &Server{
|
|
ChainStartFetcher: p,
|
|
Eth1InfoFetcher: p,
|
|
Eth1BlockFetcher: p,
|
|
DepositFetcher: depositCache,
|
|
PendingDepositsFetcher: depositCache,
|
|
BlockReceiver: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
HeadFetcher: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
}
|
|
|
|
// It should also return the recent deposits after their follow window.
|
|
p.LatestBlockNumber = big.NewInt(0).Add(p.LatestBlockNumber, big.NewInt(10000))
|
|
deposits, err := bs.deposits(ctx, ðpb.Eth1Data{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(deposits) != int(params.BeaconConfig().MaxDeposits) {
|
|
t.Errorf(
|
|
"Received unexpected number of pending deposits: %d, wanted: %d",
|
|
len(deposits),
|
|
int(params.BeaconConfig().MaxDeposits),
|
|
)
|
|
}
|
|
}
|
|
|
|
func TestPendingDeposits_CantReturnMoreDepositCount(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
height := big.NewInt(int64(params.BeaconConfig().Eth1FollowDistance))
|
|
p := &mockPOW.POWChain{
|
|
LatestBlockNumber: height,
|
|
HashesByHeight: map[int][]byte{
|
|
int(height.Int64()): []byte("0x0"),
|
|
},
|
|
}
|
|
|
|
beaconState, err := beaconstate.InitializeFromProto(&pbp2p.BeaconState{
|
|
Eth1Data: ðpb.Eth1Data{
|
|
BlockHash: []byte("0x0"),
|
|
DepositCount: 5,
|
|
},
|
|
Eth1DepositIndex: 2,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
blk := ðpb.BeaconBlock{
|
|
Slot: beaconState.Slot(),
|
|
}
|
|
blkRoot, err := ssz.HashTreeRoot(blk)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var mockSig [96]byte
|
|
var mockCreds [32]byte
|
|
|
|
readyDeposits := []*dbpb.DepositContainer{
|
|
{
|
|
Index: 0,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("a"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
{
|
|
Index: 1,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("b"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
}
|
|
|
|
var recentDeposits []*dbpb.DepositContainer
|
|
for i := int64(2); i < 22; i++ {
|
|
recentDeposits = append(recentDeposits, &dbpb.DepositContainer{
|
|
Index: i,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte{byte(i)},
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
})
|
|
}
|
|
depositTrie, err := trieutil.NewTrie(int(params.BeaconConfig().DepositContractTreeDepth))
|
|
if err != nil {
|
|
t.Fatalf("could not setup deposit trie: %v", err)
|
|
}
|
|
depositCache := depositcache.NewDepositCache()
|
|
for _, dp := range append(readyDeposits, recentDeposits...) {
|
|
depositHash, err := ssz.HashTreeRoot(dp.Deposit.Data)
|
|
if err != nil {
|
|
t.Fatalf("Unable to determine hashed value of deposit %v", err)
|
|
}
|
|
|
|
depositTrie.Insert(depositHash[:], int(dp.Index))
|
|
depositCache.InsertDeposit(ctx, dp.Deposit, uint64(dp.Index), dp.Index, depositTrie.Root())
|
|
}
|
|
for _, dp := range recentDeposits {
|
|
depositCache.InsertPendingDeposit(ctx, dp.Deposit, uint64(dp.Index), dp.Index, depositTrie.Root())
|
|
}
|
|
|
|
bs := &Server{
|
|
BlockReceiver: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
HeadFetcher: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
ChainStartFetcher: p,
|
|
Eth1InfoFetcher: p,
|
|
Eth1BlockFetcher: p,
|
|
DepositFetcher: depositCache,
|
|
PendingDepositsFetcher: depositCache,
|
|
}
|
|
|
|
// It should also return the recent deposits after their follow window.
|
|
p.LatestBlockNumber = big.NewInt(0).Add(p.LatestBlockNumber, big.NewInt(10000))
|
|
deposits, err := bs.deposits(ctx, ðpb.Eth1Data{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(deposits) != 3 {
|
|
t.Errorf(
|
|
"Received unexpected number of pending deposits: %d, wanted: %d",
|
|
len(deposits),
|
|
3,
|
|
)
|
|
}
|
|
}
|
|
|
|
func TestEth1Data_EmptyVotesFetchBlockHashFailure(t *testing.T) {
|
|
beaconState, err := beaconstate.InitializeFromProto(&pbp2p.BeaconState{
|
|
Eth1Data: ðpb.Eth1Data{
|
|
BlockHash: []byte{'a'},
|
|
},
|
|
Eth1DataVotes: []*ethpb.Eth1Data{},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
p := &mockPOW.FaultyMockPOWChain{
|
|
HashesByHeight: make(map[int][]byte),
|
|
}
|
|
proposerServer := &Server{
|
|
ChainStartFetcher: p,
|
|
Eth1InfoFetcher: p,
|
|
Eth1BlockFetcher: p,
|
|
BlockReceiver: &mock.ChainService{State: beaconState},
|
|
HeadFetcher: &mock.ChainService{State: beaconState},
|
|
}
|
|
want := "could not fetch ETH1_FOLLOW_DISTANCE ancestor"
|
|
if _, err := proposerServer.eth1Data(context.Background(), beaconState.Slot()+1); err == nil || !strings.Contains(err.Error(), want) {
|
|
t.Errorf("Expected error %v, received %v", want, err)
|
|
}
|
|
}
|
|
|
|
func TestDefaultEth1Data_NoBlockExists(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
height := big.NewInt(int64(params.BeaconConfig().Eth1FollowDistance))
|
|
deps := []*dbpb.DepositContainer{
|
|
{
|
|
Index: 0,
|
|
Eth1BlockHeight: 8,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("a"),
|
|
Signature: make([]byte, 96),
|
|
WithdrawalCredentials: make([]byte, 32),
|
|
}},
|
|
},
|
|
{
|
|
Index: 1,
|
|
Eth1BlockHeight: 14,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("b"),
|
|
Signature: make([]byte, 96),
|
|
WithdrawalCredentials: make([]byte, 32),
|
|
}},
|
|
},
|
|
}
|
|
depositTrie, err := trieutil.NewTrie(int(params.BeaconConfig().DepositContractTreeDepth))
|
|
if err != nil {
|
|
t.Fatalf("could not setup deposit trie: %v", err)
|
|
}
|
|
depositCache := depositcache.NewDepositCache()
|
|
for _, dp := range deps {
|
|
depositCache.InsertDeposit(context.Background(), dp.Deposit, dp.Eth1BlockHeight, dp.Index, depositTrie.Root())
|
|
}
|
|
|
|
p := &mockPOW.POWChain{
|
|
LatestBlockNumber: height,
|
|
HashesByHeight: map[int][]byte{
|
|
0: []byte("hash0"),
|
|
12: []byte("hash12"),
|
|
},
|
|
}
|
|
proposerServer := &Server{
|
|
ChainStartFetcher: p,
|
|
Eth1InfoFetcher: p,
|
|
Eth1BlockFetcher: p,
|
|
DepositFetcher: depositCache,
|
|
PendingDepositsFetcher: depositCache,
|
|
}
|
|
|
|
defEth1Data := ðpb.Eth1Data{
|
|
DepositCount: 10,
|
|
BlockHash: []byte{'t', 'e', 's', 't'},
|
|
DepositRoot: []byte{'r', 'o', 'o', 't'},
|
|
}
|
|
|
|
p.Eth1Data = defEth1Data
|
|
|
|
result, err := proposerServer.defaultEth1DataResponse(ctx, big.NewInt(16))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if !proto.Equal(result, defEth1Data) {
|
|
t.Errorf("Did not receive default eth1data. Wanted %v but Got %v", defEth1Data, result)
|
|
}
|
|
}
|
|
|
|
// TODO(2312): Add more tests for edge cases and better coverage.
|
|
func TestEth1Data(t *testing.T) {
|
|
slot := uint64(10000)
|
|
|
|
p := &mockPOW.POWChain{
|
|
BlockNumberByHeight: map[uint64]*big.Int{
|
|
slot * params.BeaconConfig().SecondsPerSlot: big.NewInt(4096),
|
|
},
|
|
HashesByHeight: map[int][]byte{
|
|
4080: []byte("4080"),
|
|
},
|
|
Eth1Data: ðpb.Eth1Data{
|
|
DepositCount: 55,
|
|
},
|
|
}
|
|
ps := &Server{
|
|
ChainStartFetcher: p,
|
|
Eth1InfoFetcher: p,
|
|
Eth1BlockFetcher: p,
|
|
DepositFetcher: depositcache.NewDepositCache(),
|
|
}
|
|
|
|
ctx := context.Background()
|
|
eth1Data, err := ps.eth1Data(ctx, slot)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if eth1Data.DepositCount != 55 {
|
|
t.Error("Expected deposit count to be 55")
|
|
}
|
|
}
|
|
|
|
func TestEth1Data_MockEnabled(t *testing.T) {
|
|
db := dbutil.SetupDB(t)
|
|
defer dbutil.TeardownDB(t, db)
|
|
// If a mock eth1 data votes is specified, we use the following for the
|
|
// eth1data we provide to every proposer based on https://github.com/ethereum/eth2.0-pm/issues/62:
|
|
//
|
|
// slot_in_voting_period = current_slot % SLOTS_PER_ETH1_VOTING_PERIOD
|
|
// Eth1Data(
|
|
// DepositRoot = hash(current_epoch + slot_in_voting_period),
|
|
// DepositCount = state.eth1_deposit_index,
|
|
// BlockHash = hash(hash(current_epoch + slot_in_voting_period)),
|
|
// )
|
|
ctx := context.Background()
|
|
headState := testutil.NewBeaconState()
|
|
if err := headState.SetEth1DepositIndex(64); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
ps := &Server{
|
|
HeadFetcher: &mock.ChainService{State: headState},
|
|
BeaconDB: db,
|
|
MockEth1Votes: true,
|
|
}
|
|
headBlockRoot := [32]byte{1, 2, 3}
|
|
if err := db.SaveState(ctx, headState, headBlockRoot); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := db.SaveHeadBlockRoot(ctx, headBlockRoot); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
eth1Data, err := ps.eth1Data(ctx, 100)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
period := params.BeaconConfig().EpochsPerEth1VotingPeriod * params.BeaconConfig().SlotsPerEpoch
|
|
wantedSlot := 100 % period
|
|
currentEpoch := helpers.SlotToEpoch(100)
|
|
enc, err := ssz.Marshal(currentEpoch + wantedSlot)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
depRoot := hashutil.Hash(enc)
|
|
blockHash := hashutil.Hash(depRoot[:])
|
|
want := ðpb.Eth1Data{
|
|
DepositRoot: depRoot[:],
|
|
BlockHash: blockHash[:],
|
|
DepositCount: 64,
|
|
}
|
|
if !proto.Equal(eth1Data, want) {
|
|
t.Errorf("Wanted %v, received %v", want, eth1Data)
|
|
}
|
|
}
|
|
|
|
func TestFilterAttestation_OK(t *testing.T) {
|
|
db := dbutil.SetupDB(t)
|
|
defer dbutil.TeardownDB(t, db)
|
|
ctx := context.Background()
|
|
|
|
params.OverrideBeaconConfig(params.MainnetConfig())
|
|
defer params.OverrideBeaconConfig(params.MinimalSpecConfig())
|
|
genesis := b.NewGenesisBlock([]byte{})
|
|
if err := db.SaveBlock(context.Background(), genesis); err != nil {
|
|
t.Fatalf("Could not save genesis block: %v", err)
|
|
}
|
|
|
|
numDeposits := uint64(64)
|
|
state, privKeys := testutil.DeterministicGenesisState(t, numDeposits)
|
|
if err := state.SetGenesisValidatorRoot(params.BeaconConfig().ZeroHash[:]); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
genesisRoot, err := ssz.HashTreeRoot(genesis.Block)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := db.SaveState(ctx, state, genesisRoot); err != nil {
|
|
t.Fatalf("Could not save genesis state: %v", err)
|
|
}
|
|
if err := db.SaveHeadBlockRoot(ctx, genesisRoot); err != nil {
|
|
t.Fatalf("Could not save genesis state: %v", err)
|
|
}
|
|
|
|
proposerServer := &Server{
|
|
BeaconDB: db,
|
|
AttPool: attestations.NewPool(),
|
|
HeadFetcher: &mock.ChainService{State: state, Root: genesisRoot[:]},
|
|
}
|
|
|
|
atts := make([]*ethpb.Attestation, 10)
|
|
for i := 0; i < len(atts); i++ {
|
|
atts[i] = ðpb.Attestation{Data: ðpb.AttestationData{
|
|
CommitteeIndex: uint64(i),
|
|
Target: ðpb.Checkpoint{}},
|
|
}
|
|
}
|
|
received, err := proposerServer.filterAttestationsForBlockInclusion(context.Background(), 1, atts)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(received) > 0 {
|
|
t.Error("Invalid attestations were filtered")
|
|
}
|
|
|
|
for i := 0; i < len(atts); i++ {
|
|
aggBits := bitfield.NewBitlist(2)
|
|
aggBits.SetBitAt(0, true)
|
|
atts[i] = ðpb.Attestation{Data: ðpb.AttestationData{
|
|
CommitteeIndex: uint64(i),
|
|
Target: ðpb.Checkpoint{},
|
|
Source: ðpb.Checkpoint{Root: params.BeaconConfig().ZeroHash[:]}},
|
|
AggregationBits: aggBits,
|
|
}
|
|
committee, err := helpers.BeaconCommitteeFromState(state, atts[i].Data.Slot, atts[i].Data.CommitteeIndex)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
attestingIndices := attestationutil.AttestingIndices(atts[i].AggregationBits, committee)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
domain, err := helpers.Domain(state.Fork(), 0, params.BeaconConfig().DomainBeaconAttester, params.BeaconConfig().ZeroHash[:])
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
sigs := make([]*bls.Signature, len(attestingIndices))
|
|
zeroSig := [96]byte{}
|
|
atts[i].Signature = zeroSig[:]
|
|
|
|
for i, indice := range attestingIndices {
|
|
hashTreeRoot, err := helpers.ComputeSigningRoot(atts[i].Data, domain)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
sig := privKeys[indice].Sign(hashTreeRoot[:])
|
|
sigs[i] = sig
|
|
}
|
|
atts[i].Signature = bls.AggregateSignatures(sigs).Marshal()[:]
|
|
}
|
|
|
|
received, err = proposerServer.filterAttestationsForBlockInclusion(context.Background(), 1, atts)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(received) != 1 {
|
|
t.Errorf("Did not filter correctly, wanted: 1, received: %d", len(received))
|
|
}
|
|
}
|
|
|
|
func Benchmark_Eth1Data(b *testing.B) {
|
|
ctx := context.Background()
|
|
|
|
hashesByHeight := make(map[int][]byte)
|
|
|
|
beaconState, err := beaconstate.InitializeFromProto(&pbp2p.BeaconState{
|
|
Eth1DataVotes: []*ethpb.Eth1Data{},
|
|
Eth1Data: ðpb.Eth1Data{
|
|
BlockHash: []byte("stub"),
|
|
},
|
|
})
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
var mockSig [96]byte
|
|
var mockCreds [32]byte
|
|
deposits := []*dbpb.DepositContainer{
|
|
{
|
|
Index: 0,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("a"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
{
|
|
Index: 1,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("b"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
}
|
|
|
|
depositCache := depositcache.NewDepositCache()
|
|
for i, dp := range deposits {
|
|
var root [32]byte
|
|
copy(root[:], []byte{'d', 'e', 'p', 'o', 's', 'i', 't', byte(i)})
|
|
depositCache.InsertDeposit(ctx, dp.Deposit, uint64(dp.Index), dp.Index, root)
|
|
}
|
|
numOfVotes := 1000
|
|
for i := 0; i < numOfVotes; i++ {
|
|
blockhash := []byte{'b', 'l', 'o', 'c', 'k', byte(i)}
|
|
deposit := []byte{'d', 'e', 'p', 'o', 's', 'i', 't', byte(i)}
|
|
err := beaconState.SetEth1DataVotes(append(beaconState.Eth1DataVotes(), ðpb.Eth1Data{
|
|
BlockHash: blockhash,
|
|
DepositRoot: deposit,
|
|
}))
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
hashesByHeight[i] = blockhash
|
|
}
|
|
hashesByHeight[numOfVotes+1] = []byte("stub")
|
|
|
|
blk := ðpb.BeaconBlock{
|
|
Slot: beaconState.Slot(),
|
|
}
|
|
blkRoot, err := ssz.HashTreeRoot(blk)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
|
|
currentHeight := params.BeaconConfig().Eth1FollowDistance + 5
|
|
p := &mockPOW.POWChain{
|
|
LatestBlockNumber: big.NewInt(int64(currentHeight)),
|
|
HashesByHeight: hashesByHeight,
|
|
}
|
|
proposerServer := &Server{
|
|
BlockReceiver: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
HeadFetcher: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
ChainStartFetcher: p,
|
|
Eth1InfoFetcher: p,
|
|
Eth1BlockFetcher: p,
|
|
DepositFetcher: depositCache,
|
|
PendingDepositsFetcher: depositCache,
|
|
}
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
_, err := proposerServer.eth1Data(context.Background(), beaconState.Slot()+1)
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDeposits_ReturnsEmptyList_IfLatestEth1DataEqGenesisEth1Block(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
height := big.NewInt(int64(params.BeaconConfig().Eth1FollowDistance))
|
|
p := &mockPOW.POWChain{
|
|
LatestBlockNumber: height,
|
|
HashesByHeight: map[int][]byte{
|
|
int(height.Int64()): []byte("0x0"),
|
|
},
|
|
GenesisEth1Block: height,
|
|
}
|
|
|
|
beaconState, err := beaconstate.InitializeFromProto(&pbp2p.BeaconState{
|
|
Eth1Data: ðpb.Eth1Data{
|
|
BlockHash: []byte("0x0"),
|
|
},
|
|
Eth1DepositIndex: 2,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
blk := ðpb.BeaconBlock{
|
|
Slot: beaconState.Slot(),
|
|
}
|
|
blkRoot, err := ssz.HashTreeRoot(blk)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
var mockSig [96]byte
|
|
var mockCreds [32]byte
|
|
|
|
readyDeposits := []*dbpb.DepositContainer{
|
|
{
|
|
Index: 0,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("a"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
{
|
|
Index: 1,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte("b"),
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
},
|
|
}
|
|
|
|
var recentDeposits []*dbpb.DepositContainer
|
|
for i := int64(2); i < 22; i++ {
|
|
recentDeposits = append(recentDeposits, &dbpb.DepositContainer{
|
|
Index: i,
|
|
Deposit: ðpb.Deposit{
|
|
Data: ðpb.Deposit_Data{
|
|
PublicKey: []byte{byte(i)},
|
|
Signature: mockSig[:],
|
|
WithdrawalCredentials: mockCreds[:],
|
|
}},
|
|
})
|
|
}
|
|
depositTrie, err := trieutil.NewTrie(int(params.BeaconConfig().DepositContractTreeDepth))
|
|
if err != nil {
|
|
t.Fatalf("could not setup deposit trie: %v", err)
|
|
}
|
|
depositCache := depositcache.NewDepositCache()
|
|
for _, dp := range append(readyDeposits, recentDeposits...) {
|
|
depositHash, err := ssz.HashTreeRoot(dp.Deposit.Data)
|
|
if err != nil {
|
|
t.Fatalf("Unable to determine hashed value of deposit %v", err)
|
|
}
|
|
|
|
depositTrie.Insert(depositHash[:], int(dp.Index))
|
|
depositCache.InsertDeposit(ctx, dp.Deposit, uint64(dp.Index), dp.Index, depositTrie.Root())
|
|
}
|
|
for _, dp := range recentDeposits {
|
|
depositCache.InsertPendingDeposit(ctx, dp.Deposit, uint64(dp.Index), dp.Index, depositTrie.Root())
|
|
}
|
|
|
|
bs := &Server{
|
|
BlockReceiver: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
HeadFetcher: &mock.ChainService{State: beaconState, Root: blkRoot[:]},
|
|
ChainStartFetcher: p,
|
|
Eth1InfoFetcher: p,
|
|
Eth1BlockFetcher: p,
|
|
DepositFetcher: depositCache,
|
|
PendingDepositsFetcher: depositCache,
|
|
}
|
|
|
|
// It should also return the recent deposits after their follow window.
|
|
p.LatestBlockNumber = big.NewInt(0).Add(p.LatestBlockNumber, big.NewInt(10000))
|
|
deposits, err := bs.deposits(ctx, ðpb.Eth1Data{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(deposits) != 0 {
|
|
t.Errorf(
|
|
"Received unexpected number of pending deposits: %d, wanted: 0",
|
|
len(deposits),
|
|
)
|
|
}
|
|
}
|
|
|
|
func TestDeleteAttsInPool_Aggregated(t *testing.T) {
|
|
s := &Server{
|
|
AttPool: attestations.NewPool(),
|
|
}
|
|
|
|
sig := bls.RandKey().Sign([]byte("foo")).Marshal()
|
|
aggregatedAtts := []*ethpb.Attestation{{AggregationBits: bitfield.Bitlist{0b10101}, Signature: sig}, {AggregationBits: bitfield.Bitlist{0b11010}, Signature: sig}}
|
|
unaggregatedAtts := []*ethpb.Attestation{{AggregationBits: bitfield.Bitlist{0b1001}, Signature: sig}, {AggregationBits: bitfield.Bitlist{0b0001}, Signature: sig}}
|
|
|
|
if err := s.AttPool.SaveAggregatedAttestations(aggregatedAtts); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := s.AttPool.SaveUnaggregatedAttestations(unaggregatedAtts); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
aa, err := helpers.AggregateAttestations(aggregatedAtts)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
if err := s.deleteAttsInPool(append(aa, unaggregatedAtts...)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(s.AttPool.AggregatedAttestations()) != 0 {
|
|
t.Error("Did not delete aggregated attestation")
|
|
}
|
|
if len(s.AttPool.UnaggregatedAttestations()) != 0 {
|
|
t.Error("Did not delete unaggregated attestation")
|
|
}
|
|
}
|