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  }