aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorMartin Holst Swende <martin@swende.se>2018-04-16 20:04:32 +0800
committerPéter Szilágyi <peterke@gmail.com>2018-04-16 20:04:32 +0800
commitec3db0f56c779387132dcf2049ed32bf4ed34a4f (patch)
treed509c580e02053fd133b0402c0838940d4b871d2 /common
parentde2a7bb764c82dbaa80d37939c5862358174bc6e (diff)
downloadgo-tangerine-ec3db0f56c779387132dcf2049ed32bf4ed34a4f.tar.gz
go-tangerine-ec3db0f56c779387132dcf2049ed32bf4ed34a4f.tar.zst
go-tangerine-ec3db0f56c779387132dcf2049ed32bf4ed34a4f.zip
cmd/clef, signer: initial poc of the standalone signer (#16154)
* signer: introduce external signer command * cmd/signer, rpc: Implement new signer. Add info about remote user to Context * signer: refactored request/response, made use of urfave.cli * cmd/signer: Use common flags * cmd/signer: methods to validate calldata against abi * cmd/signer: work on abi parser * signer: add mutex around UI * cmd/signer: add json 4byte directory, remove passwords from api * cmd/signer: minor changes * cmd/signer: Use ErrRequestDenied, enable lightkdf * cmd/signer: implement tests * cmd/signer: made possible for UI to modify tx parameters * cmd/signer: refactors, removed channels in ui comms, added UI-api via stdin/out * cmd/signer: Made lowercase json-definitions, added UI-signer test functionality * cmd/signer: update documentation * cmd/signer: fix bugs, improve abi detection, abi argument display * cmd/signer: minor change in json format * cmd/signer: rework json communication * cmd/signer: implement mixcase addresses in API, fix json id bug * cmd/signer: rename fromaccount, update pythonpoc with new json encoding format * cmd/signer: make use of new abi interface * signer: documentation * signer/main: remove redundant option * signer: implement audit logging * signer: create package 'signer', minor changes * common: add 0x-prefix to mixcaseaddress in json marshalling + validation * signer, rules, storage: implement rules + ephemeral storage for signer rules * signer: implement OnApprovedTx, change signing response (API BREAKAGE) * signer: refactoring + documentation * signer/rules: implement dispatching to next handler * signer: docs * signer/rules: hide json-conversion from users, ensure context is cleaned * signer: docs * signer: implement validation rules, change signature of call_info * signer: fix log flaw with string pointer * signer: implement custom 4byte databsae that saves submitted signatures * signer/storage: implement aes-gcm-backed credential storage * accounts: implement json unmarshalling of url * signer: fix listresponse, fix gas->uint64 * node: make http/ipc start methods public * signer: add ipc capability+review concerns * accounts: correct docstring * signer: address review concerns * rpc: go fmt -s * signer: review concerns+ baptize Clef * signer,node: move Start-functions to separate file * signer: formatting
Diffstat (limited to 'common')
-rw-r--r--common/types.go62
-rw-r--r--common/types_test.go44
2 files changed, 106 insertions, 0 deletions
diff --git a/common/types.go b/common/types.go
index 4ea2d56a6..76e7be58f 100644
--- a/common/types.go
+++ b/common/types.go
@@ -23,8 +23,10 @@ import (
"math/rand"
"reflect"
+ "encoding/json"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto/sha3"
+ "strings"
)
const (
@@ -238,3 +240,63 @@ func (a *UnprefixedAddress) UnmarshalText(input []byte) error {
func (a UnprefixedAddress) MarshalText() ([]byte, error) {
return []byte(hex.EncodeToString(a[:])), nil
}
+
+// MixedcaseAddress retains the original string, which may or may not be
+// correctly checksummed
+type MixedcaseAddress struct {
+ addr Address
+ original string
+}
+
+// NewMixedcaseAddress constructor (mainly for testing)
+func NewMixedcaseAddress(addr Address) MixedcaseAddress {
+ return MixedcaseAddress{addr: addr, original: addr.Hex()}
+}
+
+// NewMixedcaseAddressFromString is mainly meant for unit-testing
+func NewMixedcaseAddressFromString(hexaddr string) (*MixedcaseAddress, error) {
+ if !IsHexAddress(hexaddr) {
+ return nil, fmt.Errorf("Invalid address")
+ }
+ a := FromHex(hexaddr)
+ return &MixedcaseAddress{addr: BytesToAddress(a), original: hexaddr}, nil
+}
+
+// UnmarshalJSON parses MixedcaseAddress
+func (ma *MixedcaseAddress) UnmarshalJSON(input []byte) error {
+ if err := hexutil.UnmarshalFixedJSON(addressT, input, ma.addr[:]); err != nil {
+ return err
+ }
+ return json.Unmarshal(input, &ma.original)
+}
+
+// MarshalJSON marshals the original value
+func (ma *MixedcaseAddress) MarshalJSON() ([]byte, error) {
+ if strings.HasPrefix(ma.original, "0x") || strings.HasPrefix(ma.original, "0X") {
+ return json.Marshal(fmt.Sprintf("0x%s", ma.original[2:]))
+ }
+ return json.Marshal(fmt.Sprintf("0x%s", ma.original))
+}
+
+// Address returns the address
+func (ma *MixedcaseAddress) Address() Address {
+ return ma.addr
+}
+
+// String implements fmt.Stringer
+func (ma *MixedcaseAddress) String() string {
+ if ma.ValidChecksum() {
+ return fmt.Sprintf("%s [chksum ok]", ma.original)
+ }
+ return fmt.Sprintf("%s [chksum INVALID]", ma.original)
+}
+
+// ValidChecksum returns true if the address has valid checksum
+func (ma *MixedcaseAddress) ValidChecksum() bool {
+ return ma.original == ma.addr.Hex()
+}
+
+// Original returns the mixed-case input string
+func (ma *MixedcaseAddress) Original() string {
+ return ma.original
+}
diff --git a/common/types_test.go b/common/types_test.go
index db636812c..9e0c5be3a 100644
--- a/common/types_test.go
+++ b/common/types_test.go
@@ -18,6 +18,7 @@ package common
import (
"encoding/json"
+
"math/big"
"strings"
"testing"
@@ -149,3 +150,46 @@ func BenchmarkAddressHex(b *testing.B) {
testAddr.Hex()
}
}
+
+func TestMixedcaseAccount_Address(t *testing.T) {
+
+ // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md
+ // Note: 0X{checksum_addr} is not valid according to spec above
+
+ var res []struct {
+ A MixedcaseAddress
+ Valid bool
+ }
+ if err := json.Unmarshal([]byte(`[
+ {"A" : "0xae967917c465db8578ca9024c205720b1a3651A9", "Valid": false},
+ {"A" : "0xAe967917c465db8578ca9024c205720b1a3651A9", "Valid": true},
+ {"A" : "0XAe967917c465db8578ca9024c205720b1a3651A9", "Valid": false},
+ {"A" : "0x1111111111111111111112222222222223333323", "Valid": true}
+ ]`), &res); err != nil {
+ t.Fatal(err)
+ }
+
+ for _, r := range res {
+ if got := r.A.ValidChecksum(); got != r.Valid {
+ t.Errorf("Expected checksum %v, got checksum %v, input %v", r.Valid, got, r.A.String())
+ }
+ }
+
+ //These should throw exceptions:
+ var r2 []MixedcaseAddress
+ for _, r := range []string{
+ `["0x11111111111111111111122222222222233333"]`, // Too short
+ `["0x111111111111111111111222222222222333332"]`, // Too short
+ `["0x11111111111111111111122222222222233333234"]`, // Too long
+ `["0x111111111111111111111222222222222333332344"]`, // Too long
+ `["1111111111111111111112222222222223333323"]`, // Missing 0x
+ `["x1111111111111111111112222222222223333323"]`, // Missing 0
+ `["0xG111111111111111111112222222222223333323"]`, //Non-hex
+ } {
+ if err := json.Unmarshal([]byte(r), &r2); err == nil {
+ t.Errorf("Expected failure, input %v", r)
+ }
+
+ }
+
+}