diff options
author | Ales Katona <ales@coinbase.com> | 2016-04-26 01:23:40 +0800 |
---|---|---|
committer | Ales Katona <ales@coinbase.com> | 2016-04-28 23:11:40 +0800 |
commit | 572da73d4d475db0443f457d9383a3d513f189ee (patch) | |
tree | e5a13000b505ebc2576e58e6c371da8838d56f40 | |
parent | 70b8b54cd2413fb01e279890b2ddb5eb9bc227c2 (diff) | |
download | go-tangerine-572da73d4d475db0443f457d9383a3d513f189ee.tar.gz go-tangerine-572da73d4d475db0443f457d9383a3d513f189ee.tar.zst go-tangerine-572da73d4d475db0443f457d9383a3d513f189ee.zip |
eth: add personal_importRawKey for runtime private key import
-rw-r--r-- | accounts/account_manager.go | 7 | ||||
-rw-r--r-- | eth/api.go | 11 | ||||
-rw-r--r-- | internal/web3ext/web3ext.go | 27 |
3 files changed, 38 insertions, 7 deletions
diff --git a/accounts/account_manager.go b/accounts/account_manager.go index 56499672e..3afadf6b2 100644 --- a/accounts/account_manager.go +++ b/accounts/account_manager.go @@ -284,7 +284,12 @@ func (am *Manager) Import(keyJSON []byte, passphrase, newPassphrase string) (Acc // ImportECDSA stores the given key into the key directory, encrypting it with the passphrase. func (am *Manager) ImportECDSA(priv *ecdsa.PrivateKey, passphrase string) (Account, error) { - return am.importKey(newKeyFromECDSA(priv), passphrase) + key := newKeyFromECDSA(priv) + if am.cache.hasAddress(key.Address) { + return Account{}, fmt.Errorf("account already exists") + } + + return am.importKey(key, passphrase) } func (am *Manager) importKey(key *Key, passphrase string) (Account, error) { diff --git a/eth/api.go b/eth/api.go index a0b1f8ac2..4ebc9b2a0 100644 --- a/eth/api.go +++ b/eth/api.go @@ -18,6 +18,7 @@ package eth import ( "bytes" + "encoding/hex" "encoding/json" "errors" "fmt" @@ -439,6 +440,16 @@ func (s *PrivateAccountAPI) NewAccount(password string) (common.Address, error) return common.Address{}, err } +func (s *PrivateAccountAPI) ImportRawKey(privkey string, password string) (common.Address, error) { + hexkey, err := hex.DecodeString(privkey) + if err != nil { + return common.Address{}, err + } + + acc, err := s.am.ImportECDSA(crypto.ToECDSA(hexkey), password) + return acc.Address, err +} + // UnlockAccount will unlock the account associated with the given address with // the given password for duration seconds. If duration is nil it will use a // default of 300 seconds. It returns an indication if the account was unlocked. diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index bc1e46921..14700b05c 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -18,12 +18,13 @@ package web3ext var Modules = map[string]string{ - "txpool": TxPool_JS, - "admin": Admin_JS, - "eth": Eth_JS, - "miner": Miner_JS, - "debug": Debug_JS, - "net": Net_JS, + "txpool": TxPool_JS, + "admin": Admin_JS, + "personal": Personal_JS, + "eth": Eth_JS, + "miner": Miner_JS, + "debug": Debug_JS, + "net": Net_JS, } const TxPool_JS = ` @@ -175,6 +176,20 @@ web3._extend({ }); ` +const Personal_JS = ` +web3._extend({ + property: 'personal', + methods: + [ + new web3._extend.Method({ + name: 'importRawKey', + call: 'personal_importRawKey', + params: 2 + }) + ] +}); +` + const Eth_JS = ` web3._extend({ property: 'eth', |