github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/smartcontract/contract_test.go (about) 1 package smartcontract 2 3 import ( 4 "testing" 5 6 "github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames" 7 "github.com/nspcc-dev/neo-go/pkg/crypto/keys" 8 "github.com/nspcc-dev/neo-go/pkg/io" 9 "github.com/nspcc-dev/neo-go/pkg/vm/opcode" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestCreateMultiSigRedeemScript(t *testing.T) { 15 val1, _ := keys.NewPublicKeyFromString("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c") 16 val2, _ := keys.NewPublicKeyFromString("02df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e895093") 17 val3, _ := keys.NewPublicKeyFromString("03b8d9d5771d8f513aa0869b9cc8d50986403b78c6da36890638c3d46a5adce04a") 18 19 validators := []*keys.PublicKey{val1, val2, val3} 20 21 out, err := CreateMultiSigRedeemScript(3, validators) 22 require.NoError(t, err) 23 24 br := io.NewBinReaderFromBuf(out) 25 assert.Equal(t, opcode.PUSH3, opcode.Opcode(br.ReadB())) 26 27 for i := 0; i < len(validators); i++ { 28 assert.EqualValues(t, opcode.PUSHDATA1, br.ReadB()) 29 bb := br.ReadVarBytes() 30 require.NoError(t, br.Err) 31 assert.Equal(t, validators[i].Bytes(), bb) 32 } 33 34 assert.Equal(t, opcode.PUSH3, opcode.Opcode(br.ReadB())) 35 assert.Equal(t, opcode.SYSCALL, opcode.Opcode(br.ReadB())) 36 assert.Equal(t, interopnames.ToID([]byte(interopnames.SystemCryptoCheckMultisig)), br.ReadU32LE()) 37 } 38 39 func TestCreateDefaultMultiSigRedeemScript(t *testing.T) { 40 var validators = make([]*keys.PublicKey, 0) 41 42 var addKey = func() { 43 key, err := keys.NewPrivateKey() 44 require.NoError(t, err) 45 validators = append(validators, key.PublicKey()) 46 } 47 var checkM = func(m int) { 48 validScript, err := CreateMultiSigRedeemScript(m, validators) 49 require.NoError(t, err) 50 defaultScript, err := CreateDefaultMultiSigRedeemScript(validators) 51 require.NoError(t, err) 52 require.Equal(t, validScript, defaultScript) 53 } 54 55 // 1 out of 1 56 addKey() 57 checkM(1) 58 59 // 2 out of 2 60 addKey() 61 checkM(2) 62 63 // 3 out of 4 64 for i := 0; i < 2; i++ { 65 addKey() 66 } 67 checkM(3) 68 69 // 5 out of 6 70 for i := 0; i < 2; i++ { 71 addKey() 72 } 73 checkM(5) 74 75 // 5 out of 7 76 addKey() 77 checkM(5) 78 79 // 7 out of 10 80 for i := 0; i < 3; i++ { 81 addKey() 82 } 83 checkM(7) 84 } 85 86 func TestCreateMajorityMultiSigRedeemScript(t *testing.T) { 87 var validators = make([]*keys.PublicKey, 0) 88 89 var addKey = func() { 90 key, err := keys.NewPrivateKey() 91 require.NoError(t, err) 92 validators = append(validators, key.PublicKey()) 93 } 94 var checkM = func(m int) { 95 validScript, err := CreateMultiSigRedeemScript(m, validators) 96 require.NoError(t, err) 97 defaultScript, err := CreateMajorityMultiSigRedeemScript(validators) 98 require.NoError(t, err) 99 require.Equal(t, validScript, defaultScript) 100 } 101 102 // 1 out of 1 103 addKey() 104 checkM(1) 105 106 // 2 out of 2 107 addKey() 108 checkM(2) 109 110 // 3 out of 4 111 addKey() 112 addKey() 113 checkM(3) 114 115 // 4 out of 6 116 addKey() 117 addKey() 118 checkM(4) 119 120 // 5 out of 8 121 addKey() 122 addKey() 123 checkM(5) 124 125 // 6 out of 10 126 addKey() 127 addKey() 128 checkM(6) 129 }