Merge pull request #1801 from fjl/ethdb
all: move common.Database to ethdb and add NewBatch
This commit is contained in:
		@@ -22,7 +22,6 @@ import (
 | 
			
		||||
 | 
			
		||||
	"github.com/codegangsta/cli"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/cmd/utils"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/eth"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/ethdb"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/tests"
 | 
			
		||||
@@ -103,7 +102,7 @@ func runBlockTest(ctx *cli.Context) {
 | 
			
		||||
 | 
			
		||||
func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, error) {
 | 
			
		||||
	cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx)
 | 
			
		||||
	cfg.NewDB = func(path string) (common.Database, error) { return ethdb.NewMemDatabase() }
 | 
			
		||||
	cfg.NewDB = func(path string) (ethdb.Database, error) { return ethdb.NewMemDatabase() }
 | 
			
		||||
	cfg.MaxPeers = 0 // disable network
 | 
			
		||||
	cfg.Shh = false  // disable whisper
 | 
			
		||||
	cfg.NAT = nil    // disable port mapping
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ import (
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/state"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/ethdb"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -191,7 +192,7 @@ func hashish(x string) bool {
 | 
			
		||||
	return err != nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func closeAll(dbs ...common.Database) {
 | 
			
		||||
func closeAll(dbs ...ethdb.Database) {
 | 
			
		||||
	for _, db := range dbs {
 | 
			
		||||
		db.Close()
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -103,7 +103,7 @@ func testREPL(t *testing.T, config func(*eth.Config)) (string, *testjethre, *eth
 | 
			
		||||
		Name:           "test",
 | 
			
		||||
		SolcPath:       testSolcPath,
 | 
			
		||||
		PowTest:        true,
 | 
			
		||||
		NewDB:          func(path string) (common.Database, error) { return db, nil },
 | 
			
		||||
		NewDB:          func(path string) (ethdb.Database, error) { return db, nil },
 | 
			
		||||
	}
 | 
			
		||||
	if config != nil {
 | 
			
		||||
		config(conf)
 | 
			
		||||
 
 | 
			
		||||
@@ -508,7 +508,7 @@ func SetupEth(ctx *cli.Context) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MakeChain creates a chain manager from set command line flags.
 | 
			
		||||
func MakeChain(ctx *cli.Context) (chain *core.ChainManager, chainDb common.Database) {
 | 
			
		||||
func MakeChain(ctx *cli.Context) (chain *core.ChainManager, chainDb ethdb.Database) {
 | 
			
		||||
	datadir := ctx.GlobalString(DataDirFlag.Name)
 | 
			
		||||
	cache := ctx.GlobalInt(CacheFlag.Name)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -143,7 +143,7 @@ func testEth(t *testing.T) (ethereum *eth.Ethereum, err error) {
 | 
			
		||||
		MaxPeers:       0,
 | 
			
		||||
		PowTest:        true,
 | 
			
		||||
		Etherbase:      common.HexToAddress(testAddress),
 | 
			
		||||
		NewDB:          func(path string) (common.Database, error) { return db, nil },
 | 
			
		||||
		NewDB:          func(path string) (ethdb.Database, error) { return db, nil },
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -144,7 +144,7 @@ func genUncles(i int, gen *BlockGen) {
 | 
			
		||||
 | 
			
		||||
func benchInsertChain(b *testing.B, disk bool, gen func(int, *BlockGen)) {
 | 
			
		||||
	// Create the database in memory or in a temporary directory.
 | 
			
		||||
	var db common.Database
 | 
			
		||||
	var db ethdb.Database
 | 
			
		||||
	if !disk {
 | 
			
		||||
		db, _ = ethdb.NewMemDatabase()
 | 
			
		||||
	} else {
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ import (
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/state"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/crypto"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/ethdb"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/event"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
			
		||||
@@ -41,7 +42,7 @@ const (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type BlockProcessor struct {
 | 
			
		||||
	chainDb common.Database
 | 
			
		||||
	chainDb ethdb.Database
 | 
			
		||||
	// Mutex for locking the block processor. Blocks can only be handled one at a time
 | 
			
		||||
	mutex sync.Mutex
 | 
			
		||||
	// Canonical block chain
 | 
			
		||||
@@ -68,7 +69,7 @@ type GasPool interface {
 | 
			
		||||
	SubGas(gas, price *big.Int) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewBlockProcessor(db common.Database, pow pow.PoW, chainManager *ChainManager, eventMux *event.TypeMux) *BlockProcessor {
 | 
			
		||||
func NewBlockProcessor(db ethdb.Database, pow pow.PoW, chainManager *ChainManager, eventMux *event.TypeMux) *BlockProcessor {
 | 
			
		||||
	sm := &BlockProcessor{
 | 
			
		||||
		chainDb:  db,
 | 
			
		||||
		mem:      make(map[string]*big.Int),
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,7 @@ 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/ethdb"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/event"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/pow"
 | 
			
		||||
)
 | 
			
		||||
@@ -142,7 +143,7 @@ func (b *BlockGen) PrevBlock(index int) *types.Block {
 | 
			
		||||
// Blocks created by GenerateChain do not contain valid proof of work
 | 
			
		||||
// values. Inserting them into ChainManager requires use of FakePow or
 | 
			
		||||
// a similar non-validating proof of work implementation.
 | 
			
		||||
func GenerateChain(parent *types.Block, db common.Database, n int, gen func(int, *BlockGen)) []*types.Block {
 | 
			
		||||
func GenerateChain(parent *types.Block, db ethdb.Database, n int, gen func(int, *BlockGen)) []*types.Block {
 | 
			
		||||
	statedb := state.New(parent.Root(), db)
 | 
			
		||||
	blocks := make(types.Blocks, n)
 | 
			
		||||
	genblock := func(i int, h *types.Header) *types.Block {
 | 
			
		||||
@@ -185,7 +186,7 @@ func makeHeader(parent *types.Block, state *state.StateDB) *types.Header {
 | 
			
		||||
 | 
			
		||||
// newCanonical creates a new deterministic canonical chain by running
 | 
			
		||||
// InsertChain on the result of makeChain.
 | 
			
		||||
func newCanonical(n int, db common.Database) (*BlockProcessor, error) {
 | 
			
		||||
func newCanonical(n int, db ethdb.Database) (*BlockProcessor, error) {
 | 
			
		||||
	evmux := &event.TypeMux{}
 | 
			
		||||
 | 
			
		||||
	WriteTestNetGenesisBlock(db, 0)
 | 
			
		||||
@@ -201,7 +202,7 @@ func newCanonical(n int, db common.Database) (*BlockProcessor, error) {
 | 
			
		||||
	return bman, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func makeChain(parent *types.Block, n int, db common.Database, seed int) []*types.Block {
 | 
			
		||||
func makeChain(parent *types.Block, n int, db ethdb.Database, seed int) []*types.Block {
 | 
			
		||||
	return GenerateChain(parent, db, n, func(i int, b *BlockGen) {
 | 
			
		||||
		b.SetCoinbase(common.Address{0: byte(seed), 19: byte(i)})
 | 
			
		||||
	})
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,7 @@ 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/ethdb"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/event"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
			
		||||
@@ -60,7 +61,7 @@ const (
 | 
			
		||||
 | 
			
		||||
type ChainManager struct {
 | 
			
		||||
	//eth          EthManager
 | 
			
		||||
	chainDb      common.Database
 | 
			
		||||
	chainDb      ethdb.Database
 | 
			
		||||
	processor    types.BlockProcessor
 | 
			
		||||
	eventMux     *event.TypeMux
 | 
			
		||||
	genesisBlock *types.Block
 | 
			
		||||
@@ -90,7 +91,7 @@ type ChainManager struct {
 | 
			
		||||
	pow pow.PoW
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewChainManager(chainDb common.Database, pow pow.PoW, mux *event.TypeMux) (*ChainManager, error) {
 | 
			
		||||
func NewChainManager(chainDb ethdb.Database, pow pow.PoW, mux *event.TypeMux) (*ChainManager, error) {
 | 
			
		||||
	headerCache, _ := lru.New(headerCacheLimit)
 | 
			
		||||
	bodyCache, _ := lru.New(bodyCacheLimit)
 | 
			
		||||
	bodyRLPCache, _ := lru.New(bodyCacheLimit)
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ func thePow() pow.PoW {
 | 
			
		||||
	return pow
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func theChainManager(db common.Database, t *testing.T) *ChainManager {
 | 
			
		||||
func theChainManager(db ethdb.Database, t *testing.T) *ChainManager {
 | 
			
		||||
	var eventMux event.TypeMux
 | 
			
		||||
	WriteTestNetGenesisBlock(db, 0)
 | 
			
		||||
	chainMan, err := NewChainManager(db, thePow(), &eventMux)
 | 
			
		||||
@@ -380,7 +380,7 @@ func makeChainWithDiff(genesis *types.Block, d []int, seed byte) []*types.Block
 | 
			
		||||
	return chain
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func chm(genesis *types.Block, db common.Database) *ChainManager {
 | 
			
		||||
func chm(genesis *types.Block, db ethdb.Database) *ChainManager {
 | 
			
		||||
	var eventMux event.TypeMux
 | 
			
		||||
	bc := &ChainManager{chainDb: db, genesisBlock: genesis, eventMux: &eventMux, pow: FakePow{}}
 | 
			
		||||
	bc.headerCache, _ = lru.New(100)
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,7 @@ 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/params"
 | 
			
		||||
@@ -111,7 +112,7 @@ func CalcGasLimit(parent *types.Block) *big.Int {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetCanonicalHash retrieves a hash assigned to a canonical block number.
 | 
			
		||||
func GetCanonicalHash(db common.Database, number uint64) common.Hash {
 | 
			
		||||
func GetCanonicalHash(db ethdb.Database, number uint64) common.Hash {
 | 
			
		||||
	data, _ := db.Get(append(blockNumPrefix, big.NewInt(int64(number)).Bytes()...))
 | 
			
		||||
	if len(data) == 0 {
 | 
			
		||||
		return common.Hash{}
 | 
			
		||||
@@ -124,7 +125,7 @@ func GetCanonicalHash(db common.Database, number uint64) common.Hash {
 | 
			
		||||
// last block hash is only updated upon a full block import, the last header
 | 
			
		||||
// hash is updated already at header import, allowing head tracking for the
 | 
			
		||||
// fast synchronization mechanism.
 | 
			
		||||
func GetHeadHeaderHash(db common.Database) common.Hash {
 | 
			
		||||
func GetHeadHeaderHash(db ethdb.Database) common.Hash {
 | 
			
		||||
	data, _ := db.Get(headHeaderKey)
 | 
			
		||||
	if len(data) == 0 {
 | 
			
		||||
		return common.Hash{}
 | 
			
		||||
@@ -133,7 +134,7 @@ func GetHeadHeaderHash(db common.Database) common.Hash {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetHeadBlockHash retrieves the hash of the current canonical head block.
 | 
			
		||||
func GetHeadBlockHash(db common.Database) common.Hash {
 | 
			
		||||
func GetHeadBlockHash(db ethdb.Database) common.Hash {
 | 
			
		||||
	data, _ := db.Get(headBlockKey)
 | 
			
		||||
	if len(data) == 0 {
 | 
			
		||||
		return common.Hash{}
 | 
			
		||||
@@ -143,14 +144,14 @@ func GetHeadBlockHash(db common.Database) common.Hash {
 | 
			
		||||
 | 
			
		||||
// GetHeaderRLP retrieves a block header in its raw RLP database encoding, or nil
 | 
			
		||||
// if the header's not found.
 | 
			
		||||
func GetHeaderRLP(db common.Database, hash common.Hash) rlp.RawValue {
 | 
			
		||||
func GetHeaderRLP(db ethdb.Database, hash common.Hash) rlp.RawValue {
 | 
			
		||||
	data, _ := db.Get(append(append(blockPrefix, hash[:]...), headerSuffix...))
 | 
			
		||||
	return data
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetHeader retrieves the block header corresponding to the hash, nil if none
 | 
			
		||||
// found.
 | 
			
		||||
func GetHeader(db common.Database, hash common.Hash) *types.Header {
 | 
			
		||||
func GetHeader(db ethdb.Database, hash common.Hash) *types.Header {
 | 
			
		||||
	data := GetHeaderRLP(db, hash)
 | 
			
		||||
	if len(data) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
@@ -164,14 +165,14 @@ func GetHeader(db common.Database, hash common.Hash) *types.Header {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetBodyRLP retrieves the block body (transactions and uncles) in RLP encoding.
 | 
			
		||||
func GetBodyRLP(db common.Database, hash common.Hash) rlp.RawValue {
 | 
			
		||||
func GetBodyRLP(db ethdb.Database, hash common.Hash) rlp.RawValue {
 | 
			
		||||
	data, _ := db.Get(append(append(blockPrefix, hash[:]...), bodySuffix...))
 | 
			
		||||
	return data
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetBody retrieves the block body (transactons, uncles) corresponding to the
 | 
			
		||||
// hash, nil if none found.
 | 
			
		||||
func GetBody(db common.Database, hash common.Hash) *types.Body {
 | 
			
		||||
func GetBody(db ethdb.Database, hash common.Hash) *types.Body {
 | 
			
		||||
	data := GetBodyRLP(db, hash)
 | 
			
		||||
	if len(data) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
@@ -186,7 +187,7 @@ func GetBody(db common.Database, hash common.Hash) *types.Body {
 | 
			
		||||
 | 
			
		||||
// GetTd retrieves a block's total difficulty corresponding to the hash, nil if
 | 
			
		||||
// none found.
 | 
			
		||||
func GetTd(db common.Database, hash common.Hash) *big.Int {
 | 
			
		||||
func GetTd(db ethdb.Database, hash common.Hash) *big.Int {
 | 
			
		||||
	data, _ := db.Get(append(append(blockPrefix, hash.Bytes()...), tdSuffix...))
 | 
			
		||||
	if len(data) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
@@ -201,7 +202,7 @@ func GetTd(db common.Database, hash common.Hash) *big.Int {
 | 
			
		||||
 | 
			
		||||
// GetBlock retrieves an entire block corresponding to the hash, assembling it
 | 
			
		||||
// back from the stored header and body.
 | 
			
		||||
func GetBlock(db common.Database, hash common.Hash) *types.Block {
 | 
			
		||||
func GetBlock(db ethdb.Database, hash common.Hash) *types.Block {
 | 
			
		||||
	// Retrieve the block header and body contents
 | 
			
		||||
	header := GetHeader(db, hash)
 | 
			
		||||
	if header == nil {
 | 
			
		||||
@@ -216,7 +217,7 @@ func GetBlock(db common.Database, hash common.Hash) *types.Block {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WriteCanonicalHash stores the canonical hash for the given block number.
 | 
			
		||||
func WriteCanonicalHash(db common.Database, hash common.Hash, number uint64) error {
 | 
			
		||||
func WriteCanonicalHash(db ethdb.Database, hash common.Hash, number uint64) error {
 | 
			
		||||
	key := append(blockNumPrefix, big.NewInt(int64(number)).Bytes()...)
 | 
			
		||||
	if err := db.Put(key, hash.Bytes()); err != nil {
 | 
			
		||||
		glog.Fatalf("failed to store number to hash mapping into database: %v", err)
 | 
			
		||||
@@ -226,7 +227,7 @@ func WriteCanonicalHash(db common.Database, hash common.Hash, number uint64) err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WriteHeadHeaderHash stores the head header's hash.
 | 
			
		||||
func WriteHeadHeaderHash(db common.Database, hash common.Hash) error {
 | 
			
		||||
func WriteHeadHeaderHash(db ethdb.Database, hash common.Hash) error {
 | 
			
		||||
	if err := db.Put(headHeaderKey, hash.Bytes()); err != nil {
 | 
			
		||||
		glog.Fatalf("failed to store last header's hash into database: %v", err)
 | 
			
		||||
		return err
 | 
			
		||||
@@ -235,7 +236,7 @@ func WriteHeadHeaderHash(db common.Database, hash common.Hash) error {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WriteHeadBlockHash stores the head block's hash.
 | 
			
		||||
func WriteHeadBlockHash(db common.Database, hash common.Hash) error {
 | 
			
		||||
func WriteHeadBlockHash(db ethdb.Database, hash common.Hash) error {
 | 
			
		||||
	if err := db.Put(headBlockKey, hash.Bytes()); err != nil {
 | 
			
		||||
		glog.Fatalf("failed to store last block's hash into database: %v", err)
 | 
			
		||||
		return err
 | 
			
		||||
@@ -244,7 +245,7 @@ func WriteHeadBlockHash(db common.Database, hash common.Hash) error {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WriteHeader serializes a block header into the database.
 | 
			
		||||
func WriteHeader(db common.Database, header *types.Header) error {
 | 
			
		||||
func WriteHeader(db ethdb.Database, header *types.Header) error {
 | 
			
		||||
	data, err := rlp.EncodeToBytes(header)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
@@ -259,7 +260,7 @@ func WriteHeader(db common.Database, header *types.Header) error {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WriteBody serializes the body of a block into the database.
 | 
			
		||||
func WriteBody(db common.Database, hash common.Hash, body *types.Body) error {
 | 
			
		||||
func WriteBody(db ethdb.Database, hash common.Hash, body *types.Body) error {
 | 
			
		||||
	data, err := rlp.EncodeToBytes(body)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
@@ -274,7 +275,7 @@ func WriteBody(db common.Database, hash common.Hash, body *types.Body) error {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WriteTd serializes the total difficulty of a block into the database.
 | 
			
		||||
func WriteTd(db common.Database, hash common.Hash, td *big.Int) error {
 | 
			
		||||
func WriteTd(db ethdb.Database, hash common.Hash, td *big.Int) error {
 | 
			
		||||
	data, err := rlp.EncodeToBytes(td)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
@@ -289,7 +290,7 @@ func WriteTd(db common.Database, hash common.Hash, td *big.Int) error {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WriteBlock serializes a block into the database, header and body separately.
 | 
			
		||||
func WriteBlock(db common.Database, block *types.Block) error {
 | 
			
		||||
func WriteBlock(db ethdb.Database, block *types.Block) error {
 | 
			
		||||
	// Store the body first to retain database consistency
 | 
			
		||||
	if err := WriteBody(db, block.Hash(), &types.Body{block.Transactions(), block.Uncles()}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
@@ -302,27 +303,27 @@ func WriteBlock(db common.Database, block *types.Block) error {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeleteCanonicalHash removes the number to hash canonical mapping.
 | 
			
		||||
func DeleteCanonicalHash(db common.Database, number uint64) {
 | 
			
		||||
func DeleteCanonicalHash(db ethdb.Database, number uint64) {
 | 
			
		||||
	db.Delete(append(blockNumPrefix, big.NewInt(int64(number)).Bytes()...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeleteHeader removes all block header data associated with a hash.
 | 
			
		||||
func DeleteHeader(db common.Database, hash common.Hash) {
 | 
			
		||||
func DeleteHeader(db ethdb.Database, hash common.Hash) {
 | 
			
		||||
	db.Delete(append(append(blockPrefix, hash.Bytes()...), headerSuffix...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeleteBody removes all block body data associated with a hash.
 | 
			
		||||
func DeleteBody(db common.Database, hash common.Hash) {
 | 
			
		||||
func DeleteBody(db ethdb.Database, hash common.Hash) {
 | 
			
		||||
	db.Delete(append(append(blockPrefix, hash.Bytes()...), bodySuffix...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeleteTd removes all block total difficulty data associated with a hash.
 | 
			
		||||
func DeleteTd(db common.Database, hash common.Hash) {
 | 
			
		||||
func DeleteTd(db ethdb.Database, hash common.Hash) {
 | 
			
		||||
	db.Delete(append(append(blockPrefix, hash.Bytes()...), tdSuffix...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeleteBlock removes all block data associated with a hash.
 | 
			
		||||
func DeleteBlock(db common.Database, hash common.Hash) {
 | 
			
		||||
func DeleteBlock(db ethdb.Database, hash common.Hash) {
 | 
			
		||||
	DeleteHeader(db, hash)
 | 
			
		||||
	DeleteBody(db, hash)
 | 
			
		||||
	DeleteTd(db, hash)
 | 
			
		||||
@@ -333,7 +334,7 @@ func DeleteBlock(db common.Database, hash common.Hash) {
 | 
			
		||||
// or nil if not found. This method is only used by the upgrade mechanism to
 | 
			
		||||
// access the old combined block representation. It will be dropped after the
 | 
			
		||||
// network transitions to eth/63.
 | 
			
		||||
func GetBlockByHashOld(db common.Database, hash common.Hash) *types.Block {
 | 
			
		||||
func GetBlockByHashOld(db ethdb.Database, hash common.Hash) *types.Block {
 | 
			
		||||
	data, _ := db.Get(append(blockHashPre, hash[:]...))
 | 
			
		||||
	if len(data) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
 
 | 
			
		||||
@@ -27,13 +27,14 @@ 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/ethdb"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/params"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// WriteGenesisBlock writes the genesis block to the database as block number 0
 | 
			
		||||
func WriteGenesisBlock(chainDb common.Database, reader io.Reader) (*types.Block, error) {
 | 
			
		||||
func WriteGenesisBlock(chainDb ethdb.Database, reader io.Reader) (*types.Block, error) {
 | 
			
		||||
	contents, err := ioutil.ReadAll(reader)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
@@ -110,7 +111,7 @@ func WriteGenesisBlock(chainDb common.Database, reader io.Reader) (*types.Block,
 | 
			
		||||
 | 
			
		||||
// GenesisBlockForTesting creates a block in which addr has the given wei balance.
 | 
			
		||||
// The state trie of the block is written to db.
 | 
			
		||||
func GenesisBlockForTesting(db common.Database, addr common.Address, balance *big.Int) *types.Block {
 | 
			
		||||
func GenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big.Int) *types.Block {
 | 
			
		||||
	statedb := state.New(common.Hash{}, db)
 | 
			
		||||
	obj := statedb.GetOrNewStateObject(addr)
 | 
			
		||||
	obj.SetBalance(balance)
 | 
			
		||||
@@ -124,7 +125,7 @@ func GenesisBlockForTesting(db common.Database, addr common.Address, balance *bi
 | 
			
		||||
	return block
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WriteGenesisBlockForTesting(db common.Database, addr common.Address, balance *big.Int) *types.Block {
 | 
			
		||||
func WriteGenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big.Int) *types.Block {
 | 
			
		||||
	testGenesis := fmt.Sprintf(`{
 | 
			
		||||
	"nonce":"0x%x",
 | 
			
		||||
	"gasLimit":"0x%x",
 | 
			
		||||
@@ -137,7 +138,7 @@ func WriteGenesisBlockForTesting(db common.Database, addr common.Address, balanc
 | 
			
		||||
	return block
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func WriteTestNetGenesisBlock(chainDb common.Database, nonce uint64) (*types.Block, error) {
 | 
			
		||||
func WriteTestNetGenesisBlock(chainDb ethdb.Database, nonce uint64) (*types.Block, error) {
 | 
			
		||||
	testGenesis := fmt.Sprintf(`{
 | 
			
		||||
	"nonce":"0x%x",
 | 
			
		||||
	"gasLimit":"0x%x",
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ import (
 | 
			
		||||
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
	// "github.com/ethereum/go-ethereum/crypto"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
 | 
			
		||||
	"github.com/ethereum/go-ethereum/ethdb"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/event"
 | 
			
		||||
)
 | 
			
		||||
@@ -32,7 +32,7 @@ type TestManager struct {
 | 
			
		||||
	// stateManager *StateManager
 | 
			
		||||
	eventMux *event.TypeMux
 | 
			
		||||
 | 
			
		||||
	db         common.Database
 | 
			
		||||
	db         ethdb.Database
 | 
			
		||||
	txPool     *TxPool
 | 
			
		||||
	blockChain *ChainManager
 | 
			
		||||
	Blocks     []*types.Block
 | 
			
		||||
@@ -74,7 +74,7 @@ func (tm *TestManager) EventMux() *event.TypeMux {
 | 
			
		||||
// 	return nil
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func (tm *TestManager) Db() common.Database {
 | 
			
		||||
func (tm *TestManager) Db() ethdb.Database {
 | 
			
		||||
	return tm.db
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ package core
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/ethereum/go-ethereum/accounts"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/ethdb"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/event"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -28,7 +28,7 @@ type Backend interface {
 | 
			
		||||
	BlockProcessor() *BlockProcessor
 | 
			
		||||
	ChainManager() *ChainManager
 | 
			
		||||
	TxPool() *TxPool
 | 
			
		||||
	ChainDb() common.Database
 | 
			
		||||
	DappDb() common.Database
 | 
			
		||||
	ChainDb() ethdb.Database
 | 
			
		||||
	DappDb() ethdb.Database
 | 
			
		||||
	EventMux() *event.TypeMux
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,7 @@ import (
 | 
			
		||||
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/crypto"
 | 
			
		||||
	"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"
 | 
			
		||||
@@ -56,7 +57,7 @@ func (self Storage) Copy() Storage {
 | 
			
		||||
 | 
			
		||||
type StateObject struct {
 | 
			
		||||
	// State database for storing state changes
 | 
			
		||||
	db   common.Database
 | 
			
		||||
	db   ethdb.Database
 | 
			
		||||
	trie *trie.SecureTrie
 | 
			
		||||
 | 
			
		||||
	// Address belonging to this account
 | 
			
		||||
@@ -87,7 +88,7 @@ type StateObject struct {
 | 
			
		||||
	dirty   bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewStateObject(address common.Address, db common.Database) *StateObject {
 | 
			
		||||
func NewStateObject(address common.Address, db ethdb.Database) *StateObject {
 | 
			
		||||
	object := &StateObject{db: db, address: address, balance: new(big.Int), gasPool: new(big.Int), dirty: true}
 | 
			
		||||
	object.trie = trie.NewSecure((common.Hash{}).Bytes(), db)
 | 
			
		||||
	object.storage = make(Storage)
 | 
			
		||||
@@ -96,7 +97,7 @@ func NewStateObject(address common.Address, db common.Database) *StateObject {
 | 
			
		||||
	return object
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewStateObjectFromBytes(address common.Address, data []byte, db common.Database) *StateObject {
 | 
			
		||||
func NewStateObjectFromBytes(address common.Address, data []byte, db ethdb.Database) *StateObject {
 | 
			
		||||
	// TODO clean me up
 | 
			
		||||
	var extobject struct {
 | 
			
		||||
		Nonce    uint64
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@ import (
 | 
			
		||||
	"math/big"
 | 
			
		||||
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/ethdb"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/trie"
 | 
			
		||||
@@ -32,7 +33,7 @@ import (
 | 
			
		||||
// * Contracts
 | 
			
		||||
// * Accounts
 | 
			
		||||
type StateDB struct {
 | 
			
		||||
	db   common.Database
 | 
			
		||||
	db   ethdb.Database
 | 
			
		||||
	trie *trie.SecureTrie
 | 
			
		||||
	root common.Hash
 | 
			
		||||
 | 
			
		||||
@@ -47,7 +48,7 @@ type StateDB struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Create a new state from a given trie
 | 
			
		||||
func New(root common.Hash, db common.Database) *StateDB {
 | 
			
		||||
func New(root common.Hash, db ethdb.Database) *StateDB {
 | 
			
		||||
	trie := trie.NewSecure(root[:], db)
 | 
			
		||||
	return &StateDB{root: root, db: db, trie: trie, stateObjects: make(map[string]*StateObject), refund: new(big.Int), logs: make(map[common.Hash]Logs)}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ var (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// PutTransactions stores the transactions in the given database
 | 
			
		||||
func PutTransactions(db common.Database, block *types.Block, txs types.Transactions) {
 | 
			
		||||
func PutTransactions(db ethdb.Database, block *types.Block, txs types.Transactions) {
 | 
			
		||||
	batch := new(leveldb.Batch)
 | 
			
		||||
	_, batchWrite := db.(*ethdb.LDBDatabase)
 | 
			
		||||
 | 
			
		||||
@@ -78,7 +78,7 @@ func PutTransactions(db common.Database, block *types.Block, txs types.Transacti
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PutReceipts stores the receipts in the current database
 | 
			
		||||
func PutReceipts(db common.Database, receipts types.Receipts) error {
 | 
			
		||||
func PutReceipts(db ethdb.Database, receipts types.Receipts) error {
 | 
			
		||||
	batch := new(leveldb.Batch)
 | 
			
		||||
	_, batchWrite := db.(*ethdb.LDBDatabase)
 | 
			
		||||
 | 
			
		||||
@@ -108,7 +108,7 @@ func PutReceipts(db common.Database, receipts types.Receipts) error {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetReceipt returns a receipt by hash
 | 
			
		||||
func GetReceipt(db common.Database, txHash common.Hash) *types.Receipt {
 | 
			
		||||
func GetReceipt(db ethdb.Database, txHash common.Hash) *types.Receipt {
 | 
			
		||||
	data, _ := db.Get(append(receiptsPre, txHash[:]...))
 | 
			
		||||
	if len(data) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
@@ -124,7 +124,7 @@ func GetReceipt(db common.Database, txHash common.Hash) *types.Receipt {
 | 
			
		||||
 | 
			
		||||
// GetBlockReceipts returns the receipts generated by the transactions
 | 
			
		||||
// included in block's given hash.
 | 
			
		||||
func GetBlockReceipts(db common.Database, hash common.Hash) types.Receipts {
 | 
			
		||||
func GetBlockReceipts(db ethdb.Database, hash common.Hash) types.Receipts {
 | 
			
		||||
	data, _ := db.Get(append(blockReceiptsPre, hash[:]...))
 | 
			
		||||
	if len(data) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
@@ -141,7 +141,7 @@ func GetBlockReceipts(db common.Database, hash common.Hash) types.Receipts {
 | 
			
		||||
// PutBlockReceipts stores the block's transactions associated receipts
 | 
			
		||||
// and stores them by block hash in a single slice. This is required for
 | 
			
		||||
// forks and chain reorgs
 | 
			
		||||
func PutBlockReceipts(db common.Database, block *types.Block, receipts types.Receipts) error {
 | 
			
		||||
func PutBlockReceipts(db ethdb.Database, block *types.Block, receipts types.Receipts) error {
 | 
			
		||||
	rs := make([]*types.ReceiptForStorage, len(receipts))
 | 
			
		||||
	for i, receipt := range receipts {
 | 
			
		||||
		rs[i] = (*types.ReceiptForStorage)(receipt)
 | 
			
		||||
 
 | 
			
		||||
@@ -128,7 +128,7 @@ type Config struct {
 | 
			
		||||
 | 
			
		||||
	// NewDB is used to create databases.
 | 
			
		||||
	// If nil, the default is to create leveldb databases on disk.
 | 
			
		||||
	NewDB func(path string) (common.Database, error)
 | 
			
		||||
	NewDB func(path string) (ethdb.Database, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (cfg *Config) parseBootNodes() []*discover.Node {
 | 
			
		||||
@@ -210,11 +210,8 @@ type Ethereum struct {
 | 
			
		||||
	shutdownChan chan bool
 | 
			
		||||
 | 
			
		||||
	// DB interfaces
 | 
			
		||||
	chainDb common.Database // Block chain databe
 | 
			
		||||
	dappDb  common.Database // Dapp database
 | 
			
		||||
 | 
			
		||||
	// Closed when databases are flushed and closed
 | 
			
		||||
	databasesClosed chan bool
 | 
			
		||||
	chainDb ethdb.Database // Block chain database
 | 
			
		||||
	dappDb  ethdb.Database // Dapp database
 | 
			
		||||
 | 
			
		||||
	//*** SERVICES ***
 | 
			
		||||
	// State manager for processing new blocks and managing the over all states
 | 
			
		||||
@@ -267,7 +264,7 @@ func New(config *Config) (*Ethereum, error) {
 | 
			
		||||
 | 
			
		||||
	newdb := config.NewDB
 | 
			
		||||
	if newdb == nil {
 | 
			
		||||
		newdb = func(path string) (common.Database, error) { return ethdb.NewLDBDatabase(path, config.DatabaseCache) }
 | 
			
		||||
		newdb = func(path string) (ethdb.Database, error) { return ethdb.NewLDBDatabase(path, config.DatabaseCache) }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Open the chain database and perform any upgrades needed
 | 
			
		||||
@@ -337,7 +334,6 @@ func New(config *Config) (*Ethereum, error) {
 | 
			
		||||
 | 
			
		||||
	eth := &Ethereum{
 | 
			
		||||
		shutdownChan:            make(chan bool),
 | 
			
		||||
		databasesClosed:         make(chan bool),
 | 
			
		||||
		chainDb:                 chainDb,
 | 
			
		||||
		dappDb:                  dappDb,
 | 
			
		||||
		eventMux:                &event.TypeMux{},
 | 
			
		||||
@@ -527,8 +523,8 @@ func (s *Ethereum) BlockProcessor() *core.BlockProcessor { return s.blockProcess
 | 
			
		||||
func (s *Ethereum) TxPool() *core.TxPool                 { return s.txPool }
 | 
			
		||||
func (s *Ethereum) Whisper() *whisper.Whisper            { return s.whisper }
 | 
			
		||||
func (s *Ethereum) EventMux() *event.TypeMux             { return s.eventMux }
 | 
			
		||||
func (s *Ethereum) ChainDb() common.Database             { return s.chainDb }
 | 
			
		||||
func (s *Ethereum) DappDb() common.Database              { return s.dappDb }
 | 
			
		||||
func (s *Ethereum) ChainDb() ethdb.Database              { return s.chainDb }
 | 
			
		||||
func (s *Ethereum) DappDb() ethdb.Database               { return s.dappDb }
 | 
			
		||||
func (s *Ethereum) IsListening() bool                    { return true } // Always listening
 | 
			
		||||
func (s *Ethereum) PeerCount() int                       { return s.net.PeerCount() }
 | 
			
		||||
func (s *Ethereum) Peers() []*p2p.Peer                   { return s.net.Peers() }
 | 
			
		||||
@@ -549,8 +545,6 @@ func (s *Ethereum) Start() error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	// periodically flush databases
 | 
			
		||||
	go s.syncDatabases()
 | 
			
		||||
 | 
			
		||||
	if s.AutoDAG {
 | 
			
		||||
		s.StartAutoDAG()
 | 
			
		||||
@@ -566,32 +560,6 @@ func (s *Ethereum) Start() error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// sync databases every minute. If flushing fails we exit immediatly. The system
 | 
			
		||||
// may not continue under any circumstances.
 | 
			
		||||
func (s *Ethereum) syncDatabases() {
 | 
			
		||||
	ticker := time.NewTicker(1 * time.Minute)
 | 
			
		||||
done:
 | 
			
		||||
	for {
 | 
			
		||||
		select {
 | 
			
		||||
		case <-ticker.C:
 | 
			
		||||
			// don't change the order of database flushes
 | 
			
		||||
			if err := s.dappDb.Flush(); err != nil {
 | 
			
		||||
				glog.Fatalf("fatal error: flush dappDb: %v (Restart your node. We are aware of this issue)\n", err)
 | 
			
		||||
			}
 | 
			
		||||
			if err := s.chainDb.Flush(); err != nil {
 | 
			
		||||
				glog.Fatalf("fatal error: flush chainDb: %v (Restart your node. We are aware of this issue)\n", err)
 | 
			
		||||
			}
 | 
			
		||||
		case <-s.shutdownChan:
 | 
			
		||||
			break done
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	s.chainDb.Close()
 | 
			
		||||
	s.dappDb.Close()
 | 
			
		||||
 | 
			
		||||
	close(s.databasesClosed)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Ethereum) StartForTest() {
 | 
			
		||||
	jsonlogger.LogJson(&logger.LogStarting{
 | 
			
		||||
		ClientString:    s.net.Name,
 | 
			
		||||
@@ -622,12 +590,13 @@ func (s *Ethereum) Stop() {
 | 
			
		||||
	}
 | 
			
		||||
	s.StopAutoDAG()
 | 
			
		||||
 | 
			
		||||
	s.chainDb.Close()
 | 
			
		||||
	s.dappDb.Close()
 | 
			
		||||
	close(s.shutdownChan)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This function will wait for a shutdown and resumes main thread execution
 | 
			
		||||
func (s *Ethereum) WaitForShutdown() {
 | 
			
		||||
	<-s.databasesClosed
 | 
			
		||||
	<-s.shutdownChan
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -717,7 +686,7 @@ func dagFiles(epoch uint64) (string, string) {
 | 
			
		||||
	return dag, "full-R" + dag
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func saveBlockchainVersion(db common.Database, bcVersion int) {
 | 
			
		||||
func saveBlockchainVersion(db ethdb.Database, bcVersion int) {
 | 
			
		||||
	d, _ := db.Get([]byte("BlockchainVersion"))
 | 
			
		||||
	blockchainVersion := common.NewValue(d).Uint()
 | 
			
		||||
 | 
			
		||||
@@ -728,7 +697,7 @@ func saveBlockchainVersion(db common.Database, bcVersion int) {
 | 
			
		||||
 | 
			
		||||
// upgradeChainDatabase ensures that the chain database stores block split into
 | 
			
		||||
// separate header and body entries.
 | 
			
		||||
func upgradeChainDatabase(db common.Database) error {
 | 
			
		||||
func upgradeChainDatabase(db ethdb.Database) error {
 | 
			
		||||
	// Short circuit if the head block is stored already as separate header and body
 | 
			
		||||
	data, err := db.Get([]byte("LastBlock"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ import (
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/eth/downloader"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/eth/fetcher"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/ethdb"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/event"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
			
		||||
@@ -61,7 +62,7 @@ func (ep extProt) GetBlock(hashes []common.Hash) error { return ep.getBlocks(has
 | 
			
		||||
type ProtocolManager struct {
 | 
			
		||||
	txpool   txPool
 | 
			
		||||
	chainman *core.ChainManager
 | 
			
		||||
	chaindb  common.Database
 | 
			
		||||
	chaindb  ethdb.Database
 | 
			
		||||
 | 
			
		||||
	downloader *downloader.Downloader
 | 
			
		||||
	fetcher    *fetcher.Fetcher
 | 
			
		||||
@@ -86,7 +87,7 @@ type ProtocolManager struct {
 | 
			
		||||
 | 
			
		||||
// NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable
 | 
			
		||||
// with the ethereum network.
 | 
			
		||||
func NewProtocolManager(networkId int, mux *event.TypeMux, txpool txPool, pow pow.PoW, chainman *core.ChainManager, chaindb common.Database) *ProtocolManager {
 | 
			
		||||
func NewProtocolManager(networkId int, mux *event.TypeMux, txpool txPool, pow pow.PoW, chainman *core.ChainManager, chaindb ethdb.Database) *ProtocolManager {
 | 
			
		||||
	// Create the protocol manager with the base fields
 | 
			
		||||
	manager := &ProtocolManager{
 | 
			
		||||
		eventMux:  mux,
 | 
			
		||||
 
 | 
			
		||||
@@ -61,9 +61,7 @@ type LDBDatabase struct {
 | 
			
		||||
	quitChan chan chan error // Quit channel to stop the metrics collection before closing the database
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewLDBDatabase returns a LevelDB wrapped object. LDBDatabase does not persist data by
 | 
			
		||||
// it self but requires a background poller which syncs every X. `Flush` should be called
 | 
			
		||||
// when data needs to be stored and written to disk.
 | 
			
		||||
// NewLDBDatabase returns a LevelDB wrapped object.
 | 
			
		||||
func NewLDBDatabase(file string, cache int) (*LDBDatabase, error) {
 | 
			
		||||
	// Calculate the cache allowance for this particular database
 | 
			
		||||
	cache = int(float64(cache) * cacheRatio[filepath.Base(file)])
 | 
			
		||||
@@ -142,11 +140,6 @@ func (self *LDBDatabase) NewIterator() iterator.Iterator {
 | 
			
		||||
	return self.db.NewIterator(nil, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Flush flushes out the queue to leveldb
 | 
			
		||||
func (self *LDBDatabase) Flush() error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (self *LDBDatabase) Close() {
 | 
			
		||||
	// Stop the metrics collection to avoid internal database races
 | 
			
		||||
	self.quitLock.Lock()
 | 
			
		||||
@@ -159,12 +152,14 @@ func (self *LDBDatabase) Close() {
 | 
			
		||||
			glog.V(logger.Error).Infof("metrics failure in '%s': %v\n", self.fn, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// Flush and close the database
 | 
			
		||||
	if err := self.Flush(); err != nil {
 | 
			
		||||
		glog.V(logger.Error).Infof("flushing '%s' failed: %v\n", self.fn, err)
 | 
			
		||||
	err := self.db.Close()
 | 
			
		||||
	if glog.V(logger.Error) {
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			glog.Infoln("closed db:", self.fn)
 | 
			
		||||
		} else {
 | 
			
		||||
			glog.Errorf("error closing db %s: %v", self.fn, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	self.db.Close()
 | 
			
		||||
	glog.V(logger.Error).Infoln("flushed and closed db:", self.fn)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (self *LDBDatabase) LDB() *leveldb.DB {
 | 
			
		||||
@@ -268,3 +263,23 @@ func (self *LDBDatabase) meter(refresh time.Duration) {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO: remove this stuff and expose leveldb directly
 | 
			
		||||
 | 
			
		||||
func (db *LDBDatabase) NewBatch() Batch {
 | 
			
		||||
	return &ldbBatch{db: db.db, b: new(leveldb.Batch)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ldbBatch struct {
 | 
			
		||||
	db *leveldb.DB
 | 
			
		||||
	b  *leveldb.Batch
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (b *ldbBatch) Put(key, value []byte) error {
 | 
			
		||||
	b.b.Put(key, value)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (b *ldbBatch) Write() error {
 | 
			
		||||
	return b.db.Write(b.b, nil)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,13 +14,17 @@
 | 
			
		||||
// You should have received a copy of the GNU Lesser General Public License
 | 
			
		||||
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
package common
 | 
			
		||||
package ethdb
 | 
			
		||||
 | 
			
		||||
// Database interface
 | 
			
		||||
type Database interface {
 | 
			
		||||
	Put(key []byte, value []byte) error
 | 
			
		||||
	Get(key []byte) ([]byte, error)
 | 
			
		||||
	Delete(key []byte) error
 | 
			
		||||
	Close()
 | 
			
		||||
	Flush() error
 | 
			
		||||
	NewBatch() Batch
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Batch interface {
 | 
			
		||||
	Put(key, value []byte) error
 | 
			
		||||
	Write() error
 | 
			
		||||
}
 | 
			
		||||
@@ -36,8 +36,7 @@ func NewMemDatabase() (*MemDatabase, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (db *MemDatabase) Put(key []byte, value []byte) error {
 | 
			
		||||
	db.db[string(key)] = value
 | 
			
		||||
 | 
			
		||||
	db.db[string(key)] = common.CopyBytes(value)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -92,6 +91,25 @@ func (db *MemDatabase) LastKnownTD() []byte {
 | 
			
		||||
	return data
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (db *MemDatabase) Flush() error {
 | 
			
		||||
func (db *MemDatabase) NewBatch() Batch {
 | 
			
		||||
	return &memBatch{db: db}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type kv struct{ k, v []byte }
 | 
			
		||||
 | 
			
		||||
type memBatch struct {
 | 
			
		||||
	db     *MemDatabase
 | 
			
		||||
	writes []kv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *memBatch) Put(key, value []byte) error {
 | 
			
		||||
	w.writes = append(w.writes, kv{key, common.CopyBytes(value)})
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *memBatch) Write() error {
 | 
			
		||||
	for _, kv := range w.writes {
 | 
			
		||||
		w.db.db[string(kv.k)] = kv.v
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -19,11 +19,12 @@ package miner
 | 
			
		||||
import (
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/pow"
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type CpuAgent struct {
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ import (
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/state"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/ethdb"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/event"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
			
		||||
@@ -100,7 +101,7 @@ type worker struct {
 | 
			
		||||
	eth     core.Backend
 | 
			
		||||
	chain   *core.ChainManager
 | 
			
		||||
	proc    *core.BlockProcessor
 | 
			
		||||
	chainDb common.Database
 | 
			
		||||
	chainDb ethdb.Database
 | 
			
		||||
 | 
			
		||||
	coinbase common.Address
 | 
			
		||||
	gasPrice *big.Int
 | 
			
		||||
 
 | 
			
		||||
@@ -197,7 +197,7 @@ func (test *BlockTest) makeEthConfig() *eth.Config {
 | 
			
		||||
		Verbosity:      5,
 | 
			
		||||
		Etherbase:      common.Address{},
 | 
			
		||||
		AccountManager: accounts.NewManager(ks),
 | 
			
		||||
		NewDB:          func(path string) (common.Database, error) { return ethdb.NewMemDatabase() },
 | 
			
		||||
		NewDB:          func(path string) (ethdb.Database, error) { return ethdb.NewMemDatabase() },
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ import (
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/vm"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/crypto"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/ethdb"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func checkLogs(tlog []Log, logs state.Logs) error {
 | 
			
		||||
@@ -87,7 +88,7 @@ func (self Log) Topics() [][]byte {
 | 
			
		||||
	return t
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StateObjectFromAccount(db common.Database, addr string, account Account) *state.StateObject {
 | 
			
		||||
func StateObjectFromAccount(db ethdb.Database, addr string, account Account) *state.StateObject {
 | 
			
		||||
	obj := state.NewStateObject(common.HexToAddress(addr), db)
 | 
			
		||||
	obj.SetBalance(common.Big(account.Balance))
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user