forked from TrueCloudLab/neoneo-go
130 lines
2.9 KiB
Go
130 lines
2.9 KiB
Go
package smartcontract
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
|
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
|
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestCreateMultiSigRedeemScript(t *testing.T) {
|
|
val1, _ := keys.NewPublicKeyFromString("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c")
|
|
val2, _ := keys.NewPublicKeyFromString("02df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e895093")
|
|
val3, _ := keys.NewPublicKeyFromString("03b8d9d5771d8f513aa0869b9cc8d50986403b78c6da36890638c3d46a5adce04a")
|
|
|
|
validators := []*keys.PublicKey{val1, val2, val3}
|
|
|
|
out, err := CreateMultiSigRedeemScript(3, validators)
|
|
require.NoError(t, err)
|
|
|
|
br := io.NewBinReaderFromBuf(out)
|
|
assert.Equal(t, opcode.PUSH3, opcode.Opcode(br.ReadB()))
|
|
|
|
for i := 0; i < len(validators); i++ {
|
|
assert.EqualValues(t, opcode.PUSHDATA1, br.ReadB())
|
|
bb := br.ReadVarBytes()
|
|
require.NoError(t, br.Err)
|
|
assert.Equal(t, validators[i].Bytes(), bb)
|
|
}
|
|
|
|
assert.Equal(t, opcode.PUSH3, opcode.Opcode(br.ReadB()))
|
|
assert.Equal(t, opcode.PUSHNULL, opcode.Opcode(br.ReadB()))
|
|
assert.Equal(t, opcode.SYSCALL, opcode.Opcode(br.ReadB()))
|
|
assert.Equal(t, interopnames.ToID([]byte(interopnames.NeoCryptoCheckMultisigWithECDsaSecp256r1)), br.ReadU32LE())
|
|
}
|
|
|
|
func TestCreateDefaultMultiSigRedeemScript(t *testing.T) {
|
|
var validators = make([]*keys.PublicKey, 0)
|
|
|
|
var addKey = func() {
|
|
key, err := keys.NewPrivateKey()
|
|
require.NoError(t, err)
|
|
validators = append(validators, key.PublicKey())
|
|
}
|
|
var checkM = func(m int) {
|
|
validScript, err := CreateMultiSigRedeemScript(m, validators)
|
|
require.NoError(t, err)
|
|
defaultScript, err := CreateDefaultMultiSigRedeemScript(validators)
|
|
require.NoError(t, err)
|
|
require.Equal(t, validScript, defaultScript)
|
|
}
|
|
|
|
// 1 out of 1
|
|
addKey()
|
|
checkM(1)
|
|
|
|
// 2 out of 2
|
|
addKey()
|
|
checkM(2)
|
|
|
|
// 3 out of 4
|
|
for i := 0; i < 2; i++ {
|
|
addKey()
|
|
}
|
|
checkM(3)
|
|
|
|
// 5 out of 6
|
|
for i := 0; i < 2; i++ {
|
|
addKey()
|
|
}
|
|
checkM(5)
|
|
|
|
// 5 out of 7
|
|
addKey()
|
|
checkM(5)
|
|
|
|
// 7 out of 10
|
|
for i := 0; i < 3; i++ {
|
|
addKey()
|
|
}
|
|
checkM(7)
|
|
}
|
|
|
|
func TestCreateMajorityMultiSigRedeemScript(t *testing.T) {
|
|
var validators = make([]*keys.PublicKey, 0)
|
|
|
|
var addKey = func() {
|
|
key, err := keys.NewPrivateKey()
|
|
require.NoError(t, err)
|
|
validators = append(validators, key.PublicKey())
|
|
}
|
|
var checkM = func(m int) {
|
|
validScript, err := CreateMultiSigRedeemScript(m, validators)
|
|
require.NoError(t, err)
|
|
defaultScript, err := CreateMajorityMultiSigRedeemScript(validators)
|
|
require.NoError(t, err)
|
|
require.Equal(t, validScript, defaultScript)
|
|
}
|
|
|
|
// 1 out of 1
|
|
addKey()
|
|
checkM(1)
|
|
|
|
// 2 out of 2
|
|
addKey()
|
|
checkM(2)
|
|
|
|
// 3 out of 4
|
|
addKey()
|
|
addKey()
|
|
checkM(3)
|
|
|
|
// 4 out of 6
|
|
addKey()
|
|
addKey()
|
|
checkM(4)
|
|
|
|
// 5 out of 8
|
|
addKey()
|
|
addKey()
|
|
checkM(5)
|
|
|
|
// 6 out of 10
|
|
addKey()
|
|
addKey()
|
|
checkM(6)
|
|
}
|