diff --git a/Gopkg.lock b/Gopkg.lock index ab790281..1a4101a0 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -69,6 +69,12 @@ digest = "1:3238a0c355a81640974751f7d3bab21bf91035165f75c2c457959425c0422a4b" name = "github.com/ethereum/go-ethereum" packages = [ + ".", + "accounts", + "accounts/abi", + "accounts/keystore", + "accounts/usbwallet", + "accounts/usbwallet/internal/trezor", "common", "common/bitutil", "common/hexutil", @@ -86,16 +92,25 @@ "crypto/bn256", "crypto/bn256/cloudflare", "crypto/bn256/google", + "crypto/ecies", + "crypto/randentropy", "crypto/secp256k1", "crypto/sha3", + "eth/downloader", "ethdb", "event", + "internal/ethapi", "log", "metrics", + "p2p", + "p2p/discover", + "p2p/discv5", + "p2p/nat", "p2p/netutil", "params", "rlp", "rpc", + "signer/core", "trie", ] pruneopts = "T" @@ -150,6 +165,7 @@ name = "github.com/golang/protobuf" packages = [ "proto", + "protoc-gen-go/descriptor", "ptypes", "ptypes/any", "ptypes/duration", @@ -177,6 +193,22 @@ pruneopts = "T" revision = "0fb14efe8c47ae851c0034ed7a448854d3d34cf3" +[[projects]] + branch = "master" + digest = "1:202e4a1a283dd740ca9d131787e73bb9d69611a01ef86e82ed262e035b0dd792" + name = "github.com/huin/goupnp" + packages = [ + ".", + "dcps/internetgateway1", + "dcps/internetgateway2", + "httpu", + "scpd", + "soap", + "ssdp", + ] + pruneopts = "T" + revision = "1395d1447324cbea88d249fbfcfd70ea878fdfca" + [[projects]] digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" name = "github.com/inconshreveable/mousetrap" @@ -185,6 +217,14 @@ revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" version = "v1.0" +[[projects]] + digest = "1:32b82e71cf24f8b78323e0d7903c4b90278486283965aa2a19b1ea13763b8f34" + name = "github.com/jackpal/go-nat-pmp" + packages = ["."] + pruneopts = "T" + revision = "c9cfead9f2a36ddf3daa40ba269aa7f4bbba6b62" + version = "v1.0.1" + [[projects]] branch = "master" digest = "1:dc6b1a6801b3055e9bd3da4cd1e568606eb48118cc6f28e947783aa5d998ad74" @@ -193,6 +233,14 @@ pruneopts = "T" revision = "c42d9e0ca023e2198120196f842701bb4c55d7b9" +[[projects]] + branch = "master" + digest = "1:01f1325bf6f105bb633029a2d8b63f1a2357181e60af8dadabf14ad2e84398c5" + name = "github.com/karalabe/hid" + packages = ["."] + pruneopts = "T" + revision = "2b4488a37358b7283de4f9622553e85ebbe73125" + [[projects]] branch = "master" digest = "1:a64e323dc06b73892e5bb5d040ced475c4645d456038333883f58934abbf6f72" @@ -201,6 +249,14 @@ pruneopts = "T" revision = "b84e30acd515aadc4b783ad4ff83aff3299bdfe0" +[[projects]] + digest = "1:361de06aa7ae272616cbe71c3994a654cc6316324e30998e650f7765b20c5b33" + name = "github.com/pborman/uuid" + packages = ["."] + pruneopts = "T" + revision = "e790cca94e6cc75c7064b1332e63811d4aae1a53" + version = "v1.1" + [[projects]] digest = "1:40e195917a951a8bf867cd05de2a46aaf1806c50cf92eebf4c16f78cd196f747" name = "github.com/pkg/errors" @@ -217,6 +273,14 @@ revision = "792786c7400a136282c1664665ae0a8db921c6c2" version = "v1.0.0" +[[projects]] + digest = "1:6afc433cbb471b1d32de92131245fb1f76000c9d88940265df4a512572a51b51" + name = "github.com/rjeczalik/notify" + packages = ["."] + pruneopts = "T" + revision = "52ae50d8490436622a8941bd70c3dbe0acdd4bbf" + version = "v0.9.0" + [[projects]] digest = "1:6cae6970d70fc5fe75bf83c48ee33e9c4c561a62d0b033254bee8dd5942b815a" name = "github.com/rs/cors" @@ -330,7 +394,12 @@ branch = "master" digest = "1:da29cbeb9d244918393b37243c008ab7128688fb017c966aaf876587c010bcdd" name = "golang.org/x/crypto" - packages = ["ripemd160"] + packages = [ + "pbkdf2", + "ripemd160", + "scrypt", + "ssh/terminal", + ] pruneopts = "T" revision = "614d502a4dac94afa3a6ce146bd1736da82514c6" @@ -339,6 +408,9 @@ name = "golang.org/x/net" packages = [ "context", + "html", + "html/atom", + "html/charset", "http/httpguts", "http2", "http2/hpack", @@ -350,18 +422,41 @@ pruneopts = "T" revision = "292b43bbf7cb8d35ddf40f8d5100ef3837cced3f" +[[projects]] + branch = "master" + digest = "1:7560b3b54e7e9d901c46cd919d77da3c4373652ee2b0a13b15b80ea02ad94a56" + name = "golang.org/x/sys" + packages = [ + "unix", + "windows", + ] + pruneopts = "T" + revision = "d99a578cf41bfccdeaf48b0845c823a4b8b0ad5e" + [[projects]] digest = "1:6164911cb5e94e8d8d5131d646613ff82c14f5a8ce869de2f6d80d9889df8c5a" name = "golang.org/x/text" packages = [ "collate", "collate/build", + "encoding", + "encoding/charmap", + "encoding/htmlindex", + "encoding/internal", + "encoding/internal/identifier", + "encoding/japanese", + "encoding/korean", + "encoding/simplifiedchinese", + "encoding/traditionalchinese", + "encoding/unicode", "internal/colltab", "internal/gen", "internal/tag", "internal/triegen", "internal/ucd", + "internal/utf8internal", "language", + "runes", "secure/bidirule", "transform", "unicode/bidi", @@ -469,6 +564,7 @@ "github.com/ethereum/go-ethereum/params", "github.com/ethereum/go-ethereum/rlp", "github.com/ethereum/go-ethereum/rpc", + "github.com/ethereum/go-ethereum/signer/core", "github.com/ethereum/go-ethereum/trie", "github.com/hashicorp/golang-lru", "github.com/pkg/errors", diff --git a/server/rpc/apis.go b/server/rpc/apis.go index ae30f0f9..d0f7bb38 100644 --- a/server/rpc/apis.go +++ b/server/rpc/apis.go @@ -3,10 +3,10 @@ package rpc import ( + "github.com/cosmos/ethermint/version" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/rpc" - "github.com/cosmos/ethermint/version" ) // returns the master list of public APIs for use with StartHTTPEndpoint @@ -17,13 +17,19 @@ func GetRPCAPIs() []rpc.API { Version: "1.0", Service: NewPublicWeb3API(), }, + { + Namespace: "eth", + Version: "1.0", + Service: NewPublicEthAPI(), + }, } } -// PublicWeb3API is the web3_ prefixed set of APIs in the WEB3 JSON-RPC spec. +// PublicWeb3API is the web3_ prefixed set of APIs in the Web3 JSON-RPC spec. type PublicWeb3API struct { } +// NewPublicWeb3API creates an instance of the Web3 API. func NewPublicWeb3API() *PublicWeb3API { return &PublicWeb3API{} } diff --git a/server/rpc/apis_test.go b/server/rpc/apis_test.go index f58c2a38..d0bec724 100644 --- a/server/rpc/apis_test.go +++ b/server/rpc/apis_test.go @@ -2,9 +2,9 @@ package rpc import ( "context" + "github.com/cosmos/ethermint/version" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" - "github.com/cosmos/ethermint/version" "testing" ) @@ -37,6 +37,16 @@ func (s *apisTestSuite) TestPublicWeb3APISha3() { require.Equal(s.T(), "0x1b84adea42d5b7d192fd8a61a85b25abe0757e9a65cab1da470258914053823f", res) } +func (s *apisTestSuite) TestMiningAPIs() { + res, err := rpcCall(s.Port, "eth_mining", nil) + require.Nil(s.T(), err, "unexpected error") + require.Equal(s.T(), false, res) + + res, err = rpcCall(s.Port, "eth_hashrate", nil) + require.Nil(s.T(), err, "unexpected error") + require.Equal(s.T(), "0x0", res) +} + func TestAPIsTestSuite(t *testing.T) { suite.Run(t, new(apisTestSuite)) } diff --git a/server/rpc/config.go b/server/rpc/config.go index c79f58df..2c030f1b 100644 --- a/server/rpc/config.go +++ b/server/rpc/config.go @@ -4,13 +4,13 @@ package rpc // behavior of the RPC HTTP server. type Config struct { // EnableRPC defines whether or not to enable the RPC server - EnableRPC bool + EnableRPC bool // RPCAddr defines the IP address to listen on - RPCAddr string + RPCAddr string // RPCPort defines the port to listen on - RPCPort int + RPCPort int // RPCCORSDomains defines list of domains to enable CORS headers for (used by browsers) RPCCORSDomains []string // RPCVhosts defines list of domains to listen on (useful if Tendermint is addressable via DNS) - RPCVHosts []string + RPCVHosts []string } diff --git a/server/rpc/eth_api.go b/server/rpc/eth_api.go new file mode 100644 index 00000000..fc212ff0 --- /dev/null +++ b/server/rpc/eth_api.go @@ -0,0 +1,196 @@ +package rpc + +import ( + "github.com/cosmos/ethermint/version" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/signer/core" + "math/big" +) + +// PublicEthAPI is the eth_ prefixed set of APIs in the Web3 JSON-RPC spec. +type PublicEthAPI struct{} + +// NewPublicEthAPI creates an instance of the public ETH Web3 API. +func NewPublicEthAPI() *PublicEthAPI { + return &PublicEthAPI{} +} + +// ProtocolVersion returns the supported Ethereum protocol version. +func (e *PublicEthAPI) ProtocolVersion() string { + return version.ProtocolVersion +} + +// Syncing returns whether or not the current node is syncing with other peers. Returns false if not, or a struct +// outlining the state of the sync if it is. +func (e *PublicEthAPI) Syncing() interface{} { + return false +} + +// Coinbase returns this node's coinbase address. Not used in Ethermint. +func (e *PublicEthAPI) Coinbase() (addr common.Address) { + return +} + +// Mining returns whether or not this node is currently mining. Always false. +func (e *PublicEthAPI) Mining() bool { + return false +} + +// Hashrate returns the current node's hashrate. Always 0. +func (e *PublicEthAPI) Hashrate() hexutil.Uint64 { + return 0 +} + +// GasPrice returns the current gas price based on Ethermint's gas price oracle. +func (e *PublicEthAPI) GasPrice() *hexutil.Big { + out := big.NewInt(0) + return (*hexutil.Big)(out) +} + +// Accounts returns the list of accounts available to this node. +func (e *PublicEthAPI) Accounts() []common.Address { + return nil +} + +// BlockNumber returns the current block number. +func (e *PublicEthAPI) BlockNumber() *big.Int { + return big.NewInt(0) +} + +// GetBalance returns the provided account's balance up to the provided block number. +func (e *PublicEthAPI) GetBalance(address common.Address, blockNum rpc.BlockNumber) *hexutil.Big { + out := big.NewInt(0) + return (*hexutil.Big)(out) +} + +// GetStorageAt returns the contract storage at the given address, block number, and key. +func (e *PublicEthAPI) GetStorageAt(address common.Address, key string, blockNum rpc.BlockNumber) hexutil.Bytes { + return nil +} + +// GetTransactionCount returns the number of transactions at the given address up to the given block number. +func (e *PublicEthAPI) GetTransactionCount(address common.Address, blockNum rpc.BlockNumber) hexutil.Uint64 { + return 0 +} + +// GetBlockTransactionCountByHash returns the number of transactions in the block identified by hash. +func (e *PublicEthAPI) GetBlockTransactionCountByHash(hash common.Hash) hexutil.Uint { + return 0 +} + +// GetBlockTransactionCountByNumber returns the number of transactions in the block identified by number. +func (e *PublicEthAPI) GetBlockTransactionCountByNumber(blockNum rpc.BlockNumber) hexutil.Uint { + return 0 +} + +// GetUncleCountByBlockHash returns the number of uncles in the block idenfied by hash. Always zero. +func (e *PublicEthAPI) GetUncleCountByBlockHash(hash common.Hash) hexutil.Uint { + return 0 +} + +// GetUncleCountByBlockNumber returns the number of uncles in the block idenfied by number. Always zero. +func (e *PublicEthAPI) GetUncleCountByBlockNumber(blockNum rpc.BlockNumber) hexutil.Uint { + return 0 +} + +// GetCode returns the contract code at the given address and block number. +func (e *PublicEthAPI) GetCode(address common.Address, blockNumber rpc.BlockNumber) hexutil.Bytes { + return nil +} + +// Sign signs the provided data using the private key of address via Geth's signature standard. +func (e *PublicEthAPI) Sign(address common.Address, data hexutil.Bytes) hexutil.Bytes { + return nil +} + +// SendTransaction sends an Ethereum transaction. +func (e *PublicEthAPI) SendTransaction(args core.SendTxArgs) common.Hash { + var h common.Hash + return h +} + +// SendRawTransaction send a raw Ethereum transaction. +func (e *PublicEthAPI) SendRawTransaction(data hexutil.Bytes) common.Hash { + var h common.Hash + return h +} + +// CallArgs represents arguments to a smart contract call as provided by RPC clients. +type CallArgs struct { + From common.Address `json:"from"` + To common.Address `json:"to"` + Gas hexutil.Uint64 `json:"gas"` + GasPrice hexutil.Big `json:"gasPrice"` + Value hexutil.Big `json:"value"` + Data hexutil.Bytes `json:"data"` +} + +// Call performs a raw contract call. +func (e *PublicEthAPI) Call(args CallArgs, blockNum rpc.BlockNumber) hexutil.Bytes { + return nil +} + +// EstimateGas estimates gas usage for the given smart contract call. +func (e *PublicEthAPI) EstimateGas(args CallArgs, blockNum rpc.BlockNumber) hexutil.Uint64 { + return 0 +} + +// GetBlockByHash returns the block identified by hash. +func (e *PublicEthAPI) GetBlockByHash(hash common.Hash, fullTx bool) map[string]interface{} { + return nil +} + +// GetBlockByNumber returns the block identified by number. +func (e *PublicEthAPI) GetBlockByNumber(blockNum rpc.BlockNumber, fullTx bool) map[string]interface{} { + return nil +} + +// Transaction represents a transaction returned to RPC clients. +type Transaction struct { + BlockHash common.Hash `json:"blockHash"` + BlockNumber *hexutil.Big `json:"blockNumber"` + From common.Address `json:"from"` + Gas hexutil.Uint64 `json:"gas"` + GasPrice *hexutil.Big `json:"gasPrice"` + Hash common.Hash `json:"hash"` + Input hexutil.Bytes `json:"input"` + Nonce hexutil.Uint64 `json:"nonce"` + To *common.Address `json:"to"` + TransactionIndex hexutil.Uint `json:"transactionIndex"` + Value *hexutil.Big `json:"value"` + V *hexutil.Big `json:"v"` + R *hexutil.Big `json:"r"` + S *hexutil.Big `json:"s"` +} + +// GetTransactionByHash returns the transaction identified by hash. +func (e *PublicEthAPI) GetTransactionByHash(hash common.Hash) *Transaction { + return nil +} + +// GetTransactionByBlockHashAndIndex returns the transaction identified by hash and index. +func (e *PublicEthAPI) GetTransactionByBlockHashAndIndex(hash common.Hash, idx hexutil.Uint) *Transaction { + return nil +} + +// GetTransactionByBlockNumberAndIndex returns the transaction identified by number and index. +func (e *PublicEthAPI) GetTransactionByBlockNumberAndIndex(blockNumber rpc.BlockNumber, idx hexutil.Uint) *Transaction { + return nil +} + +// GetTransactionReceipt returns the transaction receipt identified by hash. +func (e *PublicEthAPI) GetTransactionReceipt(hash common.Hash) map[string]interface{} { + return nil +} + +// GetUncleByBlockHashAndIndex returns the uncle identified by hash and index. Always returns nil. +func (e *PublicEthAPI) GetUncleByBlockHashAndIndex(hash common.Hash, idx hexutil.Uint) map[string]interface{} { + return nil +} + +// GetUncleByBlockNumberAndIndex returns the uncle identified by number and index. Always returns nil. +func (e *PublicEthAPI) GetUncleByBlockNumberAndIndex(number hexutil.Uint, idx hexutil.Uint) map[string]interface{} { + return nil +} diff --git a/server/rpc/rpc.go b/server/rpc/rpc.go index 641f19f2..df621eb6 100644 --- a/server/rpc/rpc.go +++ b/server/rpc/rpc.go @@ -4,7 +4,7 @@ import ( "context" "fmt" "github.com/ethereum/go-ethereum/rpc" - ) +) // StartHTTPEndpoint starts the Tendermint Web3-compatible RPC layer. Consumes a Context for cancellation, a config // struct, and a list of rpc.API interfaces that will be automatically wired into a JSON-RPC webserver. diff --git a/version/version.go b/version/version.go index ae4e0650..015a5b96 100644 --- a/version/version.go +++ b/version/version.go @@ -14,6 +14,9 @@ const AppName = "Ethermint" // been developed? const Version = "0.0.0" +// ProtocolVersion is the supported Ethereum protocol version (e.g., Homestead, Olympic, etc.) +const ProtocolVersion = "63" + // GitCommit contains the git SHA1 short hash set by build flags. var GitCommit = ""