mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-27 03:58:06 +00:00
Merge pull request #897 from nspcc-dev/feature/testchain
core,test: move helper functions for testchain to the internal package
This commit is contained in:
commit
be5389e8dd
4 changed files with 103 additions and 64 deletions
|
@ -14,6 +14,7 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
||||||
|
@ -216,35 +217,7 @@ func TestExport(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func getTestValidator(i int) (*privateKey, *publicKey) {
|
func getTestValidator(i int) (*privateKey, *publicKey) {
|
||||||
var wif, password string
|
key := testchain.PrivateKey(i)
|
||||||
|
|
||||||
// Sorted by public key.
|
|
||||||
switch i {
|
|
||||||
case 0:
|
|
||||||
wif = "6PYXPEFeBxeDjqMiwRrSe81LnpL1cpw1WSwENJY1p4NtgSbfZPaUFy8Kkg"
|
|
||||||
password = "two"
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
wif = "6PYWscJHQ76uctwuM7GRcAp6xfGjdYDKnbMtMnT6hcXxcNn7CywbQmvfSy"
|
|
||||||
password = "four"
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
wif = "6PYKYQKRs758NBX4q5k6fSmduZDfEfQyoXMovQU5myKm2h5ArXuYpuMEaN"
|
|
||||||
password = "one"
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
wif = "6PYRHjZrvxYqrHLpXz1aP6dBnrFkkxQMCdYsJi7YDPoQnQddvRuTzKGxME"
|
|
||||||
password = "three"
|
|
||||||
|
|
||||||
default:
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
key, err := keys.NEP2Decrypt(wif, password)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return &privateKey{PrivateKey: key}, &publicKey{PublicKey: key.PublicKey()}
|
return &privateKey{PrivateKey: key}, &publicKey{PublicKey: key.PublicKey()}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,8 +242,7 @@ func (fs *feer) SystemFee(*transaction.Transaction) util.Fixed8 { return util.F
|
||||||
|
|
||||||
func addSender(t *testing.T, txs ...*transaction.Transaction) {
|
func addSender(t *testing.T, txs ...*transaction.Transaction) {
|
||||||
// multisig address which possess all NEO
|
// multisig address which possess all NEO
|
||||||
scriptHash, err := util.Uint160DecodeStringBE("d60ac443bb800fb08261e75fa5925d747d485861")
|
scriptHash := testchain.MultisigScriptHash()
|
||||||
require.NoError(t, err)
|
|
||||||
for _, tx := range txs {
|
for _, tx := range txs {
|
||||||
tx.Sender = scriptHash
|
tx.Sender = scriptHash
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
|
@ -27,15 +28,8 @@ import (
|
||||||
"go.uber.org/zap/zaptest"
|
"go.uber.org/zap/zaptest"
|
||||||
)
|
)
|
||||||
|
|
||||||
var privNetKeys = []string{
|
|
||||||
"KxyjQ8eUa4FHt3Gvioyt1Wz29cTUrE4eTqX3yFSk1YFCsPL8uNsY",
|
|
||||||
"KzfPUYDC9n2yf4fK5ro4C8KMcdeXtFuEnStycbZgX3GomiUsvX6W",
|
|
||||||
"KzgWE3u3EDp13XPXXuTKZxeJ3Gi8Bsm8f9ijY3ZsCKKRvZUo1Cdn",
|
|
||||||
"L2oEXKRAAMiPEZukwR5ho2S6SMeQLhcK9mF71ZnF7GvT8dU4Kkgz",
|
|
||||||
}
|
|
||||||
|
|
||||||
// multisig address which possess all NEO
|
// multisig address which possess all NEO
|
||||||
var neoOwner = "d60ac443bb800fb08261e75fa5925d747d485861"
|
var neoOwner = testchain.MultisigScriptHash().StringBE()
|
||||||
|
|
||||||
// newTestChain should be called before newBlock invocation to properly setup
|
// newTestChain should be called before newBlock invocation to properly setup
|
||||||
// global state.
|
// global state.
|
||||||
|
@ -78,11 +72,8 @@ func newBlock(cfg config.ProtocolConfiguration, index uint32, prev util.Uint256,
|
||||||
_ = b.RebuildMerkleRoot()
|
_ = b.RebuildMerkleRoot()
|
||||||
|
|
||||||
invScript := make([]byte, 0)
|
invScript := make([]byte, 0)
|
||||||
for _, wif := range privNetKeys {
|
for i := 0; i < testchain.Size(); i++ {
|
||||||
pKey, err := keys.NewPrivateKeyFromWIF(wif)
|
pKey := testchain.PrivateKey(i)
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
b := b.GetSignedPart()
|
b := b.GetSignedPart()
|
||||||
sig := pKey.Sign(b)
|
sig := pKey.Sign(b)
|
||||||
if len(sig) != 64 {
|
if len(sig) != 64 {
|
||||||
|
@ -224,8 +215,7 @@ func TestCreateBasicChain(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
txMoveNeo.Sender = scriptHash
|
txMoveNeo.Sender = scriptHash
|
||||||
|
|
||||||
priv0, err := keys.NewPrivateKeyFromWIF(privNetKeys[0])
|
priv0 := testchain.PrivateKeyByID(0)
|
||||||
require.NoError(t, err)
|
|
||||||
priv0ScriptHash := priv0.GetScriptHash()
|
priv0ScriptHash := priv0.GetScriptHash()
|
||||||
txMoveNeo.AddOutput(&transaction.Output{
|
txMoveNeo.AddOutput(&transaction.Output{
|
||||||
AssetID: GoverningTokenID(),
|
AssetID: GoverningTokenID(),
|
||||||
|
@ -375,8 +365,7 @@ func TestCreateBasicChain(t *testing.T) {
|
||||||
require.NoError(t, bc.AddBlock(b))
|
require.NoError(t, bc.AddBlock(b))
|
||||||
t.Logf("txInv: %s", txInv.Hash().StringLE())
|
t.Logf("txInv: %s", txInv.Hash().StringLE())
|
||||||
|
|
||||||
priv1, err := keys.NewPrivateKeyFromWIF(privNetKeys[1])
|
priv1 := testchain.PrivateKeyByID(1)
|
||||||
require.NoError(t, err)
|
|
||||||
txNeo0to1 := transaction.NewContractTX()
|
txNeo0to1 := transaction.NewContractTX()
|
||||||
txNeo0to1.Nonce = getNextNonce()
|
txNeo0to1.Nonce = getNextNonce()
|
||||||
txNeo0to1.ValidUntilBlock = validUntilBlock
|
txNeo0to1.ValidUntilBlock = validUntilBlock
|
||||||
|
@ -526,11 +515,8 @@ func signTx(bc *Blockchain, txs ...*transaction.Transaction) error {
|
||||||
data := tx.GetSignedPart()
|
data := tx.GetSignedPart()
|
||||||
|
|
||||||
var invoc []byte
|
var invoc []byte
|
||||||
for i := range privNetKeys {
|
for i := 0; i < testchain.Size(); i++ {
|
||||||
priv, err := keys.NewPrivateKeyFromWIF(privNetKeys[i])
|
priv := testchain.PrivateKey(i)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
invoc = append(invoc, getInvocationScript(data, priv)...)
|
invoc = append(invoc, getInvocationScript(data, priv)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
80
pkg/internal/testchain/address.go
Normal file
80
pkg/internal/testchain/address.go
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
package testchain
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
// privNetKeys is a list of unencrypted WIFs sorted by public key.
|
||||||
|
var privNetKeys = []string{
|
||||||
|
"KzfPUYDC9n2yf4fK5ro4C8KMcdeXtFuEnStycbZgX3GomiUsvX6W",
|
||||||
|
"KzgWE3u3EDp13XPXXuTKZxeJ3Gi8Bsm8f9ijY3ZsCKKRvZUo1Cdn",
|
||||||
|
"KxyjQ8eUa4FHt3Gvioyt1Wz29cTUrE4eTqX3yFSk1YFCsPL8uNsY",
|
||||||
|
"L2oEXKRAAMiPEZukwR5ho2S6SMeQLhcK9mF71ZnF7GvT8dU4Kkgz",
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
// ids maps validators order by public key sorting to validators ID.
|
||||||
|
// which is an order of the validator in the StandByValidators list.
|
||||||
|
ids = []int{1, 3, 0, 2}
|
||||||
|
// orders maps to validators id to it's order by public key sorting.
|
||||||
|
orders = []int{2, 0, 3, 1}
|
||||||
|
)
|
||||||
|
|
||||||
|
// Size returns testchain initial validators amount.
|
||||||
|
func Size() int {
|
||||||
|
return len(privNetKeys)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IDToOrder returns node's order in privnet.
|
||||||
|
func IDToOrder(id int) int {
|
||||||
|
return orders[id]
|
||||||
|
}
|
||||||
|
|
||||||
|
// WIF returns unencrypted wif of the specified validator.
|
||||||
|
func WIF(i int) string {
|
||||||
|
return privNetKeys[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
// PrivateKey returns private key of node #i.
|
||||||
|
func PrivateKey(i int) *keys.PrivateKey {
|
||||||
|
wif := WIF(i)
|
||||||
|
priv, err := keys.NewPrivateKeyFromWIF(wif)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return priv
|
||||||
|
}
|
||||||
|
|
||||||
|
// PrivateKeyByID returns private keys of a node with the specified id.
|
||||||
|
func PrivateKeyByID(id int) *keys.PrivateKey {
|
||||||
|
return PrivateKey(IDToOrder(id))
|
||||||
|
}
|
||||||
|
|
||||||
|
// MultisigVerificationScript returns script hash of the consensus multisig address.
|
||||||
|
func MultisigVerificationScript() []byte {
|
||||||
|
var pubs keys.PublicKeys
|
||||||
|
for i := range privNetKeys {
|
||||||
|
priv := PrivateKey(ids[i])
|
||||||
|
pubs = append(pubs, priv.PublicKey())
|
||||||
|
}
|
||||||
|
|
||||||
|
script, err := smartcontract.CreateMultiSigRedeemScript(3, pubs)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return script
|
||||||
|
}
|
||||||
|
|
||||||
|
// MultisigScriptHash returns consensus address as Uint160.
|
||||||
|
func MultisigScriptHash() util.Uint160 {
|
||||||
|
return hash.Hash160(MultisigVerificationScript())
|
||||||
|
}
|
||||||
|
|
||||||
|
// MultisigAddress return consensus address as string.
|
||||||
|
func MultisigAddress() string {
|
||||||
|
return address.Uint160ToString(MultisigScriptHash())
|
||||||
|
}
|
|
@ -17,6 +17,7 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/internal/testchain"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpc/response"
|
"github.com/nspcc-dev/neo-go/pkg/rpc/response"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpc/response/result"
|
"github.com/nspcc-dev/neo-go/pkg/rpc/response/result"
|
||||||
|
@ -86,7 +87,7 @@ var rpcTestCases = map[string][]rpcTestCase{
|
||||||
"getaccountstate": {
|
"getaccountstate": {
|
||||||
{
|
{
|
||||||
name: "positive",
|
name: "positive",
|
||||||
params: `["AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6"]`,
|
params: `["` + testchain.MultisigAddress() + `"]`,
|
||||||
result: func(e *executor) interface{} { return &result.AccountState{} },
|
result: func(e *executor) interface{} { return &result.AccountState{} },
|
||||||
check: func(t *testing.T, e *executor, acc interface{}) {
|
check: func(t *testing.T, e *executor, acc interface{}) {
|
||||||
res, ok := acc.(*result.AccountState)
|
res, ok := acc.(*result.AccountState)
|
||||||
|
@ -160,12 +161,12 @@ var rpcTestCases = map[string][]rpcTestCase{
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "positive",
|
name: "positive",
|
||||||
params: `["c4bba7ed4e624d038b844d6b6ff24518e7db0165"]`,
|
params: `["` + testchain.PrivateKeyByID(0).GetScriptHash().StringLE() + `"]`,
|
||||||
result: func(e *executor) interface{} { return &result.NEP5Balances{} },
|
result: func(e *executor) interface{} { return &result.NEP5Balances{} },
|
||||||
check: func(t *testing.T, e *executor, acc interface{}) {
|
check: func(t *testing.T, e *executor, acc interface{}) {
|
||||||
res, ok := acc.(*result.NEP5Balances)
|
res, ok := acc.(*result.NEP5Balances)
|
||||||
require.True(t, ok)
|
require.True(t, ok)
|
||||||
require.Equal(t, "AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY", res.Address)
|
require.Equal(t, testchain.PrivateKeyByID(0).Address(), res.Address)
|
||||||
require.Equal(t, 1, len(res.Balances))
|
require.Equal(t, 1, len(res.Balances))
|
||||||
require.Equal(t, "8.77", res.Balances[0].Amount)
|
require.Equal(t, "8.77", res.Balances[0].Amount)
|
||||||
require.Equal(t, testContractHash, res.Balances[0].Asset.StringLE())
|
require.Equal(t, testContractHash, res.Balances[0].Asset.StringLE())
|
||||||
|
@ -186,12 +187,12 @@ var rpcTestCases = map[string][]rpcTestCase{
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "positive",
|
name: "positive",
|
||||||
params: `["AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY"]`,
|
params: `["` + testchain.PrivateKeyByID(0).Address() + `"]`,
|
||||||
result: func(e *executor) interface{} { return &result.NEP5Transfers{} },
|
result: func(e *executor) interface{} { return &result.NEP5Transfers{} },
|
||||||
check: func(t *testing.T, e *executor, acc interface{}) {
|
check: func(t *testing.T, e *executor, acc interface{}) {
|
||||||
res, ok := acc.(*result.NEP5Transfers)
|
res, ok := acc.(*result.NEP5Transfers)
|
||||||
require.True(t, ok)
|
require.True(t, ok)
|
||||||
require.Equal(t, "AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY", res.Address)
|
require.Equal(t, testchain.PrivateKeyByID(0).Address(), res.Address)
|
||||||
|
|
||||||
assetHash, err := util.Uint160DecodeStringLE(testContractHash)
|
assetHash, err := util.Uint160DecodeStringLE(testContractHash)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -204,7 +205,7 @@ var rpcTestCases = map[string][]rpcTestCase{
|
||||||
require.Equal(t, 1, len(res.Sent))
|
require.Equal(t, 1, len(res.Sent))
|
||||||
require.Equal(t, "1.23", res.Sent[0].Amount)
|
require.Equal(t, "1.23", res.Sent[0].Amount)
|
||||||
require.Equal(t, assetHash, res.Sent[0].Asset)
|
require.Equal(t, assetHash, res.Sent[0].Asset)
|
||||||
require.Equal(t, "AdB6ayKfBRJZasiXX4JL5N2YtmxftNp1b3", res.Sent[0].Address)
|
require.Equal(t, testchain.PrivateKeyByID(1).Address(), res.Sent[0].Address)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -515,7 +516,7 @@ var rpcTestCases = map[string][]rpcTestCase{
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "normal address",
|
name: "normal address",
|
||||||
params: `["AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6"]`,
|
params: `["` + testchain.MultisigAddress() + `"]`,
|
||||||
result: func(*executor) interface{} {
|
result: func(*executor) interface{} {
|
||||||
// hash of the issueTx
|
// hash of the issueTx
|
||||||
h, _ := util.Uint256DecodeStringBE("4cccf8f1a4cfa9ebd9344c312f8220199ee9000f14cb951f677601d208aa5af0")
|
h, _ := util.Uint256DecodeStringBE("4cccf8f1a4cfa9ebd9344c312f8220199ee9000f14cb951f677601d208aa5af0")
|
||||||
|
@ -530,7 +531,7 @@ var rpcTestCases = map[string][]rpcTestCase{
|
||||||
Unclaimed: amount,
|
Unclaimed: amount,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Address: "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6",
|
Address: testchain.MultisigAddress(),
|
||||||
Unclaimed: amount,
|
Unclaimed: amount,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -612,7 +613,7 @@ var rpcTestCases = map[string][]rpcTestCase{
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "positive",
|
name: "positive",
|
||||||
params: `["AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6"]`,
|
params: `["` + testchain.MultisigAddress() + `"]`,
|
||||||
result: func(*executor) interface{} {
|
result: func(*executor) interface{} {
|
||||||
return &result.Unclaimed{}
|
return &result.Unclaimed{}
|
||||||
},
|
},
|
||||||
|
@ -628,7 +629,7 @@ var rpcTestCases = map[string][]rpcTestCase{
|
||||||
"getunspents": {
|
"getunspents": {
|
||||||
{
|
{
|
||||||
name: "positive",
|
name: "positive",
|
||||||
params: `["AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6"]`,
|
params: `["` + testchain.MultisigAddress() + `"]`,
|
||||||
result: func(e *executor) interface{} { return &result.Unspents{} },
|
result: func(e *executor) interface{} { return &result.Unspents{} },
|
||||||
check: func(t *testing.T, e *executor, unsp interface{}) {
|
check: func(t *testing.T, e *executor, unsp interface{}) {
|
||||||
res, ok := unsp.(*result.Unspents)
|
res, ok := unsp.(*result.Unspents)
|
||||||
|
@ -973,7 +974,7 @@ func TestRPC(t *testing.T) {
|
||||||
assert.Equal(t, 0, txOut.N)
|
assert.Equal(t, 0, txOut.N)
|
||||||
assert.Equal(t, "0xf5bc5a9ac7b85a47be381260a06b5a1e7a667ce8f7d7c8baa5cfc6465571377a", txOut.Asset)
|
assert.Equal(t, "0xf5bc5a9ac7b85a47be381260a06b5a1e7a667ce8f7d7c8baa5cfc6465571377a", txOut.Asset)
|
||||||
assert.Equal(t, util.Fixed8FromInt64(100000000), txOut.Value)
|
assert.Equal(t, util.Fixed8FromInt64(100000000), txOut.Value)
|
||||||
assert.Equal(t, "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", txOut.Address)
|
assert.Equal(t, testchain.MultisigAddress(), txOut.Address)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("getrawmempool", func(t *testing.T) {
|
t.Run("getrawmempool", func(t *testing.T) {
|
||||||
|
|
Loading…
Reference in a new issue