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  }