Create a home submodule for Eth node bridges- Rename StatusBackend to GethStatusBackend
This commit is contained in:
parent
464c30a430
commit
26b6d7c36a
|
@ -72,3 +72,7 @@ _assets/compose/bootnode/keys
|
||||||
|
|
||||||
# do not vendor nested vendor/ dirs
|
# do not vendor nested vendor/ dirs
|
||||||
vendor/**/vendor
|
vendor/**/vendor
|
||||||
|
|
||||||
|
# Nimbus
|
||||||
|
/vendor/github.com/status-im/nimbus/
|
||||||
|
**/eth-node/bridge/nimbus/libnimbus.*
|
||||||
|
|
|
@ -13,13 +13,12 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/accounts"
|
"github.com/ethereum/go-ethereum/accounts"
|
||||||
"github.com/ethereum/go-ethereum/accounts/keystore"
|
"github.com/ethereum/go-ethereum/accounts/keystore"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
gethcommon "github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/pborman/uuid"
|
"github.com/pborman/uuid"
|
||||||
|
|
||||||
"github.com/status-im/status-go/account/generator"
|
"github.com/status-im/status-go/account/generator"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/extkeys"
|
"github.com/status-im/status-go/extkeys"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// errors
|
// errors
|
||||||
|
@ -158,7 +157,7 @@ func (m *Manager) VerifyAccountPassword(keyStoreDir, address, password string) (
|
||||||
var err error
|
var err error
|
||||||
var foundKeyFile []byte
|
var foundKeyFile []byte
|
||||||
|
|
||||||
addressObj := gethcommon.BytesToAddress(gethcommon.FromHex(address))
|
addressObj := common.BytesToAddress(common.FromHex(address))
|
||||||
checkAccountKey := func(path string, fileInfo os.FileInfo) error {
|
checkAccountKey := func(path string, fileInfo os.FileInfo) error {
|
||||||
if len(foundKeyFile) > 0 || fileInfo.IsDir() {
|
if len(foundKeyFile) > 0 || fileInfo.IsDir() {
|
||||||
return nil
|
return nil
|
||||||
|
@ -176,7 +175,7 @@ func (m *Manager) VerifyAccountPassword(keyStoreDir, address, password string) (
|
||||||
return fmt.Errorf("failed to read key file: %s", e)
|
return fmt.Errorf("failed to read key file: %s", e)
|
||||||
}
|
}
|
||||||
|
|
||||||
if gethcommon.HexToAddress("0x"+accountKey.Address).Hex() == addressObj.Hex() {
|
if common.HexToAddress("0x"+accountKey.Address).Hex() == addressObj.Hex() {
|
||||||
foundKeyFile = rawKeyFile
|
foundKeyFile = rawKeyFile
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -325,7 +324,7 @@ func (m *Manager) ImportSingleExtendedKey(extKey *extkeys.ExtendedKey, password
|
||||||
return address, "", err
|
return address, "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
pubKey = protocol.EncodeHex(crypto.FromECDSAPub(&key.PrivateKey.PublicKey))
|
pubKey = types.EncodeHex(crypto.FromECDSAPub(&key.PrivateKey.PublicKey))
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -349,17 +348,17 @@ func (m *Manager) importExtendedKey(keyPurpose extkeys.KeyPurpose, extKey *extke
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return address, "", err
|
return address, "", err
|
||||||
}
|
}
|
||||||
pubKey = protocol.EncodeHex(crypto.FromECDSAPub(&key.PrivateKey.PublicKey))
|
pubKey = types.EncodeHex(crypto.FromECDSAPub(&key.PrivateKey.PublicKey))
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Accounts returns list of addresses for selected account, including
|
// Accounts returns list of addresses for selected account, including
|
||||||
// subaccounts.
|
// subaccounts.
|
||||||
func (m *Manager) Accounts() ([]gethcommon.Address, error) {
|
func (m *Manager) Accounts() ([]common.Address, error) {
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
defer m.mu.RUnlock()
|
defer m.mu.RUnlock()
|
||||||
addresses := make([]gethcommon.Address, 0)
|
addresses := make([]common.Address, 0)
|
||||||
if m.mainAccountAddress != zeroAddress {
|
if m.mainAccountAddress != zeroAddress {
|
||||||
addresses = append(addresses, m.mainAccountAddress)
|
addresses = append(addresses, m.mainAccountAddress)
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import (
|
||||||
"github.com/status-im/status-go/t/utils"
|
"github.com/status-im/status-go/t/utils"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
gethcommon "github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
|
@ -33,7 +32,7 @@ func TestVerifyAccountPassword(t *testing.T) {
|
||||||
require.NoError(t, utils.ImportTestAccount(keyStoreDir, utils.GetAccount1PKFile()))
|
require.NoError(t, utils.ImportTestAccount(keyStoreDir, utils.GetAccount1PKFile()))
|
||||||
require.NoError(t, utils.ImportTestAccount(keyStoreDir, utils.GetAccount2PKFile()))
|
require.NoError(t, utils.ImportTestAccount(keyStoreDir, utils.GetAccount2PKFile()))
|
||||||
|
|
||||||
account1Address := gethcommon.BytesToAddress(gethcommon.FromHex(utils.TestConfig.Account1.WalletAddress))
|
account1Address := common.BytesToAddress(common.FromHex(utils.TestConfig.Account1.WalletAddress))
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
|
@ -87,7 +86,7 @@ func TestVerifyAccountPassword(t *testing.T) {
|
||||||
if accountKey == nil {
|
if accountKey == nil {
|
||||||
require.Fail(t, "no error reported, but account key is missing")
|
require.Fail(t, "no error reported, but account key is missing")
|
||||||
}
|
}
|
||||||
accountAddress := gethcommon.BytesToAddress(gethcommon.FromHex(testCase.address))
|
accountAddress := common.BytesToAddress(common.FromHex(testCase.address))
|
||||||
if accountKey.Address != accountAddress {
|
if accountKey.Address != accountAddress {
|
||||||
require.Fail(t, "account mismatch: have %s, want %s", accountKey.Address.Hex(), accountAddress.Hex())
|
require.Fail(t, "account mismatch: have %s, want %s", accountKey.Address.Hex(), accountAddress.Hex())
|
||||||
}
|
}
|
||||||
|
@ -109,7 +108,7 @@ func TestVerifyAccountPasswordWithAccountBeforeEIP55(t *testing.T) {
|
||||||
|
|
||||||
accManager := NewManager()
|
accManager := NewManager()
|
||||||
|
|
||||||
address := gethcommon.HexToAddress(utils.TestConfig.Account3.WalletAddress)
|
address := common.HexToAddress(utils.TestConfig.Account3.WalletAddress)
|
||||||
_, err = accManager.VerifyAccountPassword(keyStoreDir, address.Hex(), utils.TestConfig.Account3.Password)
|
_, err = accManager.VerifyAccountPassword(keyStoreDir, address.Hex(), utils.TestConfig.Account3.Password)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ package account
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
func CreateAddress() (address, pubKey, privKey string, err error) {
|
func CreateAddress() (address, pubKey, privKey string, err error) {
|
||||||
|
@ -15,8 +15,8 @@ func CreateAddress() (address, pubKey, privKey string, err error) {
|
||||||
pubKeyBytes := crypto.FromECDSAPub(&key.PublicKey)
|
pubKeyBytes := crypto.FromECDSAPub(&key.PublicKey)
|
||||||
addressBytes := crypto.PubkeyToAddress(key.PublicKey)
|
addressBytes := crypto.PubkeyToAddress(key.PublicKey)
|
||||||
|
|
||||||
privKey = protocol.EncodeHex(privKeyBytes)
|
privKey = types.EncodeHex(privKeyBytes)
|
||||||
pubKey = protocol.EncodeHex(pubKeyBytes)
|
pubKey = types.EncodeHex(pubKeyBytes)
|
||||||
address = addressBytes.Hex()
|
address = addressBytes.Hex()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
|
@ -3,22 +3,21 @@ package account
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
gethcommon "github.com/ethereum/go-ethereum/common"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCreateAddress(t *testing.T) {
|
func TestCreateAddress(t *testing.T) {
|
||||||
addr, pub, priv, err := CreateAddress()
|
addr, pub, priv, err := CreateAddress()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, gethcommon.IsHexAddress(addr), true)
|
require.Equal(t, types.IsHexAddress(addr), true)
|
||||||
|
|
||||||
privECDSA, err := crypto.HexToECDSA(priv[2:])
|
privECDSA, err := crypto.HexToECDSA(priv[2:])
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
pubECDSA := privECDSA.PublicKey
|
pubECDSA := privECDSA.PublicKey
|
||||||
expectedPubStr := hexutil.Encode(crypto.FromECDSAPub(&pubECDSA))
|
expectedPubStr := types.EncodeHex(crypto.FromECDSAPub(&pubECDSA))
|
||||||
|
|
||||||
require.Equal(t, expectedPubStr, pub)
|
require.Equal(t, expectedPubStr, pub)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/extkeys"
|
"github.com/status-im/status-go/extkeys"
|
||||||
statusproto "github.com/status-im/status-go/protocol/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type account struct {
|
type account struct {
|
||||||
|
@ -15,7 +15,7 @@ type account struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *account) toAccountInfo() AccountInfo {
|
func (a *account) toAccountInfo() AccountInfo {
|
||||||
publicKeyHex := statusproto.EncodeHex(crypto.FromECDSAPub(&a.privateKey.PublicKey))
|
publicKeyHex := types.EncodeHex(crypto.FromECDSAPub(&a.privateKey.PublicKey))
|
||||||
addressHex := crypto.PubkeyToAddress(a.privateKey.PublicKey).Hex()
|
addressHex := crypto.PubkeyToAddress(a.privateKey.PublicKey).Hex()
|
||||||
|
|
||||||
return AccountInfo{
|
return AccountInfo{
|
||||||
|
@ -27,7 +27,7 @@ func (a *account) toAccountInfo() AccountInfo {
|
||||||
func (a *account) toIdentifiedAccountInfo(id string) IdentifiedAccountInfo {
|
func (a *account) toIdentifiedAccountInfo(id string) IdentifiedAccountInfo {
|
||||||
info := a.toAccountInfo()
|
info := a.toAccountInfo()
|
||||||
keyUID := sha256.Sum256(crypto.FromECDSAPub(&a.privateKey.PublicKey))
|
keyUID := sha256.Sum256(crypto.FromECDSAPub(&a.privateKey.PublicKey))
|
||||||
keyUIDHex := statusproto.EncodeHex(keyUID[:])
|
keyUIDHex := types.EncodeHex(keyUID[:])
|
||||||
return IdentifiedAccountInfo{
|
return IdentifiedAccountInfo{
|
||||||
AccountInfo: info,
|
AccountInfo: info,
|
||||||
ID: id,
|
ID: id,
|
||||||
|
|
|
@ -6,8 +6,8 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/pborman/uuid"
|
"github.com/pborman/uuid"
|
||||||
"github.com/status-im/status-go/account/generator"
|
"github.com/status-im/status-go/account/generator"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/extkeys"
|
"github.com/status-im/status-go/extkeys"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// OnboardingAccount is returned during onboarding and contains its ID and the mnemonic to re-generate the same account Info keys.
|
// OnboardingAccount is returned during onboarding and contains its ID and the mnemonic to re-generate the same account Info keys.
|
||||||
|
@ -107,7 +107,7 @@ func (o *Onboarding) deriveAccount(masterExtendedKey *extkeys.ExtendedKey, purpo
|
||||||
|
|
||||||
privateKeyECDSA := extendedKey.ToECDSA()
|
privateKeyECDSA := extendedKey.ToECDSA()
|
||||||
address := crypto.PubkeyToAddress(privateKeyECDSA.PublicKey)
|
address := crypto.PubkeyToAddress(privateKeyECDSA.PublicKey)
|
||||||
publicKeyHex := protocol.EncodeHex(crypto.FromECDSAPub(&privateKeyECDSA.PublicKey))
|
publicKeyHex := types.EncodeHex(crypto.FromECDSAPub(&privateKeyECDSA.PublicKey))
|
||||||
|
|
||||||
return address.Hex(), publicKeyHex, nil
|
return address.Hex(), publicKeyHex, nil
|
||||||
}
|
}
|
||||||
|
|
1058
api/backend.go
1058
api/backend.go
File diff suppressed because it is too large
Load Diff
|
@ -23,7 +23,7 @@ const (
|
||||||
|
|
||||||
func TestSubscriptionEthWithParamsDict(t *testing.T) {
|
func TestSubscriptionEthWithParamsDict(t *testing.T) {
|
||||||
// a simple test to check the parameter parsing for eth_* filter subscriptions
|
// a simple test to check the parameter parsing for eth_* filter subscriptions
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
// initNodeAndLogin can fail and terminate the test, in that case stopNode must be executed anyway.
|
// initNodeAndLogin can fail and terminate the test, in that case stopNode must be executed anyway.
|
||||||
defer func() {
|
defer func() {
|
||||||
err := backend.StopNode()
|
err := backend.StopNode()
|
||||||
|
@ -44,7 +44,7 @@ func TestSubscriptionEthWithParamsDict(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSubscriptionPendingTransaction(t *testing.T) {
|
func TestSubscriptionPendingTransaction(t *testing.T) {
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
backend.allowAllRPC = true
|
backend.allowAllRPC = true
|
||||||
defer func() {
|
defer func() {
|
||||||
err := backend.StopNode()
|
err := backend.StopNode()
|
||||||
|
@ -97,7 +97,7 @@ func TestSubscriptionPendingTransaction(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSubscriptionWhisperEnvelopes(t *testing.T) {
|
func TestSubscriptionWhisperEnvelopes(t *testing.T) {
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
defer func() {
|
defer func() {
|
||||||
err := backend.StopNode()
|
err := backend.StopNode()
|
||||||
if err != node.ErrNoRunningNode {
|
if err != node.ErrNoRunningNode {
|
||||||
|
@ -216,7 +216,7 @@ func extractResult(t *testing.T, jsonString string) string {
|
||||||
return value.(string)
|
return value.(string)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createSubscription(t *testing.T, backend *StatusBackend, params string) string {
|
func createSubscription(t *testing.T, backend StatusBackend, params string) string {
|
||||||
createSubFmt := `
|
createSubFmt := `
|
||||||
{
|
{
|
||||||
"jsonrpc": "2.0",
|
"jsonrpc": "2.0",
|
||||||
|
@ -232,7 +232,7 @@ func createSubscription(t *testing.T, backend *StatusBackend, params string) str
|
||||||
return extractResult(t, jsonResponse)
|
return extractResult(t, jsonResponse)
|
||||||
}
|
}
|
||||||
|
|
||||||
func initNodeAndLogin(t *testing.T, backend *StatusBackend) (string, string) {
|
func initNodeAndLogin(t *testing.T, backend *GethStatusBackend) (string, string) {
|
||||||
utils.Init()
|
utils.Init()
|
||||||
|
|
||||||
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
||||||
|
|
|
@ -12,9 +12,9 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/status-im/status-go/account"
|
"github.com/status-im/status-go/account"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/multiaccounts"
|
"github.com/status-im/status-go/multiaccounts"
|
||||||
"github.com/status-im/status-go/multiaccounts/accounts"
|
"github.com/status-im/status-go/multiaccounts/accounts"
|
||||||
"github.com/status-im/status-go/node"
|
"github.com/status-im/status-go/node"
|
||||||
|
@ -30,7 +30,7 @@ import (
|
||||||
func TestBackendStartNodeConcurrently(t *testing.T) {
|
func TestBackendStartNodeConcurrently(t *testing.T) {
|
||||||
utils.Init()
|
utils.Init()
|
||||||
|
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
||||||
|
@ -65,7 +65,7 @@ func TestBackendStartNodeConcurrently(t *testing.T) {
|
||||||
func TestBackendRestartNodeConcurrently(t *testing.T) {
|
func TestBackendRestartNodeConcurrently(t *testing.T) {
|
||||||
utils.Init()
|
utils.Init()
|
||||||
|
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
count := 3
|
count := 3
|
||||||
|
@ -93,7 +93,7 @@ func TestBackendRestartNodeConcurrently(t *testing.T) {
|
||||||
func TestBackendGettersConcurrently(t *testing.T) {
|
func TestBackendGettersConcurrently(t *testing.T) {
|
||||||
utils.Init()
|
utils.Init()
|
||||||
|
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
||||||
|
@ -147,7 +147,7 @@ func TestBackendGettersConcurrently(t *testing.T) {
|
||||||
func TestBackendAccountsConcurrently(t *testing.T) {
|
func TestBackendAccountsConcurrently(t *testing.T) {
|
||||||
utils.Init()
|
utils.Init()
|
||||||
|
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
||||||
|
@ -209,7 +209,7 @@ func TestBackendAccountsConcurrently(t *testing.T) {
|
||||||
func TestBackendInjectChatAccount(t *testing.T) {
|
func TestBackendInjectChatAccount(t *testing.T) {
|
||||||
utils.Init()
|
utils.Init()
|
||||||
|
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
||||||
|
@ -225,7 +225,7 @@ func TestBackendInjectChatAccount(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
chatPrivKeyHex := hex.EncodeToString(crypto.FromECDSA(chatPrivKey))
|
chatPrivKeyHex := hex.EncodeToString(crypto.FromECDSA(chatPrivKey))
|
||||||
chatPubKeyHex := hexutil.Encode(crypto.FromECDSAPub(&chatPrivKey.PublicKey))
|
chatPubKeyHex := types.EncodeHex(crypto.FromECDSAPub(&chatPrivKey.PublicKey))
|
||||||
encryptionPrivKeyHex := hex.EncodeToString(crypto.FromECDSA(encryptionPrivKey))
|
encryptionPrivKeyHex := hex.EncodeToString(crypto.FromECDSA(encryptionPrivKey))
|
||||||
|
|
||||||
whisperService, err := backend.StatusNode().WhisperService()
|
whisperService, err := backend.StatusNode().WhisperService()
|
||||||
|
@ -253,7 +253,7 @@ func TestBackendInjectChatAccount(t *testing.T) {
|
||||||
|
|
||||||
func TestBackendConnectionChangesConcurrently(t *testing.T) {
|
func TestBackendConnectionChangesConcurrently(t *testing.T) {
|
||||||
connections := [...]string{wifi, cellular, unknown}
|
connections := [...]string{wifi, cellular, unknown}
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
count := 3
|
count := 3
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
|
@ -271,7 +271,7 @@ func TestBackendConnectionChangesConcurrently(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBackendConnectionChangesToOffline(t *testing.T) {
|
func TestBackendConnectionChangesToOffline(t *testing.T) {
|
||||||
b := NewStatusBackend()
|
b := NewGethStatusBackend()
|
||||||
b.ConnectionChange(none, false)
|
b.ConnectionChange(none, false)
|
||||||
assert.True(t, b.connectionState.Offline)
|
assert.True(t, b.connectionState.Offline)
|
||||||
|
|
||||||
|
@ -285,7 +285,7 @@ func TestBackendConnectionChangesToOffline(t *testing.T) {
|
||||||
func TestBackendCallRPCConcurrently(t *testing.T) {
|
func TestBackendCallRPCConcurrently(t *testing.T) {
|
||||||
utils.Init()
|
utils.Init()
|
||||||
|
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
||||||
|
@ -327,7 +327,7 @@ func TestBackendCallRPCConcurrently(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAppStateChange(t *testing.T) {
|
func TestAppStateChange(t *testing.T) {
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
|
|
||||||
var testCases = []struct {
|
var testCases = []struct {
|
||||||
name string
|
name string
|
||||||
|
@ -361,7 +361,7 @@ func TestAppStateChange(t *testing.T) {
|
||||||
func TestBlockedRPCMethods(t *testing.T) {
|
func TestBlockedRPCMethods(t *testing.T) {
|
||||||
utils.Init()
|
utils.Init()
|
||||||
|
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
||||||
|
@ -381,7 +381,7 @@ func TestBlockedRPCMethods(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCallRPCWithStoppedNode(t *testing.T) {
|
func TestCallRPCWithStoppedNode(t *testing.T) {
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
|
|
||||||
resp, err := backend.CallRPC(
|
resp, err := backend.CallRPC(
|
||||||
`{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}`,
|
`{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}`,
|
||||||
|
@ -401,7 +401,7 @@ func TestCallRPCWithStoppedNode(t *testing.T) {
|
||||||
func TestStartStopMultipleTimes(t *testing.T) {
|
func TestStartStopMultipleTimes(t *testing.T) {
|
||||||
utils.Init()
|
utils.Init()
|
||||||
|
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
||||||
|
@ -420,7 +420,7 @@ func TestStartStopMultipleTimes(t *testing.T) {
|
||||||
func TestSignHash(t *testing.T) {
|
func TestSignHash(t *testing.T) {
|
||||||
utils.Init()
|
utils.Init()
|
||||||
|
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
||||||
|
@ -460,7 +460,7 @@ func TestSignHash(t *testing.T) {
|
||||||
func TestHashTypedData(t *testing.T) {
|
func TestHashTypedData(t *testing.T) {
|
||||||
utils.Init()
|
utils.Init()
|
||||||
|
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
||||||
|
@ -502,7 +502,7 @@ func TestHashTypedData(t *testing.T) {
|
||||||
|
|
||||||
hash, err := backend.HashTypedData(typed)
|
hash, err := backend.HashTypedData(typed)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.NotEqual(t, common.Hash{}, hash)
|
assert.NotEqual(t, types.Hash{}, hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBackendGetVerifiedAccount(t *testing.T) {
|
func TestBackendGetVerifiedAccount(t *testing.T) {
|
||||||
|
@ -512,9 +512,9 @@ func TestBackendGetVerifiedAccount(t *testing.T) {
|
||||||
tmpdir, err := ioutil.TempDir("", "verified-account-test-")
|
tmpdir, err := ioutil.TempDir("", "verified-account-test-")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer os.Remove(tmpdir)
|
defer os.Remove(tmpdir)
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
backend.UpdateRootDataDir(tmpdir)
|
backend.UpdateRootDataDir(tmpdir)
|
||||||
require.NoError(t, backend.accountManager.InitKeystore(filepath.Join(tmpdir, "keystore")))
|
require.NoError(t, backend.AccountManager().InitKeystore(filepath.Join(tmpdir, "keystore")))
|
||||||
require.NoError(t, backend.ensureAppDBOpened(multiaccounts.Account{Address: common.Address{1, 1, 1}}, password))
|
require.NoError(t, backend.ensureAppDBOpened(multiaccounts.Account{Address: common.Address{1, 1, 1}}, password))
|
||||||
config, err := params.NewNodeConfig(tmpdir, 178733)
|
config, err := params.NewNodeConfig(tmpdir, 178733)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -538,7 +538,7 @@ func TestBackendGetVerifiedAccount(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
address := crypto.PubkeyToAddress(pkey.PublicKey)
|
address := crypto.PubkeyToAddress(pkey.PublicKey)
|
||||||
db := accounts.NewDB(backend.appDB)
|
db := accounts.NewDB(backend.appDB)
|
||||||
_, err = backend.accountManager.ImportAccount(pkey, password)
|
_, err = backend.AccountManager().ImportAccount(pkey, password)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, db.SaveAccounts([]accounts.Account{{Address: address}}))
|
require.NoError(t, db.SaveAccounts([]accounts.Account{{Address: address}}))
|
||||||
key, err := backend.getVerifiedWalletAccount(address.String(), "wrong-password")
|
key, err := backend.getVerifiedWalletAccount(address.String(), "wrong-password")
|
||||||
|
@ -551,7 +551,7 @@ func TestBackendGetVerifiedAccount(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
address := crypto.PubkeyToAddress(pkey.PublicKey)
|
address := crypto.PubkeyToAddress(pkey.PublicKey)
|
||||||
db := accounts.NewDB(backend.appDB)
|
db := accounts.NewDB(backend.appDB)
|
||||||
_, err = backend.accountManager.ImportAccount(pkey, password)
|
_, err = backend.AccountManager().ImportAccount(pkey, password)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, db.SaveAccounts([]accounts.Account{{Address: address}}))
|
require.NoError(t, db.SaveAccounts([]accounts.Account{{Address: address}}))
|
||||||
key, err := backend.getVerifiedWalletAccount(address.String(), password)
|
key, err := backend.getVerifiedWalletAccount(address.String(), password)
|
||||||
|
@ -563,7 +563,7 @@ func TestBackendGetVerifiedAccount(t *testing.T) {
|
||||||
func TestLoginWithKey(t *testing.T) {
|
func TestLoginWithKey(t *testing.T) {
|
||||||
utils.Init()
|
utils.Init()
|
||||||
|
|
||||||
b := NewStatusBackend()
|
b := NewGethStatusBackend()
|
||||||
pkey, err := crypto.GenerateKey()
|
pkey, err := crypto.GenerateKey()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
main := multiaccounts.Account{
|
main := multiaccounts.Account{
|
||||||
|
@ -576,7 +576,7 @@ func TestLoginWithKey(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
keyhex := hex.EncodeToString(crypto.FromECDSA(pkey))
|
keyhex := hex.EncodeToString(crypto.FromECDSA(pkey))
|
||||||
|
|
||||||
require.NoError(t, b.accountManager.InitKeystore(conf.KeyStoreDir))
|
require.NoError(t, b.AccountManager().InitKeystore(conf.KeyStoreDir))
|
||||||
b.UpdateRootDataDir(conf.DataDir)
|
b.UpdateRootDataDir(conf.DataDir)
|
||||||
require.NoError(t, b.OpenAccounts())
|
require.NoError(t, b.OpenAccounts())
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -4,7 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
"github.com/status-im/status-go/params"
|
"github.com/status-im/status-go/params"
|
||||||
"github.com/status-im/status-go/services/personal"
|
"github.com/status-im/status-go/services/personal"
|
||||||
"github.com/status-im/status-go/t/utils"
|
"github.com/status-im/status-go/t/utils"
|
||||||
|
@ -13,7 +13,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestHashMessage(t *testing.T) {
|
func TestHashMessage(t *testing.T) {
|
||||||
backend := NewStatusBackend()
|
backend := NewGethStatusBackend()
|
||||||
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
config, err := utils.MakeTestNodeConfig(params.StatusChainNetworkID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
require.NoError(t, backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
||||||
|
|
|
@ -16,17 +16,15 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/p2p"
|
"github.com/ethereum/go-ethereum/p2p"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enode"
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
"github.com/status-im/status-go/api"
|
"github.com/status-im/status-go/api"
|
||||||
|
gethbridge "github.com/status-im/status-go/eth-node/bridge/geth"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/logutils"
|
"github.com/status-im/status-go/logutils"
|
||||||
"github.com/status-im/status-go/params"
|
"github.com/status-im/status-go/params"
|
||||||
gethbridge "github.com/status-im/status-go/protocol/bridge/geth"
|
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
"github.com/status-im/status-go/rpc"
|
"github.com/status-im/status-go/rpc"
|
||||||
"github.com/status-im/status-go/services/shhext"
|
"github.com/status-im/status-go/services/shhext"
|
||||||
"github.com/status-im/status-go/t/helpers"
|
"github.com/status-im/status-go/t/helpers"
|
||||||
"golang.org/x/crypto/sha3"
|
"golang.org/x/crypto/sha3"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/crypto/ssh/terminal"
|
||||||
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -158,12 +156,12 @@ func verifyMailserverBehavior(mailserverNode *enode.Node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// watch for envelopes to be available in filters in the client
|
// watch for envelopes to be available in filters in the client
|
||||||
envelopeAvailableWatcher := make(chan whispertypes.EnvelopeEvent, 1024)
|
envelopeAvailableWatcher := make(chan types.EnvelopeEvent, 1024)
|
||||||
sub := clientWhisperService.SubscribeEnvelopeEvents(envelopeAvailableWatcher)
|
sub := clientWhisperService.SubscribeEnvelopeEvents(envelopeAvailableWatcher)
|
||||||
defer sub.Unsubscribe()
|
defer sub.Unsubscribe()
|
||||||
|
|
||||||
// watch for mailserver responses in the client
|
// watch for mailserver responses in the client
|
||||||
mailServerResponseWatcher := make(chan whispertypes.EnvelopeEvent, 1024)
|
mailServerResponseWatcher := make(chan types.EnvelopeEvent, 1024)
|
||||||
sub = clientWhisperService.SubscribeEnvelopeEvents(mailServerResponseWatcher)
|
sub = clientWhisperService.SubscribeEnvelopeEvents(mailServerResponseWatcher)
|
||||||
defer sub.Unsubscribe()
|
defer sub.Unsubscribe()
|
||||||
|
|
||||||
|
@ -182,7 +180,7 @@ func verifyMailserverBehavior(mailserverNode *enode.Node) {
|
||||||
logger.Error("Error requesting historic messages from mailserver", "error", err)
|
logger.Error("Error requesting historic messages from mailserver", "error", err)
|
||||||
os.Exit(2)
|
os.Exit(2)
|
||||||
}
|
}
|
||||||
requestID := protocol.BytesToHash(requestIDBytes)
|
requestID := types.BytesToHash(requestIDBytes)
|
||||||
|
|
||||||
// wait for mailserver request sent event
|
// wait for mailserver request sent event
|
||||||
err = waitForMailServerRequestSent(mailServerResponseWatcher, requestID, time.Duration(*timeout)*time.Second)
|
err = waitForMailServerRequestSent(mailServerResponseWatcher, requestID, time.Duration(*timeout)*time.Second)
|
||||||
|
@ -205,7 +203,7 @@ func verifyMailserverBehavior(mailserverNode *enode.Node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// wait for last envelope sent by the mailserver to be available for filters
|
// wait for last envelope sent by the mailserver to be available for filters
|
||||||
err = waitForEnvelopeEvents(envelopeAvailableWatcher, []string{resp.LastEnvelopeHash.String()}, whispertypes.EventEnvelopeAvailable)
|
err = waitForEnvelopeEvents(envelopeAvailableWatcher, []string{resp.LastEnvelopeHash.String()}, types.EventEnvelopeAvailable)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("Error waiting for envelopes to be available to client filter", "error", err)
|
logger.Error("Error waiting for envelopes to be available to client filter", "error", err)
|
||||||
os.Exit(4)
|
os.Exit(4)
|
||||||
|
@ -296,12 +294,12 @@ func whisperConfig(nodeConfig *params.NodeConfig) (*params.NodeConfig, error) {
|
||||||
return nodeConfig, nil
|
return nodeConfig, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func startClientNode() (*api.StatusBackend, error) {
|
func startClientNode() (*api.GethStatusBackend, error) {
|
||||||
config, err := makeNodeConfig()
|
config, err := makeNodeConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
clientBackend := api.NewStatusBackend()
|
clientBackend := api.NewGethStatusBackend()
|
||||||
err = clientBackend.AccountManager().InitKeystore(config.KeyStoreDir)
|
err = clientBackend.AccountManager().InitKeystore(config.KeyStoreDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -313,32 +311,32 @@ func startClientNode() (*api.StatusBackend, error) {
|
||||||
return clientBackend, err
|
return clientBackend, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func joinPublicChat(w whispertypes.Whisper, rpcClient *rpc.Client, name string) (string, whispertypes.TopicType, string, error) {
|
func joinPublicChat(w types.Whisper, rpcClient *rpc.Client, name string) (string, types.TopicType, string, error) {
|
||||||
keyID, err := w.AddSymKeyFromPassword(name)
|
keyID, err := w.AddSymKeyFromPassword(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", whispertypes.TopicType{}, "", err
|
return "", types.TopicType{}, "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
h := sha3.NewLegacyKeccak256()
|
h := sha3.NewLegacyKeccak256()
|
||||||
_, err = h.Write([]byte(name))
|
_, err = h.Write([]byte(name))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", whispertypes.TopicType{}, "", err
|
return "", types.TopicType{}, "", err
|
||||||
}
|
}
|
||||||
fullTopic := h.Sum(nil)
|
fullTopic := h.Sum(nil)
|
||||||
topic := whispertypes.BytesToTopic(fullTopic)
|
topic := types.BytesToTopic(fullTopic)
|
||||||
|
|
||||||
whisperAPI := w.PublicWhisperAPI()
|
whisperAPI := w.PublicWhisperAPI()
|
||||||
filterID, err := whisperAPI.NewMessageFilter(whispertypes.Criteria{SymKeyID: keyID, Topics: []whispertypes.TopicType{topic}})
|
filterID, err := whisperAPI.NewMessageFilter(types.Criteria{SymKeyID: keyID, Topics: []types.TopicType{topic}})
|
||||||
|
|
||||||
return keyID, topic, filterID, err
|
return keyID, topic, filterID, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func waitForMailServerRequestSent(events chan whispertypes.EnvelopeEvent, requestID protocol.Hash, timeout time.Duration) error {
|
func waitForMailServerRequestSent(events chan types.EnvelopeEvent, requestID types.Hash, timeout time.Duration) error {
|
||||||
timeoutTimer := time.NewTimer(timeout)
|
timeoutTimer := time.NewTimer(timeout)
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case event := <-events:
|
case event := <-events:
|
||||||
if event.Hash == requestID && event.Event == whispertypes.EventMailServerRequestSent {
|
if event.Hash == requestID && event.Event == types.EventMailServerRequestSent {
|
||||||
timeoutTimer.Stop()
|
timeoutTimer.Stop()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -348,7 +346,7 @@ func waitForMailServerRequestSent(events chan whispertypes.EnvelopeEvent, reques
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func waitForMailServerResponse(events chan whispertypes.EnvelopeEvent, requestID protocol.Hash, timeout time.Duration) (*whispertypes.MailServerResponse, error) {
|
func waitForMailServerResponse(events chan types.EnvelopeEvent, requestID types.Hash, timeout time.Duration) (*types.MailServerResponse, error) {
|
||||||
timeoutTimer := time.NewTimer(timeout)
|
timeoutTimer := time.NewTimer(timeout)
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
@ -366,25 +364,25 @@ func waitForMailServerResponse(events chan whispertypes.EnvelopeEvent, requestID
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func decodeMailServerResponse(event whispertypes.EnvelopeEvent) (*whispertypes.MailServerResponse, error) {
|
func decodeMailServerResponse(event types.EnvelopeEvent) (*types.MailServerResponse, error) {
|
||||||
switch event.Event {
|
switch event.Event {
|
||||||
case whispertypes.EventMailServerRequestSent:
|
case types.EventMailServerRequestSent:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case whispertypes.EventMailServerRequestCompleted:
|
case types.EventMailServerRequestCompleted:
|
||||||
resp, ok := event.Data.(*whispertypes.MailServerResponse)
|
resp, ok := event.Data.(*types.MailServerResponse)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("failed to convert event to a *MailServerResponse")
|
return nil, errors.New("failed to convert event to a *MailServerResponse")
|
||||||
}
|
}
|
||||||
|
|
||||||
return resp, nil
|
return resp, nil
|
||||||
case whispertypes.EventMailServerRequestExpired:
|
case types.EventMailServerRequestExpired:
|
||||||
return nil, errors.New("no messages available from mailserver")
|
return nil, errors.New("no messages available from mailserver")
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unexpected event type: %v", event.Event)
|
return nil, fmt.Errorf("unexpected event type: %v", event.Event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func waitForEnvelopeEvents(events chan whispertypes.EnvelopeEvent, hashes []string, event whispertypes.EventType) error {
|
func waitForEnvelopeEvents(events chan types.EnvelopeEvent, hashes []string, event types.EventType) error {
|
||||||
check := make(map[string]struct{})
|
check := make(map[string]struct{})
|
||||||
for _, hash := range hashes {
|
for _, hash := range hashes {
|
||||||
check[hash] = struct{}{}
|
check[hash] = struct{}{}
|
||||||
|
@ -408,7 +406,7 @@ func waitForEnvelopeEvents(events chan whispertypes.EnvelopeEvent, hashes []stri
|
||||||
}
|
}
|
||||||
|
|
||||||
// helper for checking LastEnvelopeHash
|
// helper for checking LastEnvelopeHash
|
||||||
func isEmptyEnvelope(hash protocol.Hash) bool {
|
func isEmptyEnvelope(hash types.Hash) bool {
|
||||||
for _, b := range hash {
|
for _, b := range hash {
|
||||||
if b != 0 {
|
if b != 0 {
|
||||||
return false
|
return false
|
||||||
|
|
|
@ -125,7 +125,7 @@ func main() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
backend := api.NewStatusBackend()
|
backend := api.NewGethStatusBackend()
|
||||||
err = backend.AccountManager().InitKeystore(config.KeyStoreDir)
|
err = backend.AccountManager().InitKeystore(config.KeyStoreDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("Failed to init keystore", "error", err)
|
logger.Error("Failed to init keystore", "error", err)
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
package crypto
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/ecdsa"
|
|
||||||
"encoding/hex"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Sign signs the hash of an arbitrary string
|
|
||||||
func Sign(content string, identity *ecdsa.PrivateKey) (string, error) {
|
|
||||||
signature, err := crypto.Sign(crypto.Keccak256([]byte(content)), identity)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
return hex.EncodeToString(signature), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// VerifySignatures verifys tuples of signatures content/hash/public key
|
|
||||||
func VerifySignatures(signaturePairs [][3]string) error {
|
|
||||||
for _, signaturePair := range signaturePairs {
|
|
||||||
content := crypto.Keccak256([]byte(signaturePair[0]))
|
|
||||||
|
|
||||||
signature, err := hex.DecodeString(signaturePair[1])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
publicKeyBytes, err := hex.DecodeString(signaturePair[2])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
publicKey, err := crypto.UnmarshalPubkey(publicKeyBytes)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
recoveredKey, err := crypto.SigToPub(
|
|
||||||
content,
|
|
||||||
signature,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if crypto.PubkeyToAddress(*recoveredKey) != crypto.PubkeyToAddress(*publicKey) {
|
|
||||||
return errors.New("identity key and signature mismatch")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExtractSignatures extract from tuples of signatures content a public key
|
|
||||||
func ExtractSignatures(signaturePairs [][2]string) ([]string, error) {
|
|
||||||
response := make([]string, len(signaturePairs))
|
|
||||||
for i, signaturePair := range signaturePairs {
|
|
||||||
content := crypto.Keccak256([]byte(signaturePair[0]))
|
|
||||||
|
|
||||||
signature, err := hex.DecodeString(signaturePair[1])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
recoveredKey, err := crypto.SigToPub(
|
|
||||||
content,
|
|
||||||
signature,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
response[i] = fmt.Sprintf("%x", crypto.FromECDSAPub(recoveredKey))
|
|
||||||
}
|
|
||||||
|
|
||||||
return response, nil
|
|
||||||
}
|
|
|
@ -1,100 +0,0 @@
|
||||||
package crypto
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/hex"
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestExtractSignatures(t *testing.T) {
|
|
||||||
const content1 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35441"
|
|
||||||
const content2 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35440"
|
|
||||||
|
|
||||||
key1, err := crypto.GenerateKey()
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
key2, err := crypto.GenerateKey()
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
signature1, err := Sign(content1, key1)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
signature2, err := Sign(content2, key2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
key1String := hex.EncodeToString(crypto.FromECDSAPub(&key1.PublicKey))
|
|
||||||
key2String := hex.EncodeToString(crypto.FromECDSAPub(&key2.PublicKey))
|
|
||||||
|
|
||||||
pair1 := [2]string{content1, signature1}
|
|
||||||
pair2 := [2]string{content2, signature2}
|
|
||||||
|
|
||||||
signaturePairs := [][2]string{pair1, pair2}
|
|
||||||
|
|
||||||
extractedSignatures, err := ExtractSignatures(signaturePairs)
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.Equal(t, []string{key1String, key2String}, extractedSignatures)
|
|
||||||
|
|
||||||
// Test wrong content
|
|
||||||
pair3 := [2]string{content1, signature2}
|
|
||||||
|
|
||||||
signaturePairs = [][2]string{pair1, pair2, pair3}
|
|
||||||
|
|
||||||
extractedSignatures, err = ExtractSignatures(signaturePairs)
|
|
||||||
require.NoError(t, err)
|
|
||||||
// The public key is neither the one which generated the content, nor the one generated the signature
|
|
||||||
require.NotEqual(t, []string{key1String, key2String, key1String}, extractedSignatures)
|
|
||||||
require.NotEqual(t, []string{key1String, key2String, key2String}, extractedSignatures)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestVerifySignature(t *testing.T) {
|
|
||||||
const content1 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35441"
|
|
||||||
const content2 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35440"
|
|
||||||
|
|
||||||
key1, err := crypto.GenerateKey()
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
key2, err := crypto.GenerateKey()
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
signature1, err := Sign(content1, key1)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
signature2, err := Sign(content2, key2)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
key1String := hex.EncodeToString(crypto.FromECDSAPub(&key1.PublicKey))
|
|
||||||
key2String := hex.EncodeToString(crypto.FromECDSAPub(&key2.PublicKey))
|
|
||||||
|
|
||||||
pair1 := [3]string{content1, signature1, key1String}
|
|
||||||
pair2 := [3]string{content2, signature2, key2String}
|
|
||||||
|
|
||||||
signaturePairs := [][3]string{pair1, pair2}
|
|
||||||
|
|
||||||
err = VerifySignatures(signaturePairs)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
// Test wrong content
|
|
||||||
pair3 := [3]string{content1, signature2, key2String}
|
|
||||||
|
|
||||||
signaturePairs = [][3]string{pair1, pair2, pair3}
|
|
||||||
|
|
||||||
err = VerifySignatures(signaturePairs)
|
|
||||||
require.Error(t, err)
|
|
||||||
|
|
||||||
// Test wrong signature
|
|
||||||
pair3 = [3]string{content1, signature2, key1String}
|
|
||||||
|
|
||||||
signaturePairs = [][3]string{pair1, pair2, pair3}
|
|
||||||
|
|
||||||
err = VerifySignatures(signaturePairs)
|
|
||||||
require.Error(t, err)
|
|
||||||
|
|
||||||
// Test wrong pubkey
|
|
||||||
pair3 = [3]string{content1, signature1, key2String}
|
|
||||||
|
|
||||||
signaturePairs = [][3]string{pair1, pair2, pair3}
|
|
||||||
|
|
||||||
err = VerifySignatures(signaturePairs)
|
|
||||||
require.Error(t, err)
|
|
||||||
}
|
|
|
@ -6,8 +6,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
"github.com/syndtr/goleveldb/leveldb/util"
|
"github.com/syndtr/goleveldb/leveldb/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -26,7 +25,7 @@ type DB interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TopicHistoryKey defines bytes that are used as unique key for TopicHistory.
|
// TopicHistoryKey defines bytes that are used as unique key for TopicHistory.
|
||||||
// first 4 bytes are whispertypes.TopicType bytes
|
// first 4 bytes are types.TopicType bytes
|
||||||
// next 8 bytes are time.Duration encoded in big endian notation.
|
// next 8 bytes are time.Duration encoded in big endian notation.
|
||||||
type TopicHistoryKey [12]byte
|
type TopicHistoryKey [12]byte
|
||||||
|
|
||||||
|
@ -36,7 +35,7 @@ func LoadTopicHistoryFromKey(db DB, key TopicHistoryKey) (th TopicHistory, err e
|
||||||
if (key == TopicHistoryKey{}) {
|
if (key == TopicHistoryKey{}) {
|
||||||
return th, ErrEmptyKey
|
return th, ErrEmptyKey
|
||||||
}
|
}
|
||||||
topic := whispertypes.TopicType{}
|
topic := types.TopicType{}
|
||||||
copy(topic[:], key[:4])
|
copy(topic[:], key[:4])
|
||||||
duration := binary.BigEndian.Uint64(key[4:])
|
duration := binary.BigEndian.Uint64(key[4:])
|
||||||
th = TopicHistory{db: db, Topic: topic, Duration: time.Duration(duration)}
|
th = TopicHistory{db: db, Topic: topic, Duration: time.Duration(duration)}
|
||||||
|
@ -47,7 +46,7 @@ func LoadTopicHistoryFromKey(db DB, key TopicHistoryKey) (th TopicHistory, err e
|
||||||
type TopicHistory struct {
|
type TopicHistory struct {
|
||||||
db DB
|
db DB
|
||||||
// whisper topic
|
// whisper topic
|
||||||
Topic whispertypes.TopicType
|
Topic types.TopicType
|
||||||
|
|
||||||
Duration time.Duration
|
Duration time.Duration
|
||||||
// Timestamp that was used for the first request with this topic.
|
// Timestamp that was used for the first request with this topic.
|
||||||
|
@ -57,7 +56,7 @@ type TopicHistory struct {
|
||||||
Current time.Time
|
Current time.Time
|
||||||
End time.Time
|
End time.Time
|
||||||
|
|
||||||
RequestID protocol.Hash
|
RequestID types.Hash
|
||||||
}
|
}
|
||||||
|
|
||||||
// Key returns unique identifier for this TopicHistory.
|
// Key returns unique identifier for this TopicHistory.
|
||||||
|
@ -115,7 +114,7 @@ func (t TopicHistory) SameRange(other TopicHistory) bool {
|
||||||
|
|
||||||
// Pending returns true if this topic was requested from a mail server.
|
// Pending returns true if this topic was requested from a mail server.
|
||||||
func (t TopicHistory) Pending() bool {
|
func (t TopicHistory) Pending() bool {
|
||||||
return t.RequestID != protocol.Hash{}
|
return t.RequestID != types.Hash{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// HistoryRequest is kept in the database while request is in the progress.
|
// HistoryRequest is kept in the database while request is in the progress.
|
||||||
|
@ -127,7 +126,7 @@ type HistoryRequest struct {
|
||||||
histories []TopicHistory
|
histories []TopicHistory
|
||||||
|
|
||||||
// Generated ID
|
// Generated ID
|
||||||
ID protocol.Hash
|
ID types.Hash
|
||||||
// List of the topics
|
// List of the topics
|
||||||
TopicHistoryKeys []TopicHistoryKey
|
TopicHistoryKeys []TopicHistoryKey
|
||||||
}
|
}
|
||||||
|
@ -167,8 +166,8 @@ func (req HistoryRequest) Save() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replace saves request with new ID and all data attached to the old one.
|
// Replace saves request with new ID and all data attached to the old one.
|
||||||
func (req HistoryRequest) Replace(id protocol.Hash) error {
|
func (req HistoryRequest) Replace(id types.Hash) error {
|
||||||
if (req.ID != protocol.Hash{}) {
|
if (req.ID != types.Hash{}) {
|
||||||
if err := req.Delete(); err != nil {
|
if err := req.Delete(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,7 @@ package db
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
"github.com/syndtr/goleveldb/leveldb/errors"
|
"github.com/syndtr/goleveldb/leveldb/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -24,7 +23,7 @@ type HistoryStore struct {
|
||||||
|
|
||||||
// GetHistory creates history instance and loads history from database.
|
// GetHistory creates history instance and loads history from database.
|
||||||
// Returns instance populated with topic and duration if history is not found in database.
|
// Returns instance populated with topic and duration if history is not found in database.
|
||||||
func (h HistoryStore) GetHistory(topic whispertypes.TopicType, duration time.Duration) (TopicHistory, error) {
|
func (h HistoryStore) GetHistory(topic types.TopicType, duration time.Duration) (TopicHistory, error) {
|
||||||
thist := h.NewHistory(topic, duration)
|
thist := h.NewHistory(topic, duration)
|
||||||
err := thist.Load()
|
err := thist.Load()
|
||||||
if err != nil && err != errors.ErrNotFound {
|
if err != nil && err != errors.ErrNotFound {
|
||||||
|
@ -39,12 +38,12 @@ func (h HistoryStore) NewRequest() HistoryRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHistory creates TopicHistory object with required values.
|
// NewHistory creates TopicHistory object with required values.
|
||||||
func (h HistoryStore) NewHistory(topic whispertypes.TopicType, duration time.Duration) TopicHistory {
|
func (h HistoryStore) NewHistory(topic types.TopicType, duration time.Duration) TopicHistory {
|
||||||
return TopicHistory{db: h.topicDB, Duration: duration, Topic: topic}
|
return TopicHistory{db: h.topicDB, Duration: duration, Topic: topic}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRequest loads HistoryRequest from database.
|
// GetRequest loads HistoryRequest from database.
|
||||||
func (h HistoryStore) GetRequest(id protocol.Hash) (HistoryRequest, error) {
|
func (h HistoryStore) GetRequest(id types.Hash) (HistoryRequest, error) {
|
||||||
req := HistoryRequest{requestDB: h.requestDB, topicDB: h.topicDB, ID: id}
|
req := HistoryRequest{requestDB: h.requestDB, topicDB: h.topicDB, ID: id}
|
||||||
err := req.Load()
|
err := req.Load()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -74,7 +73,7 @@ func (h HistoryStore) GetAllRequests() ([]HistoryRequest, error) {
|
||||||
// GetHistoriesByTopic returns all histories with a given topic.
|
// GetHistoriesByTopic returns all histories with a given topic.
|
||||||
// This is needed when we will have multiple range per single topic.
|
// This is needed when we will have multiple range per single topic.
|
||||||
// TODO explain
|
// TODO explain
|
||||||
func (h HistoryStore) GetHistoriesByTopic(topic whispertypes.TopicType) ([]TopicHistory, error) {
|
func (h HistoryStore) GetHistoriesByTopic(topic types.TopicType) ([]TopicHistory, error) {
|
||||||
rst := []TopicHistory{}
|
rst := []TopicHistory{}
|
||||||
iter := h.topicDB.NewIterator(h.topicDB.Range(topic[:], nil))
|
iter := h.topicDB.NewIterator(h.topicDB.Range(topic[:], nil))
|
||||||
for iter.Next() {
|
for iter.Next() {
|
||||||
|
|
|
@ -4,8 +4,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -16,7 +15,7 @@ func createInMemStore(t *testing.T) HistoryStore {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetNewHistory(t *testing.T) {
|
func TestGetNewHistory(t *testing.T) {
|
||||||
topic := whispertypes.TopicType{1}
|
topic := types.TopicType{1}
|
||||||
duration := time.Hour
|
duration := time.Hour
|
||||||
store := createInMemStore(t)
|
store := createInMemStore(t)
|
||||||
th, err := store.GetHistory(topic, duration)
|
th, err := store.GetHistory(topic, duration)
|
||||||
|
@ -26,7 +25,7 @@ func TestGetNewHistory(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetExistingHistory(t *testing.T) {
|
func TestGetExistingHistory(t *testing.T) {
|
||||||
topic := whispertypes.TopicType{1}
|
topic := types.TopicType{1}
|
||||||
duration := time.Hour
|
duration := time.Hour
|
||||||
store := createInMemStore(t)
|
store := createInMemStore(t)
|
||||||
th, err := store.GetHistory(topic, duration)
|
th, err := store.GetHistory(topic, duration)
|
||||||
|
@ -43,13 +42,13 @@ func TestGetExistingHistory(t *testing.T) {
|
||||||
|
|
||||||
func TestNewHistoryRequest(t *testing.T) {
|
func TestNewHistoryRequest(t *testing.T) {
|
||||||
store := createInMemStore(t)
|
store := createInMemStore(t)
|
||||||
id := protocol.Hash{1}
|
id := types.Hash{1}
|
||||||
req, err := store.GetRequest(id)
|
req, err := store.GetRequest(id)
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
req = store.NewRequest()
|
req = store.NewRequest()
|
||||||
req.ID = id
|
req.ID = id
|
||||||
|
|
||||||
th, err := store.GetHistory(whispertypes.TopicType{1}, time.Hour)
|
th, err := store.GetHistory(types.TopicType{1}, time.Hour)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
req.AddHistory(th)
|
req.AddHistory(th)
|
||||||
require.NoError(t, req.Save())
|
require.NoError(t, req.Save())
|
||||||
|
@ -61,8 +60,8 @@ func TestNewHistoryRequest(t *testing.T) {
|
||||||
|
|
||||||
func TestGetAllRequests(t *testing.T) {
|
func TestGetAllRequests(t *testing.T) {
|
||||||
store := createInMemStore(t)
|
store := createInMemStore(t)
|
||||||
idOne := protocol.Hash{1}
|
idOne := types.Hash{1}
|
||||||
idTwo := protocol.Hash{2}
|
idTwo := types.Hash{2}
|
||||||
|
|
||||||
req := store.NewRequest()
|
req := store.NewRequest()
|
||||||
req.ID = idOne
|
req.ID = idOne
|
||||||
|
|
|
@ -4,8 +4,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -14,7 +13,7 @@ func TestTopicHistoryStoreLoadFromKey(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
th := TopicHistory{
|
th := TopicHistory{
|
||||||
db: db,
|
db: db,
|
||||||
Topic: whispertypes.TopicType{1, 1, 1},
|
Topic: types.TopicType{1, 1, 1},
|
||||||
Duration: 10 * time.Hour,
|
Duration: 10 * time.Hour,
|
||||||
}
|
}
|
||||||
require.NoError(t, th.Save())
|
require.NoError(t, th.Save())
|
||||||
|
@ -71,7 +70,7 @@ func TestTopicHistorySameRange(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAddHistory(t *testing.T) {
|
func TestAddHistory(t *testing.T) {
|
||||||
topic := whispertypes.TopicType{1, 1, 1}
|
topic := types.TopicType{1, 1, 1}
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
|
|
||||||
topicdb, err := NewMemoryDBNamespace(TopicHistoryBucket)
|
topicdb, err := NewMemoryDBNamespace(TopicHistoryBucket)
|
||||||
|
@ -80,7 +79,7 @@ func TestAddHistory(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
th := TopicHistory{db: topicdb, Topic: topic, Current: now}
|
th := TopicHistory{db: topicdb, Topic: topic, Current: now}
|
||||||
id := protocol.Hash{1}
|
id := types.Hash{1}
|
||||||
|
|
||||||
req := HistoryRequest{requestDB: requestdb, topicDB: topicdb, ID: id}
|
req := HistoryRequest{requestDB: requestdb, topicDB: topicdb, ID: id}
|
||||||
req.AddHistory(th)
|
req.AddHistory(th)
|
||||||
|
@ -94,8 +93,8 @@ func TestAddHistory(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRequestIncludesMethod(t *testing.T) {
|
func TestRequestIncludesMethod(t *testing.T) {
|
||||||
topicOne := whispertypes.TopicType{1}
|
topicOne := types.TopicType{1}
|
||||||
topicTwo := whispertypes.TopicType{2}
|
topicTwo := types.TopicType{2}
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
description string
|
description string
|
||||||
result bool
|
result bool
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
GO111MODULE = on
|
||||||
|
|
||||||
|
ENABLE_METRICS ?= true
|
||||||
|
BUILD_FLAGS ?= $(shell echo "-ldflags '\
|
||||||
|
-X github.com/status-im/status-go/eth-node/vendor/github.com/ethereum/go-ethereum/metrics.EnabledStr=$(ENABLE_METRICS)'")
|
||||||
|
|
||||||
|
test:
|
||||||
|
go test ./...
|
||||||
|
.PHONY: test
|
||||||
|
|
||||||
|
lint:
|
||||||
|
golangci-lint run -v
|
||||||
|
.PHONY: lint
|
||||||
|
|
||||||
|
install-linter:
|
||||||
|
# install linter
|
||||||
|
curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.21.0
|
||||||
|
.PHONY: install-linter
|
|
@ -0,0 +1,9 @@
|
||||||
|
# Status abstractions for Ethereum node implementations
|
||||||
|
|
||||||
|
## What is eth-node?
|
||||||
|
|
||||||
|
eth-node is a low-level project that implements crypto routines, Ethereum node abstractions and types that are useful for status-go/protocol and status-go
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[Mozilla Public License 2.0](https://github.com/status-im/status-go/blob/develop/LICENSE.md)
|
|
@ -3,15 +3,16 @@ package ens
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"crypto/ecdsa"
|
|
||||||
"crypto/elliptic"
|
"crypto/elliptic"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/ethereum/go-ethereum/ethclient"
|
|
||||||
ens "github.com/wealdtech/go-ens/v3"
|
|
||||||
"go.uber.org/zap"
|
|
||||||
"math/big"
|
"math/big"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/ethclient"
|
||||||
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
|
enstypes "github.com/status-im/status-go/eth-node/types/ens"
|
||||||
|
ens "github.com/wealdtech/go-ens/v3"
|
||||||
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -22,29 +23,16 @@ type ENSVerifier struct {
|
||||||
logger *zap.Logger
|
logger *zap.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
type ENSDetails struct {
|
// NewVerifier returns a ENSVerifier attached to the specified logger
|
||||||
Name string `json:"name"`
|
|
||||||
PublicKeyString string `json:"publicKey"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type ENSResponse struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
Verified bool `json:"verified"`
|
|
||||||
VerifiedAt int64 `json:"verifiedAt"`
|
|
||||||
Error error `json:"error"`
|
|
||||||
PublicKey *ecdsa.PublicKey `json:"-"`
|
|
||||||
PublicKeyString string `json:"publicKey"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewVerifier(logger *zap.Logger) *ENSVerifier {
|
func NewVerifier(logger *zap.Logger) *ENSVerifier {
|
||||||
return &ENSVerifier{logger: logger}
|
return &ENSVerifier{logger: logger}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ENSVerifier) verifyENSName(ensInfo ENSDetails, ethclient *ethclient.Client) ENSResponse {
|
func (m *ENSVerifier) verifyENSName(ensInfo enstypes.ENSDetails, ethclient *ethclient.Client) enstypes.ENSResponse {
|
||||||
publicKeyStr := ensInfo.PublicKeyString
|
publicKeyStr := ensInfo.PublicKeyString
|
||||||
ensName := ensInfo.Name
|
ensName := ensInfo.Name
|
||||||
m.logger.Info("Resolving ENS name", zap.String("name", ensName), zap.String("publicKey", publicKeyStr))
|
m.logger.Info("Resolving ENS name", zap.String("name", ensName), zap.String("publicKey", publicKeyStr))
|
||||||
response := ENSResponse{
|
response := enstypes.ENSResponse{
|
||||||
Name: ensName,
|
Name: ensName,
|
||||||
PublicKeyString: publicKeyStr,
|
PublicKeyString: publicKeyStr,
|
||||||
VerifiedAt: time.Now().Unix(),
|
VerifiedAt: time.Now().Unix(),
|
||||||
|
@ -85,12 +73,12 @@ func (m *ENSVerifier) verifyENSName(ensInfo ENSDetails, ethclient *ethclient.Cli
|
||||||
}
|
}
|
||||||
|
|
||||||
// CheckBatch verifies that a registered ENS name matches the expected public key
|
// CheckBatch verifies that a registered ENS name matches the expected public key
|
||||||
func (m *ENSVerifier) CheckBatch(ensDetails []ENSDetails, rpcEndpoint, contractAddress string) (map[string]ENSResponse, error) {
|
func (m *ENSVerifier) CheckBatch(ensDetails []enstypes.ENSDetails, rpcEndpoint, contractAddress string) (map[string]enstypes.ENSResponse, error) {
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), contractQueryTimeout)
|
ctx, cancel := context.WithTimeout(context.Background(), contractQueryTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
ch := make(chan ENSResponse)
|
ch := make(chan enstypes.ENSResponse)
|
||||||
response := make(map[string]ENSResponse)
|
response := make(map[string]enstypes.ENSResponse)
|
||||||
|
|
||||||
ethclient, err := ethclient.DialContext(ctx, rpcEndpoint)
|
ethclient, err := ethclient.DialContext(ctx, rpcEndpoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -98,7 +86,7 @@ func (m *ENSVerifier) CheckBatch(ensDetails []ENSDetails, rpcEndpoint, contractA
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, ensInfo := range ensDetails {
|
for _, ensInfo := range ensDetails {
|
||||||
go func(info ENSDetails) { ch <- m.verifyENSName(info, ethclient) }(ensInfo)
|
go func(info enstypes.ENSDetails) { ch <- m.verifyENSName(info, ethclient) }(ensInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
for range ensDetails {
|
for range ensDetails {
|
|
@ -1,8 +1,7 @@
|
||||||
package gethbridge
|
package gethbridge
|
||||||
|
|
||||||
import (
|
import (
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -10,20 +9,20 @@ type gethEnvelopeWrapper struct {
|
||||||
envelope *whisper.Envelope
|
envelope *whisper.Envelope
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGethEnvelopeWrapper returns an object that wraps Geth's Envelope in a whispertypes interface
|
// NewGethEnvelopeWrapper returns an object that wraps Geth's Envelope in a types interface
|
||||||
func NewGethEnvelopeWrapper(e *whisper.Envelope) whispertypes.Envelope {
|
func NewGethEnvelopeWrapper(e *whisper.Envelope) types.Envelope {
|
||||||
return &gethEnvelopeWrapper{
|
return &gethEnvelopeWrapper{
|
||||||
envelope: e,
|
envelope: e,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetGethEnvelopeFrom retrieves the underlying whisper Envelope struct from a wrapped Envelope interface
|
// GetGethEnvelopeFrom retrieves the underlying whisper Envelope struct from a wrapped Envelope interface
|
||||||
func GetGethEnvelopeFrom(f whispertypes.Envelope) *whisper.Envelope {
|
func GetGethEnvelopeFrom(f types.Envelope) *whisper.Envelope {
|
||||||
return f.(*gethEnvelopeWrapper).envelope
|
return f.(*gethEnvelopeWrapper).envelope
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *gethEnvelopeWrapper) Hash() protocol.Hash {
|
func (w *gethEnvelopeWrapper) Hash() types.Hash {
|
||||||
return protocol.Hash(w.envelope.Hash())
|
return types.Hash(w.envelope.Hash())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *gethEnvelopeWrapper) Bloom() []byte {
|
func (w *gethEnvelopeWrapper) Bloom() []byte {
|
|
@ -0,0 +1,29 @@
|
||||||
|
package gethbridge
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewGethEnvelopeErrorWrapper returns a types.EnvelopeError object that mimics Geth's EnvelopeError
|
||||||
|
func NewGethEnvelopeErrorWrapper(envelopeError *whisper.EnvelopeError) *types.EnvelopeError {
|
||||||
|
if envelopeError == nil {
|
||||||
|
panic("envelopeError should not be nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
return &types.EnvelopeError{
|
||||||
|
Hash: types.Hash(envelopeError.Hash),
|
||||||
|
Code: mapGethErrorCode(envelopeError.Code),
|
||||||
|
Description: envelopeError.Description,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func mapGethErrorCode(code uint) uint {
|
||||||
|
switch code {
|
||||||
|
case whisper.EnvelopeTimeNotSynced:
|
||||||
|
return types.EnvelopeTimeNotSynced
|
||||||
|
case whisper.EnvelopeOtherError:
|
||||||
|
return types.EnvelopeOtherError
|
||||||
|
}
|
||||||
|
return types.EnvelopeOtherError
|
||||||
|
}
|
|
@ -1,13 +1,12 @@
|
||||||
package gethbridge
|
package gethbridge
|
||||||
|
|
||||||
import (
|
import (
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewGethEnvelopeEventWrapper returns a whispertypes.EnvelopeEvent object that mimics Geth's EnvelopeEvent
|
// NewGethEnvelopeEventWrapper returns a types.EnvelopeEvent object that mimics Geth's EnvelopeEvent
|
||||||
func NewGethEnvelopeEventWrapper(envelopeEvent *whisper.EnvelopeEvent) *whispertypes.EnvelopeEvent {
|
func NewGethEnvelopeEventWrapper(envelopeEvent *whisper.EnvelopeEvent) *types.EnvelopeEvent {
|
||||||
if envelopeEvent == nil {
|
if envelopeEvent == nil {
|
||||||
panic("envelopeEvent should not be nil")
|
panic("envelopeEvent should not be nil")
|
||||||
}
|
}
|
||||||
|
@ -15,7 +14,7 @@ func NewGethEnvelopeEventWrapper(envelopeEvent *whisper.EnvelopeEvent) *whispert
|
||||||
wrappedData := envelopeEvent.Data
|
wrappedData := envelopeEvent.Data
|
||||||
switch data := envelopeEvent.Data.(type) {
|
switch data := envelopeEvent.Data.(type) {
|
||||||
case []whisper.EnvelopeError:
|
case []whisper.EnvelopeError:
|
||||||
wrappedData := make([]whispertypes.EnvelopeError, len(data))
|
wrappedData := make([]types.EnvelopeError, len(data))
|
||||||
for index, envError := range data {
|
for index, envError := range data {
|
||||||
wrappedData[index] = *NewGethEnvelopeErrorWrapper(&envError)
|
wrappedData[index] = *NewGethEnvelopeErrorWrapper(&envError)
|
||||||
}
|
}
|
||||||
|
@ -24,11 +23,11 @@ func NewGethEnvelopeEventWrapper(envelopeEvent *whisper.EnvelopeEvent) *whispert
|
||||||
case whisper.SyncEventResponse:
|
case whisper.SyncEventResponse:
|
||||||
wrappedData = NewGethSyncEventResponseWrapper(data)
|
wrappedData = NewGethSyncEventResponseWrapper(data)
|
||||||
}
|
}
|
||||||
return &whispertypes.EnvelopeEvent{
|
return &types.EnvelopeEvent{
|
||||||
Event: whispertypes.EventType(envelopeEvent.Event),
|
Event: types.EventType(envelopeEvent.Event),
|
||||||
Hash: protocol.Hash(envelopeEvent.Hash),
|
Hash: types.Hash(envelopeEvent.Hash),
|
||||||
Batch: protocol.Hash(envelopeEvent.Batch),
|
Batch: types.Hash(envelopeEvent.Batch),
|
||||||
Peer: whispertypes.EnodeID(envelopeEvent.Peer),
|
Peer: types.EnodeID(envelopeEvent.Peer),
|
||||||
Data: wrappedData,
|
Data: wrappedData,
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
package gethbridge
|
package gethbridge
|
||||||
|
|
||||||
import (
|
import (
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -10,8 +10,8 @@ type gethFilterWrapper struct {
|
||||||
id string
|
id string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGethFilterWrapper returns an object that wraps Geth's Filter in a whispertypes interface
|
// NewGethFilterWrapper returns an object that wraps Geth's Filter in a types interface
|
||||||
func NewGethFilterWrapper(f *whisper.Filter, id string) whispertypes.Filter {
|
func NewGethFilterWrapper(f *whisper.Filter, id string) types.Filter {
|
||||||
if f.Messages == nil {
|
if f.Messages == nil {
|
||||||
panic("Messages should not be nil")
|
panic("Messages should not be nil")
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ func NewGethFilterWrapper(f *whisper.Filter, id string) whispertypes.Filter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetGethFilterFrom retrieves the underlying whisper Filter struct from a wrapped Filter interface
|
// GetGethFilterFrom retrieves the underlying whisper Filter struct from a wrapped Filter interface
|
||||||
func GetGethFilterFrom(f whispertypes.Filter) *whisper.Filter {
|
func GetGethFilterFrom(f types.Filter) *whisper.Filter {
|
||||||
return f.(*gethFilterWrapper).filter
|
return f.(*gethFilterWrapper).filter
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
package gethbridge
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewGethMailServerResponseWrapper returns a types.MailServerResponse object that mimics Geth's MailServerResponse
|
||||||
|
func NewGethMailServerResponseWrapper(mailServerResponse *whisper.MailServerResponse) *types.MailServerResponse {
|
||||||
|
if mailServerResponse == nil {
|
||||||
|
panic("mailServerResponse should not be nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
return &types.MailServerResponse{
|
||||||
|
LastEnvelopeHash: types.Hash(mailServerResponse.LastEnvelopeHash),
|
||||||
|
Cursor: mailServerResponse.Cursor,
|
||||||
|
Error: mailServerResponse.Error,
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
package gethbridge
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/ethereum/go-ethereum/node"
|
||||||
|
gethens "github.com/status-im/status-go/eth-node/bridge/geth/ens"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
|
enstypes "github.com/status-im/status-go/eth-node/types/ens"
|
||||||
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
|
"go.uber.org/zap"
|
||||||
|
)
|
||||||
|
|
||||||
|
type gethNodeWrapper struct {
|
||||||
|
stack *node.Node
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewNodeBridge(stack *node.Node) types.Node {
|
||||||
|
return &gethNodeWrapper{stack: stack}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *gethNodeWrapper) NewENSVerifier(logger *zap.Logger) enstypes.ENSVerifier {
|
||||||
|
return gethens.NewVerifier(logger)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *gethNodeWrapper) GetWhisper(ctx interface{}) (types.Whisper, error) {
|
||||||
|
var nativeWhisper *whisper.Whisper
|
||||||
|
if ctx == nil || ctx == w {
|
||||||
|
err := w.stack.Service(&nativeWhisper)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch serviceProvider := ctx.(type) {
|
||||||
|
case *node.ServiceContext:
|
||||||
|
err := serviceProvider.Service(&nativeWhisper)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if nativeWhisper == nil {
|
||||||
|
panic("Whisper service is not available")
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewGethWhisperWrapper(nativeWhisper), nil
|
||||||
|
}
|
|
@ -4,8 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -13,8 +12,8 @@ type gethPublicWhisperAPIWrapper struct {
|
||||||
publicWhisperAPI *whisper.PublicWhisperAPI
|
publicWhisperAPI *whisper.PublicWhisperAPI
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGethPublicWhisperAPIWrapper returns an object that wraps Geth's PublicWhisperAPI in a whispertypes interface
|
// NewGethPublicWhisperAPIWrapper returns an object that wraps Geth's PublicWhisperAPI in a types interface
|
||||||
func NewGethPublicWhisperAPIWrapper(publicWhisperAPI *whisper.PublicWhisperAPI) whispertypes.PublicWhisperAPI {
|
func NewGethPublicWhisperAPIWrapper(publicWhisperAPI *whisper.PublicWhisperAPI) types.PublicWhisperAPI {
|
||||||
if publicWhisperAPI == nil {
|
if publicWhisperAPI == nil {
|
||||||
panic("publicWhisperAPI cannot be nil")
|
panic("publicWhisperAPI cannot be nil")
|
||||||
}
|
}
|
||||||
|
@ -25,7 +24,7 @@ func NewGethPublicWhisperAPIWrapper(publicWhisperAPI *whisper.PublicWhisperAPI)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddPrivateKey imports the given private key.
|
// AddPrivateKey imports the given private key.
|
||||||
func (w *gethPublicWhisperAPIWrapper) AddPrivateKey(ctx context.Context, privateKey protocol.HexBytes) (string, error) {
|
func (w *gethPublicWhisperAPIWrapper) AddPrivateKey(ctx context.Context, privateKey types.HexBytes) (string, error) {
|
||||||
return w.publicWhisperAPI.AddPrivateKey(ctx, hexutil.Bytes(privateKey))
|
return w.publicWhisperAPI.AddPrivateKey(ctx, hexutil.Bytes(privateKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +40,7 @@ func (w *gethPublicWhisperAPIWrapper) DeleteKeyPair(ctx context.Context, key str
|
||||||
|
|
||||||
// NewMessageFilter creates a new filter that can be used to poll for
|
// NewMessageFilter creates a new filter that can be used to poll for
|
||||||
// (new) messages that satisfy the given criteria.
|
// (new) messages that satisfy the given criteria.
|
||||||
func (w *gethPublicWhisperAPIWrapper) NewMessageFilter(req whispertypes.Criteria) (string, error) {
|
func (w *gethPublicWhisperAPIWrapper) NewMessageFilter(req types.Criteria) (string, error) {
|
||||||
topics := make([]whisper.TopicType, len(req.Topics))
|
topics := make([]whisper.TopicType, len(req.Topics))
|
||||||
for index, tt := range req.Topics {
|
for index, tt := range req.Topics {
|
||||||
topics[index] = whisper.TopicType(tt)
|
topics[index] = whisper.TopicType(tt)
|
||||||
|
@ -60,19 +59,19 @@ func (w *gethPublicWhisperAPIWrapper) NewMessageFilter(req whispertypes.Criteria
|
||||||
|
|
||||||
// GetFilterMessages returns the messages that match the filter criteria and
|
// GetFilterMessages returns the messages that match the filter criteria and
|
||||||
// are received between the last poll and now.
|
// are received between the last poll and now.
|
||||||
func (w *gethPublicWhisperAPIWrapper) GetFilterMessages(id string) ([]*whispertypes.Message, error) {
|
func (w *gethPublicWhisperAPIWrapper) GetFilterMessages(id string) ([]*types.Message, error) {
|
||||||
msgs, err := w.publicWhisperAPI.GetFilterMessages(id)
|
msgs, err := w.publicWhisperAPI.GetFilterMessages(id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
wrappedMsgs := make([]*whispertypes.Message, len(msgs))
|
wrappedMsgs := make([]*types.Message, len(msgs))
|
||||||
for index, msg := range msgs {
|
for index, msg := range msgs {
|
||||||
wrappedMsgs[index] = &whispertypes.Message{
|
wrappedMsgs[index] = &types.Message{
|
||||||
Sig: msg.Sig,
|
Sig: msg.Sig,
|
||||||
TTL: msg.TTL,
|
TTL: msg.TTL,
|
||||||
Timestamp: msg.Timestamp,
|
Timestamp: msg.Timestamp,
|
||||||
Topic: whispertypes.TopicType(msg.Topic),
|
Topic: types.TopicType(msg.Topic),
|
||||||
Payload: msg.Payload,
|
Payload: msg.Payload,
|
||||||
Padding: msg.Padding,
|
Padding: msg.Padding,
|
||||||
PoW: msg.PoW,
|
PoW: msg.PoW,
|
||||||
|
@ -86,7 +85,7 @@ func (w *gethPublicWhisperAPIWrapper) GetFilterMessages(id string) ([]*whisperty
|
||||||
|
|
||||||
// Post posts a message on the Whisper network.
|
// Post posts a message on the Whisper network.
|
||||||
// returns the hash of the message in case of success.
|
// returns the hash of the message in case of success.
|
||||||
func (w *gethPublicWhisperAPIWrapper) Post(ctx context.Context, req whispertypes.NewMessage) ([]byte, error) {
|
func (w *gethPublicWhisperAPIWrapper) Post(ctx context.Context, req types.NewMessage) ([]byte, error) {
|
||||||
msg := whisper.NewMessage{
|
msg := whisper.NewMessage{
|
||||||
SymKeyID: req.SymKeyID,
|
SymKeyID: req.SymKeyID,
|
||||||
PublicKey: req.PublicKey,
|
PublicKey: req.PublicKey,
|
|
@ -2,15 +2,15 @@ package gethbridge
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/ethereum/go-ethereum/event"
|
"github.com/ethereum/go-ethereum/event"
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type gethSubscriptionWrapper struct {
|
type gethSubscriptionWrapper struct {
|
||||||
subscription event.Subscription
|
subscription event.Subscription
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGethSubscriptionWrapper returns an object that wraps Geth's Subscription in a whispertypes interface
|
// NewGethSubscriptionWrapper returns an object that wraps Geth's Subscription in a types interface
|
||||||
func NewGethSubscriptionWrapper(subscription event.Subscription) whispertypes.Subscription {
|
func NewGethSubscriptionWrapper(subscription event.Subscription) types.Subscription {
|
||||||
if subscription == nil {
|
if subscription == nil {
|
||||||
panic("subscription cannot be nil")
|
panic("subscription cannot be nil")
|
||||||
}
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package gethbridge
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewGethSyncEventResponseWrapper returns a types.SyncEventResponse object that mimics Geth's SyncEventResponse
|
||||||
|
func NewGethSyncEventResponseWrapper(syncEventResponse whisper.SyncEventResponse) types.SyncEventResponse {
|
||||||
|
return types.SyncEventResponse{
|
||||||
|
Cursor: syncEventResponse.Cursor,
|
||||||
|
Error: syncEventResponse.Error,
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,12 +1,12 @@
|
||||||
package gethbridge
|
package gethbridge
|
||||||
|
|
||||||
import (
|
import (
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetGethSyncMailRequestFrom converts a whisper SyncMailRequest struct from a SyncMailRequest struct
|
// GetGethSyncMailRequestFrom converts a whisper SyncMailRequest struct from a SyncMailRequest struct
|
||||||
func GetGethSyncMailRequestFrom(r *whispertypes.SyncMailRequest) *whisper.SyncMailRequest {
|
func GetGethSyncMailRequestFrom(r *types.SyncMailRequest) *whisper.SyncMailRequest {
|
||||||
return &whisper.SyncMailRequest{
|
return &whisper.SyncMailRequest{
|
||||||
Lower: r.Lower,
|
Lower: r.Lower,
|
||||||
Upper: r.Upper,
|
Upper: r.Upper,
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -12,8 +12,8 @@ type gethWhisperWrapper struct {
|
||||||
whisper *whisper.Whisper
|
whisper *whisper.Whisper
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGethWhisperWrapper returns an object that wraps Geth's Whisper in a whispertypes interface
|
// NewGethWhisperWrapper returns an object that wraps Geth's Whisper in a types interface
|
||||||
func NewGethWhisperWrapper(w *whisper.Whisper) whispertypes.Whisper {
|
func NewGethWhisperWrapper(w *whisper.Whisper) types.Whisper {
|
||||||
if w == nil {
|
if w == nil {
|
||||||
panic("w cannot be nil")
|
panic("w cannot be nil")
|
||||||
}
|
}
|
||||||
|
@ -24,11 +24,11 @@ func NewGethWhisperWrapper(w *whisper.Whisper) whispertypes.Whisper {
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetGethWhisperFrom retrieves the underlying whisper Whisper struct from a wrapped Whisper interface
|
// GetGethWhisperFrom retrieves the underlying whisper Whisper struct from a wrapped Whisper interface
|
||||||
func GetGethWhisperFrom(m whispertypes.Whisper) *whisper.Whisper {
|
func GetGethWhisperFrom(m types.Whisper) *whisper.Whisper {
|
||||||
return m.(*gethWhisperWrapper).whisper
|
return m.(*gethWhisperWrapper).whisper
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *gethWhisperWrapper) PublicWhisperAPI() whispertypes.PublicWhisperAPI {
|
func (w *gethWhisperWrapper) PublicWhisperAPI() types.PublicWhisperAPI {
|
||||||
return NewGethPublicWhisperAPIWrapper(whisper.NewPublicWhisperAPI(w.whisper))
|
return NewGethPublicWhisperAPIWrapper(whisper.NewPublicWhisperAPI(w.whisper))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ func (w *gethWhisperWrapper) SetTimeSource(timesource func() time.Time) {
|
||||||
w.whisper.SetTimeSource(timesource)
|
w.whisper.SetTimeSource(timesource)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *gethWhisperWrapper) SubscribeEnvelopeEvents(eventsProxy chan<- whispertypes.EnvelopeEvent) whispertypes.Subscription {
|
func (w *gethWhisperWrapper) SubscribeEnvelopeEvents(eventsProxy chan<- types.EnvelopeEvent) types.Subscription {
|
||||||
events := make(chan whisper.EnvelopeEvent, 100) // must be buffered to prevent blocking whisper
|
events := make(chan whisper.EnvelopeEvent, 100) // must be buffered to prevent blocking whisper
|
||||||
go func() {
|
go func() {
|
||||||
for e := range events {
|
for e := range events {
|
||||||
|
@ -112,7 +112,7 @@ func (w *gethWhisperWrapper) GetSymKey(id string) ([]byte, error) {
|
||||||
return w.whisper.GetSymKey(id)
|
return w.whisper.GetSymKey(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *gethWhisperWrapper) Subscribe(opts *whispertypes.SubscriptionOptions) (string, error) {
|
func (w *gethWhisperWrapper) Subscribe(opts *types.SubscriptionOptions) (string, error) {
|
||||||
var (
|
var (
|
||||||
err error
|
err error
|
||||||
keyAsym *ecdsa.PrivateKey
|
keyAsym *ecdsa.PrivateKey
|
||||||
|
@ -146,7 +146,7 @@ func (w *gethWhisperWrapper) Subscribe(opts *whispertypes.SubscriptionOptions) (
|
||||||
return id, nil
|
return id, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *gethWhisperWrapper) GetFilter(id string) whispertypes.Filter {
|
func (w *gethWhisperWrapper) GetFilter(id string) types.Filter {
|
||||||
return NewGethFilterWrapper(w.whisper.GetFilter(id), id)
|
return NewGethFilterWrapper(w.whisper.GetFilter(id), id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ func (w *gethWhisperWrapper) Unsubscribe(id string) error {
|
||||||
return w.whisper.Unsubscribe(id)
|
return w.whisper.Unsubscribe(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *gethWhisperWrapper) createFilterWrapper(id string, keyAsym *ecdsa.PrivateKey, keySym []byte, pow float64, topics [][]byte) (whispertypes.Filter, error) {
|
func (w *gethWhisperWrapper) createFilterWrapper(id string, keyAsym *ecdsa.PrivateKey, keySym []byte, pow float64, topics [][]byte) (types.Filter, error) {
|
||||||
return NewGethFilterWrapper(&whisper.Filter{
|
return NewGethFilterWrapper(&whisper.Filter{
|
||||||
KeyAsym: keyAsym,
|
KeyAsym: keyAsym,
|
||||||
KeySym: keySym,
|
KeySym: keySym,
|
||||||
|
@ -165,7 +165,7 @@ func (w *gethWhisperWrapper) createFilterWrapper(id string, keyAsym *ecdsa.Priva
|
||||||
}, id), nil
|
}, id), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *gethWhisperWrapper) SendMessagesRequest(peerID []byte, r whispertypes.MessagesRequest) error {
|
func (w *gethWhisperWrapper) SendMessagesRequest(peerID []byte, r types.MessagesRequest) error {
|
||||||
return w.whisper.SendMessagesRequest(peerID, whisper.MessagesRequest{
|
return w.whisper.SendMessagesRequest(peerID, whisper.MessagesRequest{
|
||||||
ID: r.ID,
|
ID: r.ID,
|
||||||
From: r.From,
|
From: r.From,
|
||||||
|
@ -181,11 +181,11 @@ func (w *gethWhisperWrapper) SendMessagesRequest(peerID []byte, r whispertypes.M
|
||||||
// request and respond with a number of peer-to-peer messages (possibly expired),
|
// request and respond with a number of peer-to-peer messages (possibly expired),
|
||||||
// which are not supposed to be forwarded any further.
|
// which are not supposed to be forwarded any further.
|
||||||
// The whisper protocol is agnostic of the format and contents of envelope.
|
// The whisper protocol is agnostic of the format and contents of envelope.
|
||||||
func (w *gethWhisperWrapper) RequestHistoricMessagesWithTimeout(peerID []byte, envelope whispertypes.Envelope, timeout time.Duration) error {
|
func (w *gethWhisperWrapper) RequestHistoricMessagesWithTimeout(peerID []byte, envelope types.Envelope, timeout time.Duration) error {
|
||||||
return w.whisper.RequestHistoricMessagesWithTimeout(peerID, GetGethEnvelopeFrom(envelope), timeout)
|
return w.whisper.RequestHistoricMessagesWithTimeout(peerID, GetGethEnvelopeFrom(envelope), timeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SyncMessages can be sent between two Mail Servers and syncs envelopes between them.
|
// SyncMessages can be sent between two Mail Servers and syncs envelopes between them.
|
||||||
func (w *gethWhisperWrapper) SyncMessages(peerID []byte, req whispertypes.SyncMailRequest) error {
|
func (w *gethWhisperWrapper) SyncMessages(peerID []byte, req types.SyncMailRequest) error {
|
||||||
return w.whisper.SyncMessages(peerID, *GetGethSyncMailRequestFrom(&req))
|
return w.whisper.SyncMessages(peerID, *GetGethSyncMailRequestFrom(&req))
|
||||||
}
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Pre-requisites: Git, Nix
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel)
|
||||||
|
|
||||||
|
# NOTE: To use a local Nimbus repository, uncomment and edit the following line
|
||||||
|
#nimbus_dir=~/src/github.com/status-im/nimbus
|
||||||
|
|
||||||
|
target_dir="${GIT_ROOT}/vendor/github.com/status-im/status-go/eth-node/bridge/nimbus"
|
||||||
|
|
||||||
|
if [ -z "$nimbus_dir" ]; then
|
||||||
|
# The git ref of Nimbus to fetch and build. This should represent a commit SHA or a tag, for reproducible builds
|
||||||
|
nimbus_ref='master' # TODO: Use a tag once
|
||||||
|
|
||||||
|
nimbus_src='https://github.com/status-im/nimbus/'
|
||||||
|
nimbus_dir="${GIT_ROOT}/vendor/github.com/status-im/nimbus"
|
||||||
|
|
||||||
|
trap "rm -rf $nimbus_dir" ERR INT QUIT
|
||||||
|
|
||||||
|
# Clone nimbus repo into vendor directory, if necessary
|
||||||
|
if [ -d "$nimbus_dir" ]; then
|
||||||
|
cd $nimbus_dir && git reset --hard $nimbus_ref; cd -
|
||||||
|
else
|
||||||
|
# List fetched from vendorDeps array in https://github.com/status-im/nimbus/blob/master/nix/nimbus-wrappers.nix#L9-L12
|
||||||
|
vendor_paths=( nim-chronicles nim-faststreams nim-json-serialization nim-chronos nim-eth nim-json nim-metrics nim-secp256k1 nim-serialization nim-stew nim-stint nimcrypto )
|
||||||
|
vendor_path_opts="${vendor_paths[@]/#/--recurse-submodules=vendor/}"
|
||||||
|
git clone $nimbus_src --progress ${vendor_path_opts} --depth 1 -j8 -b $nimbus_ref $nimbus_dir
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build Nimbus wrappers and copy them into the Nimbus bridge in status-eth-node
|
||||||
|
build_dir=$(cd $nimbus_dir && nix-build --pure --no-out-link -A wrappers)
|
||||||
|
# Ideally we'd use the static version of the Nimbus library (.a),
|
||||||
|
# however that causes link errors due to duplicate symbols:
|
||||||
|
# ${target_dir}/libnimbus.a(secp256k1.c.o): In function `secp256k1_context_create':
|
||||||
|
# (.text+0xca80): multiple definition of `secp256k1_context_create'
|
||||||
|
# /tmp/go-link-476687730/000014.o:${GIT_ROOT}/vendor/github.com/ethereum/go-ethereum/crypto/secp256k1/./libsecp256k1/src/secp256k1.c:56: first defined here
|
||||||
|
rm -f ${target_dir}/libnimbus.*
|
||||||
|
mkdir -p ${target_dir}
|
||||||
|
cp -f ${build_dir}/include/* ${build_dir}/lib/libnimbus.so \
|
||||||
|
${target_dir}/
|
|
@ -15,7 +15,7 @@ import "C"
|
||||||
import (
|
import (
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type nimbusFilterWrapper struct {
|
type nimbusFilterWrapper struct {
|
||||||
|
@ -24,8 +24,8 @@ type nimbusFilterWrapper struct {
|
||||||
own bool
|
own bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewNimbusFilterWrapper returns an object that wraps Nimbus's Filter in a whispertypes interface
|
// NewNimbusFilterWrapper returns an object that wraps Nimbus's Filter in a types interface
|
||||||
func NewNimbusFilterWrapper(f *C.filter_options, id string, own bool) whispertypes.Filter {
|
func NewNimbusFilterWrapper(f *C.filter_options, id string, own bool) types.Filter {
|
||||||
wrapper := &nimbusFilterWrapper{
|
wrapper := &nimbusFilterWrapper{
|
||||||
filter: f,
|
filter: f,
|
||||||
id: id,
|
id: id,
|
||||||
|
@ -35,7 +35,7 @@ func NewNimbusFilterWrapper(f *C.filter_options, id string, own bool) whispertyp
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNimbusFilterFrom retrieves the underlying whisper Filter struct from a wrapped Filter interface
|
// GetNimbusFilterFrom retrieves the underlying whisper Filter struct from a wrapped Filter interface
|
||||||
func GetNimbusFilterFrom(f whispertypes.Filter) *C.filter_options {
|
func GetNimbusFilterFrom(f types.Filter) *C.filter_options {
|
||||||
return f.(*nimbusFilterWrapper).filter
|
return f.(*nimbusFilterWrapper).filter
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,10 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
|
enstypes "github.com/status-im/status-go/eth-node/types/ens"
|
||||||
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Init() {
|
func Init() {
|
||||||
|
@ -42,3 +45,19 @@ func StartNimbus(privateKey *ecdsa.PrivateKey, listenAddr string, staging bool)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type nimbusNodeWrapper struct {
|
||||||
|
w types.Whisper
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewNodeBridge() types.Node {
|
||||||
|
return &nimbusNodeWrapper{w: NewNimbusWhisperWrapper()}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *nimbusNodeWrapper) NewENSVerifier(_ *zap.Logger) enstypes.ENSVerifier {
|
||||||
|
panic("not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *nimbusNodeWrapper) GetWhisper(ctx interface{}) (types.Whisper, error) {
|
||||||
|
return w.w, nil
|
||||||
|
}
|
|
@ -20,8 +20,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type nimbusPublicWhisperAPIWrapper struct {
|
type nimbusPublicWhisperAPIWrapper struct {
|
||||||
|
@ -30,8 +29,8 @@ type nimbusPublicWhisperAPIWrapper struct {
|
||||||
routineQueue *RoutineQueue
|
routineQueue *RoutineQueue
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewNimbusPublicWhisperAPIWrapper returns an object that wraps Nimbus's PublicWhisperAPI in a whispertypes interface
|
// NewNimbusPublicWhisperAPIWrapper returns an object that wraps Nimbus's PublicWhisperAPI in a types interface
|
||||||
func NewNimbusPublicWhisperAPIWrapper(filterMessagesMu *sync.Mutex, filterMessages *map[string]*list.List, routineQueue *RoutineQueue) whispertypes.PublicWhisperAPI {
|
func NewNimbusPublicWhisperAPIWrapper(filterMessagesMu *sync.Mutex, filterMessages *map[string]*list.List, routineQueue *RoutineQueue) types.PublicWhisperAPI {
|
||||||
return &nimbusPublicWhisperAPIWrapper{
|
return &nimbusPublicWhisperAPIWrapper{
|
||||||
filterMessagesMu: filterMessagesMu,
|
filterMessagesMu: filterMessagesMu,
|
||||||
filterMessages: filterMessages,
|
filterMessages: filterMessages,
|
||||||
|
@ -40,7 +39,7 @@ func NewNimbusPublicWhisperAPIWrapper(filterMessagesMu *sync.Mutex, filterMessag
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddPrivateKey imports the given private key.
|
// AddPrivateKey imports the given private key.
|
||||||
func (w *nimbusPublicWhisperAPIWrapper) AddPrivateKey(ctx context.Context, privateKey protocol.HexBytes) (string, error) {
|
func (w *nimbusPublicWhisperAPIWrapper) AddPrivateKey(ctx context.Context, privateKey types.HexBytes) (string, error) {
|
||||||
retVal := w.routineQueue.Send(func(c chan<- interface{}) {
|
retVal := w.routineQueue.Send(func(c chan<- interface{}) {
|
||||||
privKeyC := C.CBytes(privateKey)
|
privKeyC := C.CBytes(privateKey)
|
||||||
defer C.free(unsafe.Pointer(privKeyC))
|
defer C.free(unsafe.Pointer(privKeyC))
|
||||||
|
@ -48,7 +47,7 @@ func (w *nimbusPublicWhisperAPIWrapper) AddPrivateKey(ctx context.Context, priva
|
||||||
idC := C.malloc(C.size_t(C.ID_LEN))
|
idC := C.malloc(C.size_t(C.ID_LEN))
|
||||||
defer C.free(idC)
|
defer C.free(idC)
|
||||||
if C.nimbus_add_keypair((*C.uchar)(privKeyC), (*C.uchar)(idC)) {
|
if C.nimbus_add_keypair((*C.uchar)(privKeyC), (*C.uchar)(idC)) {
|
||||||
c <- protocol.EncodeHex(C.GoBytes(idC, C.ID_LEN))
|
c <- types.EncodeHex(C.GoBytes(idC, C.ID_LEN))
|
||||||
} else {
|
} else {
|
||||||
c <- errors.New("failed to add private key to Nimbus")
|
c <- errors.New("failed to add private key to Nimbus")
|
||||||
}
|
}
|
||||||
|
@ -69,7 +68,7 @@ func (w *nimbusPublicWhisperAPIWrapper) GenerateSymKeyFromPassword(ctx context.C
|
||||||
idC := C.malloc(C.size_t(C.ID_LEN))
|
idC := C.malloc(C.size_t(C.ID_LEN))
|
||||||
defer C.free(idC)
|
defer C.free(idC)
|
||||||
if C.nimbus_add_symkey_from_password(passwordC, (*C.uchar)(idC)) {
|
if C.nimbus_add_symkey_from_password(passwordC, (*C.uchar)(idC)) {
|
||||||
c <- protocol.EncodeHex(C.GoBytes(idC, C.ID_LEN))
|
c <- types.EncodeHex(C.GoBytes(idC, C.ID_LEN))
|
||||||
} else {
|
} else {
|
||||||
c <- errors.New("failed to add symkey to Nimbus")
|
c <- errors.New("failed to add symkey to Nimbus")
|
||||||
}
|
}
|
||||||
|
@ -102,7 +101,7 @@ func (w *nimbusPublicWhisperAPIWrapper) DeleteKeyPair(ctx context.Context, key s
|
||||||
|
|
||||||
// NewMessageFilter creates a new filter that can be used to poll for
|
// NewMessageFilter creates a new filter that can be used to poll for
|
||||||
// (new) messages that satisfy the given criteria.
|
// (new) messages that satisfy the given criteria.
|
||||||
func (w *nimbusPublicWhisperAPIWrapper) NewMessageFilter(req whispertypes.Criteria) (string, error) {
|
func (w *nimbusPublicWhisperAPIWrapper) NewMessageFilter(req types.Criteria) (string, error) {
|
||||||
// topics := make([]whisper.TopicType, len(req.Topics))
|
// topics := make([]whisper.TopicType, len(req.Topics))
|
||||||
// for index, tt := range req.Topics {
|
// for index, tt := range req.Topics {
|
||||||
// topics[index] = whisper.TopicType(tt)
|
// topics[index] = whisper.TopicType(tt)
|
||||||
|
@ -123,7 +122,7 @@ func (w *nimbusPublicWhisperAPIWrapper) NewMessageFilter(req whispertypes.Criter
|
||||||
|
|
||||||
// GetFilterMessages returns the messages that match the filter criteria and
|
// GetFilterMessages returns the messages that match the filter criteria and
|
||||||
// are received between the last poll and now.
|
// are received between the last poll and now.
|
||||||
func (w *nimbusPublicWhisperAPIWrapper) GetFilterMessages(id string) ([]*whispertypes.Message, error) {
|
func (w *nimbusPublicWhisperAPIWrapper) GetFilterMessages(id string) ([]*types.Message, error) {
|
||||||
idC := C.CString(id)
|
idC := C.CString(id)
|
||||||
defer C.free(unsafe.Pointer(idC))
|
defer C.free(unsafe.Pointer(idC))
|
||||||
|
|
||||||
|
@ -137,7 +136,7 @@ func (w *nimbusPublicWhisperAPIWrapper) GetFilterMessages(id string) ([]*whisper
|
||||||
return nil, fmt.Errorf("no filter with ID %s", id)
|
return nil, fmt.Errorf("no filter with ID %s", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
retVal := make([]*whispertypes.Message, messageList.Len())
|
retVal := make([]*types.Message, messageList.Len())
|
||||||
if messageList.Len() == 0 {
|
if messageList.Len() == 0 {
|
||||||
return retVal, nil
|
return retVal, nil
|
||||||
}
|
}
|
||||||
|
@ -145,7 +144,7 @@ func (w *nimbusPublicWhisperAPIWrapper) GetFilterMessages(id string) ([]*whisper
|
||||||
elem := messageList.Front()
|
elem := messageList.Front()
|
||||||
index := 0
|
index := 0
|
||||||
for elem != nil {
|
for elem != nil {
|
||||||
retVal[index] = (elem.Value).(*whispertypes.Message)
|
retVal[index] = (elem.Value).(*types.Message)
|
||||||
index++
|
index++
|
||||||
next := elem.Next()
|
next := elem.Next()
|
||||||
messageList.Remove(elem)
|
messageList.Remove(elem)
|
||||||
|
@ -156,7 +155,7 @@ func (w *nimbusPublicWhisperAPIWrapper) GetFilterMessages(id string) ([]*whisper
|
||||||
|
|
||||||
// Post posts a message on the Whisper network.
|
// Post posts a message on the Whisper network.
|
||||||
// returns the hash of the message in case of success.
|
// returns the hash of the message in case of success.
|
||||||
func (w *nimbusPublicWhisperAPIWrapper) Post(ctx context.Context, req whispertypes.NewMessage) ([]byte, error) {
|
func (w *nimbusPublicWhisperAPIWrapper) Post(ctx context.Context, req types.NewMessage) ([]byte, error) {
|
||||||
retVal := w.routineQueue.Send(func(c chan<- interface{}) {
|
retVal := w.routineQueue.Send(func(c chan<- interface{}) {
|
||||||
msg := C.post_message{
|
msg := C.post_message{
|
||||||
ttl: C.uint32_t(req.TTL),
|
ttl: C.uint32_t(req.TTL),
|
|
@ -24,33 +24,32 @@ import (
|
||||||
"time"
|
"time"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
gopointer "github.com/mattn/go-pointer"
|
gopointer "github.com/mattn/go-pointer"
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type nimbusWhisperWrapper struct {
|
type nimbusWhisperWrapper struct {
|
||||||
timesource func() time.Time
|
timesource func() time.Time
|
||||||
filters map[string]whispertypes.Filter
|
filters map[string]types.Filter
|
||||||
filterMessagesMu sync.Mutex
|
filterMessagesMu sync.Mutex
|
||||||
filterMessages map[string]*list.List
|
filterMessages map[string]*list.List
|
||||||
routineQueue *RoutineQueue
|
routineQueue *RoutineQueue
|
||||||
tid int
|
tid int
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewNimbusWhisperWrapper returns an object that wraps Nimbus' Whisper in a whispertypes interface
|
// NewNimbusWhisperWrapper returns an object that wraps Nimbus' Whisper in a types interface
|
||||||
func NewNimbusWhisperWrapper() whispertypes.Whisper {
|
func NewNimbusWhisperWrapper() types.Whisper {
|
||||||
return &nimbusWhisperWrapper{
|
return &nimbusWhisperWrapper{
|
||||||
timesource: func() time.Time { return time.Now() },
|
timesource: func() time.Time { return time.Now() },
|
||||||
filters: map[string]whispertypes.Filter{},
|
filters: map[string]types.Filter{},
|
||||||
filterMessages: map[string]*list.List{},
|
filterMessages: map[string]*list.List{},
|
||||||
routineQueue: NewRoutineQueue(),
|
routineQueue: NewRoutineQueue(),
|
||||||
tid: syscall.Gettid(),
|
tid: syscall.Gettid(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *nimbusWhisperWrapper) PublicWhisperAPI() whispertypes.PublicWhisperAPI {
|
func (w *nimbusWhisperWrapper) PublicWhisperAPI() types.PublicWhisperAPI {
|
||||||
return NewNimbusPublicWhisperAPIWrapper(&w.filterMessagesMu, &w.filterMessages, w.routineQueue)
|
return NewNimbusPublicWhisperAPIWrapper(&w.filterMessagesMu, &w.filterMessages, w.routineQueue)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,7 +99,7 @@ func (w *nimbusWhisperWrapper) SetTimeSource(timesource func() time.Time) {
|
||||||
w.timesource = timesource
|
w.timesource = timesource
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *nimbusWhisperWrapper) SubscribeEnvelopeEvents(eventsProxy chan<- whispertypes.EnvelopeEvent) whispertypes.Subscription {
|
func (w *nimbusWhisperWrapper) SubscribeEnvelopeEvents(eventsProxy chan<- types.EnvelopeEvent) types.Subscription {
|
||||||
// TODO: when mailserver support is implemented
|
// TODO: when mailserver support is implemented
|
||||||
panic("not implemented")
|
panic("not implemented")
|
||||||
}
|
}
|
||||||
|
@ -119,7 +118,7 @@ func (w *nimbusWhisperWrapper) GetPrivateKey(id string) (*ecdsa.PrivateKey, erro
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer C.free(unsafe.Pointer(idC))
|
defer C.free(unsafe.Pointer(idC))
|
||||||
privKeyC := C.malloc(whispertypes.AesKeyLength)
|
privKeyC := C.malloc(types.AesKeyLength)
|
||||||
defer C.free(unsafe.Pointer(privKeyC))
|
defer C.free(unsafe.Pointer(privKeyC))
|
||||||
|
|
||||||
if ok := C.nimbus_get_private_key(idC, (*C.uchar)(unsafe.Pointer(privKeyC))); !ok {
|
if ok := C.nimbus_get_private_key(idC, (*C.uchar)(unsafe.Pointer(privKeyC))); !ok {
|
||||||
|
@ -156,7 +155,7 @@ func (w *nimbusWhisperWrapper) AddKeyPair(key *ecdsa.PrivateKey) (string, error)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c <- protocol.EncodeHex(C.GoBytes(idC, C.ID_LEN))
|
c <- types.EncodeHex(C.GoBytes(idC, C.ID_LEN))
|
||||||
})
|
})
|
||||||
if err, ok := retVal.(error); ok {
|
if err, ok := retVal.(error); ok {
|
||||||
return "", err
|
return "", err
|
||||||
|
@ -197,7 +196,7 @@ func (w *nimbusWhisperWrapper) AddSymKeyDirect(key []byte) (string, error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c <- protocol.EncodeHex(C.GoBytes(idC, C.ID_LEN))
|
c <- types.EncodeHex(C.GoBytes(idC, C.ID_LEN))
|
||||||
})
|
})
|
||||||
if err, ok := retVal.(error); ok {
|
if err, ok := retVal.(error); ok {
|
||||||
return "", err
|
return "", err
|
||||||
|
@ -215,7 +214,7 @@ func (w *nimbusWhisperWrapper) AddSymKeyFromPassword(password string) (string, e
|
||||||
defer C.free(idC)
|
defer C.free(idC)
|
||||||
if C.nimbus_add_symkey_from_password(passwordC, (*C.uchar)(idC)) {
|
if C.nimbus_add_symkey_from_password(passwordC, (*C.uchar)(idC)) {
|
||||||
id := C.GoBytes(idC, C.ID_LEN)
|
id := C.GoBytes(idC, C.ID_LEN)
|
||||||
c <- protocol.EncodeHex(id)
|
c <- types.EncodeHex(id)
|
||||||
} else {
|
} else {
|
||||||
c <- errors.New("failed to add symkey to Nimbus")
|
c <- errors.New("failed to add symkey to Nimbus")
|
||||||
}
|
}
|
||||||
|
@ -270,28 +269,28 @@ func (w *nimbusWhisperWrapper) GetSymKey(id string) ([]byte, error) {
|
||||||
func onMessageHandler(msg *C.received_message, udata unsafe.Pointer) {
|
func onMessageHandler(msg *C.received_message, udata unsafe.Pointer) {
|
||||||
messageList := (gopointer.Restore(udata)).(*list.List)
|
messageList := (gopointer.Restore(udata)).(*list.List)
|
||||||
|
|
||||||
topic := whispertypes.TopicType{}
|
topic := types.TopicType{}
|
||||||
copy(topic[:], C.GoBytes(unsafe.Pointer(&msg.topic[0]), whispertypes.TopicLength)[:whispertypes.TopicLength])
|
copy(topic[:], C.GoBytes(unsafe.Pointer(&msg.topic[0]), types.TopicLength)[:types.TopicLength])
|
||||||
wrappedMsg := &whispertypes.Message{
|
wrappedMsg := &types.Message{
|
||||||
TTL: uint32(msg.ttl),
|
TTL: uint32(msg.ttl),
|
||||||
Timestamp: uint32(msg.timestamp),
|
Timestamp: uint32(msg.timestamp),
|
||||||
Topic: topic,
|
Topic: topic,
|
||||||
Payload: C.GoBytes(unsafe.Pointer(msg.decoded), C.int(msg.decodedLen)),
|
Payload: C.GoBytes(unsafe.Pointer(msg.decoded), C.int(msg.decodedLen)),
|
||||||
PoW: float64(msg.pow),
|
PoW: float64(msg.pow),
|
||||||
Hash: C.GoBytes(unsafe.Pointer(&msg.hash[0]), protocol.HashLength),
|
Hash: C.GoBytes(unsafe.Pointer(&msg.hash[0]), types.HashLength),
|
||||||
P2P: true,
|
P2P: true,
|
||||||
}
|
}
|
||||||
if msg.source != nil {
|
if msg.source != nil {
|
||||||
wrappedMsg.Sig = append([]byte{0x04}, C.GoBytes(unsafe.Pointer(msg.source), whispertypes.PubKeyLength)...)
|
wrappedMsg.Sig = append([]byte{0x04}, C.GoBytes(unsafe.Pointer(msg.source), types.PubKeyLength)...)
|
||||||
}
|
}
|
||||||
if msg.recipientPublicKey != nil {
|
if msg.recipientPublicKey != nil {
|
||||||
wrappedMsg.Dst = append([]byte{0x04}, C.GoBytes(unsafe.Pointer(msg.recipientPublicKey), whispertypes.PubKeyLength)...)
|
wrappedMsg.Dst = append([]byte{0x04}, C.GoBytes(unsafe.Pointer(msg.recipientPublicKey), types.PubKeyLength)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
messageList.PushBack(wrappedMsg)
|
messageList.PushBack(wrappedMsg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *nimbusWhisperWrapper) Subscribe(opts *whispertypes.SubscriptionOptions) (string, error) {
|
func (w *nimbusWhisperWrapper) Subscribe(opts *types.SubscriptionOptions) (string, error) {
|
||||||
f, err := w.createFilterWrapper("", opts)
|
f, err := w.createFilterWrapper("", opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
@ -326,7 +325,7 @@ func (w *nimbusWhisperWrapper) Subscribe(opts *whispertypes.SubscriptionOptions)
|
||||||
return retVal.(string), nil
|
return retVal.(string), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *nimbusWhisperWrapper) GetFilter(id string) whispertypes.Filter {
|
func (w *nimbusWhisperWrapper) GetFilter(id string) types.Filter {
|
||||||
idC := C.CString(id)
|
idC := C.CString(id)
|
||||||
defer C.free(unsafe.Pointer(idC))
|
defer C.free(unsafe.Pointer(idC))
|
||||||
|
|
||||||
|
@ -366,7 +365,7 @@ func (w *nimbusWhisperWrapper) Unsubscribe(id string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func decodeHexID(id string) (*C.uint8_t, error) {
|
func decodeHexID(id string) (*C.uint8_t, error) {
|
||||||
idBytes, err := protocol.DecodeHex(id)
|
idBytes, err := types.DecodeHex(id)
|
||||||
if err == nil && len(idBytes) != C.ID_LEN {
|
if err == nil && len(idBytes) != C.ID_LEN {
|
||||||
err = fmt.Errorf("ID length must be %v bytes, actual length is %v", C.ID_LEN, len(idBytes))
|
err = fmt.Errorf("ID length must be %v bytes, actual length is %v", C.ID_LEN, len(idBytes))
|
||||||
}
|
}
|
||||||
|
@ -379,17 +378,17 @@ func decodeHexID(id string) (*C.uint8_t, error) {
|
||||||
|
|
||||||
// copyTopicToCBuffer copies a Go topic buffer to a C topic buffer without allocating new memory
|
// copyTopicToCBuffer copies a Go topic buffer to a C topic buffer without allocating new memory
|
||||||
func copyTopicToCBuffer(dst *C.uchar, topic []byte) {
|
func copyTopicToCBuffer(dst *C.uchar, topic []byte) {
|
||||||
if len(topic) != whispertypes.TopicLength {
|
if len(topic) != types.TopicLength {
|
||||||
panic("invalid Whisper topic buffer size")
|
panic("invalid Whisper topic buffer size")
|
||||||
}
|
}
|
||||||
|
|
||||||
p := (*[whispertypes.TopicLength]C.uchar)(unsafe.Pointer(dst))
|
p := (*[types.TopicLength]C.uchar)(unsafe.Pointer(dst))
|
||||||
for index, b := range topic {
|
for index, b := range topic {
|
||||||
p[index] = C.uchar(b)
|
p[index] = C.uchar(b)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *nimbusWhisperWrapper) createFilterWrapper(id string, opts *whispertypes.SubscriptionOptions) (whispertypes.Filter, error) {
|
func (w *nimbusWhisperWrapper) createFilterWrapper(id string, opts *types.SubscriptionOptions) (types.Filter, error) {
|
||||||
if len(opts.Topics) != 1 {
|
if len(opts.Topics) != 1 {
|
||||||
return nil, errors.New("currently only 1 topic is supported by the Nimbus bridge")
|
return nil, errors.New("currently only 1 topic is supported by the Nimbus bridge")
|
||||||
}
|
}
|
||||||
|
@ -417,7 +416,7 @@ func (w *nimbusWhisperWrapper) createFilterWrapper(id string, opts *whispertypes
|
||||||
return NewNimbusFilterWrapper(&filter, id, true), nil
|
return NewNimbusFilterWrapper(&filter, id, true), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *nimbusWhisperWrapper) SendMessagesRequest(peerID []byte, r whispertypes.MessagesRequest) error {
|
func (w *nimbusWhisperWrapper) SendMessagesRequest(peerID []byte, r types.MessagesRequest) error {
|
||||||
return errors.New("not implemented")
|
return errors.New("not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,11 +425,11 @@ func (w *nimbusWhisperWrapper) SendMessagesRequest(peerID []byte, r whispertypes
|
||||||
// request and respond with a number of peer-to-peer messages (possibly expired),
|
// request and respond with a number of peer-to-peer messages (possibly expired),
|
||||||
// which are not supposed to be forwarded any further.
|
// which are not supposed to be forwarded any further.
|
||||||
// The whisper protocol is agnostic of the format and contents of envelope.
|
// The whisper protocol is agnostic of the format and contents of envelope.
|
||||||
func (w *nimbusWhisperWrapper) RequestHistoricMessagesWithTimeout(peerID []byte, envelope whispertypes.Envelope, timeout time.Duration) error {
|
func (w *nimbusWhisperWrapper) RequestHistoricMessagesWithTimeout(peerID []byte, envelope types.Envelope, timeout time.Duration) error {
|
||||||
return errors.New("not implemented")
|
return errors.New("not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
// SyncMessages can be sent between two Mail Servers and syncs envelopes between them.
|
// SyncMessages can be sent between two Mail Servers and syncs envelopes between them.
|
||||||
func (w *nimbusWhisperWrapper) SyncMessages(peerID []byte, req whispertypes.SyncMailRequest) error {
|
func (w *nimbusWhisperWrapper) SyncMessages(peerID []byte, req types.SyncMailRequest) error {
|
||||||
return errors.New("not implemented")
|
return errors.New("not implemented")
|
||||||
}
|
}
|
|
@ -9,19 +9,31 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
gethcrypto "github.com/ethereum/go-ethereum/crypto"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
aesNonceLength = 12
|
aesNonceLength = 12
|
||||||
)
|
)
|
||||||
|
|
||||||
// SignBytes signs the hash of arbitrary data.
|
// Sign calculates an ECDSA signature.
|
||||||
func SignBytes(data []byte, identity *ecdsa.PrivateKey) ([]byte, error) {
|
//
|
||||||
return crypto.Sign(crypto.Keccak256(data), identity)
|
// This function is susceptible to chosen plaintext attacks that can leak
|
||||||
|
// information about the private key that is used for signing. Callers must
|
||||||
|
// be aware that the given digest cannot be chosen by an adversery. Common
|
||||||
|
// solution is to hash any input before calculating the signature.
|
||||||
|
//
|
||||||
|
// The produced signature is in the [R || S || V] format where V is 0 or 1.
|
||||||
|
func Sign(digestHash []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) {
|
||||||
|
return gethcrypto.Sign(digestHash, prv)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SignStringAsHex signs the Keccak256 hash of arbitrary data and returns its hex representation.
|
// SignBytes signs the hash of arbitrary data.
|
||||||
|
func SignBytes(data []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) {
|
||||||
|
return Sign(Keccak256(data), prv)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SignBytesAsHex signs the Keccak256 hash of arbitrary data and returns its hex representation.
|
||||||
func SignBytesAsHex(data []byte, identity *ecdsa.PrivateKey) (string, error) {
|
func SignBytesAsHex(data []byte, identity *ecdsa.PrivateKey) (string, error) {
|
||||||
signature, err := SignBytes(data, identity)
|
signature, err := SignBytes(data, identity)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -35,16 +47,10 @@ func SignStringAsHex(data string, identity *ecdsa.PrivateKey) (string, error) {
|
||||||
return SignBytesAsHex([]byte(data), identity)
|
return SignBytesAsHex([]byte(data), identity)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sign signs the hash of arbitrary data.
|
|
||||||
// DEPRECATED: use SignStringAsHex instead.
|
|
||||||
func Sign(data string, identity *ecdsa.PrivateKey) (string, error) {
|
|
||||||
return SignStringAsHex(data, identity)
|
|
||||||
}
|
|
||||||
|
|
||||||
// VerifySignatures verifies tuples of signatures content/hash/public key
|
// VerifySignatures verifies tuples of signatures content/hash/public key
|
||||||
func VerifySignatures(signaturePairs [][3]string) error {
|
func VerifySignatures(signaturePairs [][3]string) error {
|
||||||
for _, signaturePair := range signaturePairs {
|
for _, signaturePair := range signaturePairs {
|
||||||
content := crypto.Keccak256([]byte(signaturePair[0]))
|
content := Keccak256([]byte(signaturePair[0]))
|
||||||
|
|
||||||
signature, err := hex.DecodeString(signaturePair[1])
|
signature, err := hex.DecodeString(signaturePair[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -56,12 +62,12 @@ func VerifySignatures(signaturePairs [][3]string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
publicKey, err := crypto.UnmarshalPubkey(publicKeyBytes)
|
publicKey, err := UnmarshalPubkey(publicKeyBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
recoveredKey, err := crypto.SigToPub(
|
recoveredKey, err := SigToPub(
|
||||||
content,
|
content,
|
||||||
signature,
|
signature,
|
||||||
)
|
)
|
||||||
|
@ -69,7 +75,7 @@ func VerifySignatures(signaturePairs [][3]string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if crypto.PubkeyToAddress(*recoveredKey) != crypto.PubkeyToAddress(*publicKey) {
|
if PubkeyToAddress(*recoveredKey) != PubkeyToAddress(*publicKey) {
|
||||||
return errors.New("identity key and signature mismatch")
|
return errors.New("identity key and signature mismatch")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,14 +88,14 @@ func VerifySignatures(signaturePairs [][3]string) error {
|
||||||
func ExtractSignatures(signaturePairs [][2]string) ([]string, error) {
|
func ExtractSignatures(signaturePairs [][2]string) ([]string, error) {
|
||||||
response := make([]string, len(signaturePairs))
|
response := make([]string, len(signaturePairs))
|
||||||
for i, signaturePair := range signaturePairs {
|
for i, signaturePair := range signaturePairs {
|
||||||
content := crypto.Keccak256([]byte(signaturePair[0]))
|
content := Keccak256([]byte(signaturePair[0]))
|
||||||
|
|
||||||
signature, err := hex.DecodeString(signaturePair[1])
|
signature, err := hex.DecodeString(signaturePair[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
recoveredKey, err := crypto.SigToPub(
|
recoveredKey, err := SigToPub(
|
||||||
content,
|
content,
|
||||||
signature,
|
signature,
|
||||||
)
|
)
|
||||||
|
@ -97,7 +103,7 @@ func ExtractSignatures(signaturePairs [][2]string) ([]string, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
response[i] = fmt.Sprintf("%x", crypto.FromECDSAPub(recoveredKey))
|
response[i] = fmt.Sprintf("%x", FromECDSAPub(recoveredKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
return response, nil
|
return response, nil
|
||||||
|
@ -105,8 +111,8 @@ func ExtractSignatures(signaturePairs [][2]string) ([]string, error) {
|
||||||
|
|
||||||
// ExtractSignature returns a public key for a given data and signature.
|
// ExtractSignature returns a public key for a given data and signature.
|
||||||
func ExtractSignature(data, signature []byte) (*ecdsa.PublicKey, error) {
|
func ExtractSignature(data, signature []byte) (*ecdsa.PublicKey, error) {
|
||||||
dataHash := crypto.Keccak256(data)
|
dataHash := Keccak256(data)
|
||||||
return crypto.SigToPub(dataHash, signature)
|
return SigToPub(dataHash, signature)
|
||||||
}
|
}
|
||||||
|
|
||||||
func EncryptSymmetric(key, plaintext []byte) ([]byte, error) {
|
func EncryptSymmetric(key, plaintext []byte) ([]byte, error) {
|
|
@ -2,7 +2,6 @@ package crypto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
@ -11,20 +10,20 @@ func TestExtractSignatures(t *testing.T) {
|
||||||
const content1 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35441"
|
const content1 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35441"
|
||||||
const content2 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35440"
|
const content2 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35440"
|
||||||
|
|
||||||
key1, err := crypto.GenerateKey()
|
key1, err := GenerateKey()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
key2, err := crypto.GenerateKey()
|
key2, err := GenerateKey()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
signature1, err := Sign(content1, key1)
|
signature1, err := SignStringAsHex(content1, key1)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
signature2, err := Sign(content2, key2)
|
signature2, err := SignStringAsHex(content2, key2)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
key1String := hex.EncodeToString(crypto.FromECDSAPub(&key1.PublicKey))
|
key1String := hex.EncodeToString(FromECDSAPub(&key1.PublicKey))
|
||||||
key2String := hex.EncodeToString(crypto.FromECDSAPub(&key2.PublicKey))
|
key2String := hex.EncodeToString(FromECDSAPub(&key2.PublicKey))
|
||||||
|
|
||||||
pair1 := [2]string{content1, signature1}
|
pair1 := [2]string{content1, signature1}
|
||||||
pair2 := [2]string{content2, signature2}
|
pair2 := [2]string{content2, signature2}
|
||||||
|
@ -51,20 +50,20 @@ func TestVerifySignature(t *testing.T) {
|
||||||
const content1 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35441"
|
const content1 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35441"
|
||||||
const content2 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35440"
|
const content2 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35440"
|
||||||
|
|
||||||
key1, err := crypto.GenerateKey()
|
key1, err := GenerateKey()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
key2, err := crypto.GenerateKey()
|
key2, err := GenerateKey()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
signature1, err := Sign(content1, key1)
|
signature1, err := SignStringAsHex(content1, key1)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
signature2, err := Sign(content2, key2)
|
signature2, err := SignStringAsHex(content2, key2)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
key1String := hex.EncodeToString(crypto.FromECDSAPub(&key1.PublicKey))
|
key1String := hex.EncodeToString(FromECDSAPub(&key1.PublicKey))
|
||||||
key2String := hex.EncodeToString(crypto.FromECDSAPub(&key2.PublicKey))
|
key2String := hex.EncodeToString(FromECDSAPub(&key2.PublicKey))
|
||||||
|
|
||||||
pair1 := [3]string{content1, signature1, key1String}
|
pair1 := [3]string{content1, signature1, key1String}
|
||||||
pair2 := [3]string{content2, signature2, key2String}
|
pair2 := [3]string{content2, signature2, key2String}
|
|
@ -0,0 +1,366 @@
|
||||||
|
// Copyright (c) 2013 Kyle Isom <kyle@tyrfingr.is>
|
||||||
|
// Copyright (c) 2012 The Go Authors. All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package ecies
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/cipher"
|
||||||
|
"crypto/ecdsa"
|
||||||
|
"crypto/elliptic"
|
||||||
|
"crypto/hmac"
|
||||||
|
"crypto/subtle"
|
||||||
|
"fmt"
|
||||||
|
"hash"
|
||||||
|
"io"
|
||||||
|
"math/big"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrImport = fmt.Errorf("ecies: failed to import key")
|
||||||
|
ErrInvalidCurve = fmt.Errorf("ecies: invalid elliptic curve")
|
||||||
|
ErrInvalidParams = fmt.Errorf("ecies: invalid ECIES parameters")
|
||||||
|
ErrInvalidPublicKey = fmt.Errorf("ecies: invalid public key")
|
||||||
|
ErrSharedKeyIsPointAtInfinity = fmt.Errorf("ecies: shared key is point at infinity")
|
||||||
|
ErrSharedKeyTooBig = fmt.Errorf("ecies: shared key params are too big")
|
||||||
|
)
|
||||||
|
|
||||||
|
// PublicKey is a representation of an elliptic curve public key.
|
||||||
|
type PublicKey struct {
|
||||||
|
X *big.Int
|
||||||
|
Y *big.Int
|
||||||
|
elliptic.Curve
|
||||||
|
Params *ECIESParams
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export an ECIES public key as an ECDSA public key.
|
||||||
|
func (pub *PublicKey) ExportECDSA() *ecdsa.PublicKey {
|
||||||
|
return &ecdsa.PublicKey{Curve: pub.Curve, X: pub.X, Y: pub.Y}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Import an ECDSA public key as an ECIES public key.
|
||||||
|
func ImportECDSAPublic(pub *ecdsa.PublicKey) *PublicKey {
|
||||||
|
return &PublicKey{
|
||||||
|
X: pub.X,
|
||||||
|
Y: pub.Y,
|
||||||
|
Curve: pub.Curve,
|
||||||
|
Params: ParamsFromCurve(pub.Curve),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PrivateKey is a representation of an elliptic curve private key.
|
||||||
|
type PrivateKey struct {
|
||||||
|
PublicKey
|
||||||
|
D *big.Int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export an ECIES private key as an ECDSA private key.
|
||||||
|
func (prv *PrivateKey) ExportECDSA() *ecdsa.PrivateKey {
|
||||||
|
pub := &prv.PublicKey
|
||||||
|
pubECDSA := pub.ExportECDSA()
|
||||||
|
return &ecdsa.PrivateKey{PublicKey: *pubECDSA, D: prv.D}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Import an ECDSA private key as an ECIES private key.
|
||||||
|
func ImportECDSA(prv *ecdsa.PrivateKey) *PrivateKey {
|
||||||
|
pub := ImportECDSAPublic(&prv.PublicKey)
|
||||||
|
return &PrivateKey{*pub, prv.D}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate an elliptic curve public / private keypair. If params is nil,
|
||||||
|
// the recommended default parameters for the key will be chosen.
|
||||||
|
func GenerateKey(rand io.Reader, curve elliptic.Curve, params *ECIESParams) (prv *PrivateKey, err error) {
|
||||||
|
pb, x, y, err := elliptic.GenerateKey(curve, rand)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
prv = new(PrivateKey)
|
||||||
|
prv.PublicKey.X = x
|
||||||
|
prv.PublicKey.Y = y
|
||||||
|
prv.PublicKey.Curve = curve
|
||||||
|
prv.D = new(big.Int).SetBytes(pb)
|
||||||
|
if params == nil {
|
||||||
|
params = ParamsFromCurve(curve)
|
||||||
|
}
|
||||||
|
prv.PublicKey.Params = params
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// MaxSharedKeyLength returns the maximum length of the shared key the
|
||||||
|
// public key can produce.
|
||||||
|
func MaxSharedKeyLength(pub *PublicKey) int {
|
||||||
|
return (pub.Curve.Params().BitSize + 7) / 8
|
||||||
|
}
|
||||||
|
|
||||||
|
// ECDH key agreement method used to establish secret keys for encryption.
|
||||||
|
func (prv *PrivateKey) GenerateShared(pub *PublicKey, skLen, macLen int) (sk []byte, err error) {
|
||||||
|
if prv.PublicKey.Curve != pub.Curve {
|
||||||
|
return nil, ErrInvalidCurve
|
||||||
|
}
|
||||||
|
if skLen+macLen > MaxSharedKeyLength(pub) {
|
||||||
|
return nil, ErrSharedKeyTooBig
|
||||||
|
}
|
||||||
|
|
||||||
|
x, _ := pub.Curve.ScalarMult(pub.X, pub.Y, prv.D.Bytes())
|
||||||
|
if x == nil {
|
||||||
|
return nil, ErrSharedKeyIsPointAtInfinity
|
||||||
|
}
|
||||||
|
|
||||||
|
sk = make([]byte, skLen+macLen)
|
||||||
|
skBytes := x.Bytes()
|
||||||
|
copy(sk[len(sk)-len(skBytes):], skBytes)
|
||||||
|
return sk, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrKeyDataTooLong = fmt.Errorf("ecies: can't supply requested key data")
|
||||||
|
ErrSharedTooLong = fmt.Errorf("ecies: shared secret is too long")
|
||||||
|
ErrInvalidMessage = fmt.Errorf("ecies: invalid message")
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
big2To32 = new(big.Int).Exp(big.NewInt(2), big.NewInt(32), nil)
|
||||||
|
big2To32M1 = new(big.Int).Sub(big2To32, big.NewInt(1))
|
||||||
|
)
|
||||||
|
|
||||||
|
func incCounter(ctr []byte) {
|
||||||
|
if ctr[3]++; ctr[3] != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if ctr[2]++; ctr[2] != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if ctr[1]++; ctr[1] != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if ctr[0]++; ctr[0] != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NIST SP 800-56 Concatenation Key Derivation Function (see section 5.8.1).
|
||||||
|
func concatKDF(hash hash.Hash, z, s1 []byte, kdLen int) (k []byte, err error) {
|
||||||
|
if s1 == nil {
|
||||||
|
s1 = make([]byte, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
reps := ((kdLen + 7) * 8) / (hash.BlockSize() * 8)
|
||||||
|
if big.NewInt(int64(reps)).Cmp(big2To32M1) > 0 {
|
||||||
|
fmt.Println(big2To32M1)
|
||||||
|
return nil, ErrKeyDataTooLong
|
||||||
|
}
|
||||||
|
|
||||||
|
counter := []byte{0, 0, 0, 1}
|
||||||
|
k = make([]byte, 0)
|
||||||
|
|
||||||
|
for i := 0; i <= reps; i++ {
|
||||||
|
hash.Write(counter)
|
||||||
|
hash.Write(z)
|
||||||
|
hash.Write(s1)
|
||||||
|
k = append(k, hash.Sum(nil)...)
|
||||||
|
hash.Reset()
|
||||||
|
incCounter(counter)
|
||||||
|
}
|
||||||
|
|
||||||
|
k = k[:kdLen]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// messageTag computes the MAC of a message (called the tag) as per
|
||||||
|
// SEC 1, 3.5.
|
||||||
|
func messageTag(hash func() hash.Hash, km, msg, shared []byte) []byte {
|
||||||
|
mac := hmac.New(hash, km)
|
||||||
|
mac.Write(msg)
|
||||||
|
mac.Write(shared)
|
||||||
|
tag := mac.Sum(nil)
|
||||||
|
return tag
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate an initialisation vector for CTR mode.
|
||||||
|
func generateIV(params *ECIESParams, rand io.Reader) (iv []byte, err error) {
|
||||||
|
iv = make([]byte, params.BlockSize)
|
||||||
|
_, err = io.ReadFull(rand, iv)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// symEncrypt carries out CTR encryption using the block cipher specified in the
|
||||||
|
// parameters.
|
||||||
|
func symEncrypt(rand io.Reader, params *ECIESParams, key, m []byte) (ct []byte, err error) {
|
||||||
|
c, err := params.Cipher(key)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
iv, err := generateIV(params, rand)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctr := cipher.NewCTR(c, iv)
|
||||||
|
|
||||||
|
ct = make([]byte, len(m)+params.BlockSize)
|
||||||
|
copy(ct, iv)
|
||||||
|
ctr.XORKeyStream(ct[params.BlockSize:], m)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// symDecrypt carries out CTR decryption using the block cipher specified in
|
||||||
|
// the parameters
|
||||||
|
func symDecrypt(params *ECIESParams, key, ct []byte) (m []byte, err error) {
|
||||||
|
c, err := params.Cipher(key)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ctr := cipher.NewCTR(c, ct[:params.BlockSize])
|
||||||
|
|
||||||
|
m = make([]byte, len(ct)-params.BlockSize)
|
||||||
|
ctr.XORKeyStream(m, ct[params.BlockSize:])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encrypt encrypts a message using ECIES as specified in SEC 1, 5.1.
|
||||||
|
//
|
||||||
|
// s1 and s2 contain shared information that is not part of the resulting
|
||||||
|
// ciphertext. s1 is fed into key derivation, s2 is fed into the MAC. If the
|
||||||
|
// shared information parameters aren't being used, they should be nil.
|
||||||
|
func Encrypt(rand io.Reader, pub *PublicKey, m, s1, s2 []byte) (ct []byte, err error) {
|
||||||
|
params := pub.Params
|
||||||
|
if params == nil {
|
||||||
|
if params = ParamsFromCurve(pub.Curve); params == nil {
|
||||||
|
err = ErrUnsupportedECIESParameters
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
R, err := GenerateKey(rand, pub.Curve, params)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
hash := params.Hash()
|
||||||
|
z, err := R.GenerateShared(pub, params.KeyLen, params.KeyLen)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
K, err := concatKDF(hash, z, s1, params.KeyLen+params.KeyLen)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Ke := K[:params.KeyLen]
|
||||||
|
Km := K[params.KeyLen:]
|
||||||
|
hash.Write(Km)
|
||||||
|
Km = hash.Sum(nil)
|
||||||
|
hash.Reset()
|
||||||
|
|
||||||
|
em, err := symEncrypt(rand, params, Ke, m)
|
||||||
|
if err != nil || len(em) <= params.BlockSize {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
d := messageTag(params.Hash, Km, em, s2)
|
||||||
|
|
||||||
|
Rb := elliptic.Marshal(pub.Curve, R.PublicKey.X, R.PublicKey.Y)
|
||||||
|
ct = make([]byte, len(Rb)+len(em)+len(d))
|
||||||
|
copy(ct, Rb)
|
||||||
|
copy(ct[len(Rb):], em)
|
||||||
|
copy(ct[len(Rb)+len(em):], d)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decrypt decrypts an ECIES ciphertext.
|
||||||
|
func (prv *PrivateKey) Decrypt(c, s1, s2 []byte) (m []byte, err error) {
|
||||||
|
if len(c) == 0 {
|
||||||
|
return nil, ErrInvalidMessage
|
||||||
|
}
|
||||||
|
params := prv.PublicKey.Params
|
||||||
|
if params == nil {
|
||||||
|
if params = ParamsFromCurve(prv.PublicKey.Curve); params == nil {
|
||||||
|
err = ErrUnsupportedECIESParameters
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hash := params.Hash()
|
||||||
|
|
||||||
|
var (
|
||||||
|
rLen int
|
||||||
|
hLen int = hash.Size()
|
||||||
|
mStart int
|
||||||
|
mEnd int
|
||||||
|
)
|
||||||
|
|
||||||
|
switch c[0] {
|
||||||
|
case 2, 3, 4:
|
||||||
|
rLen = (prv.PublicKey.Curve.Params().BitSize + 7) / 4
|
||||||
|
if len(c) < (rLen + hLen + 1) {
|
||||||
|
err = ErrInvalidMessage
|
||||||
|
return
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
err = ErrInvalidPublicKey
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mStart = rLen
|
||||||
|
mEnd = len(c) - hLen
|
||||||
|
|
||||||
|
R := new(PublicKey)
|
||||||
|
R.Curve = prv.PublicKey.Curve
|
||||||
|
R.X, R.Y = elliptic.Unmarshal(R.Curve, c[:rLen])
|
||||||
|
if R.X == nil {
|
||||||
|
err = ErrInvalidPublicKey
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !R.Curve.IsOnCurve(R.X, R.Y) {
|
||||||
|
err = ErrInvalidCurve
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
z, err := prv.GenerateShared(R, params.KeyLen, params.KeyLen)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
K, err := concatKDF(hash, z, s1, params.KeyLen+params.KeyLen)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
Ke := K[:params.KeyLen]
|
||||||
|
Km := K[params.KeyLen:]
|
||||||
|
hash.Write(Km)
|
||||||
|
Km = hash.Sum(nil)
|
||||||
|
hash.Reset()
|
||||||
|
|
||||||
|
d := messageTag(params.Hash, Km, c[mStart:mEnd], s2)
|
||||||
|
if subtle.ConstantTimeCompare(c[mEnd:], d) != 1 {
|
||||||
|
err = ErrInvalidMessage
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
m, err = symDecrypt(params, Ke, c[mStart:mEnd])
|
||||||
|
return
|
||||||
|
}
|
|
@ -0,0 +1,117 @@
|
||||||
|
// Copyright (c) 2013 Kyle Isom <kyle@tyrfingr.is>
|
||||||
|
// Copyright (c) 2012 The Go Authors. All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package ecies
|
||||||
|
|
||||||
|
// This file contains parameters for ECIES encryption, specifying the
|
||||||
|
// symmetric encryption and HMAC parameters.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto"
|
||||||
|
"crypto/aes"
|
||||||
|
"crypto/cipher"
|
||||||
|
"crypto/elliptic"
|
||||||
|
"crypto/sha256"
|
||||||
|
"crypto/sha512"
|
||||||
|
"fmt"
|
||||||
|
"hash"
|
||||||
|
|
||||||
|
gethcrypto "github.com/ethereum/go-ethereum/crypto"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
DefaultCurve = gethcrypto.S256()
|
||||||
|
ErrUnsupportedECDHAlgorithm = fmt.Errorf("ecies: unsupported ECDH algorithm")
|
||||||
|
ErrUnsupportedECIESParameters = fmt.Errorf("ecies: unsupported ECIES parameters")
|
||||||
|
)
|
||||||
|
|
||||||
|
type ECIESParams struct {
|
||||||
|
Hash func() hash.Hash // hash function
|
||||||
|
hashAlgo crypto.Hash
|
||||||
|
Cipher func([]byte) (cipher.Block, error) // symmetric cipher
|
||||||
|
BlockSize int // block size of symmetric cipher
|
||||||
|
KeyLen int // length of symmetric key
|
||||||
|
}
|
||||||
|
|
||||||
|
// Standard ECIES parameters:
|
||||||
|
// * ECIES using AES128 and HMAC-SHA-256-16
|
||||||
|
// * ECIES using AES256 and HMAC-SHA-256-32
|
||||||
|
// * ECIES using AES256 and HMAC-SHA-384-48
|
||||||
|
// * ECIES using AES256 and HMAC-SHA-512-64
|
||||||
|
|
||||||
|
var (
|
||||||
|
ECIES_AES128_SHA256 = &ECIESParams{
|
||||||
|
Hash: sha256.New,
|
||||||
|
hashAlgo: crypto.SHA256,
|
||||||
|
Cipher: aes.NewCipher,
|
||||||
|
BlockSize: aes.BlockSize,
|
||||||
|
KeyLen: 16,
|
||||||
|
}
|
||||||
|
|
||||||
|
ECIES_AES256_SHA256 = &ECIESParams{
|
||||||
|
Hash: sha256.New,
|
||||||
|
hashAlgo: crypto.SHA256,
|
||||||
|
Cipher: aes.NewCipher,
|
||||||
|
BlockSize: aes.BlockSize,
|
||||||
|
KeyLen: 32,
|
||||||
|
}
|
||||||
|
|
||||||
|
ECIES_AES256_SHA384 = &ECIESParams{
|
||||||
|
Hash: sha512.New384,
|
||||||
|
hashAlgo: crypto.SHA384,
|
||||||
|
Cipher: aes.NewCipher,
|
||||||
|
BlockSize: aes.BlockSize,
|
||||||
|
KeyLen: 32,
|
||||||
|
}
|
||||||
|
|
||||||
|
ECIES_AES256_SHA512 = &ECIESParams{
|
||||||
|
Hash: sha512.New,
|
||||||
|
hashAlgo: crypto.SHA512,
|
||||||
|
Cipher: aes.NewCipher,
|
||||||
|
BlockSize: aes.BlockSize,
|
||||||
|
KeyLen: 32,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
var paramsFromCurve = map[elliptic.Curve]*ECIESParams{
|
||||||
|
gethcrypto.S256(): ECIES_AES128_SHA256,
|
||||||
|
elliptic.P256(): ECIES_AES128_SHA256,
|
||||||
|
elliptic.P384(): ECIES_AES256_SHA384,
|
||||||
|
elliptic.P521(): ECIES_AES256_SHA512,
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddParamsForCurve(curve elliptic.Curve, params *ECIESParams) {
|
||||||
|
paramsFromCurve[curve] = params
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParamsFromCurve selects parameters optimal for the selected elliptic curve.
|
||||||
|
// Only the curves P256, P384, and P512 are supported.
|
||||||
|
func ParamsFromCurve(curve elliptic.Curve) (params *ECIESParams) {
|
||||||
|
return paramsFromCurve[curve]
|
||||||
|
}
|
|
@ -9,9 +9,8 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/ethereum/go-ethereum/crypto/ecies"
|
|
||||||
dr "github.com/status-im/doubleratchet"
|
dr "github.com/status-im/doubleratchet"
|
||||||
|
"github.com/status-im/status-go/eth-node/crypto/ecies"
|
||||||
"golang.org/x/crypto/hkdf"
|
"golang.org/x/crypto/hkdf"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -22,14 +21,14 @@ type EthereumCrypto struct{}
|
||||||
|
|
||||||
// See the Crypto interface.
|
// See the Crypto interface.
|
||||||
func (c EthereumCrypto) GenerateDH() (dr.DHPair, error) {
|
func (c EthereumCrypto) GenerateDH() (dr.DHPair, error) {
|
||||||
keys, err := crypto.GenerateKey()
|
keys, err := GenerateKey()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return DHPair{
|
return DHPair{
|
||||||
PubKey: crypto.CompressPubkey(&keys.PublicKey),
|
PubKey: CompressPubkey(&keys.PublicKey),
|
||||||
PrvKey: crypto.FromECDSA(keys),
|
PrvKey: FromECDSA(keys),
|
||||||
}, nil
|
}, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -37,14 +36,14 @@ func (c EthereumCrypto) GenerateDH() (dr.DHPair, error) {
|
||||||
// See the Crypto interface.
|
// See the Crypto interface.
|
||||||
func (c EthereumCrypto) DH(dhPair dr.DHPair, dhPub dr.Key) (dr.Key, error) {
|
func (c EthereumCrypto) DH(dhPair dr.DHPair, dhPub dr.Key) (dr.Key, error) {
|
||||||
tmpKey := dhPair.PrivateKey()
|
tmpKey := dhPair.PrivateKey()
|
||||||
privateKey, err := crypto.ToECDSA(tmpKey)
|
privateKey, err := ToECDSA(tmpKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
eciesPrivate := ecies.ImportECDSA(privateKey)
|
eciesPrivate := ecies.ImportECDSA(privateKey)
|
||||||
|
|
||||||
publicKey, err := crypto.DecompressPubkey(dhPub)
|
publicKey, err := DecompressPubkey(dhPub)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
|
@ -0,0 +1,242 @@
|
||||||
|
// Copyright 2014 The go-ethereum Authors
|
||||||
|
// This file is part of the go-ethereum library.
|
||||||
|
//
|
||||||
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public License
|
||||||
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package crypto
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/ecdsa"
|
||||||
|
"crypto/elliptic"
|
||||||
|
"crypto/rand"
|
||||||
|
"encoding/hex"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"math/big"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common/math"
|
||||||
|
"github.com/ethereum/go-ethereum/crypto/secp256k1"
|
||||||
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
|
"golang.org/x/crypto/sha3"
|
||||||
|
)
|
||||||
|
|
||||||
|
//SignatureLength indicates the byte length required to carry a signature with recovery id.
|
||||||
|
const SignatureLength = 64 + 1 // 64 bytes ECDSA signature + 1 byte recovery id
|
||||||
|
|
||||||
|
// RecoveryIDOffset points to the byte offset within the signature that contains the recovery id.
|
||||||
|
const RecoveryIDOffset = 64
|
||||||
|
|
||||||
|
// DigestLength sets the signature digest exact length
|
||||||
|
const DigestLength = 32
|
||||||
|
|
||||||
|
var (
|
||||||
|
secp256k1N, _ = new(big.Int).SetString("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", 16)
|
||||||
|
secp256k1halfN = new(big.Int).Div(secp256k1N, big.NewInt(2))
|
||||||
|
)
|
||||||
|
|
||||||
|
var errInvalidPubkey = errors.New("invalid secp256k1 public key")
|
||||||
|
|
||||||
|
// Keccak256 calculates and returns the Keccak256 hash of the input data.
|
||||||
|
func Keccak256(data ...[]byte) []byte {
|
||||||
|
d := sha3.NewLegacyKeccak256()
|
||||||
|
for _, b := range data {
|
||||||
|
d.Write(b)
|
||||||
|
}
|
||||||
|
return d.Sum(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keccak256Hash calculates and returns the Keccak256 hash of the input data,
|
||||||
|
// converting it to an internal Hash data structure.
|
||||||
|
func Keccak256Hash(data ...[]byte) (h types.Hash) {
|
||||||
|
d := sha3.NewLegacyKeccak256()
|
||||||
|
for _, b := range data {
|
||||||
|
d.Write(b)
|
||||||
|
}
|
||||||
|
d.Sum(h[:0])
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keccak512 calculates and returns the Keccak512 hash of the input data.
|
||||||
|
func Keccak512(data ...[]byte) []byte {
|
||||||
|
d := sha3.NewLegacyKeccak512()
|
||||||
|
for _, b := range data {
|
||||||
|
d.Write(b)
|
||||||
|
}
|
||||||
|
return d.Sum(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateAddress creates an ethereum address given the bytes and the nonce
|
||||||
|
func CreateAddress(b types.Address, nonce uint64) types.Address {
|
||||||
|
data, _ := rlp.EncodeToBytes([]interface{}{b, nonce})
|
||||||
|
return types.BytesToAddress(Keccak256(data)[12:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateAddress2 creates an ethereum address given the address bytes, initial
|
||||||
|
// contract code hash and a salt.
|
||||||
|
func CreateAddress2(b types.Address, salt [32]byte, inithash []byte) types.Address {
|
||||||
|
return types.BytesToAddress(Keccak256([]byte{0xff}, b.Bytes(), salt[:], inithash)[12:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToECDSA creates a private key with the given D value.
|
||||||
|
func ToECDSA(d []byte) (*ecdsa.PrivateKey, error) {
|
||||||
|
return toECDSA(d, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToECDSAUnsafe blindly converts a binary blob to a private key. It should almost
|
||||||
|
// never be used unless you are sure the input is valid and want to avoid hitting
|
||||||
|
// errors due to bad origin encoding (0 prefixes cut off).
|
||||||
|
func ToECDSAUnsafe(d []byte) *ecdsa.PrivateKey {
|
||||||
|
priv, _ := toECDSA(d, false)
|
||||||
|
return priv
|
||||||
|
}
|
||||||
|
|
||||||
|
// toECDSA creates a private key with the given D value. The strict parameter
|
||||||
|
// controls whether the key's length should be enforced at the curve size or
|
||||||
|
// it can also accept legacy encodings (0 prefixes).
|
||||||
|
func toECDSA(d []byte, strict bool) (*ecdsa.PrivateKey, error) {
|
||||||
|
priv := new(ecdsa.PrivateKey)
|
||||||
|
priv.PublicKey.Curve = S256()
|
||||||
|
if strict && 8*len(d) != priv.Params().BitSize {
|
||||||
|
return nil, fmt.Errorf("invalid length, need %d bits", priv.Params().BitSize)
|
||||||
|
}
|
||||||
|
priv.D = new(big.Int).SetBytes(d)
|
||||||
|
|
||||||
|
// The priv.D must < N
|
||||||
|
if priv.D.Cmp(secp256k1N) >= 0 {
|
||||||
|
return nil, fmt.Errorf("invalid private key, >=N")
|
||||||
|
}
|
||||||
|
// The priv.D must not be zero or negative.
|
||||||
|
if priv.D.Sign() <= 0 {
|
||||||
|
return nil, fmt.Errorf("invalid private key, zero or negative")
|
||||||
|
}
|
||||||
|
|
||||||
|
priv.PublicKey.X, priv.PublicKey.Y = priv.PublicKey.Curve.ScalarBaseMult(d)
|
||||||
|
if priv.PublicKey.X == nil {
|
||||||
|
return nil, errors.New("invalid private key")
|
||||||
|
}
|
||||||
|
return priv, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromECDSA exports a private key into a binary dump.
|
||||||
|
func FromECDSA(priv *ecdsa.PrivateKey) []byte {
|
||||||
|
if priv == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return math.PaddedBigBytes(priv.D, priv.Params().BitSize/8)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalPubkey converts bytes to a secp256k1 public key.
|
||||||
|
func UnmarshalPubkey(pub []byte) (*ecdsa.PublicKey, error) {
|
||||||
|
x, y := elliptic.Unmarshal(S256(), pub)
|
||||||
|
if x == nil {
|
||||||
|
return nil, errInvalidPubkey
|
||||||
|
}
|
||||||
|
return &ecdsa.PublicKey{Curve: S256(), X: x, Y: y}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func FromECDSAPub(pub *ecdsa.PublicKey) []byte {
|
||||||
|
if pub == nil || pub.X == nil || pub.Y == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return elliptic.Marshal(S256(), pub.X, pub.Y)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HexToECDSA parses a secp256k1 private key.
|
||||||
|
func HexToECDSA(hexkey string) (*ecdsa.PrivateKey, error) {
|
||||||
|
b, err := hex.DecodeString(hexkey)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("invalid hex string")
|
||||||
|
}
|
||||||
|
return ToECDSA(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadECDSA loads a secp256k1 private key from the given file.
|
||||||
|
func LoadECDSA(file string) (*ecdsa.PrivateKey, error) {
|
||||||
|
buf := make([]byte, 64)
|
||||||
|
fd, err := os.Open(file)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer fd.Close()
|
||||||
|
if _, err := io.ReadFull(fd, buf); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
key, err := hex.DecodeString(string(buf))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return ToECDSA(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SaveECDSA saves a secp256k1 private key to the given file with
|
||||||
|
// restrictive permissions. The key data is saved hex-encoded.
|
||||||
|
func SaveECDSA(file string, key *ecdsa.PrivateKey) error {
|
||||||
|
k := hex.EncodeToString(FromECDSA(key))
|
||||||
|
return ioutil.WriteFile(file, []byte(k), 0600)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateKey() (*ecdsa.PrivateKey, error) {
|
||||||
|
return ecdsa.GenerateKey(S256(), rand.Reader)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PubkeyToAddress(p ecdsa.PublicKey) types.Address {
|
||||||
|
pubBytes := FromECDSAPub(&p)
|
||||||
|
return types.BytesToAddress(Keccak256(pubBytes[1:])[12:])
|
||||||
|
}
|
||||||
|
|
||||||
|
func zeroBytes(bytes []byte) {
|
||||||
|
for i := range bytes {
|
||||||
|
bytes[i] = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ecrecover returns the uncompressed public key that created the given signature.
|
||||||
|
func Ecrecover(hash, sig []byte) ([]byte, error) {
|
||||||
|
return secp256k1.RecoverPubkey(hash, sig)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SigToPub returns the public key that created the given signature.
|
||||||
|
func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) {
|
||||||
|
s, err := Ecrecover(hash, sig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
x, y := elliptic.Unmarshal(S256(), s)
|
||||||
|
return &ecdsa.PublicKey{Curve: S256(), X: x, Y: y}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecompressPubkey parses a public key in the 33-byte compressed format.
|
||||||
|
func DecompressPubkey(pubkey []byte) (*ecdsa.PublicKey, error) {
|
||||||
|
x, y := secp256k1.DecompressPubkey(pubkey)
|
||||||
|
if x == nil {
|
||||||
|
return nil, fmt.Errorf("invalid public key")
|
||||||
|
}
|
||||||
|
return &ecdsa.PublicKey{X: x, Y: y, Curve: S256()}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CompressPubkey encodes a public key to the 33-byte compressed format.
|
||||||
|
func CompressPubkey(pubkey *ecdsa.PublicKey) []byte {
|
||||||
|
return secp256k1.CompressPubkey(pubkey.X, pubkey.Y)
|
||||||
|
}
|
||||||
|
|
||||||
|
// S256 returns an instance of the secp256k1 curve.
|
||||||
|
func S256() elliptic.Curve {
|
||||||
|
return secp256k1.S256()
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
module github.com/status-im/status-go/eth-node
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
||||||
|
replace github.com/ethereum/go-ethereum v1.9.5 => github.com/status-im/go-ethereum v1.9.5-status.6
|
||||||
|
|
||||||
|
replace github.com/status-im/status-go/extkeys => ../extkeys
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/ethereum/go-ethereum v1.9.5
|
||||||
|
github.com/mattn/go-pointer v0.0.0-20190911064623-a0a44394634f
|
||||||
|
github.com/status-im/doubleratchet v3.0.0+incompatible
|
||||||
|
github.com/status-im/status-go/extkeys v1.0.0 // indirect
|
||||||
|
github.com/status-im/whisper v1.5.2
|
||||||
|
github.com/stretchr/testify v1.4.0
|
||||||
|
github.com/wealdtech/go-ens/v3 v3.0.9
|
||||||
|
go.uber.org/zap v1.13.0
|
||||||
|
golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba
|
||||||
|
)
|
|
@ -0,0 +1,323 @@
|
||||||
|
bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
|
||||||
|
github.com/Azure/azure-pipeline-go v0.0.0-20180607212504-7571e8eb0876/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg=
|
||||||
|
github.com/Azure/azure-storage-blob-go v0.0.0-20180712005634-eaae161d9d5e/go.mod h1:x2mtS6O3mnMEZOJp7d7oldh8IvatBrMfReiyQ+cKgKY=
|
||||||
|
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||||
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||||
|
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||||
|
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
|
||||||
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
|
github.com/allegro/bigcache v0.0.0-20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
|
||||||
|
github.com/allegro/bigcache v1.1.0 h1:MLuIKTjdxDc+qsG2rhjsYjsHQC5LUGjIWzutg7M+W68=
|
||||||
|
github.com/allegro/bigcache v1.1.0/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
|
||||||
|
github.com/allegro/bigcache v1.2.0 h1:qDaE0QoF29wKBb3+pXFrJFy1ihe5OT9OiXhg1t85SxM=
|
||||||
|
github.com/allegro/bigcache v1.2.0/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
|
||||||
|
github.com/apilayer/freegeoip v3.5.0+incompatible/go.mod h1:CUfFqErhFhXneJendyQ/rRcuA8kH8JxHvYnbOozmlCU=
|
||||||
|
github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
|
||||||
|
github.com/aristanetworks/goarista v0.0.0-20181002214814-33151c4543a7 h1:6TQIK3K21/HnYLp+TAI6fjQ1YeH+KgLZbrFJwUjVrnQ=
|
||||||
|
github.com/aristanetworks/goarista v0.0.0-20181002214814-33151c4543a7/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
|
||||||
|
github.com/aristanetworks/goarista v0.0.0-20190219163901-728bce664cf5 h1:L0TwgZQo7Mga9im6FvKEZGIvyLE/VG/HI5loz5LpvC0=
|
||||||
|
github.com/aristanetworks/goarista v0.0.0-20190219163901-728bce664cf5/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
|
||||||
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
|
github.com/btcsuite/btcd v0.0.0-20181013004428-67e573d211ac/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ=
|
||||||
|
github.com/btcsuite/btcd v0.0.0-20190418232430-6867ff32788a/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8=
|
||||||
|
github.com/btcsuite/btcd v0.20.0-beta h1:DnZGUjFbRkpytojHWwy6nfUSA7vFrzWXDLpFNzt74ZA=
|
||||||
|
github.com/btcsuite/btcd v0.20.0-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
|
||||||
|
github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw=
|
||||||
|
github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
|
||||||
|
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
|
||||||
|
github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
|
||||||
|
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng=
|
||||||
|
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
|
||||||
|
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
|
||||||
|
github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
|
||||||
|
github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
|
||||||
|
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
|
||||||
|
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
|
||||||
|
github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
|
||||||
|
github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU=
|
||||||
|
github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
|
||||||
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||||
|
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||||
|
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
|
||||||
|
github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ=
|
||||||
|
github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
|
||||||
|
github.com/dgrijalva/jwt-go v0.0.0-20170201225849-2268707a8f08/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
|
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||||
|
github.com/docker/docker v0.0.0-20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||||
|
github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||||
|
github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||||
|
github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
|
||||||
|
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||||
|
github.com/elastic/gosigar v0.0.0-20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
|
||||||
|
github.com/elastic/gosigar v0.10.4 h1:6jfw75dsoflhBMRdO6QPzQUgLqUYTsQQQRkkcsHsuPo=
|
||||||
|
github.com/elastic/gosigar v0.10.4/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
|
||||||
|
github.com/ethereum/go-ethereum v1.9.2/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
|
||||||
|
github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
|
github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
|
||||||
|
github.com/fjl/memsize v0.0.0-20180929194037-2a09253e352a h1:1znxn4+q2MrEdTk1eCk6KIV3muTYVclBIB6CTVR/zBc=
|
||||||
|
github.com/fjl/memsize v0.0.0-20180929194037-2a09253e352a/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
|
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
|
||||||
|
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
|
||||||
|
github.com/gizak/termui v0.0.0-20170117222342-991cd3d38091/go.mod h1:PkJoWUt/zacQKysNfQtcw1RW+eK2SxkieVBtl+4ovLA=
|
||||||
|
github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
|
||||||
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
|
github.com/go-logfmt/logfmt v0.3.0 h1:8HUsc87TaSWLKwrnumgC8/YconD2fJQsRJAsWaPg2ic=
|
||||||
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
|
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
|
||||||
|
github.com/go-stack/stack v1.5.4/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
|
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
|
||||||
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
|
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
||||||
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
||||||
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
|
||||||
|
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
||||||
|
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
|
github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA=
|
||||||
|
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
|
||||||
|
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
|
github.com/graph-gophers/graphql-go v0.0.0-20190724201507-010347b5f9e6/go.mod h1:Au3iQ8DvDis8hZ4q2OzRcaKYlAsPt+fYvib5q4nIqu4=
|
||||||
|
github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
|
github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA=
|
||||||
|
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||||
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
|
github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag=
|
||||||
|
github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo=
|
||||||
|
github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc=
|
||||||
|
github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o=
|
||||||
|
github.com/influxdata/influxdb v0.0.0-20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY=
|
||||||
|
github.com/influxdata/influxdb v1.7.7/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY=
|
||||||
|
github.com/jackpal/go-nat-pmp v0.0.0-20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
|
||||||
|
github.com/jackpal/go-nat-pmp v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA=
|
||||||
|
github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
|
||||||
|
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
|
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
|
||||||
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
|
github.com/julienschmidt/httprouter v0.0.0-20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
|
github.com/karalabe/hid v0.0.0-20181128192157-d815e0c1a2e2/go.mod h1:YvbcH+3Wo6XPs9nkgTY3u19KXLauXW+J5nB7hEHuX0A=
|
||||||
|
github.com/karalabe/usb v0.0.0-20190819132248-550797b1cad8 h1:VhnqxaTIudc9IWKx8uXRLnpdSb9noCEj+vHacjmhp68=
|
||||||
|
github.com/karalabe/usb v0.0.0-20190819132248-550797b1cad8/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
|
||||||
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
|
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY=
|
||||||
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/maruel/panicparse v0.0.0-20160720141634-ad661195ed0e/go.mod h1:nty42YY5QByNC5MM7q/nj938VbgPU7avs45z6NClpxI=
|
||||||
|
github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||||
|
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
|
||||||
|
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||||
|
github.com/mattn/go-isatty v0.0.0-20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
|
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
|
github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc=
|
||||||
|
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
|
github.com/mattn/go-pointer v0.0.0-20190911064623-a0a44394634f h1:QTRRO+ozoYgT3CQRIzNVYJRU3DB8HRnkZv6mr4ISmMA=
|
||||||
|
github.com/mattn/go-pointer v0.0.0-20190911064623-a0a44394634f/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc=
|
||||||
|
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
|
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
|
||||||
|
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
|
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g=
|
||||||
|
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
|
||||||
|
github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5 h1:l16XLUUJ34wIz+RIvLhSwGvLvKyy+W598b135bJN6mg=
|
||||||
|
github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
|
||||||
|
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
|
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
|
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
|
||||||
|
github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78=
|
||||||
|
github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
||||||
|
github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik=
|
||||||
|
github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po=
|
||||||
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
|
github.com/naoina/toml v0.0.0-20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
|
||||||
|
github.com/nsf/termbox-go v0.0.0-20170211012700-3540b76b9c77/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ=
|
||||||
|
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||||
|
github.com/olekukonko/tablewriter v0.0.0-20170128050532-febf2d34b54a/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||||
|
github.com/olekukonko/tablewriter v0.0.1 h1:b3iUnf1v+ppJiOfNX4yxxqfWKMQPZR5yoh8urCTFX88=
|
||||||
|
github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||||
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
|
||||||
|
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
|
github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=
|
||||||
|
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
|
github.com/opentracing/opentracing-go v0.0.0-20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||||
|
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||||
|
github.com/oschwald/maxminddb-golang v1.3.1/go.mod h1:3jhIUymTJ5VREKyIhWm66LJiQt04F0UCDdodShpjWsY=
|
||||||
|
github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34=
|
||||||
|
github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g=
|
||||||
|
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
||||||
|
github.com/peterh/liner v0.0.0-20170902204657-a37ad3984311/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
|
||||||
|
github.com/pkg/errors v0.0.0-20171216070316-e881fd58d78e h1:+RHxT/gm0O3UF7nLJbdNzAmULvCFt4XfXHWzh3XI/zs=
|
||||||
|
github.com/pkg/errors v0.0.0-20171216070316-e881fd58d78e/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
|
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
|
github.com/prometheus/prometheus v0.0.0-20170814170113-3101606756c5/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s=
|
||||||
|
github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic=
|
||||||
|
github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4=
|
||||||
|
github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
|
||||||
|
github.com/rjeczalik/notify v0.9.2 h1:MiTWrPj55mNDHEiIX5YUSKefw/+lCQVoAFmD6oQm5w8=
|
||||||
|
github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM=
|
||||||
|
github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
|
||||||
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
||||||
|
github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI=
|
||||||
|
github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
||||||
|
github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ=
|
||||||
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
|
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||||
|
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
|
||||||
|
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||||
|
github.com/status-im/doubleratchet v3.0.0+incompatible h1:aJ1ejcSERpSzmWZBgtfYtiU2nF0Q8ZkGyuEPYETXkCY=
|
||||||
|
github.com/status-im/doubleratchet v3.0.0+incompatible/go.mod h1:1sqR0+yhiM/bd+wrdX79AOt2csZuJOni0nUDzKNuqOU=
|
||||||
|
github.com/status-im/go-ethereum v1.9.5-status.6 h1:ytuTO1yBIAuTVRtRQoc2mrdyngtP+XOQ9IHIibbz7/I=
|
||||||
|
github.com/status-im/go-ethereum v1.9.5-status.6/go.mod h1:08JvQWE+IOnAFSe4UD4ACLNe2fDd9XmWMCq5Yzy9mk0=
|
||||||
|
github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48 h1:ju5UTwk5Odtm4trrY+4Ca4RMj5OyXbmVeDAVad2T0Jw=
|
||||||
|
github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q=
|
||||||
|
github.com/status-im/whisper v1.5.2 h1:26NgiKusmPic38eQdtXnaY+iaQ/LuQ3Dh0kCGYT/Uxs=
|
||||||
|
github.com/status-im/whisper v1.5.2/go.mod h1:emrOxzJme0k66QtbbQ2bdd3P8RCdLZ8sTD7SkwH1s2s=
|
||||||
|
github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 h1:gIlAHnH1vJb5vwEjIp5kBj/eu99p/bl0Ay2goiPe5xE=
|
||||||
|
github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw=
|
||||||
|
github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 h1:njlZPzLwU639dk2kqnCPPv+wNjq7Xb6EfUxe/oX0/NM=
|
||||||
|
github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
|
||||||
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v0.0.0-20170809224252-890a5c3458b4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/syndtr/goleveldb v0.0.0-20181128100959-b001fa50d6b2 h1:GnOzE5fEFN3b2zDhJJABEofdb51uMRNb8eqIVtdducs=
|
||||||
|
github.com/syndtr/goleveldb v0.0.0-20181128100959-b001fa50d6b2/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
||||||
|
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
|
||||||
|
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||||
|
github.com/tyler-smith/go-bip39 v1.0.2 h1:+t3w+KwLXO6154GNJY+qUtIxLTmFjfUmpguQT1OlOT8=
|
||||||
|
github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
|
||||||
|
github.com/uber/jaeger-client-go v0.0.0-20180607151842-f7e0d4744fa6/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
|
||||||
|
github.com/uber/jaeger-lib v0.0.0-20180615202729-a51202d6f4a7/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
|
||||||
|
github.com/wealdtech/go-ens/v3 v3.0.9 h1:gXMBNXikJ/XV9k6ybPOZMXIMPjBGSCC9N10dxe8Y2Xk=
|
||||||
|
github.com/wealdtech/go-ens/v3 v3.0.9/go.mod h1:P2OEBvgkhXLrPzPN+eR5z2/wFIGwHyijTDvpuC1xLlo=
|
||||||
|
github.com/wealdtech/go-multicodec v1.2.0 h1:9AHSxcSE9F9r6ZvQLAO0EXCdM08QfYohaXmW3k6sSh4=
|
||||||
|
github.com/wealdtech/go-multicodec v1.2.0/go.mod h1:aedGMaTeYkIqi/KCPre1ho5rTb3hGpu/snBOS3GQLw4=
|
||||||
|
github.com/wealdtech/go-string2eth v1.0.0 h1:jY6b1MVqU6k2Uw/kvcU1Y9/3dDyXfPzZrOFspt82UJs=
|
||||||
|
github.com/wealdtech/go-string2eth v1.0.0/go.mod h1:UZA/snEybGcD6n+Pl+yoDjmexlEJ6dtoS9myfM83Ol4=
|
||||||
|
github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk=
|
||||||
|
github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees=
|
||||||
|
go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY=
|
||||||
|
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||||
|
go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc=
|
||||||
|
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
||||||
|
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
|
||||||
|
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||||
|
go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU=
|
||||||
|
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||||
|
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc h1:F5tKCVGp+MUAHhKp5MZtGqAlGX3+oCsiL1Q629FL90M=
|
||||||
|
golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf h1:fnPsqIDRbCSgumaMCRpoIoF2s4qxv0xSSS0BVZUE/ss=
|
||||||
|
golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba h1:9bFeDpN3gTqNanMVqNcoR/pJQuP5uroC3t1D7eXozTE=
|
||||||
|
golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||||
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1 h1:Y/KGZSOdz/2r0WJ9Mkmz6NJBusp0kiNx1Cn82lzJQ6w=
|
||||||
|
golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
|
||||||
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
|
||||||
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs=
|
||||||
|
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405 h1:829vOVxxusYHC+IqBtkX5mbKtsY9fheQiQn0MZRVLfQ=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
|
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
||||||
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
|
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU=
|
||||||
|
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
|
||||||
|
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20180302121509-abf0ba0be5d5/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns=
|
||||||
|
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190709231704-1e4459ed25ff h1:uuol9OUzSvZntY1v963NAbVd7A+PHLMz1FlCe3Lorcs=
|
||||||
|
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190709231704-1e4459ed25ff/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns=
|
||||||
|
gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78=
|
||||||
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||||
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
|
gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0=
|
||||||
|
gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0=
|
||||||
|
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
|
||||||
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
|
||||||
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
|
@ -0,0 +1,219 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql/driver"
|
||||||
|
"encoding/hex"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"math/big"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"golang.org/x/crypto/sha3"
|
||||||
|
)
|
||||||
|
|
||||||
|
/////////// Address
|
||||||
|
|
||||||
|
// AddressLength is the expected length of the address
|
||||||
|
const AddressLength = 20
|
||||||
|
|
||||||
|
var (
|
||||||
|
addressT = reflect.TypeOf(Address{})
|
||||||
|
)
|
||||||
|
|
||||||
|
// Address represents the 20 byte address of an Ethereum account.
|
||||||
|
type Address [AddressLength]byte
|
||||||
|
|
||||||
|
// BytesToAddress returns Address with value b.
|
||||||
|
// If b is larger than len(h), b will be cropped from the left.
|
||||||
|
func BytesToAddress(b []byte) Address {
|
||||||
|
var a Address
|
||||||
|
a.SetBytes(b)
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
// BigToAddress returns Address with byte values of b.
|
||||||
|
// If b is larger than len(h), b will be cropped from the left.
|
||||||
|
func BigToAddress(b *big.Int) Address { return BytesToAddress(b.Bytes()) }
|
||||||
|
|
||||||
|
// HexToAddress returns Address with byte values of s.
|
||||||
|
// If s is larger than len(h), s will be cropped from the left.
|
||||||
|
func HexToAddress(s string) Address { return BytesToAddress(FromHex(s)) }
|
||||||
|
|
||||||
|
// IsHexAddress verifies whether a string can represent a valid hex-encoded
|
||||||
|
// Ethereum address or not.
|
||||||
|
func IsHexAddress(s string) bool {
|
||||||
|
if has0xPrefix(s) {
|
||||||
|
s = s[2:]
|
||||||
|
}
|
||||||
|
return len(s) == 2*AddressLength && isHex(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bytes gets the string representation of the underlying address.
|
||||||
|
func (a Address) Bytes() []byte { return a[:] }
|
||||||
|
|
||||||
|
// Hash converts an address to a hash by left-padding it with zeros.
|
||||||
|
func (a Address) Hash() Hash { return BytesToHash(a[:]) }
|
||||||
|
|
||||||
|
// Hex returns an EIP55-compliant hex string representation of the address.
|
||||||
|
func (a Address) Hex() string {
|
||||||
|
unchecksummed := hex.EncodeToString(a[:])
|
||||||
|
sha := sha3.NewLegacyKeccak256()
|
||||||
|
sha.Write([]byte(unchecksummed))
|
||||||
|
hash := sha.Sum(nil)
|
||||||
|
|
||||||
|
result := []byte(unchecksummed)
|
||||||
|
for i := 0; i < len(result); i++ {
|
||||||
|
hashByte := hash[i/2]
|
||||||
|
if i%2 == 0 {
|
||||||
|
hashByte = hashByte >> 4
|
||||||
|
} else {
|
||||||
|
hashByte &= 0xf
|
||||||
|
}
|
||||||
|
if result[i] > '9' && hashByte > 7 {
|
||||||
|
result[i] -= 32
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "0x" + string(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
// String implements fmt.Stringer.
|
||||||
|
func (a Address) String() string {
|
||||||
|
return a.Hex()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format implements fmt.Formatter, forcing the byte slice to be formatted as is,
|
||||||
|
// without going through the stringer interface used for logging.
|
||||||
|
func (a Address) Format(s fmt.State, c rune) {
|
||||||
|
fmt.Fprintf(s, "%"+string(c), a[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetBytes sets the address to the value of b.
|
||||||
|
// If b is larger than len(a) it will panic.
|
||||||
|
func (a *Address) SetBytes(b []byte) {
|
||||||
|
if len(b) > len(a) {
|
||||||
|
b = b[len(b)-AddressLength:]
|
||||||
|
}
|
||||||
|
copy(a[AddressLength-len(b):], b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalText returns the hex representation of a.
|
||||||
|
func (a Address) MarshalText() ([]byte, error) {
|
||||||
|
return HexBytes(a[:]).MarshalText()
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalText parses a hash in hex syntax.
|
||||||
|
func (a *Address) UnmarshalText(input []byte) error {
|
||||||
|
return UnmarshalFixedText("Address", input, a[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON parses a hash in hex syntax.
|
||||||
|
func (a *Address) UnmarshalJSON(input []byte) error {
|
||||||
|
return UnmarshalFixedJSON(addressT, input, a[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan implements Scanner for database/sql.
|
||||||
|
func (a *Address) Scan(src interface{}) error {
|
||||||
|
srcB, ok := src.([]byte)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("can't scan %T into Address", src)
|
||||||
|
}
|
||||||
|
if len(srcB) != AddressLength {
|
||||||
|
return fmt.Errorf("can't scan []byte of len %d into Address, want %d", len(srcB), AddressLength)
|
||||||
|
}
|
||||||
|
copy(a[:], srcB)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value implements valuer for database/sql.
|
||||||
|
func (a Address) Value() (driver.Value, error) {
|
||||||
|
return a[:], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ImplementsGraphQLType returns true if Hash implements the specified GraphQL type.
|
||||||
|
func (a Address) ImplementsGraphQLType(name string) bool { return name == "Address" }
|
||||||
|
|
||||||
|
// UnmarshalGraphQL unmarshals the provided GraphQL query data.
|
||||||
|
func (a *Address) UnmarshalGraphQL(input interface{}) error {
|
||||||
|
var err error
|
||||||
|
switch input := input.(type) {
|
||||||
|
case string:
|
||||||
|
err = a.UnmarshalText([]byte(input))
|
||||||
|
default:
|
||||||
|
err = fmt.Errorf("Unexpected type for Address: %v", input)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnprefixedAddress allows marshaling an Address without 0x prefix.
|
||||||
|
type UnprefixedAddress Address
|
||||||
|
|
||||||
|
// UnmarshalText decodes the address from hex. The 0x prefix is optional.
|
||||||
|
func (a *UnprefixedAddress) UnmarshalText(input []byte) error {
|
||||||
|
return UnmarshalFixedUnprefixedText("UnprefixedAddress", input, a[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalText encodes the address as hex.
|
||||||
|
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 := 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
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
import "encoding/hex"
|
||||||
|
|
||||||
|
// has0xPrefix validates str begins with '0x' or '0X'.
|
||||||
|
func has0xPrefix(str string) bool {
|
||||||
|
return len(str) >= 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X')
|
||||||
|
}
|
||||||
|
|
||||||
|
// isHexCharacter returns bool of c being a valid hexadecimal.
|
||||||
|
func isHexCharacter(c byte) bool {
|
||||||
|
return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')
|
||||||
|
}
|
||||||
|
|
||||||
|
// isHex validates whether each byte is valid hexadecimal string.
|
||||||
|
func isHex(str string) bool {
|
||||||
|
if len(str)%2 != 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for _, c := range []byte(str) {
|
||||||
|
if !isHexCharacter(c) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bytes2Hex returns the hexadecimal encoding of d.
|
||||||
|
func Bytes2Hex(d []byte) string {
|
||||||
|
return hex.EncodeToString(d)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hex2Bytes returns the bytes represented by the hexadecimal string str.
|
||||||
|
func Hex2Bytes(str string) []byte {
|
||||||
|
h, _ := hex.DecodeString(str)
|
||||||
|
return h
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package enstypes
|
||||||
|
|
||||||
|
import "crypto/ecdsa"
|
||||||
|
|
||||||
|
type ENSVerifier interface {
|
||||||
|
// CheckBatch verifies that a registered ENS name matches the expected public key
|
||||||
|
CheckBatch(ensDetails []ENSDetails, rpcEndpoint, contractAddress string) (map[string]ENSResponse, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ENSDetails struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
PublicKeyString string `json:"publicKey"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ENSResponse struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Verified bool `json:"verified"`
|
||||||
|
VerifiedAt int64 `json:"verifiedAt"`
|
||||||
|
Error error `json:"error"`
|
||||||
|
PublicKey *ecdsa.PublicKey `json:"-"`
|
||||||
|
PublicKeyString string `json:"publicKey"`
|
||||||
|
}
|
|
@ -1,11 +1,9 @@
|
||||||
package whispertypes
|
package types
|
||||||
|
|
||||||
import protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
|
|
||||||
// Envelope represents a clear-text data packet to transmit through the Whisper
|
// Envelope represents a clear-text data packet to transmit through the Whisper
|
||||||
// network. Its contents may or may not be encrypted and signed.
|
// network. Its contents may or may not be encrypted and signed.
|
||||||
type Envelope interface {
|
type Envelope interface {
|
||||||
Hash() protocol.Hash // Cached hash of the envelope to avoid rehashing every time.
|
Hash() Hash // Cached hash of the envelope to avoid rehashing every time.
|
||||||
Bloom() []byte
|
Bloom() []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,15 +48,15 @@ const (
|
||||||
// EnvelopeEvent used for envelopes events.
|
// EnvelopeEvent used for envelopes events.
|
||||||
type EnvelopeEvent struct {
|
type EnvelopeEvent struct {
|
||||||
Event EventType
|
Event EventType
|
||||||
Hash protocol.Hash
|
Hash Hash
|
||||||
Batch protocol.Hash
|
Batch Hash
|
||||||
Peer EnodeID
|
Peer EnodeID
|
||||||
Data interface{}
|
Data interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// EnvelopeError code and optional description of the error.
|
// EnvelopeError code and optional description of the error.
|
||||||
type EnvelopeError struct {
|
type EnvelopeError struct {
|
||||||
Hash protocol.Hash
|
Hash Hash
|
||||||
Code uint
|
Code uint
|
||||||
Description string
|
Description string
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package whispertypes
|
package types
|
||||||
|
|
||||||
// Filter represents a Whisper message filter
|
// Filter represents a Whisper message filter
|
||||||
type Filter interface {
|
type Filter interface {
|
|
@ -1,6 +1,6 @@
|
||||||
// Code extracted from vendor/github.com/ethereum/go-ethereum/common/types.go
|
// Code extracted from vendor/github.com/ethereum/go-ethereum/common/types.go
|
||||||
|
|
||||||
package protocol
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
@ -26,17 +26,6 @@ func encode(b []byte) string {
|
||||||
return string(enc)
|
return string(enc)
|
||||||
}
|
}
|
||||||
|
|
||||||
// has0xPrefix validates str begins with '0x' or '0X'.
|
|
||||||
func has0xPrefix(str string) bool {
|
|
||||||
return len(str) >= 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X')
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hex2Bytes returns the bytes represented by the hexadecimal string str.
|
|
||||||
func Hex2Bytes(str string) []byte {
|
|
||||||
h, _ := hex.DecodeString(str)
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// FromHex returns the bytes represented by the hexadecimal string s.
|
// FromHex returns the bytes represented by the hexadecimal string s.
|
||||||
// s may be prefixed with "0x".
|
// s may be prefixed with "0x".
|
||||||
func FromHex(s string) []byte {
|
func FromHex(s string) []byte {
|
|
@ -1,9 +1,10 @@
|
||||||
// Code extracted from vendor/github.com/ethereum/go-ethereum/common/hexutil/hexutil.go
|
// Code extracted from vendor/github.com/ethereum/go-ethereum/common/hexutil/hexutil.go
|
||||||
|
|
||||||
package protocol
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -30,3 +31,24 @@ func (b *HexBytes) UnmarshalJSON(input []byte) error {
|
||||||
}
|
}
|
||||||
return wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), bytesT)
|
return wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), bytesT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UnmarshalFixedUnprefixedText decodes the input as a string with optional 0x prefix. The
|
||||||
|
// length of out determines the required input length. This function is commonly used to
|
||||||
|
// implement the UnmarshalText method for fixed-size types.
|
||||||
|
func UnmarshalFixedUnprefixedText(typname string, input, out []byte) error {
|
||||||
|
raw, err := checkText(input, false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(raw)/2 != len(out) {
|
||||||
|
return fmt.Errorf("hex string has length %d, want %d for %s", len(raw), len(out)*2, typname)
|
||||||
|
}
|
||||||
|
// Pre-verify syntax before modifying out.
|
||||||
|
for _, b := range raw {
|
||||||
|
if decodeNibble(b) == badNibble {
|
||||||
|
return ErrSyntax
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hex.Decode(out, raw)
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
// Code extracted from vendor/github.com/ethereum/go-ethereum/common/hexutil/json.go
|
// Code extracted from vendor/github.com/ethereum/go-ethereum/common/hexutil/json.go
|
||||||
|
|
||||||
package protocol
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
|
@ -1,9 +1,7 @@
|
||||||
package whispertypes
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -49,7 +47,7 @@ func (r *MessagesRequest) SetDefaults(now time.Time) {
|
||||||
|
|
||||||
// MailServerResponse is the response payload sent by the mailserver.
|
// MailServerResponse is the response payload sent by the mailserver.
|
||||||
type MailServerResponse struct {
|
type MailServerResponse struct {
|
||||||
LastEnvelopeHash protocol.Hash
|
LastEnvelopeHash Hash
|
||||||
Cursor []byte
|
Cursor []byte
|
||||||
Error error
|
Error error
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package whispertypes
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
|
@ -0,0 +1,21 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
enstypes "github.com/status-im/status-go/eth-node/types/ens"
|
||||||
|
"go.uber.org/zap"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EnodeID is a unique identifier for each node.
|
||||||
|
type EnodeID [32]byte
|
||||||
|
|
||||||
|
// ID prints as a long hexadecimal number.
|
||||||
|
func (n EnodeID) String() string {
|
||||||
|
return fmt.Sprintf("%x", n[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
type Node interface {
|
||||||
|
NewENSVerifier(logger *zap.Logger) enstypes.ENSVerifier
|
||||||
|
GetWhisper(ctx interface{}) (Whisper, error)
|
||||||
|
}
|
|
@ -1,9 +1,7 @@
|
||||||
package whispertypes
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewMessage represents a new whisper message that is posted through the RPC.
|
// NewMessage represents a new whisper message that is posted through the RPC.
|
||||||
|
@ -48,7 +46,7 @@ type Criteria struct {
|
||||||
// use publicly without security implications.
|
// use publicly without security implications.
|
||||||
type PublicWhisperAPI interface {
|
type PublicWhisperAPI interface {
|
||||||
// AddPrivateKey imports the given private key.
|
// AddPrivateKey imports the given private key.
|
||||||
AddPrivateKey(ctx context.Context, privateKey protocol.HexBytes) (string, error)
|
AddPrivateKey(ctx context.Context, privateKey HexBytes) (string, error)
|
||||||
// GenerateSymKeyFromPassword derives a key from the given password, stores it, and returns its ID.
|
// GenerateSymKeyFromPassword derives a key from the given password, stores it, and returns its ID.
|
||||||
GenerateSymKeyFromPassword(ctx context.Context, passwd string) (string, error)
|
GenerateSymKeyFromPassword(ctx context.Context, passwd string) (string, error)
|
||||||
// DeleteKeyPair removes the key with the given key if it exists.
|
// DeleteKeyPair removes the key with the given key if it exists.
|
|
@ -1,9 +1,4 @@
|
||||||
package whispertypes
|
package types
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// TopicLength is the expected length of the topic, in bytes
|
// TopicLength is the expected length of the topic, in bytes
|
||||||
|
@ -32,17 +27,17 @@ func BytesToTopic(b []byte) (t TopicType) {
|
||||||
|
|
||||||
// String converts a topic byte array to a string representation.
|
// String converts a topic byte array to a string representation.
|
||||||
func (t *TopicType) String() string {
|
func (t *TopicType) String() string {
|
||||||
return protocol.EncodeHex(t[:])
|
return EncodeHex(t[:])
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalText returns the hex representation of t.
|
// MarshalText returns the hex representation of t.
|
||||||
func (t TopicType) MarshalText() ([]byte, error) {
|
func (t TopicType) MarshalText() ([]byte, error) {
|
||||||
return protocol.HexBytes(t[:]).MarshalText()
|
return HexBytes(t[:]).MarshalText()
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalText parses a hex representation to a topic.
|
// UnmarshalText parses a hex representation to a topic.
|
||||||
func (t *TopicType) UnmarshalText(input []byte) error {
|
func (t *TopicType) UnmarshalText(input []byte) error {
|
||||||
return hexutil.UnmarshalFixedText("Topic", input, t[:])
|
return UnmarshalFixedText("Topic", input, t[:])
|
||||||
}
|
}
|
||||||
|
|
||||||
// TopicToBloom converts the topic (4 bytes) to the bloom filter (64 bytes)
|
// TopicToBloom converts the topic (4 bytes) to the bloom filter (64 bytes)
|
|
@ -1,4 +1,4 @@
|
||||||
package whispertypes
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
|
@ -19,14 +19,13 @@ github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46f
|
||||||
github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
|
github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
|
||||||
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||||
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
|
github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
|
||||||
github.com/dgrijalva/jwt-go v0.0.0-20170201225849-2268707a8f08/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
github.com/dgrijalva/jwt-go v0.0.0-20170201225849-2268707a8f08/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
github.com/docker/docker v0.0.0-20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
github.com/docker/docker v0.0.0-20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||||
github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||||
github.com/elastic/gosigar v0.0.0-20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
|
github.com/elastic/gosigar v0.0.0-20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
|
||||||
github.com/ethereum/go-ethereum v1.9.7 h1:p4O+z0MGzB7xxngHbplcYNloxkFwGkeComhkzWnq0ig=
|
|
||||||
github.com/ethereum/go-ethereum v1.9.7/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
|
|
||||||
github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
|
github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
|
@ -67,8 +66,8 @@ github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRr
|
||||||
github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
|
github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
|
||||||
github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
||||||
github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ=
|
github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ=
|
||||||
github.com/status-im/extkeys v1.0.0/go.mod h1:wNx0pnvGTgyKz/S8hBNesAHKKKI9beF+BuVLIuBJuQI=
|
github.com/status-im/go-ethereum v1.9.5-status.6 h1:ytuTO1yBIAuTVRtRQoc2mrdyngtP+XOQ9IHIibbz7/I=
|
||||||
github.com/status-im/go-ethereum v1.9.5-status.5/go.mod h1:g2+E89NWtyA+55p6XEl5Sdt7Mtez3V0T3+Y7mJNb+tI=
|
github.com/status-im/go-ethereum v1.9.5-status.6/go.mod h1:08JvQWE+IOnAFSe4UD4ACLNe2fDd9XmWMCq5Yzy9mk0=
|
||||||
github.com/stretchr/testify v0.0.0-20170809224252-890a5c3458b4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v0.0.0-20170809224252-890a5c3458b4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/syndtr/goleveldb v0.0.0-20181128100959-b001fa50d6b2/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
github.com/syndtr/goleveldb v0.0.0-20181128100959-b001fa50d6b2/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
||||||
github.com/uber/jaeger-client-go v0.0.0-20180607151842-f7e0d4744fa6/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
|
github.com/uber/jaeger-client-go v0.0.0-20180607151842-f7e0d4744fa6/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
|
||||||
|
@ -83,12 +82,14 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405 h1:829vOVxxusYHC+IqBtkX5mbKtsY9fheQiQn0MZRVLfQ=
|
||||||
gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
|
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
|
||||||
|
|
8
go.mod
8
go.mod
|
@ -14,8 +14,11 @@ replace github.com/status-im/status-go/protocol => ./protocol
|
||||||
|
|
||||||
replace github.com/status-im/status-go/extkeys => ./extkeys
|
replace github.com/status-im/status-go/extkeys => ./extkeys
|
||||||
|
|
||||||
|
replace github.com/status-im/status-go/eth-node => ./eth-node
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/beevik/ntp v0.2.0
|
github.com/beevik/ntp v0.2.0
|
||||||
|
github.com/elastic/gosigar v0.10.5 // indirect
|
||||||
github.com/ethereum/go-ethereum v1.9.5
|
github.com/ethereum/go-ethereum v1.9.5
|
||||||
github.com/go-playground/locales v0.12.1 // indirect
|
github.com/go-playground/locales v0.12.1 // indirect
|
||||||
github.com/go-playground/universal-translator v0.16.0 // indirect
|
github.com/go-playground/universal-translator v0.16.0 // indirect
|
||||||
|
@ -33,7 +36,8 @@ require (
|
||||||
github.com/russolsen/transit v0.0.0-20180705123435-0794b4c4505a
|
github.com/russolsen/transit v0.0.0-20180705123435-0794b4c4505a
|
||||||
github.com/status-im/migrate/v4 v4.6.2-status.2
|
github.com/status-im/migrate/v4 v4.6.2-status.2
|
||||||
github.com/status-im/rendezvous v1.3.0
|
github.com/status-im/rendezvous v1.3.0
|
||||||
github.com/status-im/status-go/extkeys v0.0.0-00010101000000-000000000000
|
github.com/status-im/status-go/eth-node v0.0.0-20191126161717-86bc127b3d0a
|
||||||
|
github.com/status-im/status-go/extkeys v1.0.0
|
||||||
github.com/status-im/status-go/protocol v0.5.2
|
github.com/status-im/status-go/protocol v0.5.2
|
||||||
github.com/status-im/tcp-shaker v0.0.0-20191114194237-215893130501
|
github.com/status-im/tcp-shaker v0.0.0-20191114194237-215893130501
|
||||||
github.com/status-im/whisper v1.6.1
|
github.com/status-im/whisper v1.6.1
|
||||||
|
@ -41,6 +45,8 @@ require (
|
||||||
github.com/syndtr/goleveldb v1.0.0
|
github.com/syndtr/goleveldb v1.0.0
|
||||||
go.uber.org/zap v1.13.0
|
go.uber.org/zap v1.13.0
|
||||||
golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba
|
golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba
|
||||||
|
golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 // indirect
|
||||||
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect
|
||||||
gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
|
gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
|
||||||
gopkg.in/go-playground/validator.v9 v9.29.1
|
gopkg.in/go-playground/validator.v9 v9.29.1
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0
|
||||||
|
|
35
go.sum
35
go.sum
|
@ -35,9 +35,8 @@ github.com/apilayer/freegeoip v3.5.0+incompatible/go.mod h1:CUfFqErhFhXneJendyQ/
|
||||||
github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
|
github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
|
||||||
github.com/aristanetworks/goarista v0.0.0-20181002214814-33151c4543a7/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
|
github.com/aristanetworks/goarista v0.0.0-20181002214814-33151c4543a7/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
|
||||||
github.com/aristanetworks/goarista v0.0.0-20190219163901-728bce664cf5/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
|
github.com/aristanetworks/goarista v0.0.0-20190219163901-728bce664cf5/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
|
||||||
|
github.com/aristanetworks/goarista v0.0.0-20190502180301-283422fc1708 h1:tS7jSmwRqSxTnonTRlDD1oHo6Q9YOK4xHS9/v4L56eg=
|
||||||
github.com/aristanetworks/goarista v0.0.0-20190502180301-283422fc1708/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
|
github.com/aristanetworks/goarista v0.0.0-20190502180301-283422fc1708/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
|
||||||
github.com/aristanetworks/goarista v0.0.0-20190704150520-f44d68189fd7 h1:fKnuvQ/O22ZpD7HaJjGQXn/GxOdDJOQFL8bpM8Xe3X8=
|
|
||||||
github.com/aristanetworks/goarista v0.0.0-20190704150520-f44d68189fd7/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
|
|
||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
github.com/beevik/ntp v0.2.0 h1:sGsd+kAXzT0bfVfzJfce04g+dSRfrs+tbQW8lweuYgw=
|
github.com/beevik/ntp v0.2.0 h1:sGsd+kAXzT0bfVfzJfce04g+dSRfrs+tbQW8lweuYgw=
|
||||||
|
@ -130,8 +129,9 @@ github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt
|
||||||
github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
|
github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
|
||||||
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||||
github.com/elastic/gosigar v0.0.0-20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
|
github.com/elastic/gosigar v0.0.0-20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
|
||||||
github.com/elastic/gosigar v0.10.4 h1:6jfw75dsoflhBMRdO6QPzQUgLqUYTsQQQRkkcsHsuPo=
|
|
||||||
github.com/elastic/gosigar v0.10.4/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
|
github.com/elastic/gosigar v0.10.4/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
|
||||||
|
github.com/elastic/gosigar v0.10.5 h1:GzPQ+78RaAb4J63unidA/JavQRKrB6s8IOzN6Ib59jo=
|
||||||
|
github.com/elastic/gosigar v0.10.5/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
|
||||||
github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
|
github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
|
||||||
github.com/ethereum/go-ethereum v1.8.20/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
|
github.com/ethereum/go-ethereum v1.8.20/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
|
||||||
github.com/ethereum/go-ethereum v1.9.2/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
|
github.com/ethereum/go-ethereum v1.9.2/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
|
||||||
|
@ -275,9 +275,8 @@ github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0=
|
github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0=
|
||||||
github.com/karalabe/hid v0.0.0-20181128192157-d815e0c1a2e2/go.mod h1:YvbcH+3Wo6XPs9nkgTY3u19KXLauXW+J5nB7hEHuX0A=
|
github.com/karalabe/hid v0.0.0-20181128192157-d815e0c1a2e2/go.mod h1:YvbcH+3Wo6XPs9nkgTY3u19KXLauXW+J5nB7hEHuX0A=
|
||||||
|
github.com/karalabe/usb v0.0.0-20190819132248-550797b1cad8 h1:VhnqxaTIudc9IWKx8uXRLnpdSb9noCEj+vHacjmhp68=
|
||||||
github.com/karalabe/usb v0.0.0-20190819132248-550797b1cad8/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
|
github.com/karalabe/usb v0.0.0-20190819132248-550797b1cad8/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
|
||||||
github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw=
|
|
||||||
github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
|
|
||||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
|
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||||
|
@ -312,17 +311,14 @@ github.com/libp2p/go-eventbus v0.1.0 h1:mlawomSAjjkk97QnYiEmHsLu7E136+2oCWSHRUvM
|
||||||
github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4=
|
github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4=
|
||||||
github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s=
|
github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s=
|
||||||
github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
|
github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8=
|
||||||
github.com/libp2p/go-libp2p v0.1.1 h1:52sB0TJuDk2nYMcMfHOKaPoaayDZjaYVCq6Vk1ejUTk=
|
|
||||||
github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8=
|
github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8=
|
||||||
github.com/libp2p/go-libp2p v0.4.0 h1:nV2q3fdhL80OWtPyBrsoWKcw32qC4TbbR+iGjEOMRaU=
|
github.com/libp2p/go-libp2p v0.4.0 h1:nV2q3fdhL80OWtPyBrsoWKcw32qC4TbbR+iGjEOMRaU=
|
||||||
github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI=
|
github.com/libp2p/go-libp2p v0.4.0/go.mod h1:9EsEIf9p2UDuwtPd0DwJsAl0qXVxgAnuDGRvHbfATfI=
|
||||||
github.com/libp2p/go-libp2p-autonat v0.1.0 h1:aCWAu43Ri4nU0ZPO7NyLzUvvfqd0nE3dX0R/ZGYVgOU=
|
github.com/libp2p/go-libp2p-autonat v0.1.0 h1:aCWAu43Ri4nU0ZPO7NyLzUvvfqd0nE3dX0R/ZGYVgOU=
|
||||||
github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8=
|
github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8=
|
||||||
github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78=
|
|
||||||
github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro=
|
github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro=
|
||||||
github.com/libp2p/go-libp2p-blankhost v0.1.4 h1:I96SWjR4rK9irDHcHq3XHN6hawCRTPUADzkJacgZLvk=
|
github.com/libp2p/go-libp2p-blankhost v0.1.4 h1:I96SWjR4rK9irDHcHq3XHN6hawCRTPUADzkJacgZLvk=
|
||||||
github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU=
|
github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU=
|
||||||
github.com/libp2p/go-libp2p-circuit v0.1.0 h1:eniLL3Y9aq/sryfyV1IAHj5rlvuyj3b7iz8tSiZpdhY=
|
|
||||||
github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8=
|
github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8=
|
||||||
github.com/libp2p/go-libp2p-circuit v0.1.3 h1:WsMYYaA0PwdpgJSQu12EzPYf5ypkLSTgcOsWr7DYrgI=
|
github.com/libp2p/go-libp2p-circuit v0.1.3 h1:WsMYYaA0PwdpgJSQu12EzPYf5ypkLSTgcOsWr7DYrgI=
|
||||||
github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8OTBGoV1AWbWor3qM=
|
github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8OTBGoV1AWbWor3qM=
|
||||||
|
@ -333,7 +329,6 @@ github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv
|
||||||
github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0=
|
github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0=
|
||||||
github.com/libp2p/go-libp2p-core v0.2.3 h1:zXikZ5pLfebtTMeIYfcwVQ2Pae77O0FIwDquwM6AGNM=
|
github.com/libp2p/go-libp2p-core v0.2.3 h1:zXikZ5pLfebtTMeIYfcwVQ2Pae77O0FIwDquwM6AGNM=
|
||||||
github.com/libp2p/go-libp2p-core v0.2.3/go.mod h1:GqhyQqyIAPsxFYXHMjfXgMv03lxsvM0mFzuYA9Ib42A=
|
github.com/libp2p/go-libp2p-core v0.2.3/go.mod h1:GqhyQqyIAPsxFYXHMjfXgMv03lxsvM0mFzuYA9Ib42A=
|
||||||
github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ=
|
|
||||||
github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI=
|
github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI=
|
||||||
github.com/libp2p/go-libp2p-discovery v0.1.0 h1:j+R6cokKcGbnZLf4kcNwpx6mDEUPF3N6SrqMymQhmvs=
|
github.com/libp2p/go-libp2p-discovery v0.1.0 h1:j+R6cokKcGbnZLf4kcNwpx6mDEUPF3N6SrqMymQhmvs=
|
||||||
github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g=
|
github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g=
|
||||||
|
@ -345,23 +340,18 @@ github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiY
|
||||||
github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw=
|
github.com/libp2p/go-libp2p-nat v0.0.4 h1:+KXK324yaY701On8a0aGjTnw8467kW3ExKcqW2wwmyw=
|
||||||
github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY=
|
github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY=
|
||||||
github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU=
|
github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU=
|
||||||
github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY=
|
|
||||||
github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY=
|
github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY=
|
||||||
github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E=
|
|
||||||
github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY=
|
github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY=
|
||||||
github.com/libp2p/go-libp2p-peerstore v0.1.3 h1:wMgajt1uM2tMiqf4M+4qWKVyyFc8SfA+84VV9glZq1M=
|
github.com/libp2p/go-libp2p-peerstore v0.1.3 h1:wMgajt1uM2tMiqf4M+4qWKVyyFc8SfA+84VV9glZq1M=
|
||||||
github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI=
|
github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI=
|
||||||
github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ=
|
|
||||||
github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8=
|
github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8=
|
||||||
github.com/libp2p/go-libp2p-secio v0.2.0 h1:ywzZBsWEEz2KNTn5RtzauEDq5RFEefPsttXYwAWqHng=
|
github.com/libp2p/go-libp2p-secio v0.2.0 h1:ywzZBsWEEz2KNTn5RtzauEDq5RFEefPsttXYwAWqHng=
|
||||||
github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g=
|
github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g=
|
||||||
github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s=
|
|
||||||
github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4=
|
github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4=
|
||||||
github.com/libp2p/go-libp2p-swarm v0.2.2 h1:T4hUpgEs2r371PweU3DuH7EOmBIdTBCwWs+FLcgx3bQ=
|
github.com/libp2p/go-libp2p-swarm v0.2.2 h1:T4hUpgEs2r371PweU3DuH7EOmBIdTBCwWs+FLcgx3bQ=
|
||||||
github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU=
|
github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU=
|
||||||
github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
|
github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
|
||||||
github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
|
github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
|
||||||
github.com/libp2p/go-libp2p-testing v0.0.4 h1:Qev57UR47GcLPXWjrunv5aLIQGO4n9mhI/8/EIrEEFc=
|
|
||||||
github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
|
github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E=
|
||||||
github.com/libp2p/go-libp2p-testing v0.1.0 h1:WaFRj/t3HdMZGNZqnU2pS7pDRBmMeoDx7/HDNpeyT9U=
|
github.com/libp2p/go-libp2p-testing v0.1.0 h1:WaFRj/t3HdMZGNZqnU2pS7pDRBmMeoDx7/HDNpeyT9U=
|
||||||
github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0=
|
github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0=
|
||||||
|
@ -370,14 +360,12 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07q
|
||||||
github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8=
|
github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8=
|
||||||
github.com/libp2p/go-libp2p-yamux v0.2.1 h1:Q3XYNiKCC2vIxrvUJL+Jg1kiyeEaIDNKLjgEjo3VQdI=
|
github.com/libp2p/go-libp2p-yamux v0.2.1 h1:Q3XYNiKCC2vIxrvUJL+Jg1kiyeEaIDNKLjgEjo3VQdI=
|
||||||
github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI=
|
github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI=
|
||||||
github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs=
|
|
||||||
github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q=
|
github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q=
|
||||||
github.com/libp2p/go-maddr-filter v0.0.5 h1:CW3AgbMO6vUvT4kf87y4N+0P8KUl2aqLYhrGyDUbLSg=
|
github.com/libp2p/go-maddr-filter v0.0.5 h1:CW3AgbMO6vUvT4kf87y4N+0P8KUl2aqLYhrGyDUbLSg=
|
||||||
github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M=
|
github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M=
|
||||||
github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0=
|
github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0=
|
||||||
github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0=
|
github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0=
|
||||||
github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU=
|
github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU=
|
||||||
github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0=
|
|
||||||
github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
|
github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
|
||||||
github.com/libp2p/go-msgio v0.0.4 h1:agEFehY3zWJFUHK6SEMR7UYmk2z6kC3oeCM7ybLhguA=
|
github.com/libp2p/go-msgio v0.0.4 h1:agEFehY3zWJFUHK6SEMR7UYmk2z6kC3oeCM7ybLhguA=
|
||||||
github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
|
github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ=
|
||||||
|
@ -392,11 +380,9 @@ github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA2
|
||||||
github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14=
|
github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14=
|
||||||
github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg=
|
github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg=
|
||||||
github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc=
|
github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc=
|
||||||
github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o=
|
|
||||||
github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc=
|
github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc=
|
||||||
github.com/libp2p/go-tcp-transport v0.1.1 h1:yGlqURmqgNA2fvzjSgZNlHcsd/IulAnKM8Ncu+vlqnw=
|
github.com/libp2p/go-tcp-transport v0.1.1 h1:yGlqURmqgNA2fvzjSgZNlHcsd/IulAnKM8Ncu+vlqnw=
|
||||||
github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY=
|
github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY=
|
||||||
github.com/libp2p/go-ws-transport v0.1.0 h1:F+0OvvdmPTDsVc4AjPHjV7L7Pk1B7D5QwtDcKE2oag4=
|
|
||||||
github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo=
|
github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo=
|
||||||
github.com/libp2p/go-ws-transport v0.1.2 h1:VnxQcLfSGtqupqPpBNu8fUiCv+IN1RJ2BcVqQEM+z8E=
|
github.com/libp2p/go-ws-transport v0.1.2 h1:VnxQcLfSGtqupqPpBNu8fUiCv+IN1RJ2BcVqQEM+z8E=
|
||||||
github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6/1tK/6VFOdN69Y=
|
github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6/1tK/6VFOdN69Y=
|
||||||
|
@ -419,7 +405,6 @@ github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc
|
||||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
github.com/mattn/go-pointer v0.0.0-20190911064623-a0a44394634f h1:QTRRO+ozoYgT3CQRIzNVYJRU3DB8HRnkZv6mr4ISmMA=
|
github.com/mattn/go-pointer v0.0.0-20190911064623-a0a44394634f h1:QTRRO+ozoYgT3CQRIzNVYJRU3DB8HRnkZv6mr4ISmMA=
|
||||||
github.com/mattn/go-pointer v0.0.0-20190911064623-a0a44394634f/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc=
|
github.com/mattn/go-pointer v0.0.0-20190911064623-a0a44394634f/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc=
|
||||||
github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4=
|
|
||||||
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
|
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
|
||||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
|
@ -460,15 +445,12 @@ github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lg
|
||||||
github.com/multiformats/go-multiaddr v0.1.1 h1:rVAztJYMhCQ7vEFr8FvxW3mS+HF2eY/oPbOMeS0ZDnE=
|
github.com/multiformats/go-multiaddr v0.1.1 h1:rVAztJYMhCQ7vEFr8FvxW3mS+HF2eY/oPbOMeS0ZDnE=
|
||||||
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
|
github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo=
|
||||||
github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
|
github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
|
||||||
github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8=
|
|
||||||
github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
|
github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q=
|
||||||
github.com/multiformats/go-multiaddr-dns v0.1.0 h1:gsPeMvo91XvcsNlQXgJgfjYjbsVV99bvveguUvDBpyQ=
|
github.com/multiformats/go-multiaddr-dns v0.1.0 h1:gsPeMvo91XvcsNlQXgJgfjYjbsVV99bvveguUvDBpyQ=
|
||||||
github.com/multiformats/go-multiaddr-dns v0.1.0/go.mod h1:01k2RAqtoXIuPa3DCavAE9/6jc6nM0H3EgZyfUhN2oY=
|
github.com/multiformats/go-multiaddr-dns v0.1.0/go.mod h1:01k2RAqtoXIuPa3DCavAE9/6jc6nM0H3EgZyfUhN2oY=
|
||||||
github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA=
|
|
||||||
github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q=
|
github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q=
|
||||||
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
|
github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E=
|
||||||
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
|
github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo=
|
||||||
github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g=
|
|
||||||
github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU=
|
github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU=
|
||||||
github.com/multiformats/go-multiaddr-net v0.1.0 h1:ZepO8Ezwovd+7b5XPPDhQhayk1yt0AJpzQBpq9fejx4=
|
github.com/multiformats/go-multiaddr-net v0.1.0 h1:ZepO8Ezwovd+7b5XPPDhQhayk1yt0AJpzQBpq9fejx4=
|
||||||
github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ=
|
github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ=
|
||||||
|
@ -603,7 +585,6 @@ github.com/status-im/rendezvous v1.3.0 h1:7RK/MXXW+tlm0asKm1u7Qp7Yni6AO29a7j8+E4
|
||||||
github.com/status-im/rendezvous v1.3.0/go.mod h1:+hzjuP+j/XzLPeF6E50b88pWOTLdTcwjvNYt+Gh1W1s=
|
github.com/status-im/rendezvous v1.3.0/go.mod h1:+hzjuP+j/XzLPeF6E50b88pWOTLdTcwjvNYt+Gh1W1s=
|
||||||
github.com/status-im/tcp-shaker v0.0.0-20191114194237-215893130501 h1:oa0KU5jJRNtXaM/P465MhvSFo/HM2O8qi2DDuPcd7ro=
|
github.com/status-im/tcp-shaker v0.0.0-20191114194237-215893130501 h1:oa0KU5jJRNtXaM/P465MhvSFo/HM2O8qi2DDuPcd7ro=
|
||||||
github.com/status-im/tcp-shaker v0.0.0-20191114194237-215893130501/go.mod h1:RYo/itke1oU5k/6sj9DNM3QAwtE5rZSgg5JnkOv83hk=
|
github.com/status-im/tcp-shaker v0.0.0-20191114194237-215893130501/go.mod h1:RYo/itke1oU5k/6sj9DNM3QAwtE5rZSgg5JnkOv83hk=
|
||||||
github.com/status-im/whisper v1.5.2 h1:26NgiKusmPic38eQdtXnaY+iaQ/LuQ3Dh0kCGYT/Uxs=
|
|
||||||
github.com/status-im/whisper v1.5.2/go.mod h1:emrOxzJme0k66QtbbQ2bdd3P8RCdLZ8sTD7SkwH1s2s=
|
github.com/status-im/whisper v1.5.2/go.mod h1:emrOxzJme0k66QtbbQ2bdd3P8RCdLZ8sTD7SkwH1s2s=
|
||||||
github.com/status-im/whisper v1.6.1 h1:C/T1HQHZfUI2jbccf3yIe8yfkl435I3BILIKeNASJDc=
|
github.com/status-im/whisper v1.6.1 h1:C/T1HQHZfUI2jbccf3yIe8yfkl435I3BILIKeNASJDc=
|
||||||
github.com/status-im/whisper v1.6.1/go.mod h1:lygchT4p9Y1/hR451OhNNqfinvy9EYEDxtXU2T/U30Q=
|
github.com/status-im/whisper v1.6.1/go.mod h1:lygchT4p9Y1/hR451OhNNqfinvy9EYEDxtXU2T/U30Q=
|
||||||
|
@ -634,8 +615,8 @@ github.com/uber/jaeger-lib v0.0.0-20180615202729-a51202d6f4a7/go.mod h1:ComeNDZl
|
||||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||||
github.com/vacp2p/mvds v0.0.23 h1:BKdn7tyGvl/J/Pwv6FlcW6Xbzm+17jv141GB1mFXyOU=
|
github.com/vacp2p/mvds v0.0.23 h1:BKdn7tyGvl/J/Pwv6FlcW6Xbzm+17jv141GB1mFXyOU=
|
||||||
github.com/vacp2p/mvds v0.0.23/go.mod h1:uUmtiahU7efOVl/5w5yk9jOze5xYpDZDrSrT8TvHXjQ=
|
github.com/vacp2p/mvds v0.0.23/go.mod h1:uUmtiahU7efOVl/5w5yk9jOze5xYpDZDrSrT8TvHXjQ=
|
||||||
github.com/wealdtech/go-ens/v3 v3.0.7 h1:0iZ7yfuN5MSshCTDZB2i2vLyARs6+ybiiNz1Z8QKiGU=
|
github.com/wealdtech/go-ens/v3 v3.0.9 h1:gXMBNXikJ/XV9k6ybPOZMXIMPjBGSCC9N10dxe8Y2Xk=
|
||||||
github.com/wealdtech/go-ens/v3 v3.0.7/go.mod h1:P2OEBvgkhXLrPzPN+eR5z2/wFIGwHyijTDvpuC1xLlo=
|
github.com/wealdtech/go-ens/v3 v3.0.9/go.mod h1:P2OEBvgkhXLrPzPN+eR5z2/wFIGwHyijTDvpuC1xLlo=
|
||||||
github.com/wealdtech/go-multicodec v1.2.0 h1:9AHSxcSE9F9r6ZvQLAO0EXCdM08QfYohaXmW3k6sSh4=
|
github.com/wealdtech/go-multicodec v1.2.0 h1:9AHSxcSE9F9r6ZvQLAO0EXCdM08QfYohaXmW3k6sSh4=
|
||||||
github.com/wealdtech/go-multicodec v1.2.0/go.mod h1:aedGMaTeYkIqi/KCPre1ho5rTb3hGpu/snBOS3GQLw4=
|
github.com/wealdtech/go-multicodec v1.2.0/go.mod h1:aedGMaTeYkIqi/KCPre1ho5rTb3hGpu/snBOS3GQLw4=
|
||||||
github.com/wealdtech/go-string2eth v1.0.0 h1:jY6b1MVqU6k2Uw/kvcU1Y9/3dDyXfPzZrOFspt82UJs=
|
github.com/wealdtech/go-string2eth v1.0.0 h1:jY6b1MVqU6k2Uw/kvcU1Y9/3dDyXfPzZrOFspt82UJs=
|
||||||
|
@ -664,7 +645,6 @@ go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
go.opencensus.io v0.22.1 h1:8dP3SGL7MPB94crU3bEPplMPe83FI4EouesJUeFHv50=
|
go.opencensus.io v0.22.1 h1:8dP3SGL7MPB94crU3bEPplMPe83FI4EouesJUeFHv50=
|
||||||
go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA=
|
go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA=
|
||||||
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
|
|
||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY=
|
go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY=
|
||||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||||
|
@ -723,6 +703,7 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 h1:6KET3Sqa7fkVfD63QnAM81ZeYg5n4HwApOJkufONnHA=
|
golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 h1:6KET3Sqa7fkVfD63QnAM81ZeYg5n4HwApOJkufONnHA=
|
||||||
golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
@ -734,6 +715,7 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
@ -755,7 +737,6 @@ golang.org/x/sys v0.0.0-20190426135247-a129542de9ae/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190927073244-c990c680b611/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056 h1:dHtDnRWQtSx0Hjq9kvKFpBh9uPPKfQN70NZZmvssGwk=
|
golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056 h1:dHtDnRWQtSx0Hjq9kvKFpBh9uPPKfQN70NZZmvssGwk=
|
||||||
golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
|
|
@ -10,8 +10,8 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/status-im/status-go/api"
|
"github.com/status-im/status-go/api"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/exportlogs"
|
"github.com/status-im/status-go/exportlogs"
|
||||||
"github.com/status-im/status-go/logutils"
|
"github.com/status-im/status-go/logutils"
|
||||||
"github.com/status-im/status-go/multiaccounts"
|
"github.com/status-im/status-go/multiaccounts"
|
||||||
|
@ -485,7 +485,7 @@ func HashTransaction(txArgsJSON *C.char) *C.char {
|
||||||
|
|
||||||
result := struct {
|
result := struct {
|
||||||
Transaction transactions.SendTxArgs `json:"transaction"`
|
Transaction transactions.SendTxArgs `json:"transaction"`
|
||||||
Hash common.Hash `json:"hash"`
|
Hash types.Hash `json:"hash"`
|
||||||
}{
|
}{
|
||||||
Transaction: newTxArgs,
|
Transaction: newTxArgs,
|
||||||
Hash: hash,
|
Hash: hash,
|
||||||
|
|
|
@ -25,13 +25,12 @@ import (
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/accounts/keystore"
|
"github.com/ethereum/go-ethereum/accounts/keystore"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
gethcommon "github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/ethereum/go-ethereum/event"
|
"github.com/ethereum/go-ethereum/event"
|
||||||
"github.com/status-im/status-go/account"
|
"github.com/status-im/status-go/account"
|
||||||
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/multiaccounts/accounts"
|
"github.com/status-im/status-go/multiaccounts/accounts"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
"github.com/status-im/status-go/signal"
|
"github.com/status-im/status-go/signal"
|
||||||
. "github.com/status-im/status-go/t/utils" //nolint: golint
|
. "github.com/status-im/status-go/t/utils" //nolint: golint
|
||||||
"github.com/status-im/status-go/transactions"
|
"github.com/status-im/status-go/transactions"
|
||||||
|
@ -44,7 +43,7 @@ const initJS = `
|
||||||
};`
|
};`
|
||||||
|
|
||||||
var (
|
var (
|
||||||
zeroHash = gethcommon.Hash{}
|
zeroHash = common.Hash{}
|
||||||
testChainDir string
|
testChainDir string
|
||||||
keystoreDir string
|
keystoreDir string
|
||||||
nodeConfigJSON string
|
nodeConfigJSON string
|
||||||
|
@ -62,7 +61,7 @@ func buildSubAccountData(chatAddress string) *C.char {
|
||||||
{
|
{
|
||||||
Wallet: true,
|
Wallet: true,
|
||||||
Chat: true,
|
Chat: true,
|
||||||
Address: gethcommon.HexToAddress(chatAddress),
|
Address: common.HexToAddress(chatAddress),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
data, _ := json.Marshal(accs)
|
data, _ := json.Marshal(accs)
|
||||||
|
@ -71,9 +70,9 @@ func buildSubAccountData(chatAddress string) *C.char {
|
||||||
|
|
||||||
func buildLoginParams(mainAccountAddress, chatAddress, password string) account.LoginParams {
|
func buildLoginParams(mainAccountAddress, chatAddress, password string) account.LoginParams {
|
||||||
return account.LoginParams{
|
return account.LoginParams{
|
||||||
ChatAddress: gethcommon.HexToAddress(chatAddress),
|
ChatAddress: common.HexToAddress(chatAddress),
|
||||||
Password: password,
|
Password: password,
|
||||||
MainAccount: gethcommon.HexToAddress(mainAccountAddress),
|
MainAccount: common.HexToAddress(mainAccountAddress),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -461,7 +460,7 @@ func testLoginWithKeycard(t *testing.T, feed *event.Feed) bool { //nolint: gocyc
|
||||||
t.Errorf("whisper service not running: %v", err)
|
t.Errorf("whisper service not running: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
chatPubKeyHex := protocol.EncodeHex(crypto.FromECDSAPub(&chatPrivKey.PublicKey))
|
chatPubKeyHex := types.EncodeHex(crypto.FromECDSAPub(&chatPrivKey.PublicKey))
|
||||||
if whisperService.HasKeyPair(chatPubKeyHex) {
|
if whisperService.HasKeyPair(chatPubKeyHex) {
|
||||||
t.Error("identity already present in whisper")
|
t.Error("identity already present in whisper")
|
||||||
return false
|
return false
|
||||||
|
@ -556,8 +555,8 @@ func testSendTransactionWithLogin(t *testing.T, feed *event.Feed) bool {
|
||||||
t.Errorf("failed to send transaction: %v", result.Error)
|
t.Errorf("failed to send transaction: %v", result.Error)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
hash := gethcommon.BytesToHash(result.Result)
|
hash := common.BytesToHash(result.Result)
|
||||||
if reflect.DeepEqual(hash, gethcommon.Hash{}) {
|
if reflect.DeepEqual(hash, common.Hash{}) {
|
||||||
t.Errorf("response hash empty: %s", hash.Hex())
|
t.Errorf("response hash empty: %s", hash.Hex())
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ package main
|
||||||
|
|
||||||
import "github.com/status-im/status-go/api"
|
import "github.com/status-im/status-go/api"
|
||||||
|
|
||||||
var statusBackend = api.NewStatusBackend()
|
var statusBackend = api.NewGethStatusBackend()
|
||||||
|
|
||||||
// Technically this package supposed to be a lib for
|
// Technically this package supposed to be a lib for
|
||||||
// cross-compilation and usage with Android/iOS, but
|
// cross-compilation and usage with Android/iOS, but
|
||||||
|
|
|
@ -6,8 +6,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"github.com/syndtr/goleveldb/leveldb"
|
"github.com/syndtr/goleveldb/leveldb"
|
||||||
|
@ -118,8 +117,8 @@ func testMessagesCount(t *testing.T, expected int, s *WMailServer) {
|
||||||
func countMessages(t *testing.T, db DB) int {
|
func countMessages(t *testing.T, db DB) int {
|
||||||
var (
|
var (
|
||||||
count int
|
count int
|
||||||
zero protocol.Hash
|
zero types.Hash
|
||||||
emptyTopic whispertypes.TopicType
|
emptyTopic types.TopicType
|
||||||
)
|
)
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
|
|
|
@ -4,14 +4,13 @@ import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// DBKeyLength is a size of the envelope key.
|
// DBKeyLength is a size of the envelope key.
|
||||||
DBKeyLength = protocol.HashLength + timestampLength + whispertypes.TopicLength
|
DBKeyLength = types.HashLength + timestampLength + types.TopicLength
|
||||||
CursorLength = protocol.HashLength + timestampLength
|
CursorLength = types.HashLength + timestampLength
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -30,12 +29,12 @@ func (k *DBKey) Bytes() []byte {
|
||||||
return k.raw
|
return k.raw
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *DBKey) Topic() whispertypes.TopicType {
|
func (k *DBKey) Topic() types.TopicType {
|
||||||
return whispertypes.BytesToTopic(k.raw[timestampLength+protocol.HashLength:])
|
return types.BytesToTopic(k.raw[timestampLength+types.HashLength:])
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *DBKey) EnvelopeHash() protocol.Hash {
|
func (k *DBKey) EnvelopeHash() types.Hash {
|
||||||
return protocol.BytesToHash(k.raw[timestampLength : protocol.HashLength+timestampLength])
|
return types.BytesToHash(k.raw[timestampLength : types.HashLength+timestampLength])
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *DBKey) Cursor() []byte {
|
func (k *DBKey) Cursor() []byte {
|
||||||
|
@ -44,11 +43,11 @@ func (k *DBKey) Cursor() []byte {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDBKey creates a new DBKey with the given values.
|
// NewDBKey creates a new DBKey with the given values.
|
||||||
func NewDBKey(timestamp uint32, topic whispertypes.TopicType, h protocol.Hash) *DBKey {
|
func NewDBKey(timestamp uint32, topic types.TopicType, h types.Hash) *DBKey {
|
||||||
var k DBKey
|
var k DBKey
|
||||||
k.raw = make([]byte, DBKeyLength)
|
k.raw = make([]byte, DBKeyLength)
|
||||||
binary.BigEndian.PutUint32(k.raw, timestamp)
|
binary.BigEndian.PutUint32(k.raw, timestamp)
|
||||||
copy(k.raw[timestampLength:], h[:])
|
copy(k.raw[timestampLength:], h[:])
|
||||||
copy(k.raw[timestampLength+protocol.HashLength:], topic[:])
|
copy(k.raw[timestampLength+types.HashLength:], topic[:])
|
||||||
return &k
|
return &k
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,15 +3,14 @@ package mailserver
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNewDBKey(t *testing.T) {
|
func TestNewDBKey(t *testing.T) {
|
||||||
topic := whispertypes.BytesToTopic([]byte{0x01, 0x02, 0x03, 0x04})
|
topic := types.BytesToTopic([]byte{0x01, 0x02, 0x03, 0x04})
|
||||||
|
|
||||||
hash := protocol.BytesToHash([]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x30, 0x31, 0x32})
|
hash := types.BytesToHash([]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x30, 0x31, 0x32})
|
||||||
dbKey := NewDBKey(0xabcdef12, topic, hash)
|
dbKey := NewDBKey(0xabcdef12, topic, hash)
|
||||||
expected := []byte{0xab, 0xcd, 0xef, 0x12, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x30, 0x31, 0x32, 0x01, 0x02, 0x03, 0x04}
|
expected := []byte{0xab, 0xcd, 0xef, 0x12, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x30, 0x31, 0x32, 0x01, 0x02, 0x03, 0x04}
|
||||||
require.Equal(t, expected, dbKey.Bytes())
|
require.Equal(t, expected, dbKey.Bytes())
|
||||||
|
|
|
@ -29,9 +29,8 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/params"
|
"github.com/status-im/status-go/params"
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
|
|
||||||
prom "github.com/prometheus/client_golang/prometheus"
|
prom "github.com/prometheus/client_golang/prometheus"
|
||||||
|
@ -199,7 +198,7 @@ func (s *WMailServer) DeliverMail(peer *whisper.Peer, request *whisper.Envelope)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
requestID := protocol.Hash(request.Hash())
|
requestID := types.Hash(request.Hash())
|
||||||
peerID := peerIDString(peer)
|
peerID := peerIDString(peer)
|
||||||
|
|
||||||
log.Info("[mailserver:DeliverMail] delivering mail",
|
log.Info("[mailserver:DeliverMail] delivering mail",
|
||||||
|
@ -356,7 +355,7 @@ func (s *WMailServer) Deliver(peer *whisper.Peer, r whisper.MessagesRequest) {
|
||||||
deliveryAttemptsCounter.Inc()
|
deliveryAttemptsCounter.Inc()
|
||||||
|
|
||||||
var (
|
var (
|
||||||
requestIDHash = protocol.BytesToHash(r.ID)
|
requestIDHash = types.BytesToHash(r.ID)
|
||||||
requestIDStr = requestIDHash.String()
|
requestIDStr = requestIDHash.String()
|
||||||
peerID = peerIDString(peer)
|
peerID = peerIDString(peer)
|
||||||
err error
|
err error
|
||||||
|
@ -592,8 +591,8 @@ func (s *WMailServer) exceedsPeerRequests(peer []byte) bool {
|
||||||
|
|
||||||
func (s *WMailServer) createIterator(lower, upper uint32, cursor []byte, bloom []byte, limit uint32) (Iterator, error) {
|
func (s *WMailServer) createIterator(lower, upper uint32, cursor []byte, bloom []byte, limit uint32) (Iterator, error) {
|
||||||
var (
|
var (
|
||||||
emptyHash protocol.Hash
|
emptyHash types.Hash
|
||||||
emptyTopic whispertypes.TopicType
|
emptyTopic types.TopicType
|
||||||
ku, kl *DBKey
|
ku, kl *DBKey
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -620,7 +619,7 @@ func (s *WMailServer) processRequestInBundles(
|
||||||
requestID string,
|
requestID string,
|
||||||
output chan<- []rlp.RawValue,
|
output chan<- []rlp.RawValue,
|
||||||
cancel <-chan struct{},
|
cancel <-chan struct{},
|
||||||
) ([]byte, protocol.Hash) {
|
) ([]byte, types.Hash) {
|
||||||
timer := prom.NewTimer(requestsInBundlesDuration)
|
timer := prom.NewTimer(requestsInBundlesDuration)
|
||||||
defer timer.ObserveDuration()
|
defer timer.ObserveDuration()
|
||||||
|
|
||||||
|
@ -631,7 +630,7 @@ func (s *WMailServer) processRequestInBundles(
|
||||||
processedEnvelopes int
|
processedEnvelopes int
|
||||||
processedEnvelopesSize int64
|
processedEnvelopesSize int64
|
||||||
nextCursor []byte
|
nextCursor []byte
|
||||||
lastEnvelopeHash protocol.Hash
|
lastEnvelopeHash types.Hash
|
||||||
)
|
)
|
||||||
|
|
||||||
log.Info("[mailserver:processRequestInBundles] processing request",
|
log.Info("[mailserver:processRequestInBundles] processing request",
|
||||||
|
@ -760,13 +759,13 @@ func (s *WMailServer) sendRawEnvelopes(peer *whisper.Peer, envelopes []rlp.RawVa
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *WMailServer) sendHistoricMessageResponse(peer *whisper.Peer, requestID, lastEnvelopeHash protocol.Hash, cursor []byte) error {
|
func (s *WMailServer) sendHistoricMessageResponse(peer *whisper.Peer, requestID, lastEnvelopeHash types.Hash, cursor []byte) error {
|
||||||
payload := whisper.CreateMailServerRequestCompletedPayload(common.Hash(requestID), common.Hash(lastEnvelopeHash), cursor)
|
payload := whisper.CreateMailServerRequestCompletedPayload(common.Hash(requestID), common.Hash(lastEnvelopeHash), cursor)
|
||||||
return s.w.SendHistoricMessageResponse(peer, payload)
|
return s.w.SendHistoricMessageResponse(peer, payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
// this method doesn't return an error because it is already in the error handling chain
|
// this method doesn't return an error because it is already in the error handling chain
|
||||||
func (s *WMailServer) trySendHistoricMessageErrorResponse(peer *whisper.Peer, requestID protocol.Hash, errorToReport error) {
|
func (s *WMailServer) trySendHistoricMessageErrorResponse(peer *whisper.Peer, requestID types.Hash, errorToReport error) {
|
||||||
payload := whisper.CreateMailServerRequestFailedPayload(common.Hash(requestID), errorToReport)
|
payload := whisper.CreateMailServerRequestFailedPayload(common.Hash(requestID), errorToReport)
|
||||||
|
|
||||||
err := s.w.SendHistoricMessageResponse(peer, payload)
|
err := s.w.SendHistoricMessageResponse(peer, payload)
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
type DB interface {
|
type DB interface {
|
||||||
Close() error
|
Close() error
|
||||||
// SaveEnvelope stores an envelope
|
// SaveEnvelope stores an envelope
|
||||||
SaveEnvelope(*whisper.Envelope) error // TODO: Migrate to whispertypes.Envelope
|
SaveEnvelope(*whisper.Envelope) error // TODO: Migrate to types.Envelope
|
||||||
// GetEnvelope returns an rlp encoded envelope from the datastore
|
// GetEnvelope returns an rlp encoded envelope from the datastore
|
||||||
GetEnvelope(*DBKey) ([]byte, error)
|
GetEnvelope(*DBKey) ([]byte, error)
|
||||||
// Prune removes envelopes older than time
|
// Prune removes envelopes older than time
|
||||||
|
|
|
@ -6,9 +6,8 @@ import (
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/params"
|
"github.com/status-im/status-go/params"
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
"github.com/syndtr/goleveldb/leveldb"
|
"github.com/syndtr/goleveldb/leveldb"
|
||||||
"github.com/syndtr/goleveldb/leveldb/errors"
|
"github.com/syndtr/goleveldb/leveldb/errors"
|
||||||
|
@ -48,9 +47,9 @@ func (i *LevelDBIterator) GetEnvelope(bloom []byte) ([]byte, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
envelopeBloom = whispertypes.TopicToBloom(key.Topic())
|
envelopeBloom = types.TopicToBloom(key.Topic())
|
||||||
}
|
}
|
||||||
if !whispertypes.BloomFilterMatch(bloom, envelopeBloom) {
|
if !types.BloomFilterMatch(bloom, envelopeBloom) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
return rawValue, nil
|
return rawValue, nil
|
||||||
|
@ -90,8 +89,8 @@ func (db *LevelDB) GetEnvelope(key *DBKey) ([]byte, error) {
|
||||||
func (db *LevelDB) Prune(t time.Time, batchSize int) (int, error) {
|
func (db *LevelDB) Prune(t time.Time, batchSize int) (int, error) {
|
||||||
defer recoverLevelDBPanics("Prune")
|
defer recoverLevelDBPanics("Prune")
|
||||||
|
|
||||||
var zero protocol.Hash
|
var zero types.Hash
|
||||||
var emptyTopic whispertypes.TopicType
|
var emptyTopic types.TopicType
|
||||||
kl := NewDBKey(0, emptyTopic, zero)
|
kl := NewDBKey(0, emptyTopic, zero)
|
||||||
ku := NewDBKey(uint32(t.Unix()), emptyTopic, zero)
|
ku := NewDBKey(uint32(t.Unix()), emptyTopic, zero)
|
||||||
query := CursorQuery{
|
query := CursorQuery{
|
||||||
|
@ -140,7 +139,7 @@ func (db *LevelDB) Prune(t time.Time, batchSize int) (int, error) {
|
||||||
func (db *LevelDB) SaveEnvelope(env *whisper.Envelope) error {
|
func (db *LevelDB) SaveEnvelope(env *whisper.Envelope) error {
|
||||||
defer recoverLevelDBPanics("SaveEnvelope")
|
defer recoverLevelDBPanics("SaveEnvelope")
|
||||||
|
|
||||||
key := NewDBKey(env.Expiry-env.TTL, whispertypes.TopicType(env.Topic), protocol.Hash(env.Hash()))
|
key := NewDBKey(env.Expiry-env.TTL, types.TopicType(env.Topic), types.Hash(env.Hash()))
|
||||||
rawEnvelope, err := rlp.EncodeToBytes(env)
|
rawEnvelope, err := rlp.EncodeToBytes(env)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(fmt.Sprintf("rlp.EncodeToBytes failed: %s", err))
|
log.Error(fmt.Sprintf("rlp.EncodeToBytes failed: %s", err))
|
||||||
|
|
|
@ -15,8 +15,7 @@ import (
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -159,8 +158,8 @@ func (i *PostgresDB) GetEnvelope(key *DBKey) ([]byte, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *PostgresDB) Prune(t time.Time, batch int) (int, error) {
|
func (i *PostgresDB) Prune(t time.Time, batch int) (int, error) {
|
||||||
var zero protocol.Hash
|
var zero types.Hash
|
||||||
var emptyTopic whispertypes.TopicType
|
var emptyTopic types.TopicType
|
||||||
kl := NewDBKey(0, emptyTopic, zero)
|
kl := NewDBKey(0, emptyTopic, zero)
|
||||||
ku := NewDBKey(uint32(t.Unix()), emptyTopic, zero)
|
ku := NewDBKey(uint32(t.Unix()), emptyTopic, zero)
|
||||||
statement := "DELETE FROM envelopes WHERE id BETWEEN $1 AND $2"
|
statement := "DELETE FROM envelopes WHERE id BETWEEN $1 AND $2"
|
||||||
|
@ -179,8 +178,8 @@ func (i *PostgresDB) Prune(t time.Time, batch int) (int, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *PostgresDB) SaveEnvelope(env *whisper.Envelope) error {
|
func (i *PostgresDB) SaveEnvelope(env *whisper.Envelope) error {
|
||||||
topic := whispertypes.TopicType(env.Topic)
|
topic := types.TopicType(env.Topic)
|
||||||
key := NewDBKey(env.Expiry-env.TTL, topic, protocol.Hash(env.Hash()))
|
key := NewDBKey(env.Expiry-env.TTL, topic, types.Hash(env.Hash()))
|
||||||
rawEnvelope, err := rlp.EncodeToBytes(env)
|
rawEnvelope, err := rlp.EncodeToBytes(env)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(fmt.Sprintf("rlp.EncodeToBytes failed: %s", err))
|
log.Error(fmt.Sprintf("rlp.EncodeToBytes failed: %s", err))
|
||||||
|
@ -214,7 +213,7 @@ func (i *PostgresDB) SaveEnvelope(env *whisper.Envelope) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func topicToByte(t whispertypes.TopicType) []byte {
|
func topicToByte(t types.TopicType) []byte {
|
||||||
return []byte{t[0], t[1], t[2], t[3]}
|
return []byte{t[0], t[1], t[2], t[3]}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,9 +32,8 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/params"
|
"github.com/status-im/status-go/params"
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
)
|
)
|
||||||
|
@ -46,7 +45,7 @@ var seed = time.Now().Unix()
|
||||||
var testPayload = []byte("test payload")
|
var testPayload = []byte("test payload")
|
||||||
|
|
||||||
type ServerTestParams struct {
|
type ServerTestParams struct {
|
||||||
topic whispertypes.TopicType
|
topic types.TopicType
|
||||||
birth uint32
|
birth uint32
|
||||||
low uint32
|
low uint32
|
||||||
upp uint32
|
upp uint32
|
||||||
|
@ -259,7 +258,7 @@ func (s *MailserverSuite) TestArchive() {
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
s.server.Archive(env)
|
s.server.Archive(env)
|
||||||
key := NewDBKey(env.Expiry-env.TTL, whispertypes.TopicType(env.Topic), protocol.Hash(env.Hash()))
|
key := NewDBKey(env.Expiry-env.TTL, types.TopicType(env.Topic), types.Hash(env.Hash()))
|
||||||
archivedEnvelope, err := s.server.db.GetEnvelope(key)
|
archivedEnvelope, err := s.server.db.GetEnvelope(key)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
|
@ -279,8 +278,8 @@ func (s *MailserverSuite) TestManageLimits() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MailserverSuite) TestDBKey() {
|
func (s *MailserverSuite) TestDBKey() {
|
||||||
var h protocol.Hash
|
var h types.Hash
|
||||||
var emptyTopic whispertypes.TopicType
|
var emptyTopic types.TopicType
|
||||||
i := uint32(time.Now().Unix())
|
i := uint32(time.Now().Unix())
|
||||||
k := NewDBKey(i, emptyTopic, h)
|
k := NewDBKey(i, emptyTopic, h)
|
||||||
s.Equal(len(k.Bytes()), DBKeyLength, "wrong DB key length")
|
s.Equal(len(k.Bytes()), DBKeyLength, "wrong DB key length")
|
||||||
|
@ -307,7 +306,7 @@ func (s *MailserverSuite) TestRequestPaginationLimit() {
|
||||||
env, err := generateEnvelope(sentTime)
|
env, err := generateEnvelope(sentTime)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
s.server.Archive(env)
|
s.server.Archive(env)
|
||||||
key := NewDBKey(env.Expiry-env.TTL, whispertypes.TopicType(env.Topic), protocol.Hash(env.Hash()))
|
key := NewDBKey(env.Expiry-env.TTL, types.TopicType(env.Topic), types.Hash(env.Hash()))
|
||||||
archiveKeys = append(archiveKeys, fmt.Sprintf("%x", key.Cursor()))
|
archiveKeys = append(archiveKeys, fmt.Sprintf("%x", key.Cursor()))
|
||||||
sentEnvelopes = append(sentEnvelopes, env)
|
sentEnvelopes = append(sentEnvelopes, env)
|
||||||
sentHashes = append(sentHashes, env.Hash())
|
sentHashes = append(sentHashes, env.Hash())
|
||||||
|
@ -423,7 +422,7 @@ func (s *MailserverSuite) TestMailServer() {
|
||||||
s.Equal(tc.params.low, lower)
|
s.Equal(tc.params.low, lower)
|
||||||
s.Equal(tc.params.upp, upper)
|
s.Equal(tc.params.upp, upper)
|
||||||
s.Equal(tc.params.limit, limit)
|
s.Equal(tc.params.limit, limit)
|
||||||
s.Equal(whispertypes.TopicToBloom(tc.params.topic), bloom)
|
s.Equal(types.TopicToBloom(tc.params.topic), bloom)
|
||||||
s.Equal(tc.expect, s.messageExists(env, tc.params.low, tc.params.upp, bloom, tc.params.limit))
|
s.Equal(tc.expect, s.messageExists(env, tc.params.low, tc.params.upp, bloom, tc.params.limit))
|
||||||
|
|
||||||
src[0]++
|
src[0]++
|
||||||
|
@ -454,7 +453,7 @@ func (s *MailserverSuite) TestDecodeRequest() {
|
||||||
srcKey, err := s.shh.GetPrivateKey(id)
|
srcKey, err := s.shh.GetPrivateKey(id)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
env := s.createEnvelope(whispertypes.TopicType{0x01}, data, srcKey)
|
env := s.createEnvelope(types.TopicType{0x01}, data, srcKey)
|
||||||
|
|
||||||
decodedPayload, err := s.server.decodeRequest(nil, env)
|
decodedPayload, err := s.server.decodeRequest(nil, env)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
@ -480,7 +479,7 @@ func (s *MailserverSuite) TestDecodeRequestNoUpper() {
|
||||||
srcKey, err := s.shh.GetPrivateKey(id)
|
srcKey, err := s.shh.GetPrivateKey(id)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
env := s.createEnvelope(whispertypes.TopicType{0x01}, data, srcKey)
|
env := s.createEnvelope(types.TopicType{0x01}, data, srcKey)
|
||||||
|
|
||||||
decodedPayload, err := s.server.decodeRequest(nil, env)
|
decodedPayload, err := s.server.decodeRequest(nil, env)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
@ -686,7 +685,7 @@ func (s *MailserverSuite) defaultServerParams(env *whisper.Envelope) *ServerTest
|
||||||
birth := env.Expiry - env.TTL
|
birth := env.Expiry - env.TTL
|
||||||
|
|
||||||
return &ServerTestParams{
|
return &ServerTestParams{
|
||||||
topic: whispertypes.TopicType(env.Topic),
|
topic: types.TopicType(env.Topic),
|
||||||
birth: birth,
|
birth: birth,
|
||||||
low: birth - 1,
|
low: birth - 1,
|
||||||
upp: birth + 1,
|
upp: birth + 1,
|
||||||
|
@ -696,7 +695,7 @@ func (s *MailserverSuite) defaultServerParams(env *whisper.Envelope) *ServerTest
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MailserverSuite) createRequest(p *ServerTestParams) *whisper.Envelope {
|
func (s *MailserverSuite) createRequest(p *ServerTestParams) *whisper.Envelope {
|
||||||
bloom := whispertypes.TopicToBloom(p.topic)
|
bloom := types.TopicToBloom(p.topic)
|
||||||
data := make([]byte, 8)
|
data := make([]byte, 8)
|
||||||
binary.BigEndian.PutUint32(data, p.low)
|
binary.BigEndian.PutUint32(data, p.low)
|
||||||
binary.BigEndian.PutUint32(data[4:], p.upp)
|
binary.BigEndian.PutUint32(data[4:], p.upp)
|
||||||
|
@ -711,7 +710,7 @@ func (s *MailserverSuite) createRequest(p *ServerTestParams) *whisper.Envelope {
|
||||||
return s.createEnvelope(p.topic, data, p.key)
|
return s.createEnvelope(p.topic, data, p.key)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MailserverSuite) createEnvelope(topic whispertypes.TopicType, data []byte, srcKey *ecdsa.PrivateKey) *whisper.Envelope {
|
func (s *MailserverSuite) createEnvelope(topic types.TopicType, data []byte, srcKey *ecdsa.PrivateKey) *whisper.Envelope {
|
||||||
key, err := s.shh.GetSymKey(keyID)
|
key, err := s.shh.GetSymKey(keyID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.T().Fatalf("failed to retrieve sym key with seed %d: %s.", seed, err)
|
s.T().Fatalf("failed to retrieve sym key with seed %d: %s.", seed, err)
|
||||||
|
@ -771,7 +770,7 @@ func generateEnvelope(sentTime time.Time) (*whisper.Envelope, error) {
|
||||||
|
|
||||||
func processRequestAndCollectHashes(
|
func processRequestAndCollectHashes(
|
||||||
server *WMailServer, lower, upper uint32, cursor []byte, bloom []byte, limit int,
|
server *WMailServer, lower, upper uint32, cursor []byte, bloom []byte, limit int,
|
||||||
) ([]common.Hash, []byte, protocol.Hash) {
|
) ([]common.Hash, []byte, types.Hash) {
|
||||||
iter, _ := server.createIterator(lower, upper, cursor, nil, 0)
|
iter, _ := server.createIterator(lower, upper, cursor, nil, 0)
|
||||||
defer iter.Release()
|
defer iter.Release()
|
||||||
bundles := make(chan []rlp.RawValue, 10)
|
bundles := make(chan []rlp.RawValue, 10)
|
||||||
|
|
|
@ -8,9 +8,9 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/status-im/status-go/api"
|
"github.com/status-im/status-go/api"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/exportlogs"
|
"github.com/status-im/status-go/exportlogs"
|
||||||
"github.com/status-im/status-go/multiaccounts"
|
"github.com/status-im/status-go/multiaccounts"
|
||||||
"github.com/status-im/status-go/multiaccounts/accounts"
|
"github.com/status-im/status-go/multiaccounts/accounts"
|
||||||
|
@ -24,7 +24,7 @@ import (
|
||||||
validator "gopkg.in/go-playground/validator.v9"
|
validator "gopkg.in/go-playground/validator.v9"
|
||||||
)
|
)
|
||||||
|
|
||||||
var statusBackend = api.NewStatusBackend()
|
var statusBackend = api.NewGethStatusBackend()
|
||||||
|
|
||||||
// OpenAccounts opens database and returns accounts list.
|
// OpenAccounts opens database and returns accounts list.
|
||||||
func OpenAccounts(datadir string) string {
|
func OpenAccounts(datadir string) string {
|
||||||
|
@ -535,7 +535,7 @@ func HashTransaction(txArgsJSON string) string {
|
||||||
|
|
||||||
result := struct {
|
result := struct {
|
||||||
Transaction transactions.SendTxArgs `json:"transaction"`
|
Transaction transactions.SendTxArgs `json:"transaction"`
|
||||||
Hash common.Hash `json:"hash"`
|
Hash types.Hash `json:"hash"`
|
||||||
}{
|
}{
|
||||||
Transaction: newTxArgs,
|
Transaction: newTxArgs,
|
||||||
Hash: hash,
|
Hash: hash,
|
||||||
|
|
36
node/node.go
36
node/node.go
|
@ -12,7 +12,6 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/accounts"
|
"github.com/ethereum/go-ethereum/accounts"
|
||||||
gethcommon "github.com/ethereum/go-ethereum/common"
|
gethcommon "github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/ethereum/go-ethereum/eth"
|
"github.com/ethereum/go-ethereum/eth"
|
||||||
"github.com/ethereum/go-ethereum/eth/downloader"
|
"github.com/ethereum/go-ethereum/eth/downloader"
|
||||||
"github.com/ethereum/go-ethereum/ethclient"
|
"github.com/ethereum/go-ethereum/ethclient"
|
||||||
|
@ -23,15 +22,16 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/p2p/discv5"
|
"github.com/ethereum/go-ethereum/p2p/discv5"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enode"
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||||
"github.com/ethereum/go-ethereum/p2p/nat"
|
"github.com/ethereum/go-ethereum/p2p/nat"
|
||||||
|
gethbridge "github.com/status-im/status-go/eth-node/bridge/geth"
|
||||||
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
"github.com/status-im/status-go/mailserver"
|
"github.com/status-im/status-go/mailserver"
|
||||||
"github.com/status-im/status-go/params"
|
"github.com/status-im/status-go/params"
|
||||||
gethbridge "github.com/status-im/status-go/protocol/bridge/geth"
|
|
||||||
"github.com/status-im/status-go/services/incentivisation"
|
"github.com/status-im/status-go/services/incentivisation"
|
||||||
|
"github.com/status-im/status-go/services/nodebridge"
|
||||||
"github.com/status-im/status-go/services/peer"
|
"github.com/status-im/status-go/services/peer"
|
||||||
"github.com/status-im/status-go/services/personal"
|
"github.com/status-im/status-go/services/personal"
|
||||||
"github.com/status-im/status-go/services/shhext"
|
"github.com/status-im/status-go/services/shhext"
|
||||||
"github.com/status-im/status-go/services/status"
|
"github.com/status-im/status-go/services/status"
|
||||||
"github.com/status-im/status-go/services/whisperbridge"
|
|
||||||
"github.com/status-im/status-go/static"
|
"github.com/status-im/status-go/static"
|
||||||
"github.com/status-im/status-go/timesource"
|
"github.com/status-im/status-go/timesource"
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
whisper "github.com/status-im/whisper/whisperv6"
|
||||||
|
@ -272,7 +272,7 @@ func activateStatusService(stack *node.Node, config *params.NodeConfig) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
return stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
return stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
||||||
var service *whisperbridge.WhisperService
|
var service *nodebridge.WhisperService
|
||||||
if err := ctx.Service(&service); err != nil {
|
if err := ctx.Service(&service); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -316,13 +316,25 @@ func activateShhService(stack *node.Node, config *params.NodeConfig, db *leveldb
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register Whisper status-go/protocol bridge
|
// Register eth-node node bridge
|
||||||
err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
||||||
var whisper *whisper.Whisper
|
return &nodebridge.NodeService{Node: gethbridge.NewNodeBridge(stack)}, nil
|
||||||
if err := ctx.Service(&whisper); err != nil {
|
})
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register Whisper eth-node bridge
|
||||||
|
err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
||||||
|
var ethnode *nodebridge.NodeService
|
||||||
|
if err := ctx.Service(ðnode); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &whisperbridge.WhisperService{Whisper: gethbridge.NewGethWhisperWrapper(whisper)}, nil
|
w, err := ethnode.Node.GetWhisper(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &nodebridge.WhisperService{Whisper: w}, nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
@ -330,11 +342,11 @@ func activateShhService(stack *node.Node, config *params.NodeConfig, db *leveldb
|
||||||
|
|
||||||
// TODO(dshulyak) add a config option to enable it by default, but disable if app is started from statusd
|
// TODO(dshulyak) add a config option to enable it by default, but disable if app is started from statusd
|
||||||
return stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
return stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
||||||
var service *whisperbridge.WhisperService
|
var ethnode *nodebridge.NodeService
|
||||||
if err := ctx.Service(&service); err != nil {
|
if err := ctx.Service(ðnode); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return shhext.New(service.Whisper, shhext.EnvelopeSignalHandler{}, db, config.ShhextConfig), nil
|
return shhext.New(ethnode.Node, ctx, shhext.EnvelopeSignalHandler{}, db, config.ShhextConfig), nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,7 +410,7 @@ func activateIncentivisationService(stack *node.Node, config *params.NodeConfig)
|
||||||
logger.Info("activating incentivisation")
|
logger.Info("activating incentivisation")
|
||||||
// TODO(dshulyak) add a config option to enable it by default, but disable if app is started from statusd
|
// TODO(dshulyak) add a config option to enable it by default, but disable if app is started from statusd
|
||||||
return stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
return stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
|
||||||
var w *whisperbridge.WhisperService
|
var w *nodebridge.WhisperService
|
||||||
if err := ctx.Service(&w); err != nil {
|
if err := ctx.Service(&w); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,12 +16,6 @@ lint:
|
||||||
golangci-lint run -v
|
golangci-lint run -v
|
||||||
.PHONY: lint
|
.PHONY: lint
|
||||||
|
|
||||||
vendor:
|
|
||||||
go mod tidy
|
|
||||||
go mod vendor
|
|
||||||
modvendor -copy="**/*.c **/*.h" -v
|
|
||||||
.PHONY: vendor
|
|
||||||
|
|
||||||
install-linter:
|
install-linter:
|
||||||
# install linter
|
# install linter
|
||||||
curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.21.0
|
curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.21.0
|
||||||
|
|
|
@ -2,7 +2,7 @@ package applicationmetadata
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (m *Message) RecoverKey() (*ecdsa.PublicKey, error) {
|
func (m *Message) RecoverKey() (*ecdsa.PublicKey, error) {
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
package gethbridge
|
|
||||||
|
|
||||||
import (
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewGethEnvelopeErrorWrapper returns a whispertypes.EnvelopeError object that mimics Geth's EnvelopeError
|
|
||||||
func NewGethEnvelopeErrorWrapper(envelopeError *whisper.EnvelopeError) *whispertypes.EnvelopeError {
|
|
||||||
if envelopeError == nil {
|
|
||||||
panic("envelopeError should not be nil")
|
|
||||||
}
|
|
||||||
|
|
||||||
return &whispertypes.EnvelopeError{
|
|
||||||
Hash: protocol.Hash(envelopeError.Hash),
|
|
||||||
Code: mapGethErrorCode(envelopeError.Code),
|
|
||||||
Description: envelopeError.Description,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func mapGethErrorCode(code uint) uint {
|
|
||||||
switch code {
|
|
||||||
case whisper.EnvelopeTimeNotSynced:
|
|
||||||
return whispertypes.EnvelopeTimeNotSynced
|
|
||||||
case whisper.EnvelopeOtherError:
|
|
||||||
return whispertypes.EnvelopeOtherError
|
|
||||||
}
|
|
||||||
return whispertypes.EnvelopeOtherError
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
package gethbridge
|
|
||||||
|
|
||||||
import (
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewGethMailServerResponseWrapper returns a whispertypes.MailServerResponse object that mimics Geth's MailServerResponse
|
|
||||||
func NewGethMailServerResponseWrapper(mailServerResponse *whisper.MailServerResponse) *whispertypes.MailServerResponse {
|
|
||||||
if mailServerResponse == nil {
|
|
||||||
panic("mailServerResponse should not be nil")
|
|
||||||
}
|
|
||||||
|
|
||||||
return &whispertypes.MailServerResponse{
|
|
||||||
LastEnvelopeHash: protocol.Hash(mailServerResponse.LastEnvelopeHash),
|
|
||||||
Cursor: mailServerResponse.Cursor,
|
|
||||||
Error: mailServerResponse.Error,
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
package gethbridge
|
|
||||||
|
|
||||||
import (
|
|
||||||
whispertypes "github.com/status-im/status-go/protocol/transport/whisper/types"
|
|
||||||
whisper "github.com/status-im/whisper/whisperv6"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewGethSyncEventResponseWrapper returns a whispertypes.SyncEventResponse object that mimics Geth's SyncEventResponse
|
|
||||||
func NewGethSyncEventResponseWrapper(syncEventResponse whisper.SyncEventResponse) whispertypes.SyncEventResponse {
|
|
||||||
return whispertypes.SyncEventResponse{
|
|
||||||
Cursor: syncEventResponse.Cursor,
|
|
||||||
Error: syncEventResponse.Error,
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
v1protocol "github.com/status-im/status-go/protocol/v1"
|
v1protocol "github.com/status-im/status-go/protocol/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -140,7 +140,7 @@ type ChatMember struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c ChatMember) PublicKey() (*ecdsa.PublicKey, error) {
|
func (c ChatMember) PublicKey() (*ecdsa.PublicKey, error) {
|
||||||
b, err := protocol.DecodeHex(c.ID)
|
b, err := types.DecodeHex(c.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ func (c ChatMember) PublicKey() (*ecdsa.PublicKey, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func oneToOneChatID(publicKey *ecdsa.PublicKey) string {
|
func oneToOneChatID(publicKey *ecdsa.PublicKey) string {
|
||||||
return protocol.EncodeHex(crypto.FromECDSAPub(publicKey))
|
return types.EncodeHex(crypto.FromECDSAPub(publicKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateOneToOneChat(name string, publicKey *ecdsa.PublicKey) Chat {
|
func CreateOneToOneChat(name string, publicKey *ecdsa.PublicKey) Chat {
|
||||||
|
@ -194,7 +194,7 @@ func stringSliceToPublicKeys(slice []string, prefixed bool) ([]*ecdsa.PublicKey,
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
if prefixed {
|
if prefixed {
|
||||||
b, err = protocol.DecodeHex(item)
|
b, err = types.DecodeHex(item)
|
||||||
} else {
|
} else {
|
||||||
b, err = hex.DecodeString(item)
|
b, err = hex.DecodeString(item)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,10 +5,10 @@ import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/protocol/identity/alias"
|
"github.com/status-im/status-go/protocol/identity/alias"
|
||||||
"github.com/status-im/status-go/protocol/identity/identicon"
|
"github.com/status-im/status-go/protocol/identity/identicon"
|
||||||
protocol "github.com/status-im/status-go/protocol/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -58,7 +58,7 @@ type Contact struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Contact) PublicKey() (*ecdsa.PublicKey, error) {
|
func (c Contact) PublicKey() (*ecdsa.PublicKey, error) {
|
||||||
b, err := protocol.DecodeHex(c.ID)
|
b, err := types.DecodeHex(c.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package peer
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
|
|
||||||
"github.com/vacp2p/mvds/state"
|
"github.com/vacp2p/mvds/state"
|
||||||
)
|
)
|
||||||
|
|
|
@ -2,7 +2,7 @@ package datasync
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
"github.com/vacp2p/mvds/state"
|
"github.com/vacp2p/mvds/state"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
|
|
||||||
"github.com/status-im/status-go/protocol/sqlite"
|
"github.com/status-im/status-go/protocol/sqlite"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
|
|
||||||
"github.com/status-im/status-go/protocol/sqlite"
|
"github.com/status-im/status-go/protocol/sqlite"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
||||||
|
|
|
@ -8,12 +8,11 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
ecrypto "github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/ethereum/go-ethereum/crypto/ecies"
|
|
||||||
dr "github.com/status-im/doubleratchet"
|
dr "github.com/status-im/doubleratchet"
|
||||||
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
|
"github.com/status-im/status-go/eth-node/crypto/ecies"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
||||||
"github.com/status-im/status-go/protocol/crypto"
|
|
||||||
"github.com/status-im/status-go/protocol/encryption/multidevice"
|
"github.com/status-im/status-go/protocol/encryption/multidevice"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -144,7 +143,7 @@ func (s *encryptor) ConfirmMessageProcessed(messageID []byte) error {
|
||||||
|
|
||||||
// CreateBundle retrieves or creates an X3DH bundle given a private key
|
// CreateBundle retrieves or creates an X3DH bundle given a private key
|
||||||
func (s *encryptor) CreateBundle(privateKey *ecdsa.PrivateKey, installations []*multidevice.Installation) (*Bundle, error) {
|
func (s *encryptor) CreateBundle(privateKey *ecdsa.PrivateKey, installations []*multidevice.Installation) (*Bundle, error) {
|
||||||
ourIdentityKeyC := ecrypto.CompressPubkey(&privateKey.PublicKey)
|
ourIdentityKeyC := crypto.CompressPubkey(&privateKey.PublicKey)
|
||||||
|
|
||||||
bundleContainer, err := s.persistence.GetAnyPrivateBundle(ourIdentityKeyC, installations)
|
bundleContainer, err := s.persistence.GetAnyPrivateBundle(ourIdentityKeyC, installations)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -208,7 +207,7 @@ func (s *encryptor) keyFromPassiveX3DH(myIdentityKey *ecdsa.PrivateKey, theirIde
|
||||||
return nil, errSessionNotFound
|
return nil, errSessionNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
signedPreKey, err := ecrypto.ToECDSA(bundlePrivateKey)
|
signedPreKey, err := crypto.ToECDSA(bundlePrivateKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Error("could not convert to ecdsa", zap.Error(err))
|
s.logger.Error("could not convert to ecdsa", zap.Error(err))
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -253,7 +252,7 @@ func (s *encryptor) DecryptPayload(myIdentityKey *ecdsa.PrivateKey, theirIdentit
|
||||||
|
|
||||||
if x3dhHeader := msg.GetX3DHHeader(); x3dhHeader != nil {
|
if x3dhHeader := msg.GetX3DHHeader(); x3dhHeader != nil {
|
||||||
bundleID := x3dhHeader.GetId()
|
bundleID := x3dhHeader.GetId()
|
||||||
theirEphemeralKey, err := ecrypto.DecompressPubkey(x3dhHeader.GetKey())
|
theirEphemeralKey, err := crypto.DecompressPubkey(x3dhHeader.GetKey())
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -264,7 +263,7 @@ func (s *encryptor) DecryptPayload(myIdentityKey *ecdsa.PrivateKey, theirIdentit
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
theirIdentityKeyC := ecrypto.CompressPubkey(theirIdentityKey)
|
theirIdentityKeyC := crypto.CompressPubkey(theirIdentityKey)
|
||||||
err = s.persistence.AddRatchetInfo(symmetricKey, theirIdentityKeyC, bundleID, nil, theirInstallationID)
|
err = s.persistence.AddRatchetInfo(symmetricKey, theirIdentityKeyC, bundleID, nil, theirInstallationID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -281,7 +280,7 @@ func (s *encryptor) DecryptPayload(myIdentityKey *ecdsa.PrivateKey, theirIdentit
|
||||||
Ciphertext: msg.GetPayload(),
|
Ciphertext: msg.GetPayload(),
|
||||||
}
|
}
|
||||||
|
|
||||||
theirIdentityKeyC := ecrypto.CompressPubkey(theirIdentityKey)
|
theirIdentityKeyC := crypto.CompressPubkey(theirIdentityKey)
|
||||||
|
|
||||||
drInfo, err := s.persistence.GetRatchetInfo(drHeader.GetId(), theirIdentityKeyC, theirInstallationID)
|
drInfo, err := s.persistence.GetRatchetInfo(drHeader.GetId(), theirIdentityKeyC, theirInstallationID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -311,7 +310,7 @@ func (s *encryptor) DecryptPayload(myIdentityKey *ecdsa.PrivateKey, theirIdentit
|
||||||
|
|
||||||
// Try DH
|
// Try DH
|
||||||
if header := msg.GetDHHeader(); header != nil {
|
if header := msg.GetDHHeader(); header != nil {
|
||||||
decompressedKey, err := ecrypto.DecompressPubkey(header.GetKey())
|
decompressedKey, err := crypto.DecompressPubkey(header.GetKey())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -435,7 +434,7 @@ func (s *encryptor) encryptWithDH(theirIdentityKey *ecdsa.PublicKey, payload []b
|
||||||
|
|
||||||
return &DirectMessageProtocol{
|
return &DirectMessageProtocol{
|
||||||
DHHeader: &DHHeader{
|
DHHeader: &DHHeader{
|
||||||
Key: ecrypto.CompressPubkey(ourEphemeralKey),
|
Key: crypto.CompressPubkey(ourEphemeralKey),
|
||||||
},
|
},
|
||||||
Payload: encryptedPayload,
|
Payload: encryptedPayload,
|
||||||
}, nil
|
}, nil
|
||||||
|
@ -461,7 +460,7 @@ func (s *encryptor) GetPublicBundle(theirIdentityKey *ecdsa.PublicKey, installat
|
||||||
func (s *encryptor) EncryptPayload(theirIdentityKey *ecdsa.PublicKey, myIdentityKey *ecdsa.PrivateKey, installations []*multidevice.Installation, payload []byte) (map[string]*DirectMessageProtocol, []*multidevice.Installation, error) {
|
func (s *encryptor) EncryptPayload(theirIdentityKey *ecdsa.PublicKey, myIdentityKey *ecdsa.PrivateKey, installations []*multidevice.Installation, payload []byte) (map[string]*DirectMessageProtocol, []*multidevice.Installation, error) {
|
||||||
logger := s.logger.With(
|
logger := s.logger.With(
|
||||||
zap.String("site", "EncryptPayload"),
|
zap.String("site", "EncryptPayload"),
|
||||||
zap.Binary("their-identity-key", ecrypto.FromECDSAPub(theirIdentityKey)))
|
zap.Binary("their-identity-key", crypto.FromECDSAPub(theirIdentityKey)))
|
||||||
|
|
||||||
logger.Debug("encrypting payload")
|
logger.Debug("encrypting payload")
|
||||||
// Which installations we are sending the message to
|
// Which installations we are sending the message to
|
||||||
|
@ -477,7 +476,7 @@ func (s *encryptor) EncryptPayload(theirIdentityKey *ecdsa.PublicKey, myIdentity
|
||||||
return encryptedPayload, targetedInstallations, err
|
return encryptedPayload, targetedInstallations, err
|
||||||
}
|
}
|
||||||
|
|
||||||
theirIdentityKeyC := ecrypto.CompressPubkey(theirIdentityKey)
|
theirIdentityKeyC := crypto.CompressPubkey(theirIdentityKey)
|
||||||
response := make(map[string]*DirectMessageProtocol)
|
response := make(map[string]*DirectMessageProtocol)
|
||||||
|
|
||||||
for _, installation := range installations {
|
for _, installation := range installations {
|
||||||
|
@ -541,8 +540,8 @@ func (s *encryptor) EncryptPayload(theirIdentityKey *ecdsa.PublicKey, myIdentity
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
theirIdentityKeyC := ecrypto.CompressPubkey(theirIdentityKey)
|
theirIdentityKeyC := crypto.CompressPubkey(theirIdentityKey)
|
||||||
ourEphemeralKeyC := ecrypto.CompressPubkey(ourEphemeralKey)
|
ourEphemeralKeyC := crypto.CompressPubkey(ourEphemeralKey)
|
||||||
|
|
||||||
err = s.persistence.AddRatchetInfo(sharedKey, theirIdentityKeyC, theirSignedPreKey, ourEphemeralKeyC, installationID)
|
err = s.persistence.AddRatchetInfo(sharedKey, theirIdentityKeyC, theirSignedPreKey, ourEphemeralKeyC, installationID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -592,23 +592,23 @@ type bintree struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
var _bintree = &bintree{nil, map[string]*bintree{
|
var _bintree = &bintree{nil, map[string]*bintree{
|
||||||
"1536754952_initial_schema.down.sql": {_1536754952_initial_schemaDownSql, map[string]*bintree{}},
|
"1536754952_initial_schema.down.sql": &bintree{_1536754952_initial_schemaDownSql, map[string]*bintree{}},
|
||||||
"1536754952_initial_schema.up.sql": {_1536754952_initial_schemaUpSql, map[string]*bintree{}},
|
"1536754952_initial_schema.up.sql": &bintree{_1536754952_initial_schemaUpSql, map[string]*bintree{}},
|
||||||
"1539249977_update_ratchet_info.down.sql": {_1539249977_update_ratchet_infoDownSql, map[string]*bintree{}},
|
"1539249977_update_ratchet_info.down.sql": &bintree{_1539249977_update_ratchet_infoDownSql, map[string]*bintree{}},
|
||||||
"1539249977_update_ratchet_info.up.sql": {_1539249977_update_ratchet_infoUpSql, map[string]*bintree{}},
|
"1539249977_update_ratchet_info.up.sql": &bintree{_1539249977_update_ratchet_infoUpSql, map[string]*bintree{}},
|
||||||
"1540715431_add_version.down.sql": {_1540715431_add_versionDownSql, map[string]*bintree{}},
|
"1540715431_add_version.down.sql": &bintree{_1540715431_add_versionDownSql, map[string]*bintree{}},
|
||||||
"1540715431_add_version.up.sql": {_1540715431_add_versionUpSql, map[string]*bintree{}},
|
"1540715431_add_version.up.sql": &bintree{_1540715431_add_versionUpSql, map[string]*bintree{}},
|
||||||
"1541164797_add_installations.down.sql": {_1541164797_add_installationsDownSql, map[string]*bintree{}},
|
"1541164797_add_installations.down.sql": &bintree{_1541164797_add_installationsDownSql, map[string]*bintree{}},
|
||||||
"1541164797_add_installations.up.sql": {_1541164797_add_installationsUpSql, map[string]*bintree{}},
|
"1541164797_add_installations.up.sql": &bintree{_1541164797_add_installationsUpSql, map[string]*bintree{}},
|
||||||
"1558084410_add_secret.down.sql": {_1558084410_add_secretDownSql, map[string]*bintree{}},
|
"1558084410_add_secret.down.sql": &bintree{_1558084410_add_secretDownSql, map[string]*bintree{}},
|
||||||
"1558084410_add_secret.up.sql": {_1558084410_add_secretUpSql, map[string]*bintree{}},
|
"1558084410_add_secret.up.sql": &bintree{_1558084410_add_secretUpSql, map[string]*bintree{}},
|
||||||
"1558588866_add_version.down.sql": {_1558588866_add_versionDownSql, map[string]*bintree{}},
|
"1558588866_add_version.down.sql": &bintree{_1558588866_add_versionDownSql, map[string]*bintree{}},
|
||||||
"1558588866_add_version.up.sql": {_1558588866_add_versionUpSql, map[string]*bintree{}},
|
"1558588866_add_version.up.sql": &bintree{_1558588866_add_versionUpSql, map[string]*bintree{}},
|
||||||
"1559627659_add_contact_code.down.sql": {_1559627659_add_contact_codeDownSql, map[string]*bintree{}},
|
"1559627659_add_contact_code.down.sql": &bintree{_1559627659_add_contact_codeDownSql, map[string]*bintree{}},
|
||||||
"1559627659_add_contact_code.up.sql": {_1559627659_add_contact_codeUpSql, map[string]*bintree{}},
|
"1559627659_add_contact_code.up.sql": &bintree{_1559627659_add_contact_codeUpSql, map[string]*bintree{}},
|
||||||
"1561368210_add_installation_metadata.down.sql": {_1561368210_add_installation_metadataDownSql, map[string]*bintree{}},
|
"1561368210_add_installation_metadata.down.sql": &bintree{_1561368210_add_installation_metadataDownSql, map[string]*bintree{}},
|
||||||
"1561368210_add_installation_metadata.up.sql": {_1561368210_add_installation_metadataUpSql, map[string]*bintree{}},
|
"1561368210_add_installation_metadata.up.sql": &bintree{_1561368210_add_installation_metadataUpSql, map[string]*bintree{}},
|
||||||
"doc.go": {docGo, map[string]*bintree{}},
|
"doc.go": &bintree{docGo, map[string]*bintree{}},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
// RestoreAsset restores an asset under the given directory.
|
// RestoreAsset restores an asset under the given directory.
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
)
|
)
|
||||||
|
|
||||||
type InstallationMetadata struct {
|
type InstallationMetadata struct {
|
||||||
|
|
|
@ -5,10 +5,9 @@ import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
dr "github.com/status-im/doubleratchet"
|
dr "github.com/status-im/doubleratchet"
|
||||||
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
|
|
||||||
ecrypto "github.com/status-im/status-go/protocol/crypto"
|
|
||||||
"github.com/status-im/status-go/protocol/encryption/multidevice"
|
"github.com/status-im/status-go/protocol/encryption/multidevice"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -709,7 +708,7 @@ func (s *sqliteSessionStorage) Load(id []byte) (*dr.State, error) {
|
||||||
state.Step = step
|
state.Step = step
|
||||||
state.KeysCount = keysCount
|
state.KeysCount = keysCount
|
||||||
|
|
||||||
state.DHs = ecrypto.DHPair{
|
state.DHs = crypto.DHPair{
|
||||||
PrvKey: dhsPrivate,
|
PrvKey: dhsPrivate,
|
||||||
PubKey: dhsPublic,
|
PubKey: dhsPublic,
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
|
|
||||||
"github.com/status-im/status-go/protocol/encryption/multidevice"
|
"github.com/status-im/status-go/protocol/encryption/multidevice"
|
||||||
|
|
|
@ -8,9 +8,10 @@ import (
|
||||||
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
|
|
||||||
"github.com/status-im/status-go/protocol/encryption/multidevice"
|
"github.com/status-im/status-go/protocol/encryption/multidevice"
|
||||||
"github.com/status-im/status-go/protocol/encryption/publisher"
|
"github.com/status-im/status-go/protocol/encryption/publisher"
|
||||||
"github.com/status-im/status-go/protocol/encryption/sharedsecret"
|
"github.com/status-im/status-go/protocol/encryption/sharedsecret"
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
|
|
||||||
"github.com/status-im/status-go/protocol/sqlite"
|
"github.com/status-im/status-go/protocol/sqlite"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ import (
|
||||||
|
|
||||||
"github.com/status-im/status-go/protocol/tt"
|
"github.com/status-im/status-go/protocol/tt"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
"github.com/status-im/status-go/protocol/sqlite"
|
"github.com/status-im/status-go/protocol/sqlite"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
|
@ -6,8 +6,8 @@ import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
"github.com/ethereum/go-ethereum/crypto/ecies"
|
"github.com/status-im/status-go/eth-node/crypto/ecies"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue