From 888c11e80112500c480977d0c954bcffd682758b Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Thu, 22 Feb 2018 12:46:22 +0100 Subject: [PATCH] signer: fix listresponse, fix gas->uint64 --- cmd/signer/core/api.go | 10 ++++---- cmd/signer/core/api_test.go | 2 +- cmd/signer/core/cliui.go | 2 +- cmd/signer/core/stdioui.go | 7 +---- cmd/signer/core/types.go | 6 ++--- cmd/signer/core/validation_test.go | 6 ++--- cmd/signer/intapi_changelog.md | 41 ++++++++++++++++++++++++++++++ cmd/signer/main.go | 31 ++++++++++++++++------ cmd/signer/rules/rules_test.go | 14 +++++----- 9 files changed, 84 insertions(+), 35 deletions(-) diff --git a/cmd/signer/core/api.go b/cmd/signer/core/api.go index 46f5fcb236..eaa0b60f2f 100644 --- a/cmd/signer/core/api.go +++ b/cmd/signer/core/api.go @@ -125,9 +125,9 @@ func (m Metadata) String() string { type ( // SignTxRequest contains info about a Transaction to sign SignTxRequest struct { - Transaction SendTxArgs `json:"transaction"` - Callinfo *ValidationMessages `json:"call_info"` - Meta Metadata `json:"meta"` + Transaction SendTxArgs `json:"transaction"` + Callinfo []ValidationInfo `json:"call_info"` + Meta Metadata `json:"meta"` } // SignTxResponse result from SignTxRequest SignTxResponse struct { @@ -287,7 +287,7 @@ func logDiff(original *SignTxRequest, new *SignTxResponse) bool { log.Info("Recipient-account changed by UI", "was", t0, "is", t1) modified = true } - if g0, g1 := big.Int(original.Transaction.Gas), big.Int(new.Transaction.Gas); g0.Cmp(&g1) != 0 { + if g0, g1 := original.Transaction.Gas, new.Transaction.Gas; g0 != g1 { modified = true log.Info("Gas changed by UI", "was", g0, "is", g1) } @@ -334,7 +334,7 @@ func (api *SignerAPI) SignTransaction(ctx context.Context, args SendTxArgs, meth req := SignTxRequest{ Transaction: args, Meta: MetadataFromContext(ctx), - Callinfo: msgs, + Callinfo: msgs.Messages, } // Process approval result, err = api.UI.ApproveTx(&req) diff --git a/cmd/signer/core/api_test.go b/cmd/signer/core/api_test.go index c98f8d89cc..f260a89ec7 100644 --- a/cmd/signer/core/api_test.go +++ b/cmd/signer/core/api_test.go @@ -241,7 +241,7 @@ func TestSignData(t *testing.T) { } func mkTestTx(from common.MixedcaseAddress) SendTxArgs { to := common.NewMixedcaseAddress(common.HexToAddress("0x1337")) - gas := (hexutil.Big)(*big.NewInt(21000)) + gas := hexutil.Uint64(21000) gasPrice := (hexutil.Big)(*big.NewInt(2000000000)) value := (hexutil.Big)(*big.NewInt(1e18)) nonce := (hexutil.Uint64)(0) diff --git a/cmd/signer/core/cliui.go b/cmd/signer/core/cliui.go index 468202cece..0a727f7d67 100644 --- a/cmd/signer/core/cliui.go +++ b/cmd/signer/core/cliui.go @@ -119,7 +119,7 @@ func (ui *CommandlineUI) ApproveTx(request *SignTxRequest) (SignTxResponse, erro } if request.Callinfo != nil { fmt.Printf("\nTransaction validation:\n") - for _, m := range request.Callinfo.Messages { + for _, m := range request.Callinfo { fmt.Printf(" * %s : %s", m.Typ, m.Message) } fmt.Println() diff --git a/cmd/signer/core/stdioui.go b/cmd/signer/core/stdioui.go index 3f11939ca8..4ca77a79e8 100644 --- a/cmd/signer/core/stdioui.go +++ b/cmd/signer/core/stdioui.go @@ -45,12 +45,7 @@ func NewStdIOUI() *StdIOUI { // dispatch sends a request over the stdio func (ui *StdIOUI) dispatch(serviceMethod string, args interface{}, reply interface{}) error { - var err error - if reply != nil { - err = ui.client.Call(nil, serviceMethod, args) - } else { - err = ui.client.Call(&reply, serviceMethod, args) - } + err := ui.client.Call(&reply, serviceMethod, args) if err != nil { log.Info("Error", "exc", err.Error()) } diff --git a/cmd/signer/core/types.go b/cmd/signer/core/types.go index f23bdae401..78b1413696 100644 --- a/cmd/signer/core/types.go +++ b/cmd/signer/core/types.go @@ -76,7 +76,7 @@ type TransactionArg struct { type SendTxArgs struct { From common.MixedcaseAddress `json:"from"` To *common.MixedcaseAddress `json:"to"` - Gas hexutil.Big `json:"gas"` + Gas hexutil.Uint64 `json:"gas"` GasPrice hexutil.Big `json:"gasPrice"` Value hexutil.Big `json:"value"` Nonce hexutil.Uint64 `json:"nonce"` @@ -101,7 +101,7 @@ func (args *SendTxArgs) toTransaction() *types.Transaction { input = *args.Input } if args.To == nil { - return types.NewContractCreation(uint64(args.Nonce), (*big.Int)(&args.Value), (*big.Int)(&args.Gas), (*big.Int)(&args.GasPrice), input) + return types.NewContractCreation(uint64(args.Nonce), (*big.Int)(&args.Value), uint64(args.Gas), (*big.Int)(&args.GasPrice), input) } - return types.NewTransaction(uint64(args.Nonce), args.To.Address(), (*big.Int)(&args.Value), (*big.Int)(&args.Gas), (*big.Int)(&args.GasPrice), input) + return types.NewTransaction(uint64(args.Nonce), args.To.Address(), (*big.Int)(&args.Value), (uint64)(args.Gas), (*big.Int)(&args.GasPrice), input) } diff --git a/cmd/signer/core/validation_test.go b/cmd/signer/core/validation_test.go index 785f45a020..2b33a8630b 100644 --- a/cmd/signer/core/validation_test.go +++ b/cmd/signer/core/validation_test.go @@ -41,7 +41,7 @@ func dummyTxArgs(t txtestcase) *SendTxArgs { to, _ := mixAddr(t.to) from, _ := mixAddr(t.from) n := toHexUint(t.n) - gas := toHexBig(t.g) + gas := toHexUint(t.g) gasPrice := toHexBig(t.gp) value := toHexBig(t.value) var ( @@ -61,8 +61,8 @@ func dummyTxArgs(t txtestcase) *SendTxArgs { To: to, Value: value, Nonce: n, - GasPrice: gas, - Gas: gasPrice, + GasPrice: gasPrice, + Gas: gas, Data: data, Input: input, } diff --git a/cmd/signer/intapi_changelog.md b/cmd/signer/intapi_changelog.md index 85103b89a9..7d2a897ea2 100644 --- a/cmd/signer/intapi_changelog.md +++ b/cmd/signer/intapi_changelog.md @@ -1,5 +1,46 @@ ### Changelog for internal API (ui-api) +### 2.0.0 + +* Modify how `call_info` on a transaction is conveyed. New format: + +``` +{ + "jsonrpc": "2.0", + "id": 2, + "method": "ApproveTx", + "params": [ + { + "transaction": { + "from": "0x82A2A876D39022B3019932D30Cd9c97ad5616813", + "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0", + "gas": "0x333", + "gasPrice": "0x123", + "value": "0x10", + "nonce": "0x0", + "data": "0x4401a6e40000000000000000000000000000000000000000000000000000000000000012", + "input": null + }, + "call_info": [ + { + "type": "WARNING", + "message": "Invalid checksum on to-address" + }, + { + "type": "WARNING", + "message": "Tx contains data, but provided ABI signature could not be matched: Did not match: test (0 matches)" + } + ], + "meta": { + "remote": "127.0.0.1:54286", + "local": "localhost:8550", + "scheme": "HTTP/1.1" + } + } + ] +} +``` + #### 1.2.0 * Add `OnStartup` method, to provide the UI with information about what API version diff --git a/cmd/signer/main.go b/cmd/signer/main.go index a5e7eabd61..f73dbc46c4 100644 --- a/cmd/signer/main.go +++ b/cmd/signer/main.go @@ -51,7 +51,7 @@ import ( const EXT_API_VERSION = "2.0.0" // INT_API_VERSION -- see intapi_changelog.md -const INT_API_VERSION = "1.2.0" +const INT_API_VERSION = "2.0.0" const legal_warning = ` WARNING! @@ -179,6 +179,7 @@ func init() { utils.LightKDFFlag, utils.NoUSBFlag, utils.RPCListenAddrFlag, + utils.RPCVirtualHostsFlag, rpcPortFlag, signerSecretFlag, dBFlag, @@ -291,14 +292,18 @@ func addCredential(ctx *cli.Context) error { } func initialize(c *cli.Context) error { - if !confirm(legal_warning) { - return fmt.Errorf("aborted by user") - } // Set up the logger to print everything logOutput := os.Stdout if c.Bool(stdiouiFlag.Name) { logOutput = os.Stderr + // If using the stdioui, we can't do the 'confirm'-flow + fmt.Fprintf(logOutput, legal_warning) + } else { + if !confirm(legal_warning) { + return fmt.Errorf("aborted by user") + } } + log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(c.Int(logLevelFlag.Name)), log.StreamHandler(logOutput, log.TerminalFormat(true)))) return nil } @@ -416,12 +421,22 @@ func signer(c *cli.Context) error { "extapi_ipc": nil, }, }) - - rpc.NewHTTPServer(cors, server).Serve(listener) + vhosts := splitAndTrim(c.GlobalString(utils.RPCVirtualHostsFlag.Name)) + rpc.NewHTTPServer(cors, vhosts, server).Serve(listener) return nil } +// splitAndTrim splits input separated by a comma +// and trims excessive white space from the substrings. +func splitAndTrim(input string) []string { + result := strings.Split(input, ",") + for i, r := range result { + result[i] = strings.TrimSpace(r) + } + return result +} + // DefaultConfigDir is the default config directory to use for the vaults and other // persistence requirements. func DefaultConfigDir() string { @@ -570,10 +585,10 @@ curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","me // 4401a6e40000000000000000000000000000000000000000000000000000000000000012 // supplied abi -curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_signTransaction","params":["0x82A2A876D39022B3019932D30Cd9c97ad5616813",{"gas":"0x333","gasPrice":"0x123","nonce":"0x0","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0", "value":"0x10", "data":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012"},"test"],"id":67}' http://localhost:8550/ +curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_signTransaction","params":[{"from":"0x82A2A876D39022B3019932D30Cd9c97ad5616813","gas":"0x333","gasPrice":"0x123","nonce":"0x0","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0", "value":"0x10", "data":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012"},"test"],"id":67}' http://localhost:8550/ // Not supplied -curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_signTransaction","params":["0x82A2A876D39022B3019932D30Cd9c97ad5616813",{"gas":"0x333","gasPrice":"0x123","nonce":"0x0","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0", "value":"0x10", "data":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012"}],"id":67}' http://localhost:8550/ +curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_signTransaction","params":[{"from":"0x82A2A876D39022B3019932D30Cd9c97ad5616813","gas":"0x333","gasPrice":"0x123","nonce":"0x0","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0", "value":"0x10", "data":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012"}],"id":67}' http://localhost:8550/ // Sign data diff --git a/cmd/signer/rules/rules_test.go b/cmd/signer/rules/rules_test.go index d288933c12..845718d122 100644 --- a/cmd/signer/rules/rules_test.go +++ b/cmd/signer/rules/rules_test.go @@ -422,7 +422,7 @@ func dummyTx(value hexutil.Big) *core.SignTxRequest { to, _ := mixAddr("000000000000000000000000000000000000dead") from, _ := mixAddr("000000000000000000000000000000000000dead") n := hexutil.Uint64(3) - gas := hexutil.Big(*big.NewInt(21000)) + gas := hexutil.Uint64(21000) gasPrice := hexutil.Big(*big.NewInt(2000000)) return &core.SignTxRequest{ @@ -431,13 +431,11 @@ func dummyTx(value hexutil.Big) *core.SignTxRequest { To: to, Value: value, Nonce: n, - GasPrice: gas, - Gas: gasPrice, + GasPrice: gasPrice, + Gas: gas, }, - Callinfo: &core.ValidationMessages{ - []core.ValidationInfo{ - {"Warning", "All your base are bellong to us"}, - }, + Callinfo: []core.ValidationInfo{ + {"Warning", "All your base are bellong to us"}, }, Meta: core.Metadata{"remoteip", "localip", "inproc"}, } @@ -450,7 +448,7 @@ func dummyTxWithV(value uint64) *core.SignTxRequest { } func dummySigned(value *big.Int) *types.Transaction { to := common.HexToAddress("000000000000000000000000000000000000dead") - gas := big.NewInt(21000) + gas := uint64(21000) gasPrice := big.NewInt(2000000) data := make([]byte, 0) return types.NewTransaction(3, to, value, gas, gasPrice, data)