aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/bench_test.go2
-rw-r--r--core/chain_makers_test.go5
-rw-r--r--core/chain_manager.go30
-rw-r--r--core/chain_manager_test.go1
-rw-r--r--core/chain_util.go13
-rw-r--r--core/fees.go2
-rw-r--r--core/genesis.go13
-rw-r--r--core/transaction_util.go42
-rw-r--r--core/types/block.go4
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,