github.com/aychain/blockbook@v0.1.1-0.20181121092459-6d1fc7e07c5b/bchain/coins/btc/bitcoinparser_test.go (about) 1 // +build unittest 2 3 package btc 4 5 import ( 6 "blockbook/bchain" 7 "encoding/hex" 8 "math/big" 9 "os" 10 "reflect" 11 "testing" 12 13 "github.com/jakm/btcutil/chaincfg" 14 ) 15 16 func TestMain(m *testing.M) { 17 c := m.Run() 18 chaincfg.ResetParams() 19 os.Exit(c) 20 } 21 22 func Test_GetAddrDescFromAddress(t *testing.T) { 23 type args struct { 24 address string 25 } 26 tests := []struct { 27 name string 28 args args 29 want string 30 wantErr bool 31 }{ 32 { 33 name: "P2PKH", 34 args: args{address: "1JKgN43B9SyLuZH19H5ECvr4KcfrbVHzZ6"}, 35 want: "76a914be027bf3eac907bd4ac8cb9c5293b6f37662722088ac", 36 wantErr: false, 37 }, 38 { 39 name: "P2PKH from P2PK", 40 args: args{address: "1HY6bKYhFH7HF3F48ikvziPHLrEWPGwXcE"}, 41 want: "76a914b563933904dceba5c234e978bea0e9eb8b7e721b88ac", 42 wantErr: false, 43 }, 44 { 45 name: "P2SH", 46 args: args{address: "321x69Cb9HZLWwAWGiUBT1U81r1zPLnEjL"}, 47 want: "a9140394b3cf9a44782c10105b93962daa8dba304d7f87", 48 wantErr: false, 49 }, 50 { 51 name: "P2WPKH", 52 args: args{address: "bc1qrsf2l34jvqnq0lduyz0j5pfu2nkd93nnq0qggn"}, 53 want: "00141c12afc6b2602607fdbc209f2a053c54ecd2c673", 54 wantErr: false, 55 }, 56 { 57 name: "P2WSH", 58 args: args{address: "bc1qqwtn5s8vjnqdzrm0du885c46ypzt05vakmljhasx28shlv5a355sw5exgr"}, 59 want: "002003973a40ec94c0d10f6f6f0e7a62ba2044b7d19db6ff2bf60651e17fb29d8d29", 60 wantErr: false, 61 }, 62 } 63 parser := NewBitcoinParser(GetChainParams("main"), &Configuration{}) 64 65 for _, tt := range tests { 66 t.Run(tt.name, func(t *testing.T) { 67 got, err := parser.GetAddrDescFromAddress(tt.args.address) 68 if (err != nil) != tt.wantErr { 69 t.Errorf("GetAddrDescFromAddress() error = %v, wantErr %v", err, tt.wantErr) 70 return 71 } 72 h := hex.EncodeToString(got) 73 if !reflect.DeepEqual(h, tt.want) { 74 t.Errorf("GetAddrDescFromAddress() = %v, want %v", h, tt.want) 75 } 76 }) 77 } 78 } 79 80 func Test_GetAddrDescFromVout(t *testing.T) { 81 type args struct { 82 vout bchain.Vout 83 } 84 tests := []struct { 85 name string 86 args args 87 want string 88 wantErr bool 89 }{ 90 { 91 name: "P2PKH", 92 args: args{vout: bchain.Vout{ScriptPubKey: bchain.ScriptPubKey{Hex: "76a914be027bf3eac907bd4ac8cb9c5293b6f37662722088ac"}}}, 93 want: "76a914be027bf3eac907bd4ac8cb9c5293b6f37662722088ac", 94 wantErr: false, 95 }, 96 { 97 name: "P2PK compressed 1P3rU1Nk1pmc2BiWC8dEy9bZa1ZbMp5jfg", 98 args: args{vout: bchain.Vout{ScriptPubKey: bchain.ScriptPubKey{Hex: "21020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9ac"}}}, 99 want: "76a914f1dce4182fce875748c4986b240ff7d7bc3fffb088ac", 100 wantErr: false, 101 }, 102 { 103 name: "P2PK uncompressed 1HY6bKYhFH7HF3F48ikvziPHLrEWPGwXcE", 104 args: args{vout: bchain.Vout{ScriptPubKey: bchain.ScriptPubKey{Hex: "41041057356b91bfd3efeff5fc0fa8b865faafafb67bd653c5da2cd16ce15c7b86db0e622c8e1e135f68918a23601eb49208c1ac72c7b64a4ee99c396cf788da16ccac"}}}, 105 want: "76a914b563933904dceba5c234e978bea0e9eb8b7e721b88ac", 106 wantErr: false, 107 }, 108 { 109 name: "P2SH", 110 args: args{vout: bchain.Vout{ScriptPubKey: bchain.ScriptPubKey{Hex: "a9140394b3cf9a44782c10105b93962daa8dba304d7f87"}}}, 111 want: "a9140394b3cf9a44782c10105b93962daa8dba304d7f87", 112 wantErr: false, 113 }, 114 { 115 name: "P2WPKH", 116 args: args{vout: bchain.Vout{ScriptPubKey: bchain.ScriptPubKey{Hex: "00141c12afc6b2602607fdbc209f2a053c54ecd2c673"}}}, 117 want: "00141c12afc6b2602607fdbc209f2a053c54ecd2c673", 118 wantErr: false, 119 }, 120 { 121 name: "P2WSH", 122 args: args{vout: bchain.Vout{ScriptPubKey: bchain.ScriptPubKey{Hex: "002003973a40ec94c0d10f6f6f0e7a62ba2044b7d19db6ff2bf60651e17fb29d8d29"}}}, 123 want: "002003973a40ec94c0d10f6f6f0e7a62ba2044b7d19db6ff2bf60651e17fb29d8d29", 124 wantErr: false, 125 }, 126 } 127 parser := NewBitcoinParser(GetChainParams("main"), &Configuration{}) 128 129 for _, tt := range tests { 130 t.Run(tt.name, func(t *testing.T) { 131 got, err := parser.GetAddrDescFromVout(&tt.args.vout) 132 if (err != nil) != tt.wantErr { 133 t.Errorf("GetAddrDescFromVout() error = %v, wantErr %v", err, tt.wantErr) 134 return 135 } 136 h := hex.EncodeToString(got) 137 if !reflect.DeepEqual(h, tt.want) { 138 t.Errorf("GetAddrDescFromVout() = %v, want %v", h, tt.want) 139 } 140 }) 141 } 142 } 143 144 func Test_GetAddressesFromAddrDesc(t *testing.T) { 145 type args struct { 146 script string 147 } 148 tests := []struct { 149 name string 150 args args 151 want []string 152 want2 bool 153 wantErr bool 154 }{ 155 { 156 name: "P2PKH", 157 args: args{script: "76a914be027bf3eac907bd4ac8cb9c5293b6f37662722088ac"}, 158 want: []string{"1JKgN43B9SyLuZH19H5ECvr4KcfrbVHzZ6"}, 159 want2: true, 160 wantErr: false, 161 }, 162 { 163 name: "P2PK compressed", 164 args: args{script: "21020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9ac"}, 165 want: []string{"1P3rU1Nk1pmc2BiWC8dEy9bZa1ZbMp5jfg"}, 166 want2: false, 167 wantErr: false, 168 }, 169 { 170 name: "P2PK uncompressed", 171 args: args{script: "41041057356b91bfd3efeff5fc0fa8b865faafafb67bd653c5da2cd16ce15c7b86db0e622c8e1e135f68918a23601eb49208c1ac72c7b64a4ee99c396cf788da16ccac"}, 172 want: []string{"1HY6bKYhFH7HF3F48ikvziPHLrEWPGwXcE"}, 173 want2: false, 174 wantErr: false, 175 }, 176 { 177 name: "P2SH", 178 args: args{script: "a9140394b3cf9a44782c10105b93962daa8dba304d7f87"}, 179 want: []string{"321x69Cb9HZLWwAWGiUBT1U81r1zPLnEjL"}, 180 want2: true, 181 wantErr: false, 182 }, 183 { 184 name: "P2WPKH", 185 args: args{script: "00141c12afc6b2602607fdbc209f2a053c54ecd2c673"}, 186 want: []string{"bc1qrsf2l34jvqnq0lduyz0j5pfu2nkd93nnq0qggn"}, 187 want2: true, 188 wantErr: false, 189 }, 190 { 191 name: "P2WSH", 192 args: args{script: "002003973a40ec94c0d10f6f6f0e7a62ba2044b7d19db6ff2bf60651e17fb29d8d29"}, 193 want: []string{"bc1qqwtn5s8vjnqdzrm0du885c46ypzt05vakmljhasx28shlv5a355sw5exgr"}, 194 want2: true, 195 wantErr: false, 196 }, 197 { 198 name: "OP_RETURN ascii", 199 args: args{script: "6a0461686f6a"}, 200 want: []string{"OP_RETURN (ahoj)"}, 201 want2: false, 202 wantErr: false, 203 }, 204 { 205 name: "OP_RETURN OP_PUSHDATA1 ascii", 206 args: args{script: "6a4c0b446c6f7568792074657874"}, 207 want: []string{"OP_RETURN (Dlouhy text)"}, 208 want2: false, 209 wantErr: false, 210 }, 211 { 212 name: "OP_RETURN hex", 213 args: args{script: "6a072020f1686f6a20"}, 214 want: []string{"OP_RETURN 2020f1686f6a20"}, 215 want2: false, 216 wantErr: false, 217 }, 218 } 219 220 parser := NewBitcoinParser(GetChainParams("main"), &Configuration{}) 221 222 for _, tt := range tests { 223 t.Run(tt.name, func(t *testing.T) { 224 b, _ := hex.DecodeString(tt.args.script) 225 got, got2, err := parser.GetAddressesFromAddrDesc(b) 226 if (err != nil) != tt.wantErr { 227 t.Errorf("GetAddressesFromAddrDesc() error = %v, wantErr %v", err, tt.wantErr) 228 return 229 } 230 if !reflect.DeepEqual(got, tt.want) { 231 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got, tt.want) 232 } 233 if !reflect.DeepEqual(got2, tt.want2) { 234 t.Errorf("GetAddressesFromAddrDesc() = %v, want %v", got2, tt.want2) 235 } 236 }) 237 } 238 } 239 240 var ( 241 testTx1, testTx2 bchain.Tx 242 243 testTxPacked1 = "0001e2408ba8d7af5401000000017f9a22c9cbf54bd902400df746f138f37bcf5b4d93eb755820e974ba43ed5f42040000006a4730440220037f4ed5427cde81d55b9b6a2fd08c8a25090c2c2fff3a75c1a57625ca8a7118022076c702fe55969fa08137f71afd4851c48e31082dd3c40c919c92cdbc826758d30121029f6da5623c9f9b68a9baf9c1bc7511df88fa34c6c2f71f7c62f2f03ff48dca80feffffff019c9700000000000017a9146144d57c8aff48492c9dfb914e120b20bad72d6f8773d00700" 244 testTxPacked2 = "0007c91a899ab7da6a010000000001019d64f0c72a0d206001decbffaa722eb1044534c74eee7a5df8318e42a4323ec10000000017160014550da1f5d25a9dae2eafd6902b4194c4c6500af6ffffffff02809698000000000017a914cd668d781ece600efa4b2404dc91fd26b8b8aed8870553d7360000000017a914246655bdbd54c7e477d0ea2375e86e0db2b8f80a8702473044022076aba4ad559616905fa51d4ddd357fc1fdb428d40cb388e042cdd1da4a1b7357022011916f90c712ead9a66d5f058252efd280439ad8956a967e95d437d246710bc9012102a80a5964c5612bb769ef73147b2cf3c149bc0fd4ecb02f8097629c94ab013ffd00000000" 245 ) 246 247 func init() { 248 testTx1 = bchain.Tx{ 249 Hex: "01000000017f9a22c9cbf54bd902400df746f138f37bcf5b4d93eb755820e974ba43ed5f42040000006a4730440220037f4ed5427cde81d55b9b6a2fd08c8a25090c2c2fff3a75c1a57625ca8a7118022076c702fe55969fa08137f71afd4851c48e31082dd3c40c919c92cdbc826758d30121029f6da5623c9f9b68a9baf9c1bc7511df88fa34c6c2f71f7c62f2f03ff48dca80feffffff019c9700000000000017a9146144d57c8aff48492c9dfb914e120b20bad72d6f8773d00700", 250 Blocktime: 1519053802, 251 Txid: "056e3d82e5ffd0e915fb9b62797d76263508c34fe3e5dbed30dd3e943930f204", 252 LockTime: 512115, 253 Version: 1, 254 Vin: []bchain.Vin{ 255 { 256 ScriptSig: bchain.ScriptSig{ 257 Hex: "4730440220037f4ed5427cde81d55b9b6a2fd08c8a25090c2c2fff3a75c1a57625ca8a7118022076c702fe55969fa08137f71afd4851c48e31082dd3c40c919c92cdbc826758d30121029f6da5623c9f9b68a9baf9c1bc7511df88fa34c6c2f71f7c62f2f03ff48dca80", 258 }, 259 Txid: "425fed43ba74e9205875eb934d5bcf7bf338f146f70d4002d94bf5cbc9229a7f", 260 Vout: 4, 261 Sequence: 4294967294, 262 }, 263 }, 264 Vout: []bchain.Vout{ 265 { 266 ValueSat: *big.NewInt(38812), 267 N: 0, 268 ScriptPubKey: bchain.ScriptPubKey{ 269 Hex: "a9146144d57c8aff48492c9dfb914e120b20bad72d6f87", 270 Addresses: []string{ 271 "3AZKvpKhSh1o8t1QrX3UeXG9d2BhCRnbcK", 272 }, 273 }, 274 }, 275 }, 276 } 277 278 testTx2 = bchain.Tx{ 279 Hex: "010000000001019d64f0c72a0d206001decbffaa722eb1044534c74eee7a5df8318e42a4323ec10000000017160014550da1f5d25a9dae2eafd6902b4194c4c6500af6ffffffff02809698000000000017a914cd668d781ece600efa4b2404dc91fd26b8b8aed8870553d7360000000017a914246655bdbd54c7e477d0ea2375e86e0db2b8f80a8702473044022076aba4ad559616905fa51d4ddd357fc1fdb428d40cb388e042cdd1da4a1b7357022011916f90c712ead9a66d5f058252efd280439ad8956a967e95d437d246710bc9012102a80a5964c5612bb769ef73147b2cf3c149bc0fd4ecb02f8097629c94ab013ffd00000000", 280 Blocktime: 1235678901, 281 Txid: "474e6795760ebe81cb4023dc227e5a0efe340e1771c89a0035276361ed733de7", 282 LockTime: 0, 283 Version: 1, 284 Vin: []bchain.Vin{ 285 { 286 ScriptSig: bchain.ScriptSig{ 287 Hex: "160014550da1f5d25a9dae2eafd6902b4194c4c6500af6", 288 }, 289 Txid: "c13e32a4428e31f85d7aee4ec7344504b12e72aaffcbde0160200d2ac7f0649d", 290 Vout: 0, 291 Sequence: 4294967295, 292 }, 293 }, 294 Vout: []bchain.Vout{ 295 { 296 ValueSat: *big.NewInt(10000000), 297 N: 0, 298 ScriptPubKey: bchain.ScriptPubKey{ 299 Hex: "a914cd668d781ece600efa4b2404dc91fd26b8b8aed887", 300 Addresses: []string{ 301 "2NByHN6A8QYkBATzxf4pRGbCSHD5CEN2TRu", 302 }, 303 }, 304 }, 305 { 306 ValueSat: *big.NewInt(920081157), 307 N: 1, 308 ScriptPubKey: bchain.ScriptPubKey{ 309 Hex: "a914246655bdbd54c7e477d0ea2375e86e0db2b8f80a87", 310 Addresses: []string{ 311 "2MvZguYaGjM7JihBgNqgLF2Ca2Enb76Hj9D", 312 }, 313 }, 314 }, 315 }, 316 } 317 } 318 319 func Test_PackTx(t *testing.T) { 320 type args struct { 321 tx bchain.Tx 322 height uint32 323 blockTime int64 324 parser *BitcoinParser 325 } 326 tests := []struct { 327 name string 328 args args 329 want string 330 wantErr bool 331 }{ 332 { 333 name: "btc-1", 334 args: args{ 335 tx: testTx1, 336 height: 123456, 337 blockTime: 1519053802, 338 parser: NewBitcoinParser(GetChainParams("main"), &Configuration{}), 339 }, 340 want: testTxPacked1, 341 wantErr: false, 342 }, 343 { 344 name: "testnet-1", 345 args: args{ 346 tx: testTx2, 347 height: 510234, 348 blockTime: 1235678901, 349 parser: NewBitcoinParser(GetChainParams("test"), &Configuration{}), 350 }, 351 want: testTxPacked2, 352 wantErr: false, 353 }, 354 } 355 for _, tt := range tests { 356 t.Run(tt.name, func(t *testing.T) { 357 got, err := tt.args.parser.PackTx(&tt.args.tx, tt.args.height, tt.args.blockTime) 358 if (err != nil) != tt.wantErr { 359 t.Errorf("packTx() error = %v, wantErr %v", err, tt.wantErr) 360 return 361 } 362 h := hex.EncodeToString(got) 363 if !reflect.DeepEqual(h, tt.want) { 364 t.Errorf("packTx() = %v, want %v", h, tt.want) 365 } 366 }) 367 } 368 } 369 370 func Test_UnpackTx(t *testing.T) { 371 type args struct { 372 packedTx string 373 parser *BitcoinParser 374 } 375 tests := []struct { 376 name string 377 args args 378 want *bchain.Tx 379 want1 uint32 380 wantErr bool 381 }{ 382 { 383 name: "btc-1", 384 args: args{ 385 packedTx: testTxPacked1, 386 parser: NewBitcoinParser(GetChainParams("main"), &Configuration{}), 387 }, 388 want: &testTx1, 389 want1: 123456, 390 wantErr: false, 391 }, 392 { 393 name: "testnet-1", 394 args: args{ 395 packedTx: testTxPacked2, 396 parser: NewBitcoinParser(GetChainParams("test"), &Configuration{}), 397 }, 398 want: &testTx2, 399 want1: 510234, 400 wantErr: false, 401 }, 402 } 403 for _, tt := range tests { 404 t.Run(tt.name, func(t *testing.T) { 405 b, _ := hex.DecodeString(tt.args.packedTx) 406 got, got1, err := tt.args.parser.UnpackTx(b) 407 if (err != nil) != tt.wantErr { 408 t.Errorf("unpackTx() error = %v, wantErr %v", err, tt.wantErr) 409 return 410 } 411 if !reflect.DeepEqual(got, tt.want) { 412 t.Errorf("unpackTx() got = %v, want %v", got, tt.want) 413 } 414 if got1 != tt.want1 { 415 t.Errorf("unpackTx() got1 = %v, want %v", got1, tt.want1) 416 } 417 }) 418 } 419 }