Fix edge case for accessing accounts through rpc (#134)

* Add mutex and close keybase database correctly after use

* Add options http request to rpc API for remix
This commit is contained in:
Austin Abell 2019-10-31 11:09:40 -04:00 committed by GitHub
parent c130105b86
commit 9294fa8423
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 15 additions and 8 deletions

View File

@ -74,7 +74,7 @@ func registerRoutes(rs *lcd.RestServer) {
} }
} }
rs.Mux.HandleFunc("/rpc", s.ServeHTTP).Methods("POST") rs.Mux.HandleFunc("/", s.ServeHTTP).Methods("POST", "OPTIONS")
} }
func unlockKeyFromNameAndPassphrase(accountName, passphrase string) (emintKey emintcrypto.PrivKeySecp256k1, err error) { func unlockKeyFromNameAndPassphrase(accountName, passphrase string) (emintKey emintcrypto.PrivKeySecp256k1, err error) {

View File

@ -6,6 +6,7 @@ import (
"log" "log"
"math/big" "math/big"
"strconv" "strconv"
"sync"
emintcrypto "github.com/cosmos/ethermint/crypto" emintcrypto "github.com/cosmos/ethermint/crypto"
emintkeys "github.com/cosmos/ethermint/keys" emintkeys "github.com/cosmos/ethermint/keys"
@ -37,10 +38,11 @@ import (
// PublicEthAPI is the eth_ prefixed set of APIs in the Web3 JSON-RPC spec. // PublicEthAPI is the eth_ prefixed set of APIs in the Web3 JSON-RPC spec.
type PublicEthAPI struct { type PublicEthAPI struct {
cliCtx context.CLIContext cliCtx context.CLIContext
key emintcrypto.PrivKeySecp256k1 key emintcrypto.PrivKeySecp256k1
nonceLock *AddrLocker nonceLock *AddrLocker
gasLimit *int64 keybaseLock sync.Mutex
gasLimit *int64
} }
// NewPublicEthAPI creates an instance of the public ETH Web3 API. // NewPublicEthAPI creates an instance of the public ETH Web3 API.
@ -103,6 +105,8 @@ func (e *PublicEthAPI) GasPrice() *hexutil.Big {
// Accounts returns the list of accounts available to this node. // Accounts returns the list of accounts available to this node.
func (e *PublicEthAPI) Accounts() ([]common.Address, error) { func (e *PublicEthAPI) Accounts() ([]common.Address, error) {
e.keybaseLock.Lock()
addresses := make([]common.Address, 0) // return [] instead of nil if empty addresses := make([]common.Address, 0) // return [] instead of nil if empty
keybase, err := emintkeys.NewKeyBaseFromHomeFlag() keybase, err := emintkeys.NewKeyBaseFromHomeFlag()
if err != nil { if err != nil {
@ -114,6 +118,9 @@ func (e *PublicEthAPI) Accounts() ([]common.Address, error) {
return addresses, err return addresses, err
} }
keybase.CloseDB()
e.keybaseLock.Unlock()
for _, info := range infos { for _, info := range infos {
addressBytes := info.GetPubKey().Address().Bytes() addressBytes := info.GetPubKey().Address().Bytes()
addresses = append(addresses, common.BytesToAddress(addressBytes)) addresses = append(addresses, common.BytesToAddress(addressBytes))

View File

@ -77,4 +77,4 @@ func returnLogs(logs []*ethtypes.Log) []*ethtypes.Log {
return []*ethtypes.Log{} return []*ethtypes.Log{}
} }
return logs return logs
} }

View File

@ -17,7 +17,7 @@ type Filter struct {
addresses []common.Address addresses []common.Address
topics [][]common.Hash topics [][]common.Hash
block common.Hash // Block hash if filtering a single block block common.Hash // Block hash if filtering a single block
} }
// NewBlockFilter creates a new filter which directly inspects the contents of // NewBlockFilter creates a new filter which directly inspects the contents of

View File

@ -27,7 +27,7 @@ const (
addrAStoreKey = 0 addrAStoreKey = 0
) )
var addr = fmt.Sprintf("http://%s:%d/rpc", host, port) var addr = fmt.Sprintf("http://%s:%d", host, port)
type Request struct { type Request struct {
Version string `json:"jsonrpc"` Version string `json:"jsonrpc"`