diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/bench_test.go | 2 | ||||
-rw-r--r-- | core/chain_makers_test.go | 5 | ||||
-rw-r--r-- | core/chain_manager.go | 30 | ||||
-rw-r--r-- | core/chain_manager_test.go | 1 | ||||
-rw-r--r-- | core/chain_util.go | 13 | ||||
-rw-r--r-- | core/fees.go | 2 | ||||
-rw-r--r-- | core/genesis.go | 13 | ||||
-rw-r--r-- | core/transaction_util.go | 42 | ||||
-rw-r--r-- | core/types/block.go | 4 |
9 files changed, 70 insertions, 42 deletions
diff --git a/core/bench_test.go b/core/bench_test.go index c5c5b5b72..67ba15970 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -153,7 +153,7 @@ func benchInsertChain(b *testing.B, disk bool, gen func(int, *BlockGen)) { b.Fatalf("cannot create temporary directory: %v", err) } defer os.RemoveAll(dir) - db, err = ethdb.NewLDBDatabase(dir) + db, err = ethdb.NewLDBDatabase(dir, 0) if err != nil { b.Fatalf("cannot create temporary database: %v", err) } diff --git a/core/chain_makers_test.go b/core/chain_makers_test.go index 750ec3809..98a585f9b 100644 --- a/core/chain_makers_test.go +++ b/core/chain_makers_test.go @@ -28,6 +28,9 @@ import ( ) func ExampleGenerateChain() { + params.MinGasLimit = big.NewInt(125000) // Minimum the gas limit may ever be. + params.GenesisGasLimit = big.NewInt(3141592) // Gas limit of the Genesis block. + var ( key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") key2, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") @@ -90,5 +93,5 @@ func ExampleGenerateChain() { // last block: #5 // balance of addr1: 989000 // balance of addr2: 10000 - // balance of addr3: 5906250000000001000 + // balance of addr3: 19687500000000001000 } diff --git a/core/chain_manager.go b/core/chain_manager.go index 4ad48c24c..c2e89a10d 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -73,9 +73,6 @@ type ChainManager struct { lastBlockHash common.Hash currentGasLimit *big.Int - transState *state.StateDB - txState *state.ManagedState - cache *lru.Cache // cache is the LRU caching futureBlocks *lru.Cache // future blocks are blocks added for later processing @@ -101,13 +98,7 @@ func NewChainManager(blockDb, stateDb, extraDb common.Database, pow pow.PoW, mux bc.genesisBlock = bc.GetBlockByNumber(0) if bc.genesisBlock == nil { - // XXX Uncomment me before Frontier - //return nil, ErrNoGenesis - genesis, err := WriteTestNetGenesisBlock(bc.stateDb, bc.blockDb, 42) - if err != nil { - glog.Fatalln("genisis err", err) - } - bc.genesisBlock = genesis + return nil, ErrNoGenesis } if err := bc.setLastState(); err != nil { @@ -128,9 +119,7 @@ func NewChainManager(blockDb, stateDb, extraDb common.Database, pow pow.PoW, mux } } - bc.transState = bc.State().Copy() // Take ownership of this particular state - bc.txState = state.ManageState(bc.State().Copy()) bc.futureBlocks, _ = lru.New(maxFutureBlocks) bc.makeCache() @@ -152,9 +141,6 @@ func (bc *ChainManager) SetHead(head *types.Block) { bc.currentBlock = head bc.makeCache() - statedb := state.New(head.Root(), bc.stateDb) - bc.txState = state.ManageState(statedb) - bc.transState = statedb.Copy() bc.setTotalDifficulty(head.Td) bc.insert(head) bc.setLastState() @@ -203,17 +189,6 @@ func (self *ChainManager) State() *state.StateDB { return state.New(self.CurrentBlock().Root(), self.stateDb) } -func (self *ChainManager) TransState() *state.StateDB { - self.tsmu.RLock() - defer self.tsmu.RUnlock() - - return self.transState -} - -func (self *ChainManager) setTransState(statedb *state.StateDB) { - self.transState = statedb -} - func (bc *ChainManager) recover() bool { data, _ := bc.blockDb.Get([]byte("checkpoint")) if len(data) != 0 { @@ -529,9 +504,6 @@ func (self *ChainManager) WriteBlock(block *types.Block, queued bool) (status wr self.insert(block) self.mu.Unlock() - self.setTransState(state.New(block.Root(), self.stateDb)) - self.txState.SetState(state.New(block.Root(), self.stateDb)) - status = CanonStatTy } else { status = SideStatTy diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go index 2602afe19..f0c097df6 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -392,7 +392,6 @@ func chm(genesis *types.Block, db common.Database) *ChainManager { bc.futureBlocks, _ = lru.New(100) bc.processor = bproc{} bc.ResetWithGenesisBlock(genesis) - bc.txState = state.ManageState(bc.State()) return bc } diff --git a/core/chain_util.go b/core/chain_util.go index 4e6665568..326bf13fb 100644 --- a/core/chain_util.go +++ b/core/chain_util.go @@ -111,13 +111,22 @@ func GetBlockByNumber(db common.Database, number uint64) *types.Block { return GetBlockByHash(db, common.BytesToHash(key)) } -// WriteHead force writes the current head -func WriteHead(db common.Database, block *types.Block) error { +// WriteCanonNumber writes the canonical hash for the given block +func WriteCanonNumber(db common.Database, block *types.Block) error { key := append(blockNumPre, block.Number().Bytes()...) err := db.Put(key, block.Hash().Bytes()) if err != nil { return err } + return nil +} + +// WriteHead force writes the current head +func WriteHead(db common.Database, block *types.Block) error { + err := WriteCanonNumber(db, block) + if err != nil { + return err + } err = db.Put([]byte("LastBlock"), block.Hash().Bytes()) if err != nil { return err diff --git a/core/fees.go b/core/fees.go index 322bc96f6..0bb26f055 100644 --- a/core/fees.go +++ b/core/fees.go @@ -20,4 +20,4 @@ import ( "math/big" ) -var BlockReward *big.Int = big.NewInt(1.5e+18) +var BlockReward *big.Int = big.NewInt(5e+18) diff --git a/core/genesis.go b/core/genesis.go index 67c3a3b58..4c0323c17 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -27,6 +27,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/params" ) @@ -73,7 +75,7 @@ func WriteGenesisBlock(stateDb, blockDb common.Database, reader io.Reader) (*typ Nonce: types.EncodeNonce(common.String2Big(genesis.Nonce).Uint64()), Time: common.String2Big(genesis.Timestamp).Uint64(), ParentHash: common.HexToHash(genesis.ParentHash), - Extra: common.Hex2Bytes(genesis.ExtraData), + Extra: common.FromHex(genesis.ExtraData), GasLimit: common.String2Big(genesis.GasLimit), Difficulty: difficulty, MixDigest: common.HexToHash(genesis.Mixhash), @@ -82,6 +84,15 @@ func WriteGenesisBlock(stateDb, blockDb common.Database, reader io.Reader) (*typ }, nil, nil, nil) block.Td = difficulty + if block := GetBlockByHash(blockDb, block.Hash()); block != nil { + glog.V(logger.Info).Infoln("Genesis block already in chain. Writing canonical number") + err := WriteCanonNumber(blockDb, block) + if err != nil { + return nil, err + } + return block, nil + } + statedb.Sync() err = WriteBlock(blockDb, block) diff --git a/core/transaction_util.go b/core/transaction_util.go index 54a909ba2..ce2ceac46 100644 --- a/core/transaction_util.go +++ b/core/transaction_util.go @@ -19,9 +19,11 @@ package core import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/rlp" + "github.com/syndtr/goleveldb/leveldb" ) var ( @@ -31,13 +33,21 @@ var ( // PutTransactions stores the transactions in the given database func PutTransactions(db common.Database, block *types.Block, txs types.Transactions) { + batch := new(leveldb.Batch) + _, batchWrite := db.(*ethdb.LDBDatabase) + for i, tx := range block.Transactions() { rlpEnc, err := rlp.EncodeToBytes(tx) if err != nil { glog.V(logger.Debug).Infoln("Failed encoding tx", err) return } - db.Put(tx.Hash().Bytes(), rlpEnc) + + if batchWrite { + batch.Put(tx.Hash().Bytes(), rlpEnc) + } else { + db.Put(tx.Hash().Bytes(), rlpEnc) + } var txExtra struct { BlockHash common.Hash @@ -52,20 +62,44 @@ func PutTransactions(db common.Database, block *types.Block, txs types.Transacti glog.V(logger.Debug).Infoln("Failed encoding tx meta data", err) return } - db.Put(append(tx.Hash().Bytes(), 0x0001), rlpMeta) + + if batchWrite { + batch.Put(append(tx.Hash().Bytes(), 0x0001), rlpMeta) + } else { + db.Put(append(tx.Hash().Bytes(), 0x0001), rlpMeta) + } + } + + if db, ok := db.(*ethdb.LDBDatabase); ok { + if err := db.LDB().Write(batch, nil); err != nil { + glog.V(logger.Error).Infoln("db write err:", err) + } } } // PutReceipts stores the receipts in the current database func PutReceipts(db common.Database, receipts types.Receipts) error { + batch := new(leveldb.Batch) + _, batchWrite := db.(*ethdb.LDBDatabase) + for _, receipt := range receipts { storageReceipt := (*types.ReceiptForStorage)(receipt) bytes, err := rlp.EncodeToBytes(storageReceipt) if err != nil { return err } - err = db.Put(append(receiptsPre, receipt.TxHash[:]...), bytes) - if err != nil { + + if batchWrite { + batch.Put(append(receiptsPre, receipt.TxHash[:]...), bytes) + } else { + err = db.Put(append(receiptsPre, receipt.TxHash[:]...), bytes) + if err != nil { + return err + } + } + } + if db, ok := db.(*ethdb.LDBDatabase); ok { + if err := db.LDB().Write(batch, nil); err != nil { return err } } diff --git a/core/types/block.go b/core/types/block.go index 5a0b2abce..427a3e6cb 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -257,7 +257,7 @@ func (b *Block) DecodeRLP(s *rlp.Stream) error { return nil } -func (b Block) EncodeRLP(w io.Writer) error { +func (b *Block) EncodeRLP(w io.Writer) error { return rlp.Encode(w, extblock{ Header: b.header, Txs: b.transactions, @@ -274,7 +274,7 @@ func (b *StorageBlock) DecodeRLP(s *rlp.Stream) error { return nil } -func (b StorageBlock) EncodeRLP(w io.Writer) error { +func (b *StorageBlock) EncodeRLP(w io.Writer) error { return rlp.Encode(w, storageblock{ Header: b.header, Txs: b.transactions, |