Skip to content

Commit

Permalink
Merge branch 'develop' into feature/175208444/P2P-key-list
Browse files Browse the repository at this point in the history
  • Loading branch information
rupurt authored Oct 31, 2020
2 parents ef81b91 + 175f4b7 commit 6eb9509
Show file tree
Hide file tree
Showing 37 changed files with 243 additions and 293 deletions.
10 changes: 5 additions & 5 deletions core/cmd/local_client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ func TestClient_ImportKey(t *testing.T) {
}

sort.Strings(addresses)
expectation := []string{"0x3cb8e3FD9d27e39a5e9e6852b0e96160061fd4ea", "0x7fc66c61f88A61DFB670627cA715Fe808057123e"}
expectation := []string{cltest.DefaultKey, "0x7fc66c61f88A61DFB670627cA715Fe808057123e"}
require.Equal(t, expectation, addresses)
}

Expand Down Expand Up @@ -360,7 +360,7 @@ func TestClient_RebroadcastTransactions_BPTXM(t *testing.T) {
set.Uint("endingNonce", endingNonce, "")
set.Uint64("gasPriceWei", gasPrice.Uint64(), "")
set.Uint64("gasLimit", gasLimit, "")
set.String("address", "0x3cb8e3FD9d27e39a5e9e6852b0e96160061fd4ea", "")
set.String("address", cltest.DefaultKey, "")
c := cli.NewContext(nil, set, nil)

// {"range_start", beginningNonce},
Expand Down Expand Up @@ -431,7 +431,7 @@ func TestClient_RebroadcastTransactions_WithinRange(t *testing.T) {
set.Uint("endingNonce", endingNonce, "")
set.Uint64("gasPriceWei", gasPrice.Uint64(), "")
set.Uint64("gasLimit", gasLimit, "")
set.String("address", "0x3cb8e3FD9d27e39a5e9e6852b0e96160061fd4ea", "")
set.String("address", cltest.DefaultKey, "")
c := cli.NewContext(nil, set, nil)

tests := []struct {
Expand Down Expand Up @@ -521,7 +521,7 @@ func TestClient_RebroadcastTransactions_OutsideRange_LegacyTxManager(t *testing.
set.Uint("endingNonce", endingNonce, "")
set.Uint64("gasPriceWei", gasPrice.Uint64(), "")
set.Uint64("gasLimit", gasLimit, "")
set.String("address", "0x3cb8e3FD9d27e39a5e9e6852b0e96160061fd4ea", "")
set.String("address", cltest.DefaultKey, "")
c := cli.NewContext(nil, set, nil)

tests := []struct {
Expand Down Expand Up @@ -591,7 +591,7 @@ func TestClient_RebroadcastTransactions_OutsideRange_BPTXM(t *testing.T) {
set.Uint("endingNonce", endingNonce, "")
set.Uint64("gasPriceWei", gasPrice.Uint64(), "")
set.Uint64("gasLimit", gasLimit, "")
set.String("address", "0x3cb8e3FD9d27e39a5e9e6852b0e96160061fd4ea", "")
set.String("address", cltest.DefaultKey, "")
c := cli.NewContext(nil, set, nil)

tests := []struct {
Expand Down
5 changes: 3 additions & 2 deletions core/cmd/remote_client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/smartcontractkit/chainlink/core/store/models/ocrkey"
"github.com/smartcontractkit/chainlink/core/store/models/p2pkey"
"github.com/smartcontractkit/chainlink/core/store/presenters"
"github.com/smartcontractkit/chainlink/core/utils"

"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/common"
Expand Down Expand Up @@ -1041,7 +1042,7 @@ func TestClient_P2P_DeleteKey(t *testing.T) {

key, err := p2pkey.CreateKey()
require.NoError(t, err)
encKey, err := key.ToEncryptedP2PKey(cltest.Password)
encKey, err := key.ToEncryptedP2PKey(cltest.Password, utils.FastScryptParams)
require.NoError(t, err)
err = app.Store.OCRKeyStore.UpsertEncryptedP2PKey(&encKey)
require.NoError(t, err)
Expand Down Expand Up @@ -1117,7 +1118,7 @@ func TestClient_DeleteOCRKeyBundle(t *testing.T) {

key, err := ocrkey.NewKeyBundle()
require.NoError(t, err)
encKey, err := key.Encrypt(cltest.Password)
encKey, err := key.Encrypt(cltest.Password, utils.FastScryptParams)
require.NoError(t, err)
err = app.Store.OCRKeyStore.CreateEncryptedOCRKeyBundle(encKey)
require.NoError(t, err)
Expand Down
2 changes: 1 addition & 1 deletion core/cmd/testdata/hello_world_agreement.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
],
"payment": "1000000000000000000",
"expiration": 300,
"oracles": ["0x3cb8e3FD9d27e39a5e9e6852b0e96160061fd4ea", "0xa0788FC17B1dEe36f057c42B6F373A34B014687e"],
"oracles": ["0x27548a32b9aD5D64c5945EaE9Da5337bc3169D15", "0xa0788FC17B1dEe36f057c42B6F373A34B014687e"],
"endAt": "2019-10-19T22:17:19Z",
"aggregator": "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF",
"aggInitiateJobSelector": "0xd0771e55",
Expand Down
58 changes: 21 additions & 37 deletions core/internal/cltest/cltest.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"testing"
"time"

p2ppeer "github.com/libp2p/go-libp2p-core/peer"
"github.com/smartcontractkit/chainlink/core/assets"
"github.com/smartcontractkit/chainlink/core/auth"
"github.com/smartcontractkit/chainlink/core/cmd"
Expand All @@ -34,8 +35,6 @@ import (
"github.com/smartcontractkit/chainlink/core/services/postgres"
strpkg "github.com/smartcontractkit/chainlink/core/store"
"github.com/smartcontractkit/chainlink/core/store/models"
"github.com/smartcontractkit/chainlink/core/store/models/ocrkey"
"github.com/smartcontractkit/chainlink/core/store/models/p2pkey"
"github.com/smartcontractkit/chainlink/core/store/orm"
"github.com/smartcontractkit/chainlink/core/store/presenters"
"github.com/smartcontractkit/chainlink/core/utils"
Expand All @@ -53,7 +52,6 @@ import (
"github.com/gorilla/sessions"
"github.com/gorilla/websocket"
"github.com/jinzhu/gorm"
cryptop2p "github.com/libp2p/go-libp2p-core/crypto"
"github.com/manyminds/api2go/jsonapi"
"github.com/onsi/gomega"
"github.com/stretchr/testify/assert"
Expand All @@ -77,26 +75,27 @@ const (
// SessionSecret is the hardcoded secret solely used for test
SessionSecret = "clsession_test_secret"
// DefaultKey is the address of the fixture key
DefaultKey = "0x3cb8e3FD9d27e39a5e9e6852b0e96160061fd4ea"
DefaultKey = "0x27548a32b9aD5D64c5945EaE9Da5337bc3169D15"
// DefaultKeyFixtureFileName is the filename of the fixture key
DefaultKeyFixtureFileName = "testkey-27548a32b9aD5D64c5945EaE9Da5337bc3169D15.json"
// AllowUnstarted enable an application that can be used in tests without being started
AllowUnstarted = "allow_unstarted"
// DefaultPeerID is the peer ID of the fixture p2p key
DefaultPeerID = "12D3KooWCJUPKsYAnCRTQ7SUNULt4Z9qF8Uk1xadhCs7e9M711Lp"
// DefaultOCRKeyBundleID is the ID of the fixture ocr key bundle
DefaultOCRKeyBundleID = "54f02f2756952ee42874182c8a03d51f048b7fc245c05196af50f9266f8e444a"
// DefaultKeyJSON is the JSON for the default key encrypted with fast scrypt and password 'password'
DefaultKeyJSON = `{"id": "1ccf542e-8f4d-48a0-ad1d-b4e6a86d4c6d", "crypto": {"kdf": "scrypt", "mac": "7f31bd05768a184278c4e9f077bcfba7b2003fed585b99301374a1a4a9adff25", "cipher": "aes-128-ctr", "kdfparams": {"n": 2, "p": 1, "r": 8, "salt": "99e83bf0fdeba39bd29c343db9c52d9e0eae536fdaee472d3181eac1968aa1f9", "dklen": 32}, "ciphertext": "ac22fa788b53a5f62abda03cd432c7aee1f70053b97633e78f93709c383b2a46", "cipherparams": {"iv": "6699ba30f953728787e51a754d6f9566"}}, "address": "27548a32b9ad5d64c5945eae9da5337bc3169d15", "version": 3}`
)

var (
// DefaultKeyAddress is the address of the fixture key
DefaultKeyAddress = common.HexToAddress(DefaultKey)
DefaultKeyAddressEIP55 models.EIP55Address

// DefaultP2PPeerID is the fixture p2p key
DefaultP2PKey *p2pkey.Key
// DefaultP2PPeerID is the peer ID of the fixture p2p key
DefaultP2PPeerID models.PeerID
// DefaultP2PPeerID is the fixture p2p key, encrypted with `cltest.Password`
DefaultEncryptedP2PKey *p2pkey.EncryptedP2PKey
// DefaultOCRKeyBundleIDSha256 is the fixture ocr key bundle
DefaultOCRKeyBundle *ocrkey.KeyBundle
// DefaultOCRKeyBundleIDSha256 is the fixture ocr key bundle, encrypted with `cltest.Password`
DefaultEncryptedOCRKeyBundle *ocrkey.EncryptedKeyBundle
DefaultKeyAddress = common.HexToAddress(DefaultKey)
DefaultKeyAddressDowncased = strings.ToLower(DefaultKey)
DefaultKeyAddressEIP55 models.EIP55Address
DefaultP2PPeerID p2ppeer.ID
// DefaultOCRKeyBundleIDSha256 is the ID of the fixture ocr key bundle
DefaultOCRKeyBundleIDSha256 models.Sha256Hash
)

var storeCounter uint64
Expand Down Expand Up @@ -136,36 +135,19 @@ func init() {
logger.Debugf("Using seed: %v", seed)
rand.Seed(seed)

p2pPrivkey, _, err := cryptop2p.GenerateEd25519Key(bytes.NewBufferString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"))
DefaultP2PPeerID, err = p2ppeer.Decode(DefaultPeerID)
if err != nil {
panic(err)
}
DefaultP2PKey = &p2pkey.Key{PrivKey: p2pPrivkey}
DefaultP2PPeerID, err = DefaultP2PKey.GetPeerID()
if err != nil {
panic(err)
}
encp2pkey, err := DefaultP2PKey.ToEncryptedP2PKey(Password)
if err != nil {
panic(err)
}
DefaultEncryptedP2PKey = &encp2pkey
DefaultOCRKeyBundle, err = ocrkey.NewKeyBundleFrom(
bytes.NewBufferString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"),
bytes.NewBufferString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"),
bytes.NewBufferString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"),
)
DefaultOCRKeyBundleIDSha256, err = models.Sha256HashFromHex(DefaultOCRKeyBundleID)
if err != nil {
panic(err)
}

DefaultKeyAddressEIP55, err = models.NewEIP55Address(DefaultKey)
if err != nil {
panic(err)
}
DefaultEncryptedOCRKeyBundle, err = DefaultOCRKeyBundle.Encrypt(Password)
if err != nil {
panic(err)
}
}

func logLevelFromEnv() zapcore.Level {
Expand Down Expand Up @@ -241,6 +223,8 @@ func NewTestConfig(t testing.TB, options ...interface{}) *TestConfig {
rawConfig.Set("MINIMUM_CONTRACT_PAYMENT", minimumContractPayment.Text(10))
rawConfig.Set("ROOT", rootdir)
rawConfig.Set("SESSION_TIMEOUT", "2m")
rawConfig.Set("INSECURE_FAST_SCRYPT", "true")
rawConfig.Set("BALANCE_MONITOR_ENABLED", "false")
rawConfig.SecretGenerator = mockSecretGenerator{}
config := TestConfig{t: t, Config: rawConfig}
return &config
Expand Down
67 changes: 2 additions & 65 deletions core/internal/cltest/factories.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,13 @@ import (
"github.com/smartcontractkit/chainlink/core/internal/mocks"
"github.com/smartcontractkit/chainlink/core/logger"
"github.com/smartcontractkit/chainlink/core/services/fluxmonitor"
"github.com/smartcontractkit/chainlink/core/services/offchainreporting"
strpkg "github.com/smartcontractkit/chainlink/core/store"
"github.com/smartcontractkit/chainlink/core/store/models"
"github.com/smartcontractkit/chainlink/core/store/models/ocrkey"
"github.com/smartcontractkit/chainlink/core/store/models/p2pkey"
"github.com/smartcontractkit/chainlink/core/utils"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types"
"github.com/jinzhu/gorm"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/tidwall/gjson"
Expand Down Expand Up @@ -828,74 +824,15 @@ func MustInsertRandomKey(t *testing.T, store *strpkg.Store) models.Key {
return k
}

func MustInsertOffchainreportingKeys(t *testing.T, db *gorm.DB, dependencies ...interface{}) (
*offchainreporting.KeyStore,
models.PeerID,
*p2pkey.Key,
*ocrkey.KeyBundle,
*p2pkey.EncryptedP2PKey,
*ocrkey.EncryptedKeyBundle,
) {
t.Helper()

keystore := offchainreporting.NewKeyStore(db)
require.NoError(t, keystore.Unlock(Password))

var peerID models.PeerID
var p2pKey *p2pkey.EncryptedP2PKey
var ocrKey *ocrkey.EncryptedKeyBundle
var decryptedp2pkey *p2pkey.Key
var decryptedocrkey *ocrkey.KeyBundle
for _, dep := range dependencies {
switch d := dep.(type) {
case *p2pkey.EncryptedP2PKey:
p2pKey = d
case p2pkey.EncryptedP2PKey:
p2pKey = &d
case *ocrkey.EncryptedKeyBundle:
ocrKey = d
case ocrkey.EncryptedKeyBundle:
ocrKey = &d
default:
t.Fatalf("cltest.MustInsertOffchainreportingOracleSpec does not accept a %T as an injected dependency", dep)
}
}
if p2pKey == nil {
dk, p2pKey_, err := keystore.GenerateEncryptedP2PKey()
require.NoError(t, err)
p2pKey = &p2pKey_
peerID, err = dk.GetPeerID()
require.NoError(t, err)
} else {
err := keystore.UpsertEncryptedP2PKey(p2pKey)
require.NoError(t, err)
dk, err := p2pKey.Decrypt(Password)
require.NoError(t, err)
peerID, err = dk.GetPeerID()
require.NoError(t, err)
}
if ocrKey == nil {
_, ocrKey_, err := keystore.GenerateEncryptedOCRKeyBundle()
require.NoError(t, err)
ocrKey = &ocrKey_
} else {
err := keystore.CreateEncryptedOCRKeyBundle(ocrKey)
require.NoError(t, err)
}
return keystore, peerID, decryptedp2pkey, decryptedocrkey, p2pKey, ocrKey
}

func MustInsertOffchainreportingOracleSpec(t *testing.T, store *strpkg.Store, dependencies ...interface{}) models.OffchainReportingOracleSpec {
t.Helper()

_, peerID, _, _, _, ocrKey := MustInsertOffchainreportingKeys(t, store.DB, dependencies...)

spec := models.OffchainReportingOracleSpec{
ContractAddress: NewEIP55Address(),
P2PPeerID: peerID,
P2PPeerID: models.PeerID(DefaultP2PPeerID),
P2PBootstrapPeers: []string{},
IsBootstrapPeer: false,
EncryptedOCRKeyBundleID: ocrKey.ID,
EncryptedOCRKeyBundleID: DefaultOCRKeyBundleIDSha256,
TransmitterAddress: DefaultKeyAddressEIP55,
ObservationTimeout: 0,
BlockchainTimeout: 0,
Expand Down
5 changes: 0 additions & 5 deletions core/internal/cltest/fixtures.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,6 @@ import (
"github.com/tidwall/gjson"
)

const (
// Key3cb8e3fd9d27e39a5e9e6852b0e96160061fd4ea is a valid ethereum key encrypted with the password: 'password'
Key3cb8e3fd9d27e39a5e9e6852b0e96160061fd4ea = `{"address":"3cb8e3fd9d27e39a5e9e6852b0e96160061fd4ea","crypto":{"cipher":"aes-128-ctr","ciphertext":"7515678239ccbeeaaaf0b103f0fba46a979bf6b2a52260015f35b9eb5fed5c17","cipherparams":{"iv":"87e5a5db334305e1e4fb8b3538ceea12"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"d89ac837b5dcdce5690af764762fe349d8162bb0086cea2bc3a4289c47853f96"},"mac":"57a7f4ada10d3d89644f541c91f89b5bde73e15e827ee40565e2d1f88bb0ac96"},"id":"c8cb9bc7-0a51-43bd-8348-8a67fd1ec52c","version":3}`
)

// MustHelloWorldAgreement returns the fixture hello world agreement
func MustHelloWorldAgreement(t *testing.T) string {
template := MustReadFile(t, "testdata/hello_world_agreement.json")
Expand Down
16 changes: 4 additions & 12 deletions core/internal/cltest/transactor.go
Original file line number Diff line number Diff line change
@@ -1,26 +1,18 @@
package cltest

import (
"crypto/ecdsa"

"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/accounts/keystore"
)

// OracleTransactor representsthe identity of the oracle address used in cltest
// OracleTransactor represents the identity of the oracle address used in cltest
var OracleTransactor *bind.TransactOpts
var privateKey3cb8e3fd9d27e39a5e9e6852b0e96160061fd4ea *ecdsa.PrivateKey

func init() {
var err error
privateKey3cb8e3fd9d27e39a5e9e6852b0e96160061fd4ea, err =
crypto.HexToECDSA(
// Extracted from (to abuse notation) keystore.DecryptKey(
// []byte(key3cb8e3fd9d27e39a5e9e6852b0e96160061fd4ea), "password").D
"40052315eab136be2379e23d4c7290e74a6212a018a13b1eafae4152df5d4daa")
k, err := keystore.DecryptKey([]byte(DefaultKeyJSON), "password")
if err != nil {
panic(err)
}
OracleTransactor = bind.NewKeyedTransactor(
privateKey3cb8e3fd9d27e39a5e9e6852b0e96160061fd4ea)
OracleTransactor = bind.NewKeyedTransactor(k.PrivateKey)
}
21 changes: 13 additions & 8 deletions core/internal/features_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -669,21 +669,20 @@ func TestIntegration_NonceManagement_firstRunWithExistingTxs(t *testing.T) {
eth.Context("app.Start()", func(eth *cltest.EthMock) {
eth.RegisterSubscription("newHeads", newHeads)
eth.Register("eth_getTransactionCount", `0x100`) // activate account nonce
eth.Register("eth_getBalance", "0x100000")
})
require.NoError(t, app.Store.ORM.IdempotentInsertHead(*cltest.Head(100)))
require.NoError(t, app.StartAndConnect())

j := cltest.FixtureCreateJobViaWeb(t, app, "fixtures/web/web_initiated_eth_tx_job.json")
hash := common.HexToHash("0xb7862c896a6ba2711bccc0410184e46d793ea83b3e05470f1d359ea276d16bb5")
hash1 := common.HexToHash("0x34c4fbd25473129a88d5a835a11a293f09941c0a198fbbb26a6b0521181ac08d")
blockNumber := int64(100 - app.Store.Config.MinRequiredOutgoingConfirmations())

eth.Context("ethTx.Perform()", func(eth *cltest.EthMock) {
eth.Register("eth_getTransactionReceipt", &types.Receipt{
TxHash: hash,
TxHash: hash1,
BlockNumber: big.NewInt(blockNumber),
})
eth.Register("eth_sendRawTransaction", hash)
eth.Register("eth_sendRawTransaction", hash1)
})

jr := cltest.CreateJobRunViaWeb(t, app, j, `{"result":"0x11"}`)
Expand All @@ -696,16 +695,22 @@ func TestIntegration_NonceManagement_firstRunWithExistingTxs(t *testing.T) {

eth.AssertAllCalled()

eth.Register("eth_getBalance", "0x100000")
newHeads <- cltest.Head(200)
eth.EventuallyAllCalled(t)
hash2 := common.HexToHash("0x0881908e6aac65c32e28d280e51033170aff97926d096a19b46cc9aa163b80cc")
hash3 := common.HexToHash("0x66c6936fd241ec3061133fa8add47fd340e8f1b29d13b3211108620a45970b04")

eth.Context("ethTx.Perform()", func(eth *cltest.EthMock) {
eth.Register("eth_getTransactionReceipt", &types.Receipt{
TxHash: hash,
TxHash: hash2,
BlockNumber: big.NewInt(blockNumber + 100),
})
eth.Register("eth_sendRawTransaction", hash)
eth.Register("eth_sendRawTransaction", hash2)
eth.Register("eth_getTransactionReceipt", &types.Receipt{
TxHash: hash3,
BlockNumber: big.NewInt(blockNumber + 100),
})
eth.Register("eth_sendRawTransaction", hash3)
})

jr = cltest.CreateJobRunViaWeb(t, app, j, `{"result":"0x11"}`)
Expand All @@ -714,7 +719,7 @@ func TestIntegration_NonceManagement_firstRunWithExistingTxs(t *testing.T) {
attempt = cltest.GetLastTxAttempt(t, app.Store)
tx, err = app.Store.FindTx(attempt.TxID)
assert.NoError(t, err)
assert.Equal(t, uint64(0x101), tx.Nonce)
assert.Equal(t, uint64(0x102), tx.Nonce)

eth.AssertAllCalled()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id": "1ccf542e-8f4d-48a0-ad1d-b4e6a86d4c6d", "crypto": {"kdf": "scrypt", "mac": "7f31bd05768a184278c4e9f077bcfba7b2003fed585b99301374a1a4a9adff25", "cipher": "aes-128-ctr", "kdfparams": {"n": 2, "p": 1, "r": 8, "salt": "99e83bf0fdeba39bd29c343db9c52d9e0eae536fdaee472d3181eac1968aa1f9", "dklen": 32}, "ciphertext": "ac22fa788b53a5f62abda03cd432c7aee1f70053b97633e78f93709c383b2a46", "cipherparams": {"iv": "6699ba30f953728787e51a754d6f9566"}}, "address": "27548a32b9ad5d64c5945eae9da5337bc3169d15", "version": 3}
Loading

0 comments on commit 6eb9509

Please sign in to comment.