From 84f2f6c52722d6a591b9e32bd1d5e3fd2efbd0ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matev=C5=BE=20Jekovec?= Date: Thu, 25 Aug 2022 17:42:37 +0200 Subject: [PATCH] cli: Add support for storing oasis and ethereum addresses --- cli/cmd/wallet.go | 55 +++++---- cli/config/wallet.go | 2 +- cli/wallet/address/address.go | 184 +++++++++++++++++++++++++++++++ cli/wallet/file/file.go | 18 ++- cli/wallet/ledger/ledger.go | 8 +- cli/wallet/test/test.go | 5 + cli/wallet/wallet.go | 10 +- client-sdk/go/helpers/address.go | 71 ++++++------ client-sdk/go/testing/testing.go | 3 +- tests/benchmark/go.mod | 11 +- tests/benchmark/go.sum | 12 ++ 11 files changed, 310 insertions(+), 69 deletions(-) create mode 100644 cli/wallet/address/address.go diff --git a/cli/cmd/wallet.go b/cli/cmd/wallet.go index 75eec51332..5ae495d08d 100644 --- a/cli/cmd/wallet.go +++ b/cli/cmd/wallet.go @@ -21,8 +21,8 @@ import ( "github.com/oasisprotocol/oasis-sdk/cli/config" "github.com/oasisprotocol/oasis-sdk/cli/table" "github.com/oasisprotocol/oasis-sdk/cli/wallet" + walletAddress "github.com/oasisprotocol/oasis-sdk/cli/wallet/address" walletFile "github.com/oasisprotocol/oasis-sdk/cli/wallet/file" - "github.com/oasisprotocol/oasis-sdk/client-sdk/go/helpers" ) var ( @@ -104,7 +104,7 @@ var ( name := args[0] acc := common.LoadAccount(config.Global(), name) - showPublicWalletInfo(acc) + showPublicWalletInfo(name, acc) }, } @@ -189,18 +189,21 @@ var ( cobra.CheckErr(fmt.Errorf("account '%s' already exists", name)) } - // NOTE: We only support importing into the file-based wallet for now. - af, err := wallet.Load(walletFile.Kind) - cobra.CheckErr(err) - - // Ask for import kind. + // NOTE: Import is currently supported by file and address account factories. + kindFactory := map[wallet.ImportKind]wallet.Factory{} var supportedKinds []string - for _, kind := range af.SupportedImportKinds() { - supportedKinds = append(supportedKinds, string(kind)) + for _, fk := range []string{walletFile.Kind, walletAddress.Kind} { + f, err := wallet.Load(fk) + cobra.CheckErr(err) + for _, kind := range f.SupportedImportKinds() { + supportedKinds = append(supportedKinds, string(kind)) + kindFactory[kind] = f + } } + // Ask for import kind. var kindRaw string - err = survey.AskOne(&survey.Select{ + err := survey.AskOne(&survey.Select{ Message: "Import kind:", Options: supportedKinds, }, &kindRaw) @@ -210,6 +213,8 @@ var ( err = kind.UnmarshalText([]byte(kindRaw)) cobra.CheckErr(err) + af := kindFactory[kind] + // Ask for wallet configuration. afCfg, err := af.GetConfigFromSurvey(&kind) cobra.CheckErr(err) @@ -218,18 +223,24 @@ var ( var answers struct { Data string } - questions := []*survey.Question{ - { + questions := []*survey.Question{} + if prompt := af.DataPrompt(kind, afCfg); prompt != nil { + questions = append(questions, &survey.Question{ Name: "data", - Prompt: af.DataPrompt(kind, afCfg), + Prompt: prompt, Validate: af.DataValidator(kind, afCfg), }, + ) } + err = survey.Ask(questions, &answers) cobra.CheckErr(err) // Ask for passphrase. - passphrase := common.AskNewPassphrase() + passphrase := "" + if af.RequiresPassphrase() { + passphrase = common.AskNewPassphrase() + } accCfg := &config.Account{ Kind: af.Kind(), @@ -239,7 +250,6 @@ var ( Kind: kind, Data: answers.Data, } - err = cfg.Wallet.Import(name, passphrase, accCfg, src) cobra.CheckErr(err) @@ -258,7 +268,7 @@ var ( fmt.Printf("WARNING: Exporting the account will expose secret key material!\n") acc := common.LoadAccount(config.Global(), name) - showPublicWalletInfo(acc) + showPublicWalletInfo(name, acc) fmt.Printf("Export:\n") fmt.Println(acc.UnsafeExport()) @@ -349,12 +359,15 @@ func (sf *accountEntitySignerFactory) Load( return sf.signer, nil } -func showPublicWalletInfo(wallet wallet.Account) { - fmt.Printf("Public Key: %s\n", wallet.Signer().Public()) - fmt.Printf("Address: %s\n", wallet.Address()) - if wallet.SignatureAddressSpec().Secp256k1Eth != nil { - fmt.Printf("Ethereum address: %s\n", helpers.EthAddressFromPubKey(*wallet.SignatureAddressSpec().Secp256k1Eth)) +func showPublicWalletInfo(name string, wallet wallet.Account) { + fmt.Printf("Name: %s\n", name) + if wallet.Signer() != nil { + fmt.Printf("Public Key: %s\n", wallet.Signer().Public()) + } + if wallet.EthAddress() != nil { + fmt.Printf("Ethereum address: %s\n", wallet.EthAddress().Hex()) } + fmt.Printf("Native address: %s\n", wallet.Address()) } func init() { diff --git a/cli/config/wallet.go b/cli/config/wallet.go index 2d155b46d8..127fdff24e 100644 --- a/cli/config/wallet.go +++ b/cli/config/wallet.go @@ -93,7 +93,7 @@ func (w *Wallet) Load(name string, passphrase string) (wallet.Account, error) { return nil, err } - acc, err := af.Load(name, passphrase, cfg.Config) + acc, err := af.Load(name, passphrase, cfg.Config, cfg.Address) if err != nil { return nil, err } diff --git a/cli/wallet/address/address.go b/cli/wallet/address/address.go new file mode 100644 index 0000000000..449de5db12 --- /dev/null +++ b/cli/wallet/address/address.go @@ -0,0 +1,184 @@ +package address + +import ( + "fmt" + + "github.com/AlecAivazis/survey/v2" + "github.com/mitchellh/mapstructure" + "github.com/oasisprotocol/oasis-sdk/cli/wallet" + "github.com/oasisprotocol/oasis-sdk/client-sdk/go/crypto/signature" + "github.com/oasisprotocol/oasis-sdk/client-sdk/go/helpers" + "github.com/oasisprotocol/oasis-sdk/client-sdk/go/types" + "github.com/spf13/cobra" + flag "github.com/spf13/pflag" + + ethCommon "github.com/ethereum/go-ethereum/common" + coreSignature "github.com/oasisprotocol/oasis-core/go/common/crypto/signature" +) + +const ( + // Kind is the account kind for the test accounts. + Kind = "address" + + // ethAddressCfgKey is an optional key passed in the config files. + ethAddressCfgKey = "eth_address" +) + +type accountConfig struct { + EthAddress string `mapstructure:"eth_address,omitempty"` +} + +type addressAccount struct { + address types.Address + cfg *accountConfig +} + +func newAccount(address types.Address, cfg *accountConfig) (wallet.Account, error) { + return &addressAccount{address: address, cfg: cfg}, nil +} + +type addressAccountFactory struct{} + +func (a *addressAccountFactory) HasConsensusSigner(cfg map[string]interface{}) bool { + return false +} + +func (a *addressAccountFactory) unmarshalConfig(raw map[string]interface{}) (*accountConfig, error) { + if raw == nil { + // No eth_address defined. + return &accountConfig{}, nil + } + + var cfg accountConfig + if err := mapstructure.Decode(raw, &cfg); err != nil { + return nil, err + } + return &cfg, nil +} + +func (a *addressAccountFactory) Create(name string, passphrase string, cfg map[string]interface{}) (wallet.Account, error) { + return nil, fmt.Errorf("address: create not supported") +} + +func (a *addressAccountFactory) Load(_ string, _ string, rawCfg map[string]interface{}, rawAddr string) (wallet.Account, error) { + cfg, err := a.unmarshalConfig(rawCfg) + if err != nil { + return nil, err + } + + addr, _, err := helpers.ResolveEthOrOasisAddress(rawAddr) + if err != nil { + return nil, err + } + + return newAccount(*addr, cfg) +} + +func (a *addressAccountFactory) Remove(name string, cfg map[string]interface{}) error { + return nil +} + +func (a *addressAccountFactory) Rename(old, new string, cfg map[string]interface{}) error { + return nil +} + +func (a *addressAccountFactory) Import(_ string, _ string, cfg map[string]interface{}, src *wallet.ImportSource) (wallet.Account, error) { + addr, ethAddr, err := helpers.ResolveEthOrOasisAddress(src.Data) + if err != nil { + return nil, err + } + + ethAddrHex := "" + if ethAddr != nil { + ethAddrHex = ethAddr.Hex() + cfg[ethAddressCfgKey] = ethAddrHex + } + + return newAccount(*addr, &accountConfig{ + EthAddress: ethAddrHex, + }) +} + +func (a *addressAccountFactory) Kind() string { + return Kind +} + +func (a *addressAccountFactory) PrettyKind(rawCfg map[string]interface{}) string { + if _, ok := rawCfg[ethAddressCfgKey]; ok { + return "address (ethereum)" + } + return "address (native)" +} + +func (a *addressAccountFactory) Flags() *flag.FlagSet { + return nil +} + +func (a *addressAccountFactory) GetConfigFromFlags() (map[string]interface{}, error) { + return map[string]interface{}{}, nil +} + +func (a *addressAccountFactory) GetConfigFromSurvey(_ *wallet.ImportKind) (map[string]interface{}, error) { + return map[string]interface{}{}, nil +} + +func (a *addressAccountFactory) DataPrompt(_ wallet.ImportKind, _ map[string]interface{}) survey.Prompt { + return &survey.Multiline{Message: "Address (bech32 or hex-encoded):"} +} + +func (a *addressAccountFactory) DataValidator(_ wallet.ImportKind, _ map[string]interface{}) survey.Validator { + return func(ans interface{}) error { + if addr, _, err := helpers.ResolveEthOrOasisAddress(ans.(string)); addr == nil { + if err != nil { + return err + } + return fmt.Errorf("unsupported address format") + } + return nil + } +} + +func (a *addressAccountFactory) RequiresPassphrase() bool { + // Address accounts do not require a passphrase. + return false +} + +func (a *addressAccountFactory) SupportedImportKinds() []wallet.ImportKind { + return []wallet.ImportKind{ + wallet.ImportKindAddress, + } +} + +func (a *addressAccount) ConsensusSigner() coreSignature.Signer { + return nil +} + +func (a *addressAccount) Signer() signature.Signer { + return nil +} + +func (a *addressAccount) Address() types.Address { + return a.address +} + +func (a *addressAccount) EthAddress() *ethCommon.Address { + if a.cfg.EthAddress != "" { + _, ethAddr, err := helpers.ResolveEthOrOasisAddress(a.cfg.EthAddress) + cobra.CheckErr(err) + + return ethAddr + } + return nil +} + +func (a *addressAccount) SignatureAddressSpec() types.SignatureAddressSpec { + return types.SignatureAddressSpec{} +} + +func (a *addressAccount) UnsafeExport() string { + return "N/A" +} + +func init() { + wallet.Register(&addressAccountFactory{}) +} diff --git a/cli/wallet/file/file.go b/cli/wallet/file/file.go index 3be1611b26..672d3e4873 100644 --- a/cli/wallet/file/file.go +++ b/cli/wallet/file/file.go @@ -12,10 +12,12 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + ethCommon "github.com/ethereum/go-ethereum/common" "github.com/mitchellh/mapstructure" flag "github.com/spf13/pflag" bip39 "github.com/tyler-smith/go-bip39" "golang.org/x/crypto/argon2" + "golang.org/x/crypto/sha3" "github.com/oasisprotocol/deoxysii" "github.com/oasisprotocol/oasis-core/go/common/crypto/sakg" @@ -373,7 +375,7 @@ func (af *fileAccountFactory) Create(name string, passphrase string, rawCfg map[ return newAccount(state, cfg) } -func (af *fileAccountFactory) Load(name string, passphrase string, rawCfg map[string]interface{}) (wallet.Account, error) { +func (af *fileAccountFactory) Load(name string, passphrase string, rawCfg map[string]interface{}, _ string) (wallet.Account, error) { cfg, err := af.unmarshalConfig(rawCfg) if err != nil { return nil, err @@ -536,6 +538,20 @@ func (a *fileAccount) Address() types.Address { return types.NewAddress(a.SignatureAddressSpec()) } +func (a *fileAccount) EthAddress() *ethCommon.Address { + switch a.cfg.Algorithm { + case wallet.AlgorithmSecp256k1Bip44, wallet.AlgorithmSecp256k1Raw: + h := sha3.NewLegacyKeccak256() + untaggedPk, _ := a.Signer().Public().(secp256k1.PublicKey).MarshalBinaryUncompressedUntagged() + h.Write(untaggedPk) + hash := h.Sum(nil) + addr := ethCommon.BytesToAddress(hash[32-20:]) + return &addr + } + + return nil +} + func (a *fileAccount) SignatureAddressSpec() types.SignatureAddressSpec { switch a.cfg.Algorithm { case wallet.AlgorithmEd25519Adr8, wallet.AlgorithmEd25519Raw: diff --git a/cli/wallet/ledger/ledger.go b/cli/wallet/ledger/ledger.go index 3c7c2785e0..f17b5063be 100644 --- a/cli/wallet/ledger/ledger.go +++ b/cli/wallet/ledger/ledger.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" + ethCommon "github.com/ethereum/go-ethereum/common" "github.com/mitchellh/mapstructure" flag "github.com/spf13/pflag" @@ -109,7 +110,7 @@ func (af *ledgerAccountFactory) Create(name string, passphrase string, rawCfg ma return newAccount(cfg) } -func (af *ledgerAccountFactory) Load(name string, passphrase string, rawCfg map[string]interface{}) (wallet.Account, error) { +func (af *ledgerAccountFactory) Load(name string, passphrase string, rawCfg map[string]interface{}, _ string) (wallet.Account, error) { cfg, err := af.unmarshalConfig(rawCfg) if err != nil { return nil, err @@ -199,6 +200,11 @@ func (a *ledgerAccount) Address() types.Address { return types.NewAddress(a.SignatureAddressSpec()) } +func (a *ledgerAccount) EthAddress() *ethCommon.Address { + // secp256k1 accounts are not supported by Ledger yet. + return nil +} + func (a *ledgerAccount) SignatureAddressSpec() types.SignatureAddressSpec { return types.NewSignatureAddressSpecEd25519(a.signer.Public().(ed25519.PublicKey)) } diff --git a/cli/wallet/test/test.go b/cli/wallet/test/test.go index d31aeab208..c8f8234608 100644 --- a/cli/wallet/test/test.go +++ b/cli/wallet/test/test.go @@ -3,6 +3,7 @@ package test import ( "encoding/base64" + ethCommon "github.com/ethereum/go-ethereum/common" coreSignature "github.com/oasisprotocol/oasis-core/go/common/crypto/signature" "github.com/oasisprotocol/oasis-sdk/cli/wallet" @@ -43,6 +44,10 @@ func (a *testAccount) Address() types.Address { return a.testKey.Address } +func (a *testAccount) EthAddress() *ethCommon.Address { + return &a.testKey.EthAddress +} + func (a *testAccount) SignatureAddressSpec() types.SignatureAddressSpec { return a.testKey.SigSpec } diff --git a/cli/wallet/wallet.go b/cli/wallet/wallet.go index 72ac4bcc47..54ed93bc15 100644 --- a/cli/wallet/wallet.go +++ b/cli/wallet/wallet.go @@ -5,6 +5,7 @@ import ( "sync" "github.com/AlecAivazis/survey/v2" + ethCommon "github.com/ethereum/go-ethereum/common" flag "github.com/spf13/pflag" coreSignature "github.com/oasisprotocol/oasis-core/go/common/crypto/signature" @@ -61,7 +62,7 @@ type Factory interface { Create(name string, passphrase string, cfg map[string]interface{}) (Account, error) // Load loads an existing account. - Load(name string, passphrase string, cfg map[string]interface{}) (Account, error) + Load(name string, passphrase string, cfg map[string]interface{}, addr string) (Account, error) // Remove removes an existing account. Remove(name string, cfg map[string]interface{}) error @@ -80,6 +81,7 @@ type ImportKind string const ( ImportKindMnemonic ImportKind = "mnemonic" ImportKindPrivateKey ImportKind = "private key" + ImportKindAddress ImportKind = "address only" ) // UnmarshalText decodes a text marshalled import kind. @@ -89,6 +91,8 @@ func (k *ImportKind) UnmarshalText(text []byte) error { *k = ImportKindMnemonic case string(ImportKindPrivateKey): *k = ImportKindPrivateKey + case string(ImportKindAddress): + *k = ImportKindAddress default: return fmt.Errorf("unknown import kind: %s", string(text)) } @@ -114,6 +118,9 @@ type Account interface { // Address returns the address associated with the account. Address() types.Address + // EthAddress returns the Ethereum address associated with the account, if any. + EthAddress() *ethCommon.Address + // SignatureAddressSpec returns the signature address specification associated with the account. SignatureAddressSpec() types.SignatureAddressSpec @@ -152,5 +159,6 @@ func ImportKinds() []string { return []string{ string(ImportKindMnemonic), string(ImportKindPrivateKey), + string(ImportKindAddress), } } diff --git a/client-sdk/go/helpers/address.go b/client-sdk/go/helpers/address.go index 836346a9e5..efa13a0ca5 100644 --- a/client-sdk/go/helpers/address.go +++ b/client-sdk/go/helpers/address.go @@ -1,13 +1,12 @@ package helpers import ( - "encoding/hex" "fmt" "strings" - "golang.org/x/crypto/sha3" - + ethCommon "github.com/ethereum/go-ethereum/common" staking "github.com/oasisprotocol/oasis-core/go/staking/api" + "golang.org/x/crypto/sha3" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/config" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/crypto/signature/secp256k1" @@ -30,25 +29,11 @@ const ( // ResolveAddress resolves a string address into the corresponding account address. func ResolveAddress(net *config.Network, address string) (*types.Address, error) { + if addr, _, _ := ResolveEthOrOasisAddress(address); addr != nil { + return addr, nil + } + switch { - case strings.HasPrefix(address, addressPrefixOasis): - // Oasis Bech32 address. - var a types.Address - if err := a.UnmarshalText([]byte(address)); err != nil { - return nil, err - } - return &a, nil - case strings.HasPrefix(address, addressPrefixEth): - // Ethereum address, derive Oasis Bech32 address. - ethAddr, err := hex.DecodeString(address[2:]) - if err != nil { - return nil, fmt.Errorf("malformed Ethereum address: %w", err) - } - if len(ethAddr) != 20 { - return nil, fmt.Errorf("malformed Ethereum address: expected 20 bytes") - } - addr := types.NewAddressRaw(types.AddressV0Secp256k1EthContext, ethAddr) - return &addr, nil case strings.Contains(address, addressExplicitSeparator): subs := strings.SplitN(address, addressExplicitSeparator, 2) switch kind, data := subs[0], subs[1]; kind { @@ -85,6 +70,30 @@ func ResolveAddress(net *config.Network, address string) (*types.Address, error) } } +// ResolveEthOrOasisAddress decodes the given oasis bech32-encoded or ethereum hex-encoded +// address and returns the corresponding ethereum address object and/or account address. +// If the encoding is not valid, returns error. If the format is not known, does nothing. +func ResolveEthOrOasisAddress(address string) (*types.Address, *ethCommon.Address, error) { + switch { + case strings.HasPrefix(address, addressPrefixOasis): + // Oasis Bech32 address. + var a types.Address + if err := a.UnmarshalText([]byte(address)); err != nil { + return nil, nil, err + } + return &a, nil, nil + case strings.HasPrefix(address, addressPrefixEth): + // Ethereum address, derive Oasis Bech32 address. + if !ethCommon.IsHexAddress(address) { + return nil, nil, fmt.Errorf("malformed Ethereum address: %s", address) + } + ethAddr := ethCommon.HexToAddress(address) + addr := types.NewAddressRaw(types.AddressV0Secp256k1EthContext, ethAddr[:]) + return &addr, ðAddr, nil + } + return nil, nil, nil +} + // ParseTestAccountAddress extracts test account name from "test:some_test_account" format or // returns an empty string, if the format doesn't match. func ParseTestAccountAddress(name string) string { @@ -105,23 +114,9 @@ func EthAddressFromPubKey(pk secp256k1.PublicKey) string { untaggedPk, _ := pk.MarshalBinaryUncompressedUntagged() h.Write(untaggedPk) hash := h.Sum(nil) - unchecksummed := hex.EncodeToString(hash[32-20:]) - sha := sha3.NewLegacyKeccak256() - sha.Write([]byte(unchecksummed)) - hash = sha.Sum(nil) + var ethAddress ethCommon.Address + ethAddress.SetBytes(hash[32-20:]) - result := []byte(unchecksummed) - for i := 0; i < len(result); i++ { - hashByte := hash[i/2] - if i%2 == 0 { - hashByte >>= 4 - } else { - hashByte &= 0xf - } - if result[i] > '9' && hashByte > 7 { - result[i] -= 32 - } - } - return fmt.Sprintf("0x%s", string(result)) + return ethAddress.Hex() } diff --git a/client-sdk/go/testing/testing.go b/client-sdk/go/testing/testing.go index e465f2d709..deacd0a244 100644 --- a/client-sdk/go/testing/testing.go +++ b/client-sdk/go/testing/testing.go @@ -3,6 +3,7 @@ package testing import ( "crypto/sha512" + ethCommon "github.com/ethereum/go-ethereum/common" sr25519voi "github.com/oasisprotocol/curve25519-voi/primitives/sr25519" "golang.org/x/crypto/sha3" @@ -24,7 +25,7 @@ type TestKey struct { SigSpec types.SignatureAddressSpec // EthAddress is the corresponding Ethereum address if the key is secp256k1. - EthAddress [20]byte + EthAddress ethCommon.Address } func newEd25519TestKey(seed string) TestKey { diff --git a/tests/benchmark/go.mod b/tests/benchmark/go.mod index 2cc5338685..e4220dd951 100644 --- a/tests/benchmark/go.mod +++ b/tests/benchmark/go.mod @@ -53,6 +53,7 @@ require ( github.com/eapache/channels v1.1.0 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/elastic/gosigar v0.12.0 // indirect + github.com/ethereum/go-ethereum v1.10.19 // indirect github.com/fatih/color v1.13.0 // indirect github.com/flynn/noise v1.0.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect @@ -79,11 +80,11 @@ require ( github.com/hashicorp/go-hclog v1.2.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-plugin v1.4.4 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb // indirect github.com/hpcloud/tail v1.0.0 // indirect - github.com/huin/goupnp v1.0.2 // indirect + github.com/huin/goupnp v1.0.3 // indirect github.com/ianbruene/go-difflib v1.2.0 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/ipfs/go-cid v0.0.7 // indirect @@ -189,7 +190,7 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/stretchr/testify v1.7.4 // indirect github.com/subosito/gotenv v1.3.0 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/tendermint/tendermint v0.34.15 // indirect github.com/tendermint/tm-db v0.6.6 // indirect @@ -202,12 +203,12 @@ require ( go.uber.org/multierr v1.8.0 // indirect go.uber.org/zap v1.21.0 // indirect golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect - golang.org/x/mod v0.5.0 // indirect + golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57 // indirect golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 // indirect golang.org/x/sync v0.0.0-20220513210516-0976fa681c29 // indirect golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect golang.org/x/text v0.3.7 // indirect - golang.org/x/tools v0.1.5 // indirect + golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023 // indirect golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect google.golang.org/grpc/security/advancedtls v0.0.0-20200902210233-8630cac324bf // indirect diff --git a/tests/benchmark/go.sum b/tests/benchmark/go.sum index 11668ddf96..333443bdd4 100644 --- a/tests/benchmark/go.sum +++ b/tests/benchmark/go.sum @@ -214,6 +214,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ethereum/go-ethereum v1.10.19 h1:EOR5JbL4MD5yeOqv8W2iC1s4NximrTjqFccUz8lyBRA= +github.com/ethereum/go-ethereum v1.10.19/go.mod h1:IJBNMtzKcNHPtllYihy6BL2IgK1u+32JriaTbdt4v+w= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= @@ -423,6 +425,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -437,6 +441,8 @@ github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmK github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= +github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/ianbruene/go-difflib v1.2.0 h1:iARmgaCq6nW5QptdoFm0PYAyNGix3xw/xRgEwphJSZw= github.com/ianbruene/go-difflib v1.2.0/go.mod h1:uJbrQ06VPxjRiRIrync+E6VcWFGW2dWqw2gvQp6HQPY= @@ -1029,6 +1035,8 @@ github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= @@ -1180,6 +1188,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0 h1:UG21uOlmZabA4fW5i7ZX6bjw1xELEGg/ZLgZq9auk/Q= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57 h1:LQmS1nU0twXLA96Kt7U9qtHJEbBk3z6Q0V4UXjZkpr4= +golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1444,6 +1454,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023 h1:0c3L82FDQ5rt1bjTBlchS8t6RQ6299/+5bWMnRLh+uI= +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=