| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2016-11-09 02:01:56 +01:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2016-11-09 02:01:56 +01:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2016-11-09 02:01:56 +01:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2016-11-09 02:01:56 +01:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2016-11-09 02:01:56 +01:00
										 |  |  | // 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/>. | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | package eth | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2017-03-22 18:20:33 +01:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2019-05-02 14:50:23 +02:00
										 |  |  | 	"errors" | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	"math/big" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/accounts" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/core" | 
					
						
							| 
									
										
										
										
											2017-08-29 14:13:11 +03:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core/bloombits" | 
					
						
							| 
									
										
										
										
											2019-05-13 13:41:10 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core/rawdb" | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core/state" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/core/types" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/core/vm" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/eth/downloader" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/eth/gasprice" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/ethdb" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/event" | 
					
						
							| 
									
										
										
										
											2016-11-02 13:44:13 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/params" | 
					
						
							| 
									
										
										
										
											2017-01-05 14:03:50 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/rpc" | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | // EthAPIBackend implements ethapi.Backend for full nodes | 
					
						
							|  |  |  | type EthAPIBackend struct { | 
					
						
							| 
									
										
										
										
											2019-04-04 19:03:10 +08:00
										 |  |  | 	extRPCEnabled bool | 
					
						
							|  |  |  | 	eth           *Ethereum | 
					
						
							|  |  |  | 	gpo           *gasprice.Oracle | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 03:14:52 -07:00
										 |  |  | // ChainConfig returns the active chain configuration. | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) ChainConfig() *params.ChainConfig { | 
					
						
							| 
									
										
										
										
											2019-03-27 13:23:08 +02:00
										 |  |  | 	return b.eth.blockchain.Config() | 
					
						
							| 
									
										
										
										
											2016-11-02 13:44:13 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) CurrentBlock() *types.Block { | 
					
						
							| 
									
										
										
										
											2016-11-02 13:44:13 +01:00
										 |  |  | 	return b.eth.blockchain.CurrentBlock() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) SetHead(number uint64) { | 
					
						
							| 
									
										
										
										
											2017-03-22 02:37:24 +02:00
										 |  |  | 	b.eth.protocolManager.downloader.Cancel() | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	b.eth.blockchain.SetHead(number) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-23 21:52:24 +08:00
										 |  |  | func (b *EthAPIBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	// Pending block is only known by the miner | 
					
						
							| 
									
										
										
										
											2019-07-23 21:52:24 +08:00
										 |  |  | 	if number == rpc.PendingBlockNumber { | 
					
						
							| 
									
										
										
										
											2016-11-30 10:48:48 +01:00
										 |  |  | 		block := b.eth.miner.PendingBlock() | 
					
						
							| 
									
										
										
										
											2016-10-14 05:51:29 +02:00
										 |  |  | 		return block.Header(), nil | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	// Otherwise resolve and return the block | 
					
						
							| 
									
										
										
										
											2019-07-23 21:52:24 +08:00
										 |  |  | 	if number == rpc.LatestBlockNumber { | 
					
						
							| 
									
										
										
										
											2016-10-14 05:51:29 +02:00
										 |  |  | 		return b.eth.blockchain.CurrentBlock().Header(), nil | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-07-23 21:52:24 +08:00
										 |  |  | 	return b.eth.blockchain.GetHeaderByNumber(uint64(number)), nil | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-26 01:47:31 -07:00
										 |  |  | func (b *EthAPIBackend) HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Header, error) { | 
					
						
							|  |  |  | 	if blockNr, ok := blockNrOrHash.Number(); ok { | 
					
						
							|  |  |  | 		return b.HeaderByNumber(ctx, blockNr) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if hash, ok := blockNrOrHash.Hash(); ok { | 
					
						
							|  |  |  | 		header := b.eth.blockchain.GetHeaderByHash(hash) | 
					
						
							|  |  |  | 		if header == nil { | 
					
						
							|  |  |  | 			return nil, errors.New("header for hash not found") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if blockNrOrHash.RequireCanonical && b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { | 
					
						
							|  |  |  | 			return nil, errors.New("hash is not currently canonical") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return header, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil, errors.New("invalid arguments; neither block nor hash specified") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-12 17:36:07 +03:00
										 |  |  | func (b *EthAPIBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { | 
					
						
							|  |  |  | 	return b.eth.blockchain.GetHeaderByHash(hash), nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-23 21:52:24 +08:00
										 |  |  | func (b *EthAPIBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	// Pending block is only known by the miner | 
					
						
							| 
									
										
										
										
											2019-07-23 21:52:24 +08:00
										 |  |  | 	if number == rpc.PendingBlockNumber { | 
					
						
							| 
									
										
										
										
											2016-11-30 10:48:48 +01:00
										 |  |  | 		block := b.eth.miner.PendingBlock() | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 		return block, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Otherwise resolve and return the block | 
					
						
							| 
									
										
										
										
											2019-07-23 21:52:24 +08:00
										 |  |  | 	if number == rpc.LatestBlockNumber { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 		return b.eth.blockchain.CurrentBlock(), nil | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-07-23 21:52:24 +08:00
										 |  |  | 	return b.eth.blockchain.GetBlockByNumber(uint64(number)), nil | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 14:29:53 +08:00
										 |  |  | func (b *EthAPIBackend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { | 
					
						
							|  |  |  | 	return b.eth.blockchain.GetBlockByHash(hash), nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-26 01:47:31 -07:00
										 |  |  | func (b *EthAPIBackend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Block, error) { | 
					
						
							|  |  |  | 	if blockNr, ok := blockNrOrHash.Number(); ok { | 
					
						
							|  |  |  | 		return b.BlockByNumber(ctx, blockNr) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if hash, ok := blockNrOrHash.Hash(); ok { | 
					
						
							|  |  |  | 		header := b.eth.blockchain.GetHeaderByHash(hash) | 
					
						
							|  |  |  | 		if header == nil { | 
					
						
							|  |  |  | 			return nil, errors.New("header for hash not found") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if blockNrOrHash.RequireCanonical && b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { | 
					
						
							|  |  |  | 			return nil, errors.New("hash is not currently canonical") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		block := b.eth.blockchain.GetBlock(hash, header.Number.Uint64()) | 
					
						
							|  |  |  | 		if block == nil { | 
					
						
							|  |  |  | 			return nil, errors.New("header found, but block body is missing") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return block, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil, errors.New("invalid arguments; neither block nor hash specified") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-23 21:52:24 +08:00
										 |  |  | func (b *EthAPIBackend) StateAndHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*state.StateDB, *types.Header, error) { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	// Pending state is only known by the miner | 
					
						
							| 
									
										
										
										
											2019-07-23 21:52:24 +08:00
										 |  |  | 	if number == rpc.PendingBlockNumber { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 		block, state := b.eth.miner.Pending() | 
					
						
							| 
									
										
										
										
											2017-06-27 15:57:06 +02:00
										 |  |  | 		return state, block.Header(), nil | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	// Otherwise resolve the block number and return its state | 
					
						
							| 
									
										
										
										
											2019-07-23 21:52:24 +08:00
										 |  |  | 	header, err := b.HeaderByNumber(ctx, number) | 
					
						
							| 
									
										
										
										
											2019-05-02 14:50:23 +02:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-10-14 05:51:29 +02:00
										 |  |  | 		return nil, nil, err | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-05-02 14:50:23 +02:00
										 |  |  | 	if header == nil { | 
					
						
							|  |  |  | 		return nil, nil, errors.New("header not found") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-09-27 13:13:13 +03:00
										 |  |  | 	stateDb, err := b.eth.BlockChain().StateAt(header.Root) | 
					
						
							| 
									
										
										
										
											2017-06-27 15:57:06 +02:00
										 |  |  | 	return stateDb, header, err | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-26 01:47:31 -07:00
										 |  |  | func (b *EthAPIBackend) StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*state.StateDB, *types.Header, error) { | 
					
						
							|  |  |  | 	if blockNr, ok := blockNrOrHash.Number(); ok { | 
					
						
							|  |  |  | 		return b.StateAndHeaderByNumber(ctx, blockNr) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if hash, ok := blockNrOrHash.Hash(); ok { | 
					
						
							|  |  |  | 		header, err := b.HeaderByHash(ctx, hash) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return nil, nil, err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if header == nil { | 
					
						
							|  |  |  | 			return nil, nil, errors.New("header for hash not found") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if blockNrOrHash.RequireCanonical && b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { | 
					
						
							|  |  |  | 			return nil, nil, errors.New("hash is not currently canonical") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		stateDb, err := b.eth.BlockChain().StateAt(header.Root) | 
					
						
							|  |  |  | 		return stateDb, header, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil, nil, errors.New("invalid arguments; neither block nor hash specified") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) { | 
					
						
							| 
									
										
										
										
											2018-09-29 13:53:31 -07:00
										 |  |  | 	return b.eth.blockchain.GetReceiptsByHash(hash), nil | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) GetLogs(ctx context.Context, hash common.Hash) ([][]*types.Log, error) { | 
					
						
							| 
									
										
										
										
											2018-09-29 13:53:31 -07:00
										 |  |  | 	receipts := b.eth.blockchain.GetReceiptsByHash(hash) | 
					
						
							| 
									
										
										
										
											2018-02-22 12:48:14 +02:00
										 |  |  | 	if receipts == nil { | 
					
						
							|  |  |  | 		return nil, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	logs := make([][]*types.Log, len(receipts)) | 
					
						
							|  |  |  | 	for i, receipt := range receipts { | 
					
						
							|  |  |  | 		logs[i] = receipt.Logs | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return logs, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) GetTd(blockHash common.Hash) *big.Int { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	return b.eth.blockchain.GetTdByHash(blockHash) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												core, internal, eth, miner, les: Take VM config from BlockChain (#17955)
Until this commit, when sending an RPC request that called `NewEVM`, a blank `vm.Config`
would be taken so as to set some options, based on the default configuration. If some extra
configuration switches were passed to the blockchain, those would be ignored.
This PR adds a function to get the config from the blockchain, and this is what is now used
for RPC calls.
Some subsequent changes need to be made, see https://github.com/ethereum/go-ethereum/pull/17955#pullrequestreview-182237244
for the details of the discussion.
											
										 
											2018-12-06 14:34:49 +01:00
										 |  |  | func (b *EthAPIBackend) GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header) (*vm.EVM, func() error, error) { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	vmError := func() error { return nil } | 
					
						
							| 
									
										
										
										
											2016-12-06 02:16:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 16:38:31 +03:00
										 |  |  | 	context := core.NewEVMContext(msg, header, b.eth.BlockChain(), nil) | 
					
						
							| 
									
										
										
										
											2019-03-27 13:23:08 +02:00
										 |  |  | 	return vm.NewEVM(context, state, b.eth.blockchain.Config(), *b.eth.blockchain.GetVMConfig()), vmError, nil | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { | 
					
						
							| 
									
										
										
										
											2017-08-18 18:58:36 +08:00
										 |  |  | 	return b.eth.BlockChain().SubscribeRemovedLogsEvent(ch) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-10 12:39:14 +01:00
										 |  |  | func (b *EthAPIBackend) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription { | 
					
						
							|  |  |  | 	return b.eth.miner.SubscribePendingLogs(ch) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription { | 
					
						
							| 
									
										
										
										
											2017-08-18 18:58:36 +08:00
										 |  |  | 	return b.eth.BlockChain().SubscribeChainEvent(ch) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription { | 
					
						
							| 
									
										
										
										
											2017-08-18 18:58:36 +08:00
										 |  |  | 	return b.eth.BlockChain().SubscribeChainHeadEvent(ch) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription { | 
					
						
							| 
									
										
										
										
											2017-08-18 18:58:36 +08:00
										 |  |  | 	return b.eth.BlockChain().SubscribeChainSideEvent(ch) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { | 
					
						
							| 
									
										
										
										
											2017-08-18 18:58:36 +08:00
										 |  |  | 	return b.eth.BlockChain().SubscribeLogsEvent(ch) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) SendTx(ctx context.Context, signedTx *types.Transaction) error { | 
					
						
							| 
									
										
										
										
											2017-07-05 16:51:55 +03:00
										 |  |  | 	return b.eth.txPool.AddLocal(signedTx) | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) GetPoolTransactions() (types.Transactions, error) { | 
					
						
							| 
									
										
										
										
											2016-12-10 23:54:58 +01:00
										 |  |  | 	pending, err := b.eth.txPool.Pending() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-01 18:59:55 +03:00
										 |  |  | 	var txs types.Transactions | 
					
						
							| 
									
										
										
										
											2016-12-10 23:54:58 +01:00
										 |  |  | 	for _, batch := range pending { | 
					
						
							| 
									
										
										
										
											2016-07-01 18:59:55 +03:00
										 |  |  | 		txs = append(txs, batch...) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-12-10 23:54:58 +01:00
										 |  |  | 	return txs, nil | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) GetPoolTransaction(hash common.Hash) *types.Transaction { | 
					
						
							| 
									
										
										
										
											2016-07-01 18:59:55 +03:00
										 |  |  | 	return b.eth.txPool.Get(hash) | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-13 13:41:10 +02:00
										 |  |  | func (b *EthAPIBackend) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { | 
					
						
							|  |  |  | 	tx, blockHash, blockNumber, index := rawdb.ReadTransaction(b.eth.ChainDb(), txHash) | 
					
						
							|  |  |  | 	return tx, blockHash, blockNumber, index, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) { | 
					
						
							| 
									
										
										
										
											2019-07-09 10:34:35 +03:00
										 |  |  | 	return b.eth.txPool.Nonce(addr), nil | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) Stats() (pending int, queued int) { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	return b.eth.txPool.Stats() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) TxPoolContent() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	return b.eth.TxPool().Content() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-18 11:45:52 +03:00
										 |  |  | func (b *EthAPIBackend) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription { | 
					
						
							|  |  |  | 	return b.eth.TxPool().SubscribeNewTxsEvent(ch) | 
					
						
							| 
									
										
										
										
											2017-08-18 18:58:36 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) Downloader() *downloader.Downloader { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	return b.eth.Downloader() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) ProtocolVersion() int { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	return b.eth.EthVersion() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) SuggestPrice(ctx context.Context) (*big.Int, error) { | 
					
						
							| 
									
										
										
										
											2017-04-06 16:20:42 +02:00
										 |  |  | 	return b.gpo.SuggestPrice(ctx) | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) ChainDb() ethdb.Database { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	return b.eth.ChainDb() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) EventMux() *event.TypeMux { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	return b.eth.EventMux() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) AccountManager() *accounts.Manager { | 
					
						
							| 
									
										
										
										
											2015-12-16 04:26:23 +01:00
										 |  |  | 	return b.eth.AccountManager() | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-08-18 21:52:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-04 19:03:10 +08:00
										 |  |  | func (b *EthAPIBackend) ExtRPCEnabled() bool { | 
					
						
							|  |  |  | 	return b.extRPCEnabled | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 13:49:52 +02:00
										 |  |  | func (b *EthAPIBackend) RPCGasCap() *big.Int { | 
					
						
							|  |  |  | 	return b.eth.config.RPCGasCap | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) BloomStatus() (uint64, uint64) { | 
					
						
							| 
									
										
										
										
											2017-08-29 14:13:11 +03:00
										 |  |  | 	sections, _, _ := b.eth.bloomIndexer.Sections() | 
					
						
							|  |  |  | 	return params.BloomBitsBlocks, sections | 
					
						
							| 
									
										
										
										
											2017-08-18 21:52:20 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-09 00:59:00 -07:00
										 |  |  | func (b *EthAPIBackend) ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) { | 
					
						
							| 
									
										
										
										
											2017-08-29 14:13:11 +03:00
										 |  |  | 	for i := 0; i < bloomFilterThreads; i++ { | 
					
						
							|  |  |  | 		go session.Multiplex(bloomRetrievalBatch, bloomRetrievalWait, b.eth.bloomRequests) | 
					
						
							| 
									
										
										
										
											2017-08-18 21:52:20 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |