diff options
-rw-r--r-- | core/block_processor.go | 20 | ||||
-rw-r--r-- | core/block_processor_test.go | 2 | ||||
-rw-r--r-- | core/chain_makers.go | 2 | ||||
-rw-r--r-- | core/chain_manager_test.go | 4 | ||||
-rw-r--r-- | eth/backend.go | 16 | ||||
-rw-r--r-- | rpc/api.go | 18 | ||||
-rw-r--r-- | rpc/args.go | 6 | ||||
-rw-r--r-- | xeth/xeth.go | 13 |
8 files changed, 58 insertions, 23 deletions
diff --git a/core/block_processor.go b/core/block_processor.go index 7ac8a1bd2..395622a8e 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -12,6 +12,7 @@ import ( "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/pow" + "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/state" "gopkg.in/fatih/set.v0" ) @@ -23,7 +24,8 @@ type PendingBlockEvent struct { var statelogger = logger.NewLogger("BLOCK") type BlockProcessor struct { - db ethutil.Database + db ethutil.Database + extraDb ethutil.Database // Mutex for locking the block processor. Blocks can only be handled one at a time mutex sync.Mutex // Canonical block chain @@ -45,9 +47,10 @@ type BlockProcessor struct { eventMux *event.TypeMux } -func NewBlockProcessor(db ethutil.Database, pow pow.PoW, txpool *TxPool, chainManager *ChainManager, eventMux *event.TypeMux) *BlockProcessor { +func NewBlockProcessor(db, extra ethutil.Database, pow pow.PoW, txpool *TxPool, chainManager *ChainManager, eventMux *event.TypeMux) *BlockProcessor { sm := &BlockProcessor{ db: db, + extraDb: extra, mem: make(map[string]*big.Int), Pow: pow, bc: chainManager, @@ -230,6 +233,10 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (td *big // Remove transactions from the pool sm.txpool.RemoveSet(block.Transactions()) + for _, tx := range block.Transactions() { + putTx(sm.extraDb, tx) + } + chainlogger.Infof("processed block #%d (%x...)\n", header.Number, block.Hash()[0:4]) return td, nil @@ -347,3 +354,12 @@ func (sm *BlockProcessor) GetLogs(block *types.Block) (logs state.Logs, err erro return state.Logs(), nil } + +func putTx(db ethutil.Database, tx *types.Transaction) { + rlpEnc, err := rlp.EncodeToBytes(tx) + if err != nil { + statelogger.Infoln("Failed encoding tx", err) + return + } + db.Put(tx.Hash(), rlpEnc) +} diff --git a/core/block_processor_test.go b/core/block_processor_test.go index a031c2669..ad29404e1 100644 --- a/core/block_processor_test.go +++ b/core/block_processor_test.go @@ -14,7 +14,7 @@ func proc() (*BlockProcessor, *ChainManager) { var mux event.TypeMux chainMan := NewChainManager(db, db, &mux) - return NewBlockProcessor(db, ezp.New(), nil, chainMan, &mux), chainMan + return NewBlockProcessor(db, db, ezp.New(), nil, chainMan, &mux), chainMan } func TestNumber(t *testing.T) { diff --git a/core/chain_makers.go b/core/chain_makers.go index b5c50dc3d..f140b5c7e 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -120,7 +120,7 @@ func newChainManager(block *types.Block, eventMux *event.TypeMux, db ethutil.Dat // block processor with fake pow func newBlockProcessor(db ethutil.Database, txpool *TxPool, cman *ChainManager, eventMux *event.TypeMux) *BlockProcessor { - bman := NewBlockProcessor(db, FakePow{}, txpool, newChainManager(nil, eventMux, db), eventMux) + bman := NewBlockProcessor(db, db, FakePow{}, txpool, newChainManager(nil, eventMux, db), eventMux) return bman } diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go index 91822f9e2..898d37f9c 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -257,7 +257,7 @@ func TestChainInsertions(t *testing.T) { var eventMux event.TypeMux chainMan := NewChainManager(db, db, &eventMux) txPool := NewTxPool(&eventMux) - blockMan := NewBlockProcessor(db, nil, txPool, chainMan, &eventMux) + blockMan := NewBlockProcessor(db, db, nil, txPool, chainMan, &eventMux) chainMan.SetProcessor(blockMan) const max = 2 @@ -303,7 +303,7 @@ func TestChainMultipleInsertions(t *testing.T) { var eventMux event.TypeMux chainMan := NewChainManager(db, db, &eventMux) txPool := NewTxPool(&eventMux) - blockMan := NewBlockProcessor(db, nil, txPool, chainMan, &eventMux) + blockMan := NewBlockProcessor(db, db, nil, txPool, chainMan, &eventMux) chainMan.SetProcessor(blockMan) done := make(chan bool, max) for i, chain := range chains { diff --git a/eth/backend.go b/eth/backend.go index 9c497a586..6fd211b35 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -107,9 +107,10 @@ type Ethereum struct { // Channel for shutting down the ethereum shutdownChan chan bool - // DB interface - blockDb ethutil.Database - stateDb ethutil.Database + // DB interfaces + blockDb ethutil.Database // Block chain database + stateDb ethutil.Database // State changes database + extraDb ethutil.Database // Extra database (txs, etc) //*** SERVICES *** // State manager for processing new blocks and managing the over all states @@ -144,6 +145,7 @@ func New(config *Config) (*Ethereum, error) { if err != nil { return nil, err } + extraDb, err := ethdb.NewLDBDatabase(path.Join(config.DataDir, "extra")) // Perform database sanity checks d, _ := blockDb.Get([]byte("ProtocolVersion")) @@ -152,14 +154,13 @@ func New(config *Config) (*Ethereum, error) { path := path.Join(config.DataDir, "blockchain") return nil, fmt.Errorf("Database version mismatch. Protocol(%d / %d). `rm -rf %s`", protov, ProtocolVersion, path) } - - saveProtocolVersion(blockDb) - //ethutil.Config.Db = db + saveProtocolVersion(extraDb) eth := &Ethereum{ shutdownChan: make(chan bool), blockDb: blockDb, stateDb: stateDb, + extraDb: extraDb, eventMux: &event.TypeMux{}, logger: servlogger, accountManager: config.AccountManager, @@ -169,7 +170,7 @@ func New(config *Config) (*Ethereum, error) { eth.chainManager = core.NewChainManager(blockDb, stateDb, eth.EventMux()) pow := ethash.New(eth.chainManager) eth.txPool = core.NewTxPool(eth.EventMux()) - eth.blockProcessor = core.NewBlockProcessor(stateDb, pow, eth.txPool, eth.chainManager, eth.EventMux()) + eth.blockProcessor = core.NewBlockProcessor(stateDb, extraDb, pow, eth.txPool, eth.chainManager, eth.EventMux()) eth.chainManager.SetProcessor(eth.blockProcessor) eth.whisper = whisper.New() eth.miner = miner.New(eth, pow, config.MinerThreads) @@ -230,6 +231,7 @@ func (s *Ethereum) Whisper() *whisper.Whisper { return s.whisper } func (s *Ethereum) EventMux() *event.TypeMux { return s.eventMux } func (s *Ethereum) BlockDb() ethutil.Database { return s.blockDb } func (s *Ethereum) StateDb() ethutil.Database { return s.stateDb } +func (s *Ethereum) ExtraDb() ethutil.Database { return s.extraDb } 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() } diff --git a/rpc/api.go b/rpc/api.go index 44b8ee834..b94d2d6dc 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -421,6 +421,14 @@ func (p *EthereumApi) WhisperMessages(id int, reply *interface{}) error { return nil } +func (p *EthereumApi) GetTransactionByHash(hash string, reply *interface{}) error { + tx := p.xeth().EthTransactionByHash(hash) + if tx != nil { + *reply = NewTransactionRes(tx) + } + return nil +} + func (p *EthereumApi) GetBlockByHash(blockhash string, includetx bool) (*BlockRes, error) { block := p.xeth().EthBlockByHash(blockhash) br := NewBlockRes(block) @@ -594,14 +602,18 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error } *reply = v case "eth_getTransactionByHash": - return errNotImplemented + // HashIndexArgs used, but only the "Hash" part we need. + args := new(HashIndexArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + } + return p.GetTransactionByHash(args.Hash, reply) case "eth_getTransactionByBlockHashAndIndex": args := new(HashIndexArgs) if err := json.Unmarshal(req.Params, &args); err != nil { return err } - v, err := p.GetBlockByHash(args.BlockHash, true) + v, err := p.GetBlockByHash(args.Hash, true) if err != nil { return err } @@ -629,7 +641,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } - v, err := p.GetBlockByHash(args.BlockHash, false) + v, err := p.GetBlockByHash(args.Hash, false) if err != nil { return err } diff --git a/rpc/args.go b/rpc/args.go index 40f8575b2..faca03b63 100644 --- a/rpc/args.go +++ b/rpc/args.go @@ -280,8 +280,8 @@ func (args *BlockNumIndexArgs) UnmarshalJSON(b []byte) (err error) { } type HashIndexArgs struct { - BlockHash string - Index int64 + Hash string + Index int64 } func (args *HashIndexArgs) UnmarshalJSON(b []byte) (err error) { @@ -299,7 +299,7 @@ func (args *HashIndexArgs) UnmarshalJSON(b []byte) (err error) { if !ok { return errDecodeArgs } - args.BlockHash = arg0 + args.Hash = arg0 if len(obj) > 1 { arg1, ok := obj[1].(string) diff --git a/xeth/xeth.go b/xeth/xeth.go index 70172a1c8..4c28caf86 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -32,6 +32,7 @@ type Backend interface { Peers() []*p2p.Peer BlockDb() ethutil.Database StateDb() ethutil.Database + ExtraDb() ethutil.Database EventMux() *event.TypeMux Whisper() *whisper.Whisper @@ -127,6 +128,14 @@ func (self *XEth) EthBlockByHash(strHash string) *types.Block { return block } +func (self *XEth) EthTransactionByHash(hash string) *types.Transaction { + data, _ := self.eth.ExtraDb().Get(fromHex(hash)) + if len(data) != 0 { + return types.NewTransactionFromBytes(data) + } + return nil +} + func (self *XEth) BlockByNumber(num int64) *Block { if num == -1 { return NewBlock(self.chainManager.CurrentBlock()) @@ -231,10 +240,6 @@ func (self *XEth) SecretToAddress(key string) string { return toHex(pair.Address()) } -func (self *XEth) Execute(addr, value, gas, price, data string) (string, error) { - return "", nil -} - type KeyVal struct { Key string `json:"key"` Value string `json:"value"` |