github.com/Bytom/bytom@v1.1.2-0.20210127130405-ae40204c0b09/protocol/vm/vmutil/script_test.go (about) 1 package vmutil 2 3 import ( 4 "encoding/hex" 5 "testing" 6 7 "github.com/bytom/bytom/crypto/ed25519" 8 "github.com/bytom/bytom/errors" 9 ) 10 11 // TestIsUnspendable ensures the IsUnspendable function returns the expected 12 // results. 13 func TestIsUnspendable(t *testing.T) { 14 tests := []struct { 15 pkScript []byte 16 expected bool 17 }{ 18 { 19 // Unspendable 20 pkScript: []byte{0x6a, 0x04, 0x74, 0x65, 0x73, 0x74}, 21 expected: true, 22 }, 23 { 24 // Spendable 25 pkScript: []byte{0x76, 0xa9, 0x14, 0x29, 0x95, 0xa0, 26 0xfe, 0x68, 0x43, 0xfa, 0x9b, 0x95, 0x45, 27 0x97, 0xf0, 0xdc, 0xa7, 0xa4, 0x4d, 0xf6, 28 0xfa, 0x0b, 0x5c, 0x88, 0xac}, 29 expected: false, 30 }, 31 } 32 33 for i, test := range tests { 34 res := IsUnspendable(test.pkScript) 35 if res != test.expected { 36 t.Errorf("TestIsUnspendable #%d failed: got %v want %v", 37 i, res, test.expected) 38 continue 39 } 40 } 41 } 42 43 func TestP2SPMultiSigProgram(t *testing.T) { 44 pub1, _ := hex.DecodeString("988650ff921c82d47a953527894f792572ba63197c56e5fe79e5df0c444d6bb6") 45 pub2, _ := hex.DecodeString("7192bf4eac0789ee19c88dfa87861cf59e215820f7bdb7be02761d9ed92e6c62") 46 pub3, _ := hex.DecodeString("8bcd251d9f4e03877130b6e6f1d577eda562375f07c3cdfad8f1d541002fd1a3") 47 48 tests := []struct { 49 pubkeys []ed25519.PublicKey 50 nrequired int 51 wantProgram string 52 wantErr error 53 }{ 54 { 55 pubkeys: []ed25519.PublicKey{pub1}, 56 nrequired: 1, 57 wantProgram: "ae20988650ff921c82d47a953527894f792572ba63197c56e5fe79e5df0c444d6bb65151ad", 58 }, 59 { 60 pubkeys: []ed25519.PublicKey{pub1, pub2}, 61 nrequired: 2, 62 wantProgram: "ae20988650ff921c82d47a953527894f792572ba63197c56e5fe79e5df0c444d6bb6207192bf4eac0789ee19c88dfa87861cf59e215820f7bdb7be02761d9ed92e6c625252ad", 63 }, 64 { 65 pubkeys: []ed25519.PublicKey{pub1, pub2, pub3}, 66 nrequired: 2, 67 wantProgram: "ae20988650ff921c82d47a953527894f792572ba63197c56e5fe79e5df0c444d6bb6207192bf4eac0789ee19c88dfa87861cf59e215820f7bdb7be02761d9ed92e6c62208bcd251d9f4e03877130b6e6f1d577eda562375f07c3cdfad8f1d541002fd1a35253ad", 68 }, 69 { 70 pubkeys: []ed25519.PublicKey{pub1}, 71 nrequired: -1, 72 wantErr: errors.WithDetail(ErrBadValue, "negative quorum"), 73 }, 74 { 75 pubkeys: []ed25519.PublicKey{pub1}, 76 nrequired: 0, 77 wantErr: errors.WithDetail(ErrBadValue, "quorum empty with non-empty pubkey list"), 78 }, 79 { 80 pubkeys: []ed25519.PublicKey{pub1, pub2}, 81 nrequired: 3, 82 wantErr: errors.WithDetail(ErrBadValue, "quorum too big"), 83 }, 84 } 85 86 for i, test := range tests { 87 got, err := P2SPMultiSigProgram(test.pubkeys, test.nrequired) 88 if err != nil { 89 if test.wantErr != nil && err.Error() != test.wantErr.Error() { 90 t.Errorf("TestP2SPMultiSigProgram #%d failed: got %v want %v", i, err.Error(), test.wantErr.Error()) 91 } else if test.wantErr == nil { 92 t.Fatal(err) 93 } 94 } 95 96 if hex.EncodeToString(got) != test.wantProgram { 97 t.Errorf("TestP2SPMultiSigProgram #%d failed: got %v want %v", i, hex.EncodeToString(got), test.wantProgram) 98 } 99 } 100 } 101 102 func TestP2SPMultiSigProgramWithHeight(t *testing.T) { 103 pub1, _ := hex.DecodeString("988650ff921c82d47a953527894f792572ba63197c56e5fe79e5df0c444d6bb6") 104 pub2, _ := hex.DecodeString("7192bf4eac0789ee19c88dfa87861cf59e215820f7bdb7be02761d9ed92e6c62") 105 pub3, _ := hex.DecodeString("8bcd251d9f4e03877130b6e6f1d577eda562375f07c3cdfad8f1d541002fd1a3") 106 107 tests := []struct { 108 pubkeys []ed25519.PublicKey 109 nrequired int 110 height int64 111 wantProgram string 112 wantErr error 113 }{ 114 { 115 pubkeys: []ed25519.PublicKey{pub1}, 116 nrequired: 1, 117 wantProgram: "ae20988650ff921c82d47a953527894f792572ba63197c56e5fe79e5df0c444d6bb65151ad", 118 }, 119 { 120 pubkeys: []ed25519.PublicKey{pub1, pub2}, 121 nrequired: 2, 122 wantProgram: "ae20988650ff921c82d47a953527894f792572ba63197c56e5fe79e5df0c444d6bb6207192bf4eac0789ee19c88dfa87861cf59e215820f7bdb7be02761d9ed92e6c625252ad", 123 }, 124 { 125 pubkeys: []ed25519.PublicKey{pub1, pub2, pub3}, 126 nrequired: 2, 127 wantProgram: "ae20988650ff921c82d47a953527894f792572ba63197c56e5fe79e5df0c444d6bb6207192bf4eac0789ee19c88dfa87861cf59e215820f7bdb7be02761d9ed92e6c62208bcd251d9f4e03877130b6e6f1d577eda562375f07c3cdfad8f1d541002fd1a35253ad", 128 }, 129 { 130 pubkeys: []ed25519.PublicKey{pub1}, 131 nrequired: 1, 132 height: -1, 133 wantErr: errors.WithDetail(ErrBadValue, "negative blockHeight"), 134 }, 135 { 136 pubkeys: []ed25519.PublicKey{pub1}, 137 nrequired: 1, 138 height: 0, 139 wantProgram: "ae20988650ff921c82d47a953527894f792572ba63197c56e5fe79e5df0c444d6bb65151ad", 140 }, 141 { 142 pubkeys: []ed25519.PublicKey{pub1}, 143 nrequired: 1, 144 height: 200, 145 wantProgram: "01c8cda069ae20988650ff921c82d47a953527894f792572ba63197c56e5fe79e5df0c444d6bb65151ad", 146 }, 147 { 148 pubkeys: []ed25519.PublicKey{pub1, pub2}, 149 nrequired: 2, 150 height: 200, 151 wantProgram: "01c8cda069ae20988650ff921c82d47a953527894f792572ba63197c56e5fe79e5df0c444d6bb6207192bf4eac0789ee19c88dfa87861cf59e215820f7bdb7be02761d9ed92e6c625252ad", 152 }, 153 { 154 pubkeys: []ed25519.PublicKey{pub1, pub2, pub3}, 155 nrequired: 2, 156 height: 200, 157 wantProgram: "01c8cda069ae20988650ff921c82d47a953527894f792572ba63197c56e5fe79e5df0c444d6bb6207192bf4eac0789ee19c88dfa87861cf59e215820f7bdb7be02761d9ed92e6c62208bcd251d9f4e03877130b6e6f1d577eda562375f07c3cdfad8f1d541002fd1a35253ad", 158 }, 159 { 160 pubkeys: []ed25519.PublicKey{pub1}, 161 nrequired: -1, 162 wantErr: errors.WithDetail(ErrBadValue, "negative quorum"), 163 }, 164 { 165 pubkeys: []ed25519.PublicKey{pub1}, 166 nrequired: 0, 167 wantErr: errors.WithDetail(ErrBadValue, "quorum empty with non-empty pubkey list"), 168 }, 169 { 170 pubkeys: []ed25519.PublicKey{pub1, pub2}, 171 nrequired: 3, 172 wantErr: errors.WithDetail(ErrBadValue, "quorum too big"), 173 }, 174 } 175 176 for i, test := range tests { 177 got, err := P2SPMultiSigProgramWithHeight(test.pubkeys, test.nrequired, test.height) 178 if err != nil { 179 if test.wantErr != nil && err.Error() != test.wantErr.Error() { 180 t.Errorf("TestP2SPMultiSigProgram #%d failed: got %v want %v", i, err.Error(), test.wantErr.Error()) 181 } else if test.wantErr == nil { 182 t.Fatal(err) 183 } 184 } 185 186 if hex.EncodeToString(got) != test.wantProgram { 187 t.Errorf("TestP2SPMultiSigProgram #%d failed: got %v want %v", i, hex.EncodeToString(got), test.wantProgram) 188 } 189 } 190 } 191 192 func TestGetIssuanceProgramRestrictHeight(t *testing.T) { 193 tests := []struct { 194 issuanceProgram string 195 wantHeight int64 196 }{ 197 { 198 issuanceProgram: "", 199 wantHeight: 0, 200 }, 201 { 202 issuanceProgram: "ae20ac20f5cdb9ada2ae9836bcfff32126d6b885aa3f73ee111a95d1bf37f3904aca5151ad", 203 wantHeight: 0, 204 }, 205 { 206 issuanceProgram: "01c8cda069ae20f44dd85be89de08b0f894476ccc7b3eebcf0a288c79504fa7e4c8033f5b7338020c86dc682ce3ecac64e165d9b5f8cca9ee05bd0d4df07adbfd11251ad7e88f1685152ad", 207 wantHeight: 200, 208 }, 209 } 210 211 for i, test := range tests { 212 program, err := hex.DecodeString(test.issuanceProgram) 213 if err != nil { 214 t.Fatal(err) 215 } 216 217 gotHeight := GetIssuanceProgramRestrictHeight(program) 218 if gotHeight != test.wantHeight { 219 t.Errorf("TestGetIssuanceProgramRestrictHeight #%d failed: got %d want %d", i, gotHeight, test.wantHeight) 220 } 221 } 222 }