Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

all: EIP-compliant verkle tree support #23630

Closed
Closed
Show file tree
Hide file tree
Changes from 72 commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
1627805
all: implement EIP-compliant verkle trees
gballet May 6, 2021
719bf47
Upgrade go-verkle to its IPA version (#24)
gballet Nov 4, 2021
9f9c03a
fixes for the IPA testnet
gballet Nov 4, 2021
97a79f5
enable verkle on cancun block: take 2 (#28)
jwasinger Nov 12, 2021
bc06d2c
fix rebase issues
gballet Nov 12, 2021
e114474
fix linter issue
gballet Nov 12, 2021
ef08e51
merge undefined instead of panicking (#30)
gballet Nov 17, 2021
15d9860
initialize the new access witness if not already present
gballet Nov 17, 2021
5ca9901
fix boundary check in PUSH
gballet Nov 20, 2021
6d40e11
fix bound check in code chunking
gballet Nov 21, 2021
03dbc0a
fix boundary condition check in PUSH32
gballet Nov 22, 2021
7cb1add
add circleci support (#32)
gballet Nov 23, 2021
41c2f75
remove unnecessary cancun block declaration in tests (#33)
gballet Nov 23, 2021
361a328
upgrade go version (#34)
gballet Nov 23, 2021
7360d16
fix calculation in get_tree_key_for_storage_slot (#35)
gballet Nov 23, 2021
909049c
use the witness in statedb, revert applyTx signature (#36)
gballet Nov 25, 2021
86bdc3f
Remove access witness from the signature of Process (#38)
gballet Nov 26, 2021
fa753db
consensus/ethash: ensure uncle accounts are included in block witness…
jwasinger Dec 2, 2021
5bac5b3
consensus/ethash: move accumulation of coinbase witness before coinba…
jwasinger Dec 2, 2021
fe75603
remove outdated comment
gballet Dec 6, 2021
6af78cb
miner: embed verkle proof in sealing block (#39)
jwasinger Dec 7, 2021
99ebf76
Refactor witness-accumulation in EVM (#42)
jwasinger Dec 16, 2021
f215cc0
call onleaf in verkle commit (#45)
gballet Jan 3, 2022
e16e9cc
replace sha256 with pedersen_hash in get_key (#46)
gballet Jan 7, 2022
c87a6d9
reactivate working lines in test
gballet Jan 7, 2022
99f3c92
fix: don't create settings each time a key is calculated (#53)
gballet Jan 10, 2022
4428439
fix: don't use rlp in the tree for slot values (#51)
gballet Jan 11, 2022
d761880
core/vm: don't include contract deployer bytecode in AccessWitness or…
jwasinger Jan 13, 2022
952be80
Verkle EXTCODECOPY implementation (#55)
jwasinger Jan 13, 2022
99604b0
Use IsCancun where applicable (#56)
jwasinger Jan 14, 2022
5beac51
Charge witness gas when calling/creating a contract (#60)
gballet Jan 19, 2022
15b353d
verkle proof deserialization (#61)
gballet Jan 21, 2022
5e657a5
fix: build more than one block in stateless test (#66)
gballet Jan 26, 2022
878a3d6
Fix GetTreeKey (#65)
jwasinger Jan 26, 2022
469945b
Implement latest stateless gas charging spec (#63)
jwasinger Jan 28, 2022
2c896ba
Various fixes for rust-verkle proof format compatibility (#67)
gballet Feb 1, 2022
f89d0bc
Fix contract creation aw (#68)
jwasinger Feb 1, 2022
c94b925
fix a couple linter issues
gballet Feb 2, 2022
7f5f975
Sload fix (#69)
jwasinger Feb 3, 2022
c82b074
fix: witness gas costs being charged more than once (#70)
gballet Feb 3, 2022
825884a
re-enable VerkleTrie::ToDot
gballet Feb 3, 2022
a758e16
core/state: implement GetCodeSize for VerkleDB (#75)
jwasinger Feb 7, 2022
e8114e8
copy the pre-state, use an untouched copy for the proof (#72)
gballet Feb 8, 2022
2ac6b86
test to compare the proof format with that of rust verkle (#73)
gballet Feb 8, 2022
c270886
check proof in verkle tree test
gballet Feb 8, 2022
cd491b1
don't delete from the trie when we encounter empty state object if ve…
jwasinger Feb 9, 2022
2554974
core/state: write code to rawdb under codehash key when verkle is ena…
jwasinger Feb 9, 2022
291a947
force the 32-byte alignment of nonce and balance (#71)
gballet Feb 9, 2022
dca3c2e
core/state - ensure storage value is set properly in snapshot when ve…
jwasinger Feb 10, 2022
b7d0870
fixes for the return type change in go-verkle (#77)
gballet Feb 11, 2022
1a98ca7
calculate tree index correctly for SLOAD access event (#79)
jwasinger Feb 11, 2022
7af62ef
core/vm: witness write event for SSTORE (#80)
jwasinger Feb 11, 2022
94b2e58
fix estimateGas (handle ErrInsufficientBalanceWitness). Return prope…
jwasinger Feb 11, 2022
0b9f067
Verkle/fix/perdersen hash (#84)
gballet Feb 18, 2022
54442c0
refactor: set witness account values in getStateObject() (#83)
gballet Feb 21, 2022
bf50506
fix verkle trie iterator to not miss leaf values in the first index o…
jwasinger Mar 1, 2022
3d88e39
creation-time CODECOPY adds no code to the witness (#86)
gballet Mar 3, 2022
7a3e72f
small simplification in order to facilitate rebase
gballet Mar 3, 2022
88ad86d
upgrade go-ipa + go-verkle: faster precomp loading
gballet Mar 10, 2022
ba76380
fix: place slot value, not its rlp encoding in witness
gballet Mar 10, 2022
8bb23d8
fix: code chunification with incorrect header (#89)
gballet Mar 16, 2022
ab87f5f
spec: don't add the trailing pushdata for a final PUSHn (#90)
gballet Mar 17, 2022
c9ffa89
cleanup: don't evaluate 0 coeffs in get_tree_key (#87)
gballet Mar 21, 2022
dd6425e
ensure no overflow occurs in the chunk touch function
gballet Mar 25, 2022
de3964f
load the full coinbase account in reward
gballet Mar 25, 2022
3e1417e
fix: previous commit broke stateless test
gballet Mar 25, 2022
3068fe9
rework the way the gas is charged per code chunk
gballet Mar 25, 2022
64ec2e8
update go-verkle to grab the fix for #200
gballet Mar 30, 2022
fc9c06d
fix: don't add PUSH1-data during contract deployment (#91)
gballet Mar 30, 2022
8f01a89
fix: redundant proof-of-absence stems (#93)
gballet Apr 1, 2022
ca661be
test: missing children of the same internal node produce a single ext…
gballet Apr 1, 2022
b9adceb
ParseNode with commitment parameter (#95)
gballet Apr 5, 2022
298d8ce
review feedback for rebase over kiln (#97)
gballet Apr 12, 2022
439be0c
safe gas add (#98)
gballet Apr 12, 2022
4b36e66
ensure 10-byte addresses are right-aligned in pedersen_hash (#99)
gballet Apr 13, 2022
336ff36
Remove the code analysis interface to reduce PR footprint (#100)
gballet May 3, 2022
ac6bc0f
fix: set IsDeployment=false outside of contract creation (#101)
gballet May 6, 2022
6856df3
remove trailing line
gballet May 6, 2022
5975b44
verkle test: count the code chunks in the witness (#102)
gballet May 9, 2022
a4838ea
temp fix: little endian pedersen_hash (#103)
gballet Jun 3, 2022
d4ac871
factor the amount of polynomial evaluations in access witness (#106)
gballet Jun 28, 2022
8831288
reuse polynomial evaluation in account update (#108)
gballet Jun 28, 2022
bf9893d
fix: remove redundant balance touching in access witness (#107)
gballet Jun 28, 2022
fbcdf09
add github workflow
gballet Jun 28, 2022
e15eaf7
reuse address point evaluation in code chunking (#109)
gballet Jun 29, 2022
e3191c3
upgrade branch to use banderwagon (#111)
gballet Jul 1, 2022
4e2ea43
reduce pr footprint by reverting to codeSegment (#113)
gballet Jul 1, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Use the latest 2.1 version of CircleCI pipeline process engine.
# See: https://circleci.com/docs/2.0/configuration-reference
version: 2.1

# Define a job to be invoked later in a workflow.
# See: https://circleci.com/docs/2.0/configuration-reference/#jobs
jobs:
build:
working_directory: ~/repo
# Specify the execution environment. You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub.
# See: https://circleci.com/docs/2.0/configuration-reference/#docker-machine-macos-windows-executor
docker:
- image: circleci/golang:1.16.10
# Add steps to the job
# See: https://circleci.com/docs/2.0/configuration-reference/#steps
steps:
- checkout
- restore_cache:
keys:
- go-mod-v4-{{ checksum "go.sum" }}
- run:
name: Install Dependencies
command: go mod download
- save_cache:
key: go-mod-v4-{{ checksum "go.sum" }}
paths:
- "/go/pkg/mod"
#- run:
# name: Run linter
# command: |
# go run build/ci.go lint
- run:
name: Run tests
command: |
go run build/ci.go test -coverage
- store_test_results:
path: /tmp/test-reports

# Invoke jobs via workflows
# See: https://circleci.com/docs/2.0/configuration-reference/#workflows
workflows:
sample: # This is the name of the workflow, feel free to change it to better match your workflow.
# Inside the workflow, you define the jobs you want to run.
jobs:
- build
4 changes: 2 additions & 2 deletions cmd/geth/snapshot.go
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ func verifyState(ctx *cli.Context) error {
log.Error("Failed to load head block")
return errors.New("no head block")
}
snaptree, err := snapshot.New(chaindb, trie.NewDatabase(chaindb), 256, headBlock.Root(), false, false, false)
snaptree, err := snapshot.New(chaindb, trie.NewDatabase(chaindb), 256, headBlock.Root(), false, false, false, false)
if err != nil {
log.Error("Failed to open snapshot tree", "err", err)
return err
Expand Down Expand Up @@ -472,7 +472,7 @@ func dumpState(ctx *cli.Context) error {
if err != nil {
return err
}
snaptree, err := snapshot.New(db, trie.NewDatabase(db), 256, root, false, false, false)
snaptree, err := snapshot.New(db, trie.NewDatabase(db), 256, root, false, false, false, false)
if err != nil {
return err
}
Expand Down
19 changes: 19 additions & 0 deletions consensus/ethash/consensus.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/trie"
"github.com/ethereum/go-ethereum/trie/utils"
"golang.org/x/crypto/sha3"
)

Expand Down Expand Up @@ -660,10 +661,28 @@ func accumulateRewards(config *params.ChainConfig, state *state.StateDB, header
r.Sub(r, header.Number)
r.Mul(r, blockReward)
r.Div(r, big8)

if config.IsCancun(header.Number) {
uncleCoinbase := utils.GetTreeKeyBalance(uncle.Coinbase.Bytes())
state.Witness().TouchAddressOnReadAndComputeGas(uncleCoinbase)
state.Witness().SetLeafValue(uncleCoinbase, state.GetBalance(uncle.Coinbase).Bytes())
}
state.AddBalance(uncle.Coinbase, r)

r.Div(blockReward, big32)
reward.Add(reward, r)
}
if config.IsCancun(header.Number) {
coinbase := utils.GetTreeKeyBalance(header.Coinbase.Bytes())
state.Witness().TouchAddressOnReadAndComputeGas(coinbase)
coinbase[31] = 0 // mark version
state.Witness().TouchAddressOnReadAndComputeGas(coinbase)
coinbase[31] = 2 // mark nonce
state.Witness().TouchAddressOnReadAndComputeGas(coinbase)
coinbase[31] = 3 // mark code keccak
state.Witness().TouchAddressOnReadAndComputeGas(coinbase)
balance := state.GetBalance(header.Coinbase)
state.Witness().SetLeafValue(coinbase, balance.Bytes())
}
state.AddBalance(header.Coinbase, reward)
}
29 changes: 18 additions & 11 deletions core/blockchain.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,15 +226,10 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par
futureBlocks, _ := lru.New(maxFutureBlocks)

bc := &BlockChain{
chainConfig: chainConfig,
cacheConfig: cacheConfig,
db: db,
triegc: prque.New(nil),
stateCache: state.NewDatabaseWithConfig(db, &trie.Config{
Cache: cacheConfig.TrieCleanLimit,
Journal: cacheConfig.TrieCleanJournal,
Preimages: cacheConfig.Preimages,
}),
chainConfig: chainConfig,
cacheConfig: cacheConfig,
db: db,
triegc: prque.New(nil),
quit: make(chan struct{}),
chainmu: syncx.NewClosableMutex(),
bodyCache: bodyCache,
Expand Down Expand Up @@ -283,6 +278,13 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par

// Make sure the state associated with the block is available
head := bc.CurrentBlock()
bc.stateCache = state.NewDatabaseWithConfig(db, &trie.Config{
Cache: cacheConfig.TrieCleanLimit,
Journal: cacheConfig.TrieCleanJournal,
Preimages: cacheConfig.Preimages,
UseVerkle: chainConfig.IsCancun(head.Header().Number),
})

if _, err := state.New(head.Root(), bc.stateCache, bc.snaps); err != nil {
// Head state is missing, before the state recovery, find out the
// disk layer point of snapshot(if it's enabled). Make sure the
Expand Down Expand Up @@ -375,7 +377,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par
log.Warn("Enabling snapshot recovery", "chainhead", head.NumberU64(), "diskbase", *layer)
recover = true
}
bc.snaps, _ = snapshot.New(bc.db, bc.stateCache.TrieDB(), bc.cacheConfig.SnapshotLimit, head.Root(), !bc.cacheConfig.SnapshotWait, true, recover)
bc.snaps, _ = snapshot.New(bc.db, bc.stateCache.TrieDB(), bc.cacheConfig.SnapshotLimit, head.Root(), !bc.cacheConfig.SnapshotWait, true, recover, chainConfig.IsCancun(head.Header().Number))
}

// Start future block processor.
Expand Down Expand Up @@ -1592,7 +1594,12 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals, setHead bool)

// Process block using the parent state as reference point
substart := time.Now()
receipts, logs, usedGas, err := bc.processor.Process(block, statedb, bc.vmConfig)
var (
usedGas uint64
receipts types.Receipts
logs []*types.Log
)
receipts, logs, usedGas, err = bc.processor.Process(block, statedb, bc.vmConfig)
if err != nil {
bc.reportBlock(block, receipts, err)
atomic.StoreUint32(&followupInterrupt, 1)
Expand Down
102 changes: 102 additions & 0 deletions core/chain_makers.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,12 @@ import (
"github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/consensus/misc"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/state/snapshot"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/trie"
)

// BlockGen creates blocks for testing.
Expand Down Expand Up @@ -284,6 +286,106 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse
return blocks, receipts
}

func GenerateVerkleChain(config *params.ChainConfig, parent *types.Block, engine consensus.Engine, db ethdb.Database, n int, gen func(int, *BlockGen)) ([]*types.Block, []types.Receipts) {
if config == nil {
config = params.TestChainConfig
}
blocks, receipts := make(types.Blocks, n), make([]types.Receipts, n)
chainreader := &fakeChainReader{config: config}
genblock := func(i int, parent *types.Block, statedb *state.StateDB) (*types.Block, types.Receipts) {
b := &BlockGen{i: i, chain: blocks, parent: parent, statedb: statedb, config: config, engine: engine}
b.header = makeHeader(chainreader, parent, statedb, b.engine)
preState := statedb.Copy()

// Mutate the state and block according to any hard-fork specs
if daoBlock := config.DAOForkBlock; daoBlock != nil {
limit := new(big.Int).Add(daoBlock, params.DAOForkExtraRange)
if b.header.Number.Cmp(daoBlock) >= 0 && b.header.Number.Cmp(limit) < 0 {
if config.DAOForkSupport {
b.header.Extra = common.CopyBytes(params.DAOForkBlockExtra)
}
}
}
if config.DAOForkSupport && config.DAOForkBlock != nil && config.DAOForkBlock.Cmp(b.header.Number) == 0 {
misc.ApplyDAOHardFork(statedb)
}
// Execute any user modifications to the block
if gen != nil {
gen(i, b)
}
if b.engine != nil {
// Finalize and seal the block
block, err := b.engine.FinalizeAndAssemble(chainreader, b.header, statedb, b.txs, b.uncles, b.receipts)
if err != nil {
panic(err)
}

// Write state changes to db
root, err := statedb.Commit(config.IsEIP158(b.header.Number))
if err != nil {
panic(fmt.Sprintf("state write error: %v", err))
}
if err := statedb.Database().TrieDB().Commit(root, false, nil); err != nil {
panic(fmt.Sprintf("trie write error: %v", err))
}

// Generate an associated verkle proof
tr := preState.GetTrie()
if !tr.IsVerkle() {
panic("tree should be verkle")
}

vtr := tr.(*trie.VerkleTrie)
// Make sure all keys are resolved before
// building the proof. Ultimately, node
// resolution can be done with a prefetcher
// or from GetCommitmentsAlongPath.
kvs := statedb.Witness().KeyVals()
keys := statedb.Witness().Keys()
for _, key := range keys {
_, err := vtr.TryGet(key)
if err != nil {
panic(err)
}

// Sanity check: ensure all flagged addresses have an associated
// value: keys is built from Chunks and kvs from InitialValue.
if _, exists := kvs[string(key)]; !exists {
panic(fmt.Sprintf("address not in access witness: %x", key))
}
}

// sanity check: ensure all values correspond to a flagged key by
// comparing the lengths of both structures: they should be equal
if len(kvs) != len(keys) {
panic("keys without a value in witness")
}

vtr.Hash()
p, k, err := vtr.ProveAndSerialize(keys, kvs)
block.SetVerkleProof(p, k)
if err != nil {
panic(err)
}
return block, b.receipts
}
return nil, nil
}
var snaps *snapshot.Tree
for i := 0; i < n; i++ {
statedb, err := state.New(parent.Root(), state.NewDatabaseWithConfig(db, &trie.Config{UseVerkle: true}), snaps)
if err != nil {
panic(err)
}
block, receipt := genblock(i, parent, statedb)
blocks[i] = block
receipts[i] = receipt
parent = block
snaps = statedb.Snaps()
}
return blocks, receipts
}

func makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.StateDB, engine consensus.Engine) *types.Header {
var time uint64
if parent.Time() == 0 {
Expand Down
5 changes: 5 additions & 0 deletions core/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ var (
// have enough funds for transfer(topmost call only).
ErrInsufficientFundsForTransfer = errors.New("insufficient funds for transfer")

// ErrInsufficientBalanceWitness is returned if the transaction sender has enough
// funds to cover the transfer, but not enough to pay for witness access/modification
// costs for the transaction
ErrInsufficientBalanceWitness = errors.New("insufficient funds to cover witness access costs for transaction")

// ErrInsufficientFunds is returned if the total cost of executing a transaction
// is higher than the balance of the user's account.
ErrInsufficientFunds = errors.New("insufficient funds for gas * price + value")
Expand Down
46 changes: 42 additions & 4 deletions core/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, override
if genesis != nil && genesis.Config == nil {
return params.AllEthashProtocolChanges, common.Hash{}, errGenesisNoConfig
}

// Just commit the new block if there is no stored genesis block.
stored := rawdb.ReadCanonicalHash(db, 0)
if (stored == common.Hash{}) {
Expand All @@ -177,13 +178,29 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, override
}
return genesis.Config, block.Hash(), nil
}

// We have the genesis block in database(perhaps in ancient database)
// but the corresponding state is missing.
header := rawdb.ReadHeader(db, stored, 0)
if _, err := state.New(header.Root, state.NewDatabaseWithConfig(db, nil), nil); err != nil {
if genesis == nil {
genesis = DefaultGenesisBlock()

var trieCfg *trie.Config

if genesis == nil {
storedcfg := rawdb.ReadChainConfig(db, stored)
if storedcfg == nil {
panic("this should never be reached: if genesis is nil, the config is already present or 'geth init' is being called which created it (in the code above, which means genesis != nil)")
}

if storedcfg.CancunBlock != nil {
if storedcfg.CancunBlock.Cmp(big.NewInt(0)) != 0 {
panic("cancun block must be 0")
}

trieCfg = &trie.Config{UseVerkle: storedcfg.IsCancun(big.NewInt(header.Number.Int64()))}
}
}

if _, err := state.New(header.Root, state.NewDatabaseWithConfig(db, trieCfg), nil); err != nil {
// Ensure the stored genesis matches with the given one.
hash := genesis.ToBlock(nil).Hash()
if hash != stored {
Expand Down Expand Up @@ -264,7 +281,11 @@ func (g *Genesis) ToBlock(db ethdb.Database) *types.Block {
if db == nil {
db = rawdb.NewMemoryDatabase()
}
statedb, err := state.New(common.Hash{}, state.NewDatabase(db), nil)
var trieCfg *trie.Config
if g.Config != nil {
trieCfg = &trie.Config{UseVerkle: g.Config.IsCancun(big.NewInt(int64(g.Number)))}
}
statedb, err := state.New(common.Hash{}, state.NewDatabaseWithConfig(db, trieCfg), nil)
if err != nil {
panic(err)
}
Expand Down Expand Up @@ -306,6 +327,9 @@ func (g *Genesis) ToBlock(db ethdb.Database) *types.Block {
}
statedb.Commit(false)
statedb.Database().TrieDB().Commit(root, true, nil)
if err := statedb.Cap(root); err != nil {
panic(err)
}

return types.NewBlock(head, nil, nil, nil, trie.NewStackTrie(nil))
}
Expand Down Expand Up @@ -357,6 +381,20 @@ func GenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big
return g.MustCommit(db)
}

func DefaultVerkleGenesisBlock() *Genesis {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: remove

return &Genesis{
Config: params.VerkleChainConfig,
Nonce: 86,
GasLimit: 0x2fefd8,
Difficulty: big.NewInt(1),
Alloc: map[common.Address]GenesisAccount{
common.BytesToAddress([]byte{97, 118, 97, 209, 72, 165, 43, 239, 81, 162, 104, 199, 40, 179, 162, 27, 88, 249, 67, 6}): {
Balance: big.NewInt(0).Lsh(big.NewInt(1), 27),
},
},
}
}

// DefaultGenesisBlock returns the Ethereum main net genesis block.
func DefaultGenesisBlock() *Genesis {
return &Genesis{
Expand Down
Loading