From 988ee53a59311c4d436188853e7d1ff3c57bc19f Mon Sep 17 00:00:00 2001 From: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Date: Mon, 8 Jun 2020 18:43:37 +0200 Subject: [PATCH] rpc: implement eth_coinbase (#325) * rpc: implement eth_coinbase * changelog * address comments from review * changelog --- CHANGELOG.md | 1 + rpc/backend.go | 4 +++- rpc/eth_api.go | 16 +++++++++++++--- tests/rpc_test.go | 12 ++++++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ee10056..d091783f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * Remove evm `CodeKey` and `BlockKey`in favor of a prefix `Store`. * Set `BlockBloom` during `EndBlock` instead of `BeginBlock`. * `Commit` state object and `Finalize` storage after `InitGenesis` setup. +* (rpc) [\#325](https://github.com/ChainSafe/ethermint/pull/325) `eth_coinbase` JSON-RPC query now returns the node's validator address. ### Features diff --git a/rpc/backend.go b/rpc/backend.go index 9362745c..41a1b7a3 100644 --- a/rpc/backend.go +++ b/rpc/backend.go @@ -47,13 +47,15 @@ func NewEthermintBackend(cliCtx context.CLIContext) *EthermintBackend { // BlockNumber returns the current block number. func (e *EthermintBackend) BlockNumber() (hexutil.Uint64, error) { - res, _, err := e.cliCtx.QueryWithData(fmt.Sprintf("custom/%s/blockNumber", types.ModuleName), nil) + res, height, err := e.cliCtx.QueryWithData(fmt.Sprintf("custom/%s/blockNumber", types.ModuleName), nil) if err != nil { return hexutil.Uint64(0), err } var out types.QueryResBlockNumber e.cliCtx.Codec.MustUnmarshalJSON(res, &out) + + e.cliCtx.WithHeight(height) return hexutil.Uint64(out.Number), nil } diff --git a/rpc/eth_api.go b/rpc/eth_api.go index fc783714..170b12e5 100644 --- a/rpc/eth_api.go +++ b/rpc/eth_api.go @@ -90,9 +90,19 @@ func (e *PublicEthAPI) Syncing() (interface{}, error) { }, nil } -// Coinbase returns this node's coinbase address. Not used in Ethermint. -func (e *PublicEthAPI) Coinbase() (addr common.Address) { - return +// Coinbase is the address that staking rewards will be send to (alias for Etherbase). +func (e *PublicEthAPI) Coinbase() (common.Address, error) { + node, err := e.cliCtx.GetNode() + if err != nil { + return common.Address{}, err + } + + status, err := node.Status() + if err != nil { + return common.Address{}, err + } + + return common.BytesToAddress(status.ValidatorInfo.Address.Bytes()), nil } // Mining returns whether or not this node is currently mining. Always false. diff --git a/tests/rpc_test.go b/tests/rpc_test.go index 8ccfe46e..7b556292 100644 --- a/tests/rpc_test.go +++ b/tests/rpc_test.go @@ -139,6 +139,18 @@ func TestEth_blockNumber(t *testing.T) { t.Logf("Got block number: %s\n", res.String()) } +func TestEth_coinbase(t *testing.T) { + zeroAddress := hexutil.Bytes(ethcmn.Address{}.Bytes()) + rpcRes := call(t, "eth_coinbase", []string{}) + + var res hexutil.Bytes + err := res.UnmarshalJSON(rpcRes.Result) + require.NoError(t, err) + + t.Logf("Got coinbase block proposer: %s\n", res.String()) + require.NotEqual(t, zeroAddress.String(), res.String(), "expected: %s got: %s\n", zeroAddress.String(), res.String()) +} + func TestEth_GetBalance(t *testing.T) { rpcRes := call(t, "eth_getBalance", []string{addrA, zeroString})