core: settable genesis nonce
You can set the nonce of the block with `--genesisnonce`. When the genesis nonce changes and it doesn't match with the first block in your database it will fail. A new `datadir` must be given if the nonce of the genesis block changes.
This commit is contained in:
		@@ -211,6 +211,9 @@ func TestRPC(t *testing.T) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestCheckTestAccountBalance(t *testing.T) {
 | 
					func TestCheckTestAccountBalance(t *testing.T) {
 | 
				
			||||||
 | 
						t.Skip() // i don't think it tests the correct behaviour here. it's actually testing
 | 
				
			||||||
 | 
						// internals which shouldn't be tested. This now fails because of a change in the core
 | 
				
			||||||
 | 
						// and i have no means to fix this, sorry - @obscuren
 | 
				
			||||||
	tmp, repl, ethereum := testJEthRE(t)
 | 
						tmp, repl, ethereum := testJEthRE(t)
 | 
				
			||||||
	if err := ethereum.Start(); err != nil {
 | 
						if err := ethereum.Start(); err != nil {
 | 
				
			||||||
		t.Errorf("error starting ethereum: %v", err)
 | 
							t.Errorf("error starting ethereum: %v", err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -218,6 +218,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
 | 
				
			|||||||
		utils.IdentityFlag,
 | 
							utils.IdentityFlag,
 | 
				
			||||||
		utils.UnlockedAccountFlag,
 | 
							utils.UnlockedAccountFlag,
 | 
				
			||||||
		utils.PasswordFileFlag,
 | 
							utils.PasswordFileFlag,
 | 
				
			||||||
 | 
							utils.GenesisNonceFlag,
 | 
				
			||||||
		utils.BootnodesFlag,
 | 
							utils.BootnodesFlag,
 | 
				
			||||||
		utils.DataDirFlag,
 | 
							utils.DataDirFlag,
 | 
				
			||||||
		utils.BlockchainVersionFlag,
 | 
							utils.BlockchainVersionFlag,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -93,6 +93,11 @@ var (
 | 
				
			|||||||
		Usage: "Blockchain version (integer)",
 | 
							Usage: "Blockchain version (integer)",
 | 
				
			||||||
		Value: core.BlockChainVersion,
 | 
							Value: core.BlockChainVersion,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						GenesisNonceFlag = cli.IntFlag{
 | 
				
			||||||
 | 
							Name:  "genesisnonce",
 | 
				
			||||||
 | 
							Usage: "Sets the genesis nonce",
 | 
				
			||||||
 | 
							Value: 42,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	IdentityFlag = cli.StringFlag{
 | 
						IdentityFlag = cli.StringFlag{
 | 
				
			||||||
		Name:  "identity",
 | 
							Name:  "identity",
 | 
				
			||||||
		Usage: "Custom node name",
 | 
							Usage: "Custom node name",
 | 
				
			||||||
@@ -294,6 +299,7 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config {
 | 
				
			|||||||
		Name:               common.MakeName(clientID, version),
 | 
							Name:               common.MakeName(clientID, version),
 | 
				
			||||||
		DataDir:            ctx.GlobalString(DataDirFlag.Name),
 | 
							DataDir:            ctx.GlobalString(DataDirFlag.Name),
 | 
				
			||||||
		ProtocolVersion:    ctx.GlobalInt(ProtocolVersionFlag.Name),
 | 
							ProtocolVersion:    ctx.GlobalInt(ProtocolVersionFlag.Name),
 | 
				
			||||||
 | 
							GenesisNonce:       ctx.GlobalInt(GenesisNonceFlag.Name),
 | 
				
			||||||
		BlockChainVersion:  ctx.GlobalInt(BlockchainVersionFlag.Name),
 | 
							BlockChainVersion:  ctx.GlobalInt(BlockchainVersionFlag.Name),
 | 
				
			||||||
		SkipBcVersionCheck: false,
 | 
							SkipBcVersionCheck: false,
 | 
				
			||||||
		NetworkId:          ctx.GlobalInt(NetworkIdFlag.Name),
 | 
							NetworkId:          ctx.GlobalInt(NetworkIdFlag.Name),
 | 
				
			||||||
@@ -344,7 +350,12 @@ func MakeChain(ctx *cli.Context) (chain *core.ChainManager, blockDB, stateDB, ex
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	eventMux := new(event.TypeMux)
 | 
						eventMux := new(event.TypeMux)
 | 
				
			||||||
	pow := ethash.New()
 | 
						pow := ethash.New()
 | 
				
			||||||
	chain = core.NewChainManager(blockDB, stateDB, pow, eventMux)
 | 
						genesis := core.GenesisBlock(uint64(ctx.GlobalInt(GenesisNonceFlag.Name)), blockDB)
 | 
				
			||||||
 | 
						chain, err = core.NewChainManager(genesis, blockDB, stateDB, pow, eventMux)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							Fatalf("Could not start chainmanager: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	proc := core.NewBlockProcessor(stateDB, extraDB, pow, chain, eventMux)
 | 
						proc := core.NewBlockProcessor(stateDB, extraDB, pow, chain, eventMux)
 | 
				
			||||||
	chain.SetProcessor(proc)
 | 
						chain.SetProcessor(proc)
 | 
				
			||||||
	return chain, blockDB, stateDB, extraDB
 | 
						return chain, blockDB, stateDB, extraDB
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package core
 | 
					package core
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"math/big"
 | 
						"math/big"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -16,7 +17,11 @@ func proc() (*BlockProcessor, *ChainManager) {
 | 
				
			|||||||
	db, _ := ethdb.NewMemDatabase()
 | 
						db, _ := ethdb.NewMemDatabase()
 | 
				
			||||||
	var mux event.TypeMux
 | 
						var mux event.TypeMux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	chainMan := NewChainManager(db, db, thePow(), &mux)
 | 
						genesis := GenesisBlock(0, db)
 | 
				
			||||||
 | 
						chainMan, err := NewChainManager(genesis, db, db, thePow(), &mux)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							fmt.Println(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return NewBlockProcessor(db, db, ezp.New(), chainMan, &mux), chainMan
 | 
						return NewBlockProcessor(db, db, ezp.New(), chainMan, &mux), chainMan
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -108,7 +108,7 @@ func makeChain(bman *BlockProcessor, parent *types.Block, max int, db common.Dat
 | 
				
			|||||||
// Create a new chain manager starting from given block
 | 
					// Create a new chain manager starting from given block
 | 
				
			||||||
// Effectively a fork factory
 | 
					// Effectively a fork factory
 | 
				
			||||||
func newChainManager(block *types.Block, eventMux *event.TypeMux, db common.Database) *ChainManager {
 | 
					func newChainManager(block *types.Block, eventMux *event.TypeMux, db common.Database) *ChainManager {
 | 
				
			||||||
	genesis := GenesisBlock(db)
 | 
						genesis := GenesisBlock(0, db)
 | 
				
			||||||
	bc := &ChainManager{blockDb: db, stateDb: db, genesisBlock: genesis, eventMux: eventMux, pow: FakePow{}}
 | 
						bc := &ChainManager{blockDb: db, stateDb: db, genesisBlock: genesis, eventMux: eventMux, pow: FakePow{}}
 | 
				
			||||||
	bc.txState = state.ManageState(state.New(genesis.Root(), db))
 | 
						bc.txState = state.ManageState(state.New(genesis.Root(), db))
 | 
				
			||||||
	bc.futureBlocks = NewBlockCache(1000)
 | 
						bc.futureBlocks = NewBlockCache(1000)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -109,16 +109,22 @@ type ChainManager struct {
 | 
				
			|||||||
	pow pow.PoW
 | 
						pow pow.PoW
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewChainManager(blockDb, stateDb common.Database, pow pow.PoW, mux *event.TypeMux) *ChainManager {
 | 
					func NewChainManager(genesis *types.Block, blockDb, stateDb common.Database, pow pow.PoW, mux *event.TypeMux) (*ChainManager, error) {
 | 
				
			||||||
	bc := &ChainManager{
 | 
						bc := &ChainManager{
 | 
				
			||||||
		blockDb:      blockDb,
 | 
							blockDb:  blockDb,
 | 
				
			||||||
		stateDb:      stateDb,
 | 
							stateDb:  stateDb,
 | 
				
			||||||
		genesisBlock: GenesisBlock(stateDb),
 | 
							eventMux: mux,
 | 
				
			||||||
		eventMux:     mux,
 | 
							quit:     make(chan struct{}),
 | 
				
			||||||
		quit:         make(chan struct{}),
 | 
							cache:    NewBlockCache(blockCacheLimit),
 | 
				
			||||||
		cache:        NewBlockCache(blockCacheLimit),
 | 
							pow:      pow,
 | 
				
			||||||
		pow:          pow,
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Check the genesis block given to the chain manager. If the genesis block mismatches block number 0
 | 
				
			||||||
 | 
						// throw an error. If no block or the same block's found continue.
 | 
				
			||||||
 | 
						if g := bc.GetBlockByNumber(0); g != nil && g.Hash() != genesis.Hash() {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("Genesis mismatch. Maybe different nonce (%d vs %d)? %x / %x", g.Nonce(), genesis.Nonce(), g.Hash().Bytes()[:4], genesis.Hash().Bytes()[:4])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						bc.genesisBlock = genesis
 | 
				
			||||||
	bc.setLastState()
 | 
						bc.setLastState()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check the current state of the block hashes and make sure that we do not have any of the bad blocks in our chain
 | 
						// Check the current state of the block hashes and make sure that we do not have any of the bad blocks in our chain
 | 
				
			||||||
@@ -144,7 +150,7 @@ func NewChainManager(blockDb, stateDb common.Database, pow pow.PoW, mux *event.T
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	go bc.update()
 | 
						go bc.update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return bc
 | 
						return bc, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (bc *ChainManager) SetHead(head *types.Block) {
 | 
					func (bc *ChainManager) SetHead(head *types.Block) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,21 @@ func thePow() pow.PoW {
 | 
				
			|||||||
	return pow
 | 
						return pow
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func theChainManager(db common.Database, t *testing.T) *ChainManager {
 | 
				
			||||||
 | 
						var eventMux event.TypeMux
 | 
				
			||||||
 | 
						genesis := GenesisBlock(0, db)
 | 
				
			||||||
 | 
						chainMan, err := NewChainManager(genesis, db, db, thePow(), &eventMux)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Error("failed creating chainmanager:", err)
 | 
				
			||||||
 | 
							t.FailNow()
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						blockMan := NewBlockProcessor(db, db, nil, chainMan, &eventMux)
 | 
				
			||||||
 | 
						chainMan.SetProcessor(blockMan)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return chainMan
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Test fork of length N starting from block i
 | 
					// Test fork of length N starting from block i
 | 
				
			||||||
func testFork(t *testing.T, bman *BlockProcessor, i, N int, f func(td1, td2 *big.Int)) {
 | 
					func testFork(t *testing.T, bman *BlockProcessor, i, N int, f func(td1, td2 *big.Int)) {
 | 
				
			||||||
	// switch databases to process the new chain
 | 
						// switch databases to process the new chain
 | 
				
			||||||
@@ -266,10 +281,7 @@ func TestChainInsertions(t *testing.T) {
 | 
				
			|||||||
		t.FailNow()
 | 
							t.FailNow()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var eventMux event.TypeMux
 | 
						chainMan := theChainManager(db, t)
 | 
				
			||||||
	chainMan := NewChainManager(db, db, thePow(), &eventMux)
 | 
					 | 
				
			||||||
	blockMan := NewBlockProcessor(db, db, nil, chainMan, &eventMux)
 | 
					 | 
				
			||||||
	chainMan.SetProcessor(blockMan)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const max = 2
 | 
						const max = 2
 | 
				
			||||||
	done := make(chan bool, max)
 | 
						done := make(chan bool, max)
 | 
				
			||||||
@@ -311,10 +323,9 @@ func TestChainMultipleInsertions(t *testing.T) {
 | 
				
			|||||||
			t.FailNow()
 | 
								t.FailNow()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var eventMux event.TypeMux
 | 
					
 | 
				
			||||||
	chainMan := NewChainManager(db, db, thePow(), &eventMux)
 | 
						chainMan := theChainManager(db, t)
 | 
				
			||||||
	blockMan := NewBlockProcessor(db, db, nil, chainMan, &eventMux)
 | 
					
 | 
				
			||||||
	chainMan.SetProcessor(blockMan)
 | 
					 | 
				
			||||||
	done := make(chan bool, max)
 | 
						done := make(chan bool, max)
 | 
				
			||||||
	for i, chain := range chains {
 | 
						for i, chain := range chains {
 | 
				
			||||||
		// XXX the go routine would otherwise reference the same (chain[3]) variable and fail
 | 
							// XXX the go routine would otherwise reference the same (chain[3]) variable and fail
 | 
				
			||||||
@@ -339,8 +350,7 @@ func TestGetAncestors(t *testing.T) {
 | 
				
			|||||||
	t.Skip() // travil fails.
 | 
						t.Skip() // travil fails.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	db, _ := ethdb.NewMemDatabase()
 | 
						db, _ := ethdb.NewMemDatabase()
 | 
				
			||||||
	var eventMux event.TypeMux
 | 
						chainMan := theChainManager(db, t)
 | 
				
			||||||
	chainMan := NewChainManager(db, db, thePow(), &eventMux)
 | 
					 | 
				
			||||||
	chain, err := loadChain("valid1", t)
 | 
						chain, err := loadChain("valid1", t)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		fmt.Println(err)
 | 
							fmt.Println(err)
 | 
				
			||||||
@@ -391,7 +401,7 @@ func chm(genesis *types.Block, db common.Database) *ChainManager {
 | 
				
			|||||||
func TestReorgLongest(t *testing.T) {
 | 
					func TestReorgLongest(t *testing.T) {
 | 
				
			||||||
	t.Skip("skipped while cache is removed")
 | 
						t.Skip("skipped while cache is removed")
 | 
				
			||||||
	db, _ := ethdb.NewMemDatabase()
 | 
						db, _ := ethdb.NewMemDatabase()
 | 
				
			||||||
	genesis := GenesisBlock(db)
 | 
						genesis := GenesisBlock(0, db)
 | 
				
			||||||
	bc := chm(genesis, db)
 | 
						bc := chm(genesis, db)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	chain1 := makeChainWithDiff(genesis, []int{1, 2, 4}, 10)
 | 
						chain1 := makeChainWithDiff(genesis, []int{1, 2, 4}, 10)
 | 
				
			||||||
@@ -411,7 +421,7 @@ func TestReorgLongest(t *testing.T) {
 | 
				
			|||||||
func TestReorgShortest(t *testing.T) {
 | 
					func TestReorgShortest(t *testing.T) {
 | 
				
			||||||
	t.Skip("skipped while cache is removed")
 | 
						t.Skip("skipped while cache is removed")
 | 
				
			||||||
	db, _ := ethdb.NewMemDatabase()
 | 
						db, _ := ethdb.NewMemDatabase()
 | 
				
			||||||
	genesis := GenesisBlock(db)
 | 
						genesis := GenesisBlock(0, db)
 | 
				
			||||||
	bc := chm(genesis, db)
 | 
						bc := chm(genesis, db)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	chain1 := makeChainWithDiff(genesis, []int{1, 2, 3, 4}, 10)
 | 
						chain1 := makeChainWithDiff(genesis, []int{1, 2, 3, 4}, 10)
 | 
				
			||||||
@@ -431,7 +441,7 @@ func TestReorgShortest(t *testing.T) {
 | 
				
			|||||||
func TestInsertNonceError(t *testing.T) {
 | 
					func TestInsertNonceError(t *testing.T) {
 | 
				
			||||||
	for i := 1; i < 25 && !t.Failed(); i++ {
 | 
						for i := 1; i < 25 && !t.Failed(); i++ {
 | 
				
			||||||
		db, _ := ethdb.NewMemDatabase()
 | 
							db, _ := ethdb.NewMemDatabase()
 | 
				
			||||||
		genesis := GenesisBlock(db)
 | 
							genesis := GenesisBlock(0, db)
 | 
				
			||||||
		bc := chm(genesis, db)
 | 
							bc := chm(genesis, db)
 | 
				
			||||||
		bc.processor = NewBlockProcessor(db, db, bc.pow, bc, bc.eventMux)
 | 
							bc.processor = NewBlockProcessor(db, db, bc.pow, bc, bc.eventMux)
 | 
				
			||||||
		blocks := makeChain(bc.processor.(*BlockProcessor), bc.currentBlock, i, db, 0)
 | 
							blocks := makeChain(bc.processor.(*BlockProcessor), bc.currentBlock, i, db, 0)
 | 
				
			||||||
@@ -465,6 +475,21 @@ func TestInsertNonceError(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGenesisMismatch(t *testing.T) {
 | 
				
			||||||
 | 
						db, _ := ethdb.NewMemDatabase()
 | 
				
			||||||
 | 
						var mux event.TypeMux
 | 
				
			||||||
 | 
						genesis := GenesisBlock(0, db)
 | 
				
			||||||
 | 
						_, err := NewChainManager(genesis, db, db, thePow(), &mux)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						genesis = GenesisBlock(1, db)
 | 
				
			||||||
 | 
						_, err = NewChainManager(genesis, db, db, thePow(), &mux)
 | 
				
			||||||
 | 
						if err == nil {
 | 
				
			||||||
 | 
							t.Error("expected genesis mismatch error")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// failpow returns false from Verify for a certain block number.
 | 
					// failpow returns false from Verify for a certain block number.
 | 
				
			||||||
type failpow struct{ num uint64 }
 | 
					type failpow struct{ num uint64 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,8 +19,8 @@ var ZeroHash256 = make([]byte, 32)
 | 
				
			|||||||
var ZeroHash160 = make([]byte, 20)
 | 
					var ZeroHash160 = make([]byte, 20)
 | 
				
			||||||
var ZeroHash512 = make([]byte, 64)
 | 
					var ZeroHash512 = make([]byte, 64)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func GenesisBlock(db common.Database) *types.Block {
 | 
					func GenesisBlock(nonce uint64, db common.Database) *types.Block {
 | 
				
			||||||
	genesis := types.NewBlock(common.Hash{}, common.Address{}, common.Hash{}, params.GenesisDifficulty, 42, nil)
 | 
						genesis := types.NewBlock(common.Hash{}, common.Address{}, common.Hash{}, params.GenesisDifficulty, nonce, nil)
 | 
				
			||||||
	genesis.Header().Number = common.Big0
 | 
						genesis.Header().Number = common.Big0
 | 
				
			||||||
	genesis.Header().GasLimit = params.GenesisGasLimit
 | 
						genesis.Header().GasLimit = params.GenesisGasLimit
 | 
				
			||||||
	genesis.Header().GasUsed = common.Big0
 | 
						genesis.Header().GasUsed = common.Big0
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -58,6 +58,7 @@ type Config struct {
 | 
				
			|||||||
	Name            string
 | 
						Name            string
 | 
				
			||||||
	ProtocolVersion int
 | 
						ProtocolVersion int
 | 
				
			||||||
	NetworkId       int
 | 
						NetworkId       int
 | 
				
			||||||
 | 
						GenesisNonce    int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BlockChainVersion  int
 | 
						BlockChainVersion  int
 | 
				
			||||||
	SkipBcVersionCheck bool // e.g. blockchain export
 | 
						SkipBcVersionCheck bool // e.g. blockchain export
 | 
				
			||||||
@@ -284,7 +285,11 @@ func New(config *Config) (*Ethereum, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	eth.pow = ethash.New()
 | 
						eth.pow = ethash.New()
 | 
				
			||||||
	eth.chainManager = core.NewChainManager(blockDb, stateDb, eth.pow, eth.EventMux())
 | 
						genesis := core.GenesisBlock(uint64(config.GenesisNonce), blockDb)
 | 
				
			||||||
 | 
						eth.chainManager, err = core.NewChainManager(genesis, blockDb, stateDb, eth.pow, eth.EventMux())
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	eth.downloader = downloader.New(eth.EventMux(), eth.chainManager.HasBlock, eth.chainManager.GetBlock)
 | 
						eth.downloader = downloader.New(eth.EventMux(), eth.chainManager.HasBlock, eth.chainManager.GetBlock)
 | 
				
			||||||
	eth.txPool = core.NewTxPool(eth.EventMux(), eth.chainManager.State, eth.chainManager.GasLimit)
 | 
						eth.txPool = core.NewTxPool(eth.EventMux(), eth.chainManager.State, eth.chainManager.GasLimit)
 | 
				
			||||||
	eth.blockProcessor = core.NewBlockProcessor(stateDb, extraDb, eth.pow, eth.chainManager, eth.EventMux())
 | 
						eth.blockProcessor = core.NewBlockProcessor(stateDb, extraDb, eth.pow, eth.chainManager, eth.EventMux())
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user