From e94aa421c69b8eee2f2e06654f9a288cdfe4f546 Mon Sep 17 00:00:00 2001 From: "Daniel A. Nagy" Date: Fri, 8 May 2015 16:17:19 +0200 Subject: New API call for signatures. --- xeth/xeth.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index ad8596803..2ca0e80d7 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -813,6 +813,27 @@ func (self *XEth) ConfirmTransaction(tx string) bool { return self.frontend.ConfirmTransaction(tx) } +func (self *XEth) Sign(fromStr, hashStr string) (string, error) { + var ( + from = common.HexToAddress(fromStr) + hash = common.HexToHash(hashStr) + ) + sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from.Bytes()}, hash) + if err == accounts.ErrLocked { + if didUnlock { + return fmt.Errorf("signer account still locked after successful unlock") + } + if !self.frontend.UnlockAccount(from.Bytes()) { + return fmt.Errorf("could not unlock signer account") + } + // retry signing, the account should now be unlocked. + return self.Sign(fromStr, hashStr) + } else if err != nil { + return err + } + return common.toHex(sig) +} + func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) { // this minimalistic recoding is enough (works for natspec.js) -- cgit v1.2.3 From a487396b764c8dac409f9ee1ef32c29c4cefb7d9 Mon Sep 17 00:00:00 2001 From: "Daniel A. Nagy" Date: Fri, 8 May 2015 16:36:13 +0200 Subject: eth_sign added to API for signing arbitrary data. --- xeth/xeth.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index 2ca0e80d7..dc2d4f06f 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -813,25 +813,25 @@ func (self *XEth) ConfirmTransaction(tx string) bool { return self.frontend.ConfirmTransaction(tx) } -func (self *XEth) Sign(fromStr, hashStr string) (string, error) { +func (self *XEth) Sign(fromStr, hashStr string, didUnlock bool) (string, error) { var ( from = common.HexToAddress(fromStr) hash = common.HexToHash(hashStr) ) - sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from.Bytes()}, hash) + sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from.Bytes()}, hash.Bytes()) if err == accounts.ErrLocked { if didUnlock { - return fmt.Errorf("signer account still locked after successful unlock") + return "", fmt.Errorf("signer account still locked after successful unlock") } if !self.frontend.UnlockAccount(from.Bytes()) { - return fmt.Errorf("could not unlock signer account") + return "", fmt.Errorf("could not unlock signer account") } // retry signing, the account should now be unlocked. - return self.Sign(fromStr, hashStr) + return self.Sign(fromStr, hashStr, true) } else if err != nil { - return err + return "", err } - return common.toHex(sig) + return common.ToHex(sig), nil } func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) { -- cgit v1.2.3 From 0ad5898c0f9b0d777818d89356b74606f4b3c988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 11 May 2015 11:53:53 +0300 Subject: rpc, xeth: fix #881, gracefully handle offline whisper --- xeth/xeth.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index ad8596803..b875fa6f1 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -79,7 +79,6 @@ func New(eth *eth.Ethereum, frontend Frontend) *XEth { xeth := &XEth{ backend: eth, frontend: frontend, - whisper: NewWhisper(eth.Whisper()), quit: make(chan struct{}), filterManager: filter.NewFilterManager(eth.EventMux()), logQueue: make(map[int]*logQueue), @@ -88,6 +87,9 @@ func New(eth *eth.Ethereum, frontend Frontend) *XEth { messages: make(map[int]*whisperFilter), agent: miner.NewRemoteAgent(), } + if eth.Whisper() != nil { + xeth.whisper = NewWhisper(eth.Whisper()) + } eth.Miner().Register(xeth.agent) if frontend == nil { xeth.frontend = dummyFrontend{} -- cgit v1.2.3 From 49559e6d5e7c365f1aa081e94cb46f3483833647 Mon Sep 17 00:00:00 2001 From: "Daniel A. Nagy" Date: Mon, 11 May 2015 15:46:18 +0200 Subject: Interactive signature creation refactored into separate doSign function. --- xeth/xeth.go | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index 06cd9dc1b..76ca4b9b4 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -815,22 +815,30 @@ func (self *XEth) ConfirmTransaction(tx string) bool { return self.frontend.ConfirmTransaction(tx) } -func (self *XEth) Sign(fromStr, hashStr string, didUnlock bool) (string, error) { - var ( - from = common.HexToAddress(fromStr) - hash = common.HexToHash(hashStr) - ) - sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from.Bytes()}, hash.Bytes()) +func (self *XEth) doSign(from common.Address, hash []byte, didUnlock bool) ([]byte, error) { + sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from.Bytes()}, hash) if err == accounts.ErrLocked { if didUnlock { - return "", fmt.Errorf("signer account still locked after successful unlock") + return nil, fmt.Errorf("signer account still locked after successful unlock") } if !self.frontend.UnlockAccount(from.Bytes()) { - return "", fmt.Errorf("could not unlock signer account") + return nil, fmt.Errorf("could not unlock signer account") } // retry signing, the account should now be unlocked. - return self.Sign(fromStr, hashStr, true) + return self.doSign(from, hash, true) } else if err != nil { + return nil, err + } + return sig, nil +} + +func (self *XEth) Sign(fromStr, hashStr string, didUnlock bool) (string, error) { + var ( + from = common.HexToAddress(fromStr) + hash = common.HexToHash(hashStr) + ) + sig, err := self.doSign(from, hash.Bytes(), didUnlock) + if err != nil { return "", err } return common.ToHex(sig), nil @@ -928,17 +936,9 @@ func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceS } func (self *XEth) sign(tx *types.Transaction, from common.Address, didUnlock bool) error { - sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from.Bytes()}, tx.Hash().Bytes()) - if err == accounts.ErrLocked { - if didUnlock { - return fmt.Errorf("sender account still locked after successful unlock") - } - if !self.frontend.UnlockAccount(from.Bytes()) { - return fmt.Errorf("could not unlock sender account") - } - // retry signing, the account should now be unlocked. - return self.sign(tx, from, true) - } else if err != nil { + hash := tx.Hash().Bytes() + sig, err := self.doSign(from, hash, didUnlock) + if err != nil { return err } tx.SetSignatureValues(sig) -- cgit v1.2.3 From 51d4566cbf5c91e429313f1765d5a7d2afc13634 Mon Sep 17 00:00:00 2001 From: "Daniel A. Nagy" Date: Mon, 11 May 2015 15:54:19 +0200 Subject: Only allow doSign to sign hashes, enforced by using the type common.Hash --- xeth/xeth.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index 76ca4b9b4..47b833a34 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -815,8 +815,8 @@ func (self *XEth) ConfirmTransaction(tx string) bool { return self.frontend.ConfirmTransaction(tx) } -func (self *XEth) doSign(from common.Address, hash []byte, didUnlock bool) ([]byte, error) { - sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from.Bytes()}, hash) +func (self *XEth) doSign(from common.Address, hash common.Hash, didUnlock bool) ([]byte, error) { + sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from.Bytes()}, hash.Bytes()) if err == accounts.ErrLocked { if didUnlock { return nil, fmt.Errorf("signer account still locked after successful unlock") @@ -837,7 +837,7 @@ func (self *XEth) Sign(fromStr, hashStr string, didUnlock bool) (string, error) from = common.HexToAddress(fromStr) hash = common.HexToHash(hashStr) ) - sig, err := self.doSign(from, hash.Bytes(), didUnlock) + sig, err := self.doSign(from, hash, didUnlock) if err != nil { return "", err } @@ -936,7 +936,7 @@ func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceS } func (self *XEth) sign(tx *types.Transaction, from common.Address, didUnlock bool) error { - hash := tx.Hash().Bytes() + hash := tx.Hash() sig, err := self.doSign(from, hash, didUnlock) if err != nil { return err -- cgit v1.2.3 From 21e52efdfed19c4376b830f8ad0e52a9e599f633 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 11 May 2015 15:43:14 +0200 Subject: cmd/geth, miner, backend, xeth: Fixed miner threads to be settable Miner threads are now settable through the admin interface (closes #897) and specify 0 CPU worker threads when eth_getWork is called (closes #916) --- xeth/xeth.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index 47b833a34..bf5844770 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -425,10 +425,10 @@ func (self *XEth) ClientVersion() string { return self.backend.ClientVersion() } -func (self *XEth) SetMining(shouldmine bool) bool { +func (self *XEth) SetMining(shouldmine bool, threads int) bool { ismining := self.backend.IsMining() if shouldmine && !ismining { - err := self.backend.StartMining() + err := self.backend.StartMining(threads) return err == nil } if ismining && !shouldmine { -- cgit v1.2.3 From 66de3f0aa849849c5cf5ad84265f3f3ce8ca5282 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 12 May 2015 14:14:08 +0200 Subject: xeth, rpc: implement eth_estimateGas. Closes #930 --- xeth/xeth.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index bf5844770..1ddd4c6e4 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -773,7 +773,7 @@ func (self *XEth) PushTx(encodedTx string) (string, error) { return tx.Hash().Hex(), nil } -func (self *XEth) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, dataStr string) (string, error) { +func (self *XEth) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, dataStr string) (string, string, error) { statedb := self.State().State() //self.eth.ChainManager().TransState() var from *state.StateObject if len(fromStr) == 0 { @@ -807,8 +807,10 @@ func (self *XEth) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, dataStr st block := self.CurrentBlock() vmenv := core.NewEnv(statedb, self.backend.ChainManager(), msg, block) + initialGas := new(big.Int).Set(msg.gas) res, err := vmenv.Call(msg.from, msg.to, msg.data, msg.gas, msg.gasPrice, msg.value) - return common.ToHex(res), err + + return common.ToHex(res), initialGas.Sub(initialGas, msg.gas).String(), err } func (self *XEth) ConfirmTransaction(tx string) bool { -- cgit v1.2.3 From ff99752dddb75779f7a82b27f578fe77bc46fdc9 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 12 May 2015 15:53:00 +0200 Subject: xeth: use same semantics as block processer for transient calls --- xeth/xeth.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index 1ddd4c6e4..11dc506b8 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -787,6 +787,7 @@ func (self *XEth) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, dataStr st from = statedb.GetOrNewStateObject(common.HexToAddress(fromStr)) } + from.SetGasPool(self.backend.ChainManager().GasLimit()) msg := callmsg{ from: from, to: common.HexToAddress(toStr), @@ -807,10 +808,8 @@ func (self *XEth) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, dataStr st block := self.CurrentBlock() vmenv := core.NewEnv(statedb, self.backend.ChainManager(), msg, block) - initialGas := new(big.Int).Set(msg.gas) - res, err := vmenv.Call(msg.from, msg.to, msg.data, msg.gas, msg.gasPrice, msg.value) - - return common.ToHex(res), initialGas.Sub(initialGas, msg.gas).String(), err + res, gas, err := core.ApplyMessage(vmenv, msg, from) + return common.ToHex(res), gas.String(), err } func (self *XEth) ConfirmTransaction(tx string) bool { -- cgit v1.2.3 From da9fe951da4005761a014316c46771d628dc058e Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Thu, 2 Apr 2015 21:14:25 +0200 Subject: Use common.Address type for accounts.Address --- xeth/xeth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index 11dc506b8..74110c4ec 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -365,7 +365,7 @@ func (self *XEth) Accounts() []string { accounts, _ := self.backend.AccountManager().Accounts() accountAddresses := make([]string, len(accounts)) for i, ac := range accounts { - accountAddresses[i] = common.ToHex(ac.Address) + accountAddresses[i] = ac.Address.Str() } return accountAddresses } -- cgit v1.2.3 From ac3371bcb69b090fa9b5a8da96916fa0aa15ed0f Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Thu, 2 Apr 2015 22:54:55 +0200 Subject: Correct accounts hex in XETH API --- xeth/xeth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index 74110c4ec..7e6a2c184 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -365,7 +365,7 @@ func (self *XEth) Accounts() []string { accounts, _ := self.backend.AccountManager().Accounts() accountAddresses := make([]string, len(accounts)) for i, ac := range accounts { - accountAddresses[i] = ac.Address.Str() + accountAddresses[i] = "0x" + ac.Address.Hex() // wtf } return accountAddresses } -- cgit v1.2.3 From 8754f2b768ba00d8507a7990dccca80e6cea1cc0 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Sun, 19 Apr 2015 01:09:41 +0200 Subject: Fix common.Address / []byte type conversions --- xeth/xeth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index 7e6a2c184..3b29eb3f7 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -781,7 +781,7 @@ func (self *XEth) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, dataStr st if err != nil || len(accounts) == 0 { from = statedb.GetOrNewStateObject(common.Address{}) } else { - from = statedb.GetOrNewStateObject(common.BytesToAddress(accounts[0].Address)) + from = statedb.GetOrNewStateObject(accounts[0].Address) } } else { from = statedb.GetOrNewStateObject(common.HexToAddress(fromStr)) -- cgit v1.2.3 From 940952f75741b3bfcfe290102874d24ccb11c3d0 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Fri, 24 Apr 2015 17:35:10 +0200 Subject: Fix HEX hack in xeth accounts() --- xeth/xeth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index 3b29eb3f7..28ca05f47 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -365,7 +365,7 @@ func (self *XEth) Accounts() []string { accounts, _ := self.backend.AccountManager().Accounts() accountAddresses := make([]string, len(accounts)) for i, ac := range accounts { - accountAddresses[i] = "0x" + ac.Address.Hex() // wtf + accountAddresses[i] = ac.Address.Hex() } return accountAddresses } -- cgit v1.2.3 From 2c1b0ff17e020f300ed9d5a5a244f59b4febfe66 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Sun, 10 May 2015 20:30:02 +0200 Subject: Update key store to new spec but keep address field for now * Also fix address types post-rebase --- xeth/xeth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'xeth') diff --git a/xeth/xeth.go b/xeth/xeth.go index 28ca05f47..0fe68d175 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -817,7 +817,7 @@ func (self *XEth) ConfirmTransaction(tx string) bool { } func (self *XEth) doSign(from common.Address, hash common.Hash, didUnlock bool) ([]byte, error) { - sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from.Bytes()}, hash.Bytes()) + sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from}, hash.Bytes()) if err == accounts.ErrLocked { if didUnlock { return nil, fmt.Errorf("signer account still locked after successful unlock") -- cgit v1.2.3