forked from cerc-io/laconicd-deprecated
build(deps): bump github.com/ethereum/go-ethereum from 1.10.9 to 1.10.11 (#676)
* build(deps): bump github.com/ethereum/go-ethereum from 1.10.9 to 1.10.10 Bumps [github.com/ethereum/go-ethereum](https://github.com/ethereum/go-ethereum) from 1.10.9 to 1.10.10. - [Release notes](https://github.com/ethereum/go-ethereum/releases) - [Commits](https://github.com/ethereum/go-ethereum/compare/v1.10.9...v1.10.10) --- updated-dependencies: - dependency-name: github.com/ethereum/go-ethereum dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/ethereum/go-ethereum from 1.10.9 to 1.10.10 Bumps [github.com/ethereum/go-ethereum](https://github.com/ethereum/go-ethereum) from 1.10.9 to 1.10.10. - [Release notes](https://github.com/ethereum/go-ethereum/releases) - [Commits](https://github.com/ethereum/go-ethereum/compare/v1.10.9...v1.10.10) --- updated-dependencies: - dependency-name: github.com/ethereum/go-ethereum dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/ethereum/go-ethereum from 1.10.9 to 1.10.10 Bumps [github.com/ethereum/go-ethereum](https://github.com/ethereum/go-ethereum) from 1.10.9 to 1.10.10. - [Release notes](https://github.com/ethereum/go-ethereum/releases) - [Commits](https://github.com/ethereum/go-ethereum/compare/v1.10.9...v1.10.10) --- updated-dependencies: - dependency-name: github.com/ethereum/go-ethereum dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * fix * rpc: RLP apis * tx fee cap fix * fix config * fix test Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Federico Kunze <federico.kunze94@gmail.com>
This commit is contained in:
co-authored by
Federico Kunze
parent
0cab27d529
commit
23a3362475
@@ -7,6 +7,7 @@ import (
|
||||
"fmt"
|
||||
"math/big"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||
@@ -42,8 +43,9 @@ import (
|
||||
// Implemented by EVMBackend.
|
||||
type Backend interface {
|
||||
// General Ethereum API
|
||||
RPCGasCap() uint64 // global gas cap for eth_call over rpc: DoS protection
|
||||
RPCTxFeeCap() float64 // RPCTxFeeCap is the global transaction fee(price * gaslimit) cap for, // send-transction variants. The unit is ether.
|
||||
RPCGasCap() uint64 // global gas cap for eth_call over rpc: DoS protection
|
||||
RPCEVMTimeout() time.Duration // global timeout for eth_call over rpc: DoS protection
|
||||
RPCTxFeeCap() float64 // RPCTxFeeCap is the global transaction fee(price * gaslimit) cap for send-transaction variants. The unit is ether.
|
||||
|
||||
RPCMinGasPrice() int64
|
||||
SuggestGasTipCap() (*big.Int, error)
|
||||
@@ -53,6 +55,8 @@ type Backend interface {
|
||||
GetTendermintBlockByNumber(blockNum types.BlockNumber) (*tmrpctypes.ResultBlock, error)
|
||||
GetBlockByNumber(blockNum types.BlockNumber, fullTx bool) (map[string]interface{}, error)
|
||||
GetBlockByHash(hash common.Hash, fullTx bool) (map[string]interface{}, error)
|
||||
BlockByNumber(blockNum types.BlockNumber) (*ethtypes.Block, error)
|
||||
BlockByHash(blockHash common.Hash) (*ethtypes.Block, error)
|
||||
CurrentHeader() *ethtypes.Header
|
||||
HeaderByNumber(blockNum types.BlockNumber) (*ethtypes.Header, error)
|
||||
HeaderByHash(blockHash common.Hash) (*ethtypes.Header, error)
|
||||
@@ -162,7 +166,7 @@ func (e *EVMBackend) GetBlockByHash(hash common.Hash, fullTx bool) (map[string]i
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if resBlock.Block == nil {
|
||||
if resBlock == nil || resBlock.Block == nil {
|
||||
e.logger.Debug("BlockByHash block not found", "hash", hash.Hex())
|
||||
return nil, nil
|
||||
}
|
||||
@@ -170,6 +174,97 @@ func (e *EVMBackend) GetBlockByHash(hash common.Hash, fullTx bool) (map[string]i
|
||||
return e.EthBlockFromTendermint(resBlock.Block, fullTx)
|
||||
}
|
||||
|
||||
// BlockByNumber returns the block identified by number.
|
||||
func (e *EVMBackend) BlockByNumber(blockNum types.BlockNumber) (*ethtypes.Block, error) {
|
||||
height := blockNum.Int64()
|
||||
|
||||
switch blockNum {
|
||||
case types.EthLatestBlockNumber:
|
||||
currentBlockNumber, _ := e.BlockNumber()
|
||||
if currentBlockNumber > 0 {
|
||||
height = int64(currentBlockNumber)
|
||||
}
|
||||
case types.EthPendingBlockNumber:
|
||||
currentBlockNumber, _ := e.BlockNumber()
|
||||
if currentBlockNumber > 0 {
|
||||
height = int64(currentBlockNumber)
|
||||
}
|
||||
case types.EthEarliestBlockNumber:
|
||||
height = 1
|
||||
default:
|
||||
if blockNum < 0 {
|
||||
return nil, errors.Errorf("incorrect block height: %d", height)
|
||||
}
|
||||
}
|
||||
|
||||
resBlock, err := e.clientCtx.Client.Block(e.ctx, &height)
|
||||
if err != nil {
|
||||
e.logger.Debug("HeaderByNumber failed", "height", height)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if resBlock == nil || resBlock.Block == nil {
|
||||
return nil, errors.Errorf("block not found for height %d", height)
|
||||
}
|
||||
|
||||
return e.EthBlockFromTm(resBlock.Block)
|
||||
}
|
||||
|
||||
// BlockByHash returns the block identified by hash.
|
||||
func (e *EVMBackend) BlockByHash(hash common.Hash) (*ethtypes.Block, error) {
|
||||
resBlock, err := e.clientCtx.Client.BlockByHash(e.ctx, hash.Bytes())
|
||||
if err != nil {
|
||||
e.logger.Debug("HeaderByHash failed", "hash", hash.Hex())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if resBlock == nil || resBlock.Block == nil {
|
||||
return nil, errors.Errorf("block not found for hash %s", hash)
|
||||
}
|
||||
|
||||
return e.EthBlockFromTm(resBlock.Block)
|
||||
}
|
||||
|
||||
func (e *EVMBackend) EthBlockFromTm(block *tmtypes.Block) (*ethtypes.Block, error) {
|
||||
height := block.Height
|
||||
bloom, err := e.BlockBloom(&height)
|
||||
if err != nil {
|
||||
e.logger.Debug("HeaderByNumber BlockBloom failed", "height", height)
|
||||
}
|
||||
|
||||
baseFee, err := e.BaseFee(height)
|
||||
if err != nil {
|
||||
e.logger.Debug("HeaderByNumber BaseFee failed", "height", height, "error", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ethHeader := types.EthHeaderFromTendermint(block.Header, baseFee)
|
||||
ethHeader.Bloom = bloom
|
||||
|
||||
var txs []*ethtypes.Transaction
|
||||
for _, txBz := range block.Txs {
|
||||
tx, err := e.clientCtx.TxConfig.TxDecoder()(txBz)
|
||||
if err != nil {
|
||||
e.logger.Debug("failed to decode transaction in block", "height", height, "error", err.Error())
|
||||
continue
|
||||
}
|
||||
|
||||
for _, msg := range tx.GetMsgs() {
|
||||
ethMsg, ok := msg.(*evmtypes.MsgEthereumTx)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
tx := ethMsg.AsTransaction()
|
||||
txs = append(txs, tx)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: add tx receipts
|
||||
ethBlock := ethtypes.NewBlock(ethHeader, txs, nil, nil, nil)
|
||||
return ethBlock, nil
|
||||
}
|
||||
|
||||
// GetTendermintBlockByNumber returns a Tendermint format block by block number
|
||||
func (e *EVMBackend) GetTendermintBlockByNumber(blockNum types.BlockNumber) (*tmrpctypes.ResultBlock, error) {
|
||||
height := blockNum.Int64()
|
||||
@@ -342,14 +437,15 @@ func (e *EVMBackend) CurrentHeader() *ethtypes.Header {
|
||||
// HeaderByNumber returns the block header identified by height.
|
||||
func (e *EVMBackend) HeaderByNumber(blockNum types.BlockNumber) (*ethtypes.Header, error) {
|
||||
height := blockNum.Int64()
|
||||
currentBlockNumber, _ := e.BlockNumber()
|
||||
|
||||
switch blockNum {
|
||||
case types.EthLatestBlockNumber:
|
||||
currentBlockNumber, _ := e.BlockNumber()
|
||||
if currentBlockNumber > 0 {
|
||||
height = int64(currentBlockNumber)
|
||||
}
|
||||
case types.EthPendingBlockNumber:
|
||||
currentBlockNumber, _ := e.BlockNumber()
|
||||
if currentBlockNumber > 0 {
|
||||
height = int64(currentBlockNumber)
|
||||
}
|
||||
@@ -391,7 +487,7 @@ func (e *EVMBackend) HeaderByHash(blockHash common.Hash) (*ethtypes.Header, erro
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if resBlock.Block == nil {
|
||||
if resBlock == nil || resBlock.Block == nil {
|
||||
return nil, errors.Errorf("block not found for hash %s", blockHash.Hex())
|
||||
}
|
||||
|
||||
@@ -475,14 +571,15 @@ func (e *EVMBackend) GetLogs(hash common.Hash) ([][]*ethtypes.Log, error) {
|
||||
|
||||
func (e *EVMBackend) GetLogsByNumber(blockNum types.BlockNumber) ([][]*ethtypes.Log, error) {
|
||||
height := blockNum.Int64()
|
||||
currentBlockNumber, _ := e.BlockNumber()
|
||||
|
||||
switch blockNum {
|
||||
case types.EthLatestBlockNumber:
|
||||
currentBlockNumber, _ := e.BlockNumber()
|
||||
if currentBlockNumber > 0 {
|
||||
height = int64(currentBlockNumber)
|
||||
}
|
||||
case types.EthPendingBlockNumber:
|
||||
currentBlockNumber, _ := e.BlockNumber()
|
||||
if currentBlockNumber > 0 {
|
||||
height = int64(currentBlockNumber)
|
||||
}
|
||||
@@ -755,6 +852,11 @@ func (e *EVMBackend) RPCGasCap() uint64 {
|
||||
return e.cfg.JSONRPC.GasCap
|
||||
}
|
||||
|
||||
// RPCEVMTimeout is the global evm timeout for eth-call variants.
|
||||
func (e *EVMBackend) RPCEVMTimeout() time.Duration {
|
||||
return e.cfg.JSONRPC.EVMTimeout
|
||||
}
|
||||
|
||||
// RPCGasCap is the global gas cap for eth-call variants.
|
||||
func (e *EVMBackend) RPCTxFeeCap() float64 {
|
||||
return e.cfg.JSONRPC.TxFeeCap
|
||||
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
"github.com/tendermint/tendermint/types"
|
||||
|
||||
evmtypes "github.com/tharsis/ethermint/x/evm/types"
|
||||
@@ -21,6 +22,9 @@ import (
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/server"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||
"github.com/ethereum/go-ethereum/consensus/ethash"
|
||||
"github.com/ethereum/go-ethereum/rlp"
|
||||
"github.com/tendermint/tendermint/libs/log"
|
||||
"github.com/tharsis/ethermint/rpc/ethereum/backend"
|
||||
rpctypes "github.com/tharsis/ethermint/rpc/ethereum/types"
|
||||
@@ -387,3 +391,43 @@ func (a *API) SetGCPercent(v int) int {
|
||||
a.logger.Debug("debug_setGCPercent", "percent", v)
|
||||
return debug.SetGCPercent(v)
|
||||
}
|
||||
|
||||
// GetHeaderRlp retrieves the RLP encoded for of a single header.
|
||||
func (a *API) GetHeaderRlp(number uint64) (hexutil.Bytes, error) {
|
||||
header, err := a.backend.HeaderByNumber(rpctypes.BlockNumber(number))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return rlp.EncodeToBytes(header)
|
||||
}
|
||||
|
||||
// GetBlockRlp retrieves the RLP encoded for of a single block.
|
||||
func (a *API) GetBlockRlp(number uint64) (hexutil.Bytes, error) {
|
||||
block, err := a.backend.BlockByNumber(rpctypes.BlockNumber(number))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return rlp.EncodeToBytes(block)
|
||||
}
|
||||
|
||||
// PrintBlock retrieves a block and returns its pretty printed form.
|
||||
func (a *API) PrintBlock(number uint64) (string, error) {
|
||||
block, err := a.backend.BlockByNumber(rpctypes.BlockNumber(number))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return spew.Sdump(block), nil
|
||||
}
|
||||
|
||||
// SeedHash retrieves the seed hash of a block.
|
||||
func (a *API) SeedHash(number uint64) (string, error) {
|
||||
_, err := a.backend.HeaderByNumber(rpctypes.BlockNumber(number))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return fmt.Sprintf("0x%x", ethash.SeedHash(number)), nil
|
||||
}
|
||||
|
||||
@@ -630,7 +630,23 @@ func (e *PublicAPI) doCall(
|
||||
// From ContextWithHeight: if the provided height is 0,
|
||||
// it will return an empty context and the gRPC query will use
|
||||
// the latest block height for querying.
|
||||
res, err := e.queryClient.EthCall(rpctypes.ContextWithHeight(blockNr.Int64()), &req)
|
||||
ctx := rpctypes.ContextWithHeight(blockNr.Int64())
|
||||
timeout := e.backend.RPCEVMTimeout()
|
||||
|
||||
// Setup context so it may be canceled the call has completed
|
||||
// or, in case of unmetered gas, setup a context with a timeout.
|
||||
var cancel context.CancelFunc
|
||||
if timeout > 0 {
|
||||
ctx, cancel = context.WithTimeout(ctx, timeout)
|
||||
} else {
|
||||
ctx, cancel = context.WithCancel(ctx)
|
||||
}
|
||||
|
||||
// Make sure the context is canceled when the call has completed
|
||||
// this makes sure resources are cleaned up.
|
||||
defer cancel()
|
||||
|
||||
res, err := e.queryClient.EthCall(ctx, &req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -66,32 +66,6 @@ func EthHeaderFromTendermint(header tmtypes.Header, baseFee *big.Int) *ethtypes.
|
||||
}
|
||||
}
|
||||
|
||||
// EthTransactionsFromTendermint returns a slice of ethereum transaction hashes and the total gas usage from a set of
|
||||
// tendermint block transactions.
|
||||
func EthTransactionsFromTendermint(clientCtx client.Context, txs []tmtypes.Tx) ([]common.Hash, *big.Int, error) {
|
||||
transactionHashes := []common.Hash{}
|
||||
gasUsed := big.NewInt(0)
|
||||
|
||||
for _, tx := range txs {
|
||||
ethTx, err := RawTxToEthTx(clientCtx, tx)
|
||||
if err != nil {
|
||||
// continue to next transaction in case it's not a MsgEthereumTx
|
||||
continue
|
||||
}
|
||||
|
||||
data, err := evmtypes.UnpackTxData(ethTx.Data)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to unpack tx data: %w", err)
|
||||
}
|
||||
|
||||
// TODO: Remove gas usage calculation if saving gasUsed per block
|
||||
gasUsed.Add(gasUsed, data.Fee())
|
||||
transactionHashes = append(transactionHashes, common.BytesToHash(tx.Hash()))
|
||||
}
|
||||
|
||||
return transactionHashes, gasUsed, nil
|
||||
}
|
||||
|
||||
// BlockMaxGasFromConsensusParams returns the gas limit for the latest block from the chain consensus params.
|
||||
func BlockMaxGasFromConsensusParams(ctx context.Context, clientCtx client.Context) (int64, error) {
|
||||
resConsParams, err := clientCtx.Client.ConsensusParams(ctx, nil)
|
||||
|
||||
Reference in New Issue
Block a user