From 77be0bc02299dff5ccc894b8a0951e5fb56fd659 Mon Sep 17 00:00:00 2001 From: Federico Kunze Date: Wed, 5 May 2021 15:10:21 +0200 Subject: [PATCH] cherry picks ethermint --- client/config.go | 23 +++++++++++++++++++++++ ethereum/rpc/pubsub/pubsub_test.go | 9 +++++---- x/evm/keeper/msg_server.go | 6 +++--- x/evm/types/chain_config.go | 10 ++++++++++ x/evm/types/msg.go | 2 +- x/evm/types/state_transition.go | 4 ++-- 6 files changed, 44 insertions(+), 10 deletions(-) diff --git a/client/config.go b/client/config.go index 6fd6c484..05f975c2 100644 --- a/client/config.go +++ b/client/config.go @@ -42,6 +42,29 @@ func InitConfig(cmd *cobra.Command) error { return viper.BindPFlag(cli.OutputFlag, cmd.PersistentFlags().Lookup(cli.OutputFlag)) } +// GenerateChainID wraps a cobra command with a RunE function with base 10 integer chain-id random generation +// when a chain-id is not provided. +func GenerateChainID(baseCmd *cobra.Command) *cobra.Command { + // Copy base run command to be used after chain verification + baseRunE := baseCmd.RunE + + // Function to replace command's RunE function + generateFn := func(cmd *cobra.Command, args []string) error { + chainID, _ := cmd.Flags().GetString(flags.FlagChainID) + + if chainID != "" { + if err := cmd.Flags().Set(flags.FlagChainID, ethermint.GenerateRandomChainID()); err != nil { + return fmt.Errorf("could not set random chain-id: %w", err) + } + } + + return baseRunE(cmd, args) + } + + baseCmd.RunE = generateFn + return baseCmd +} + // ValidateChainID wraps a cobra command with a RunE function with base 10 integer chain-id verification. func ValidateChainID(baseCmd *cobra.Command) *cobra.Command { // Copy base run command to be used after chain verification diff --git a/ethereum/rpc/pubsub/pubsub_test.go b/ethereum/rpc/pubsub/pubsub_test.go index 2d7062b6..996cd00d 100644 --- a/ethereum/rpc/pubsub/pubsub_test.go +++ b/ethereum/rpc/pubsub/pubsub_test.go @@ -26,10 +26,10 @@ func TestAddTopic(t *testing.T) { func TestSubscribe(t *testing.T) { q := NewEventBus() - kekSrc := make(<-chan coretypes.ResultEvent) + kekSrc := make(chan coretypes.ResultEvent) q.AddTopic("kek", kekSrc) - lolSrc := make(<-chan coretypes.ResultEvent) + lolSrc := make(chan coretypes.ResultEvent) q.AddTopic("lol", lolSrc) kekSubC, err := q.Subscribe("kek") @@ -69,8 +69,9 @@ func TestSubscribe(t *testing.T) { defer wg.Done() time.Sleep(time.Second) - <-kekSrc - <-lolSrc + + close(kekSrc) + close(lolSrc) }() wg.Wait() diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index 2fa0bfe9..621150c5 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -44,6 +44,8 @@ func (k *Keeper) EthereumTx(goCtx context.Context, msg *types.MsgEthereumTx) (*t txHash := tmtypes.Tx(ctx.TxBytes()).Hash() ethHash := ethcmn.BytesToHash(txHash) + blockHash, _ := k.GetBlockHashFromHeight(ctx, ctx.BlockHeight()) + ethBlockHash := ethcmn.BytesToHash(blockHash) var recipient *ethcmn.Address if len(msg.Data.Recipient) > 0 { @@ -70,8 +72,7 @@ func (k *Keeper) EthereumTx(goCtx context.Context, msg *types.MsgEthereumTx) (*t // other nodes, causing a consensus error if !st.Simulate { // Prepare db for logs - hash, _ := k.GetBlockHashFromHeight(ctx, ctx.BlockHeight()) - k.Prepare(ctx, ethHash, ethcmn.BytesToHash(hash), k.TxCount) + k.Prepare(ctx, ethHash, ethBlockHash, k.TxCount) k.TxCount++ } @@ -87,7 +88,6 @@ func (k *Keeper) EthereumTx(goCtx context.Context, msg *types.MsgEthereumTx) (*t executionResult.Response.Reverted = true if !st.Simulate { - blockHash, _ := k.GetBlockHashFromHeight(ctx, ctx.BlockHeight()) k.SetTxReceiptToHash(ctx, ethHash, &types.TxReceipt{ Hash: ethHash.Bytes(), From: sender.Bytes(), diff --git a/x/evm/types/chain_config.go b/x/evm/types/chain_config.go index aaffae56..11478da8 100644 --- a/x/evm/types/chain_config.go +++ b/x/evm/types/chain_config.go @@ -126,3 +126,13 @@ func validateBlock(block sdk.Int) error { return nil } + +// IsIstanbul returns whether the Istanbul version is enabled. +func (cc ChainConfig) IsIstanbul() bool { + return getBlockValue(cc.IstanbulBlock) != nil +} + +// IsHomestead returns whether the Homestead version is enabled. +func (cc ChainConfig) IsHomestead() bool { + return getBlockValue(cc.HomesteadBlock) != nil +} diff --git a/x/evm/types/msg.go b/x/evm/types/msg.go index 41404286..e68a9cfe 100644 --- a/x/evm/types/msg.go +++ b/x/evm/types/msg.go @@ -24,7 +24,7 @@ var big8 = big.NewInt(8) // message type and route constants const ( - // TypeMsgEthereumTx defines the type string of an Ethereum tranasction + // TypeMsgEthereumTx defines the type string of an Ethereum transaction TypeMsgEthereumTx = "ethereum" ) diff --git a/x/evm/types/state_transition.go b/x/evm/types/state_transition.go index 26660189..3fb9aa77 100644 --- a/x/evm/types/state_transition.go +++ b/x/evm/types/state_transition.go @@ -61,7 +61,7 @@ func GetHashFn(ctx sdk.Context, csdb *CommitStateDB) vm.GetHashFunc { case ctx.BlockHeight() == int64(height): // Case 1: The requested height matches the one from the context so we can retrieve the header // hash directly from the context. - return HashFromContext(ctx) + return csdb.bhash case ctx.BlockHeight() > int64(height): // Case 2: if the chain is not the current height we need to retrieve the hash from the store for the @@ -190,7 +190,7 @@ func (st *StateTransition) TransitionDb(ctx sdk.Context, config ChainConfig) (re ret, contractAddress, leftOverGas, err = evm.Create(senderRef, st.Payload, gasLimit, st.Amount) if err != nil { - log.WithField("simulate?", st.Simulate). + log.WithField("simulate", st.Simulate). WithField("AccountNonce", st.AccountNonce). WithField("contract", contractAddress.String()). WithError(err).Warningln("evm contract creation failed")