diff options
author | Péter Szilágyi <peterke@gmail.com> | 2018-01-03 22:53:06 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-03 22:53:06 +0800 |
commit | 762f3a48a00da02fe58063cb6ce8dc2d08821f15 (patch) | |
tree | 783421f8ece4306f69cb17e515ee07c1ab4fe0eb /internal | |
parent | b47285f1cf0cb475f29322ceb9fac4d7e1cfb11f (diff) | |
parent | 6f69cdd109b1dd692b8dfb15e7c53d2051fbc946 (diff) | |
download | dexon-762f3a48a00da02fe58063cb6ce8dc2d08821f15.tar dexon-762f3a48a00da02fe58063cb6ce8dc2d08821f15.tar.gz dexon-762f3a48a00da02fe58063cb6ce8dc2d08821f15.tar.bz2 dexon-762f3a48a00da02fe58063cb6ce8dc2d08821f15.tar.lz dexon-762f3a48a00da02fe58063cb6ce8dc2d08821f15.tar.xz dexon-762f3a48a00da02fe58063cb6ce8dc2d08821f15.tar.zst dexon-762f3a48a00da02fe58063cb6ce8dc2d08821f15.zip |
Merge pull request #15466 from karalabe/uint64-gas-limit
all: switch gas limits from big.Int to uint64
Diffstat (limited to 'internal')
-rw-r--r-- | internal/ethapi/api.go | 63 | ||||
-rw-r--r-- | internal/ethapi/backend.go | 3 |
2 files changed, 34 insertions, 32 deletions
diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index d07b2e693..55bd5aa1b 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -45,7 +45,6 @@ import ( ) const ( - defaultGas = 90000 defaultGasPrice = 50 * params.Shannon ) @@ -575,18 +574,18 @@ func (s *PublicBlockChainAPI) GetStorageAt(ctx context.Context, address common.A type CallArgs struct { From common.Address `json:"from"` To *common.Address `json:"to"` - Gas hexutil.Big `json:"gas"` + Gas hexutil.Uint64 `json:"gas"` GasPrice hexutil.Big `json:"gasPrice"` Value hexutil.Big `json:"value"` Data hexutil.Bytes `json:"data"` } -func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber, vmCfg vm.Config) ([]byte, *big.Int, bool, error) { +func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber, vmCfg vm.Config) ([]byte, uint64, bool, error) { defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now()) state, header, err := s.b.StateAndHeaderByNumber(ctx, blockNr) if state == nil || err != nil { - return nil, common.Big0, false, err + return nil, 0, false, err } // Set sender address or use a default if none specified addr := args.From @@ -598,9 +597,9 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr } } // Set default gas & gas price if none were set - gas, gasPrice := args.Gas.ToInt(), args.GasPrice.ToInt() - if gas.Sign() == 0 { - gas = big.NewInt(50000000) + gas, gasPrice := uint64(args.Gas), args.GasPrice.ToInt() + if gas == 0 { + gas = 50000000 } if gasPrice.Sign() == 0 { gasPrice = new(big.Int).SetUint64(defaultGasPrice) @@ -624,7 +623,7 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr // Get a new instance of the EVM. evm, vmError, err := s.b.GetEVM(ctx, msg, state, header, vmCfg) if err != nil { - return nil, common.Big0, false, err + return nil, 0, false, err } // Wait for the context to be done and cancel the evm. Even if the // EVM has finished, cancelling may be done (repeatedly) @@ -635,10 +634,10 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr // Setup the gas pool (also for unmetered requests) // and apply the message. - gp := new(core.GasPool).AddGas(math.MaxBig256) + gp := new(core.GasPool).AddGas(math.MaxUint64) res, gas, failed, err := core.ApplyMessage(evm, msg, gp) if err := vmError(); err != nil { - return nil, common.Big0, false, err + return nil, 0, false, err } return res, gas, failed, err } @@ -652,28 +651,29 @@ func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNr r // EstimateGas returns an estimate of the amount of gas needed to execute the // given transaction against the current pending block. -func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (*hexutil.Big, error) { - // Determine the lowest and highest possible gas limits to binary search in between +func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (hexutil.Uint64, error) { + // Binary search the gas requirement, as it may be higher than the amount used var ( lo uint64 = params.TxGas - 1 hi uint64 cap uint64 ) - if (*big.Int)(&args.Gas).Uint64() >= params.TxGas { - hi = (*big.Int)(&args.Gas).Uint64() + if uint64(args.Gas) >= params.TxGas { + hi = uint64(args.Gas) } else { // Retrieve the current pending block to act as the gas ceiling block, err := s.b.BlockByNumber(ctx, rpc.PendingBlockNumber) if err != nil { - return nil, err + return 0, err } - hi = block.GasLimit().Uint64() + hi = block.GasLimit() } cap = hi // Create a helper to check if a gas allowance results in an executable transaction executable := func(gas uint64) bool { - (*big.Int)(&args.Gas).SetUint64(gas) + args.Gas = hexutil.Uint64(gas) + _, _, failed, err := s.doCall(ctx, args, rpc.PendingBlockNumber, vm.Config{}) if err != nil || failed { return false @@ -692,17 +692,17 @@ func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (* // Reject the transaction as invalid if it still fails at the highest allowance if hi == cap { if !executable(hi) { - return nil, fmt.Errorf("gas required exceeds allowance or always failing transaction") + return 0, fmt.Errorf("gas required exceeds allowance or always failing transaction") } } - return (*hexutil.Big)(new(big.Int).SetUint64(hi)), nil + return hexutil.Uint64(hi), nil } // ExecutionResult groups all structured logs emitted by the EVM // while replaying a transaction in debug mode as well as transaction // execution status, the amount of gas used and the return value type ExecutionResult struct { - Gas *big.Int `json:"gas"` + Gas uint64 `json:"gas"` Failed bool `json:"failed"` ReturnValue string `json:"returnValue"` StructLogs []StructLogRes `json:"structLogs"` @@ -778,8 +778,8 @@ func (s *PublicBlockChainAPI) rpcOutputBlock(b *types.Block, inclTx bool, fullTx "totalDifficulty": (*hexutil.Big)(s.b.GetTd(b.Hash())), "extraData": hexutil.Bytes(head.Extra), "size": hexutil.Uint64(uint64(b.Size().Int64())), - "gasLimit": (*hexutil.Big)(head.GasLimit), - "gasUsed": (*hexutil.Big)(head.GasUsed), + "gasLimit": hexutil.Uint64(head.GasLimit), + "gasUsed": hexutil.Uint64(head.GasUsed), "timestamp": (*hexutil.Big)(head.Time), "transactionsRoot": head.TxHash, "receiptsRoot": head.ReceiptHash, @@ -822,7 +822,7 @@ type RPCTransaction struct { BlockHash common.Hash `json:"blockHash"` BlockNumber *hexutil.Big `json:"blockNumber"` From common.Address `json:"from"` - Gas *hexutil.Big `json:"gas"` + Gas hexutil.Uint64 `json:"gas"` GasPrice *hexutil.Big `json:"gasPrice"` Hash common.Hash `json:"hash"` Input hexutil.Bytes `json:"input"` @@ -847,7 +847,7 @@ func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber result := &RPCTransaction{ From: from, - Gas: (*hexutil.Big)(tx.Gas()), + Gas: hexutil.Uint64(tx.Gas()), GasPrice: (*hexutil.Big)(tx.GasPrice()), Hash: tx.Hash(), Input: hexutil.Bytes(tx.Data()), @@ -1024,8 +1024,8 @@ func (s *PublicTransactionPoolAPI) GetTransactionReceipt(hash common.Hash) (map[ "transactionIndex": hexutil.Uint64(index), "from": from, "to": tx.To(), - "gasUsed": (*hexutil.Big)(receipt.GasUsed), - "cumulativeGasUsed": (*hexutil.Big)(receipt.CumulativeGasUsed), + "gasUsed": hexutil.Uint64(receipt.GasUsed), + "cumulativeGasUsed": hexutil.Uint64(receipt.CumulativeGasUsed), "contractAddress": nil, "logs": receipt.Logs, "logsBloom": receipt.Bloom, @@ -1068,7 +1068,7 @@ func (s *PublicTransactionPoolAPI) sign(addr common.Address, tx *types.Transacti type SendTxArgs struct { From common.Address `json:"from"` To *common.Address `json:"to"` - Gas *hexutil.Big `json:"gas"` + Gas *hexutil.Uint64 `json:"gas"` GasPrice *hexutil.Big `json:"gasPrice"` Value *hexutil.Big `json:"value"` Nonce *hexutil.Uint64 `json:"nonce"` @@ -1081,7 +1081,8 @@ type SendTxArgs struct { // setDefaults is a helper function that fills in default values for unspecified tx fields. func (args *SendTxArgs) setDefaults(ctx context.Context, b Backend) error { if args.Gas == nil { - args.Gas = (*hexutil.Big)(big.NewInt(defaultGas)) + args.Gas = new(hexutil.Uint64) + *(*uint64)(args.Gas) = 90000 } if args.GasPrice == nil { price, err := b.SuggestPrice(ctx) @@ -1114,9 +1115,9 @@ func (args *SendTxArgs) toTransaction() *types.Transaction { input = *args.Input } if args.To == nil { - return types.NewContractCreation(uint64(*args.Nonce), (*big.Int)(args.Value), (*big.Int)(args.Gas), (*big.Int)(args.GasPrice), input) + return types.NewContractCreation(uint64(*args.Nonce), (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input) } - return types.NewTransaction(uint64(*args.Nonce), *args.To, (*big.Int)(args.Value), (*big.Int)(args.Gas), (*big.Int)(args.GasPrice), input) + return types.NewTransaction(uint64(*args.Nonce), *args.To, (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input) } // submitTransaction is a helper function that submits tx to txPool and logs a message. @@ -1264,7 +1265,7 @@ func (s *PublicTransactionPoolAPI) PendingTransactions() ([]*RPCTransaction, err // Resend accepts an existing transaction and a new gas price and limit. It will remove // the given transaction from the pool and reinsert it with the new gas price and limit. -func (s *PublicTransactionPoolAPI) Resend(ctx context.Context, sendArgs SendTxArgs, gasPrice, gasLimit *hexutil.Big) (common.Hash, error) { +func (s *PublicTransactionPoolAPI) Resend(ctx context.Context, sendArgs SendTxArgs, gasPrice *hexutil.Big, gasLimit *hexutil.Uint64) (common.Hash, error) { if sendArgs.Nonce == nil { return common.Hash{}, fmt.Errorf("missing transaction nonce in transaction spec") } diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index 368fa4872..af95d7906 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -37,13 +37,14 @@ import ( // Backend interface provides the common API services (that are provided by // both full and light clients) with access to necessary functions. type Backend interface { - // general Ethereum API + // General Ethereum API Downloader() *downloader.Downloader ProtocolVersion() int SuggestPrice(ctx context.Context) (*big.Int, error) ChainDb() ethdb.Database EventMux() *event.TypeMux AccountManager() *accounts.Manager + // BlockChain API SetHead(number uint64) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) |