mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-03-30 15:08:33 +00:00
[DEV-31] remove json transaction tests
This commit is contained in:
parent
f1e24fcd43
commit
1e98d0dbfe
5
.gitignore
vendored
5
.gitignore
vendored
@ -37,7 +37,4 @@ _testmain.go
|
||||
.idea
|
||||
.vscode
|
||||
debug
|
||||
debug.test
|
||||
|
||||
#go
|
||||
coverage.out
|
||||
debug.test
|
@ -92,7 +92,10 @@ var genesisBlock = wire.MsgBlock{
|
||||
// regTestGenesisHash is the hash of the first block in the block chain for the
|
||||
// regression test network (genesis block).
|
||||
var regTestGenesisHash = daghash.Hash([daghash.HashSize]byte{ // Make go vet happy.
|
||||
0xeb, 0x98, 0xea, 0xaf, 0xf3, 0xf4, 0x7b, 0x3f, 0x4b, 0x61, 0x57, 0xf8, 0x75, 0xfb, 0xc6, 0x9f, 0xde, 0x88, 0x68, 0xbe, 0x5d, 0xc8, 0xab, 0xc6, 0xb4, 0x1f, 0x85, 0xd8, 0x77, 0x03, 0xbf, 0x0f,
|
||||
0xeb, 0x98, 0xea, 0xaf, 0xf3, 0xf4, 0x7b, 0x3f,
|
||||
0x4b, 0x61, 0x57, 0xf8, 0x75, 0xfb, 0xc6, 0x9f,
|
||||
0xde, 0x88, 0x68, 0xbe, 0x5d, 0xc8, 0xab, 0xc6,
|
||||
0xb4, 0x1f, 0x85, 0xd8, 0x77, 0x03, 0xbf, 0x0f,
|
||||
})
|
||||
|
||||
// regTestGenesisMerkleRoot is the hash of the first transaction in the genesis
|
||||
@ -118,7 +121,10 @@ var regTestGenesisBlock = wire.MsgBlock{
|
||||
// testNet3GenesisHash is the hash of the first block in the block chain for the
|
||||
// test network (version 3).
|
||||
var testNet3GenesisHash = daghash.Hash([daghash.HashSize]byte{ // Make go vet happy.
|
||||
0x25, 0x62, 0xec, 0x05, 0x42, 0x4b, 0x74, 0x37, 0x5a, 0x67, 0xd2, 0x6e, 0x24, 0x6c, 0xe8, 0x96, 0xdf, 0xd6, 0x71, 0x88, 0xc8, 0xbb, 0x89, 0xd6, 0xd9, 0x23, 0x84, 0x2b, 0xd0, 0x69, 0x39, 0xe7,
|
||||
0x25, 0x62, 0xec, 0x05, 0x42, 0x4b, 0x74, 0x37,
|
||||
0x5a, 0x67, 0xd2, 0x6e, 0x24, 0x6c, 0xe8, 0x96,
|
||||
0xdf, 0xd6, 0x71, 0x88, 0xc8, 0xbb, 0x89, 0xd6,
|
||||
0xd9, 0x23, 0x84, 0x2b, 0xd0, 0x69, 0x39, 0xe7,
|
||||
})
|
||||
|
||||
// testNet3GenesisMerkleRoot is the hash of the first transaction in the genesis
|
||||
|
@ -58,7 +58,7 @@ func newUtxoViewpoint(sourceTxns []*wire.MsgTx, sourceTxHeights []int32) *blockd
|
||||
return view
|
||||
}
|
||||
|
||||
func getTxIn(originTx *wire.MsgTx, outputIndex uint32) *wire.TxIn {
|
||||
func createTxIn(originTx *wire.MsgTx, outputIndex uint32) *wire.TxIn {
|
||||
var prevOut *wire.OutPoint
|
||||
if originTx != nil {
|
||||
originTxHash := originTx.TxHash()
|
||||
@ -72,7 +72,7 @@ func getTxIn(originTx *wire.MsgTx, outputIndex uint32) *wire.TxIn {
|
||||
return wire.NewTxIn(prevOut, nil)
|
||||
}
|
||||
|
||||
func createTransaction(value int64, originTx *wire.MsgTx, outputIndex uint32, sigScript []byte) (*wire.MsgTx, error) {
|
||||
func createTransaction(value int64, originTx *wire.MsgTx, originTxoutputIndex uint32, sigScript []byte) (*wire.MsgTx, error) {
|
||||
lookupKey := func(a btcutil.Address) (*btcec.PrivateKey, bool, error) {
|
||||
// Ordinarily this function would involve looking up the private
|
||||
// key for the provided address, but since the only thing being
|
||||
@ -80,21 +80,12 @@ func createTransaction(value int64, originTx *wire.MsgTx, outputIndex uint32, si
|
||||
// private key from above, simply return it with the compressed
|
||||
// flag set since the address is using the associated compressed
|
||||
// public key.
|
||||
//
|
||||
// NOTE: If you want to prove the code is actually signing the
|
||||
// transaction properly, uncomment the following line which
|
||||
// intentionally returns an invalid key to sign with, which in
|
||||
// turn will result in a failure during the script execution
|
||||
// when verifying the signature.
|
||||
//
|
||||
// privKey.D.SetInt64(12345)
|
||||
//
|
||||
return privKey, true, nil
|
||||
}
|
||||
|
||||
redeemTx := wire.NewMsgTx(wire.TxVersion)
|
||||
tx := wire.NewMsgTx(wire.TxVersion)
|
||||
|
||||
redeemTx.AddTxIn(getTxIn(originTx, outputIndex))
|
||||
tx.AddTxIn(createTxIn(originTx, originTxoutputIndex))
|
||||
|
||||
pkScript, err := txscript.PayToAddrScript(addr)
|
||||
if err != nil {
|
||||
@ -103,14 +94,14 @@ func createTransaction(value int64, originTx *wire.MsgTx, outputIndex uint32, si
|
||||
}
|
||||
|
||||
txOut := wire.NewTxOut(value, pkScript)
|
||||
redeemTx.AddTxOut(txOut)
|
||||
tx.AddTxOut(txOut)
|
||||
if sigScript == nil {
|
||||
sigScript, err = txscript.SignTxOutput(&dagconfig.MainNetParams,
|
||||
redeemTx, 0, originTx.TxOut[0].PkScript, txscript.SigHashAll,
|
||||
tx, 0, originTx.TxOut[0].PkScript, txscript.SigHashAll,
|
||||
txscript.KeyClosure(lookupKey), nil, nil)
|
||||
}
|
||||
redeemTx.TxIn[0].SignatureScript = sigScript
|
||||
return redeemTx, nil
|
||||
tx.TxIn[0].SignatureScript = sigScript
|
||||
return tx, nil
|
||||
}
|
||||
|
||||
// TestCalcPriority ensures the priority calculations work as intended.
|
||||
|
@ -1,570 +0,0 @@
|
||||
[
|
||||
["Automatically generated test cases"],
|
||||
[
|
||||
"0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
|
||||
"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402200a5c6163f07b8c3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
|
||||
"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"",
|
||||
"EVAL_FALSE",
|
||||
"P2PK, bad sig"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402206e05a6fe23c59196ffe176c9ddc31e73a9885638f9d1328d47c0c703863b8876022076feb53811aa5b04e0e79f938eb19906cc5e67548bc555a8e8b8b0fc603d840c01 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
|
||||
"DUP HASH160 0x14 0x1018853670f9f3b0582c5b9ee8ce93764ac32b93 EQUALVERIFY CHECKSIG",
|
||||
"",
|
||||
"OK",
|
||||
"P2PKH"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022034bb0494b50b8ef130e2185bb220265b9284ef5b4b8a8da4d8415df489c83b5102206259a26d9cc0a125ac26af6153b17c02956855ebe1467412f066e402f5f05d1201 0x21 0x03363d90d446b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
|
||||
"DUP HASH160 0x14 0xc0834c0c158f53be706d234c38fd52de7eece656 EQUALVERIFY CHECKSIG",
|
||||
"",
|
||||
"EQUALVERIFY",
|
||||
"P2PKH, bad pubkey"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402204710a85181663b32d25c70ec2bbd14adff5ddfff6cb50d09e155ef5f541fc86c0220056b0cc949be9386ecc5f6c2ac0493269031dbb185781db90171b54ac127790281",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK anyonecanpay"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402204710a85181663b32d25c70ec2bbd14adff5ddfff6cb50d09e155ef5f541fc86c0220056b0cc949be9386ecc5f6c2ac0493269031dbb185781db90171b54ac127790201",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||
"",
|
||||
"EVAL_FALSE",
|
||||
"P2PK anyonecanpay marked with normal hashtype"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022003fef42ed6c7be8917441218f525a60e2431be978e28b7aca4d7a532cc413ae8022067a1f82c74e8d69291b90d148778405c6257bbcfc2353cc38a3e1f22bf44254601 0x23 0x210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
|
||||
"HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL",
|
||||
"P2SH",
|
||||
"OK",
|
||||
"P2SH(P2PK)"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022003fef42ed6c7be8917441218f525a60e2431be978e28b7aca4d7a532cc413ae8022067a1f82c74e8d69291b90d148778405c6257bbcfc2353cc38a3e1f22bf44254601 0x23 0x210279be667ef9dcbbac54a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac",
|
||||
"HASH160 0x14 0x23b0ad3477f2178bc0b3eed26e4e6316f4e83aa1 EQUAL",
|
||||
"P2SH",
|
||||
"EVAL_FALSE",
|
||||
"P2SH(P2PK), bad redeemscript"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220781ba4f59a7b207a10db87628bc2168df4d59b844b397d2dbc9a5835fb2f2b7602206ed8fbcc1072fe2dfc5bb25909269e5dc42ffcae7ec2bc81d59692210ff30c2b01 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x19 0x76a91491b24bf9f5288532960ac687abb035127b1d28a588ac",
|
||||
"HASH160 0x14 0x7f67f0521934a57d3039f77f9f32cf313f3ac74b EQUAL",
|
||||
"P2SH",
|
||||
"OK",
|
||||
"P2SH(P2PKH)"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402204e2eb034be7b089534ac9e798cf6a2c79f38bcb34d1b179efd6f2de0841735db022071461beb056b5a7be1819da6a3e3ce3662831ecc298419ca101eb6887b5dd6a401 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
|
||||
"HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL",
|
||||
"",
|
||||
"OK",
|
||||
"P2SH(P2PKH), bad sig but no VERIFY_P2SH"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402204e2eb034be7b089534ac9e798cf6a2c79f38bcb34d1b179efd6f2de0841735db022071461beb056b5a7be1819da6a3e3ce3662831ecc298419ca101eb6887b5dd6a401 0x19 0x76a9147cf9c846cd4882efec4bf07e44ebdad495c94f4b88ac",
|
||||
"HASH160 0x14 0x2df519943d5acc0ef5222091f9dfe3543f489a82 EQUAL",
|
||||
"P2SH",
|
||||
"EQUALVERIFY",
|
||||
"P2SH(P2PKH), bad sig"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0x47 0x304402200955d031fff71d8653221e85e36c3c85533d2312fc3045314b19650b7ae2f81002202a6bb8505e36201909d0921f01abff390ae6b7ff97bbf959f98aedeb0a56730901",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
|
||||
"",
|
||||
"OK",
|
||||
"3-of-3"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022051254b9fb476a52d85530792b578f86fea70ec1ffb4393e661bcccb23d8d63d3022076505f94a403c86097841944e044c70c2045ce90e36de51f7e9d3828db98a07501 0x47 0x304402200a358f750934b3feb822f1966bfcd8bbec9eeaa3a8ca941e11ee5960e181fa01022050bf6b5a8e7750f70354ae041cb68a7bade67ec6c3ab19eb359638974410626e01 0",
|
||||
"3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG",
|
||||
"",
|
||||
"EVAL_FALSE",
|
||||
"3-of-3, 2 sigs"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x304402205b7d2c2f177ae76cfbbf14d589c113b0b35db753d305d5562dd0b61cbf366cfb02202e56f93c4f08a27f986cd424ffc48a462c3202c4902104d4d0ff98ed28f4bf8001 0x47 0x30440220563e5b3b1fc11662a84bc5ea2a32cc3819703254060ba30d639a1aaf2d5068ad0220601c1f47ddc76d93284dd9ed68f7c9974c4a0ea7cbe8a247d6bc3878567a5fca01 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae",
|
||||
"HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL",
|
||||
"P2SH",
|
||||
"OK",
|
||||
"P2SH(2-of-3)"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x304402205b7d2c2f177ae76cfbbf14d589c113b0b35db753d305d5562dd0b61cbf366cfb02202e56f93c4f08a27f986cd424ffc48a462c3202c4902104d4d0ff98ed28f4bf8001 0 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae",
|
||||
"HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL",
|
||||
"P2SH",
|
||||
"EVAL_FALSE",
|
||||
"P2SH(2-of-3), 1 sig"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK with too much R padding but no DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"P2PK with too much R padding"
|
||||
],
|
||||
[
|
||||
"0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK with too much S padding but no DERSIG"
|
||||
],
|
||||
[
|
||||
"0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"P2PK with too much S padding"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK with too little R padding but no DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"P2PK with too little R padding"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK NOT with bad sig with too much R padding but no DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"P2PK NOT with bad sig with too much R padding"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
||||
"",
|
||||
"EVAL_FALSE",
|
||||
"P2PK NOT with too much R padding but no DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"P2PK NOT with too much R padding"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"OK",
|
||||
"BIP66 example 1, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"BIP66 example 1, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"",
|
||||
"EVAL_FALSE",
|
||||
"BIP66 example 2, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"BIP66 example 2, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"EVAL_FALSE",
|
||||
"BIP66 example 3, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"EVAL_FALSE",
|
||||
"BIP66 example 3, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"",
|
||||
"OK",
|
||||
"BIP66 example 4, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"OK",
|
||||
"BIP66 example 4, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x09 0x300602010102010101",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"OK",
|
||||
"BIP66 example 4, with DERSIG, non-null DER-compliant signature"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"DERSIG,NULLFAIL",
|
||||
"OK",
|
||||
"BIP66 example 4, with DERSIG and NULLFAIL"
|
||||
],
|
||||
[
|
||||
"0x09 0x300602010102010101",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"DERSIG,NULLFAIL",
|
||||
"NULLFAIL",
|
||||
"BIP66 example 4, with DERSIG and NULLFAIL, non-null DER-compliant signature"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"",
|
||||
"EVAL_FALSE",
|
||||
"BIP66 example 5, without DERSIG"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"BIP66 example 5, with DERSIG"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"",
|
||||
"OK",
|
||||
"BIP66 example 6, without DERSIG"
|
||||
],
|
||||
[
|
||||
"1",
|
||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"BIP66 example 6, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"",
|
||||
"OK",
|
||||
"BIP66 example 7, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"BIP66 example 7, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"",
|
||||
"EVAL_FALSE",
|
||||
"BIP66 example 8, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"BIP66 example 8, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"",
|
||||
"EVAL_FALSE",
|
||||
"BIP66 example 9, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"BIP66 example 9, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"",
|
||||
"OK",
|
||||
"BIP66 example 10, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"BIP66 example 10, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"",
|
||||
"EVAL_FALSE",
|
||||
"BIP66 example 11, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||
"DERSIG",
|
||||
"EVAL_FALSE",
|
||||
"BIP66 example 11, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"",
|
||||
"OK",
|
||||
"BIP66 example 12, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||
"DERSIG",
|
||||
"OK",
|
||||
"BIP66 example 12, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK with multi-byte hashtype, without DERSIG"
|
||||
],
|
||||
[
|
||||
"0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||
"DERSIG",
|
||||
"SIG_DER",
|
||||
"P2PK with multi-byte hashtype, with DERSIG"
|
||||
],
|
||||
[
|
||||
"0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK with high S but no LOW_S"
|
||||
],
|
||||
[
|
||||
"0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||
"LOW_S",
|
||||
"SIG_HIGH_S",
|
||||
"P2PK with high S"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022057292e2d4dfe775becdd0a9e6547997c728cdf35390f6a017da56d654d374e4902206b643be2fc53763b4e284845bfea2c597d2dc7759941dce937636c9d341b71ed01",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK with hybrid pubkey but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022057292e2d4dfe775becdd0a9e6547997c728cdf35390f6a017da56d654d374e4902206b643be2fc53763b4e284845bfea2c597d2dc7759941dce937636c9d341b71ed01",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"STRICTENC",
|
||||
"PUBKEYTYPE",
|
||||
"P2PK with hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220035d554e3153c14950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
|
||||
"",
|
||||
"EVAL_FALSE",
|
||||
"P2PK NOT with hybrid pubkey but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220035d554e3153c14950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
|
||||
"STRICTENC",
|
||||
"PUBKEYTYPE",
|
||||
"P2PK NOT with hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220035d554e3153c04950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK NOT with invalid hybrid pubkey but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0x47 0x30440220035d554e3153c04950c9993f41c496607a8e24093db0595be7bf875cf64fcf1f02204731c8c4e5daf15e706cec19cdd8f2c5b1d05490e11dab8465ed426569b6e92101",
|
||||
"0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT",
|
||||
"STRICTENC",
|
||||
"PUBKEYTYPE",
|
||||
"P2PK NOT with invalid hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402202e79441ad1baf5a07fb86bae3753184f6717d9692680947ea8b6e8b777c69af1022079a262e13d868bb5a0964fefe3ba26942e1b0669af1afb55ef3344bc9d4fc4c401",
|
||||
"1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"",
|
||||
"OK",
|
||||
"1-of-2 with the second 1 hybrid pubkey and no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402202e79441ad1baf5a07fb86bae3753184f6717d9692680947ea8b6e8b777c69af1022079a262e13d868bb5a0964fefe3ba26942e1b0669af1afb55ef3344bc9d4fc4c401",
|
||||
"1 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"STRICTENC",
|
||||
"OK",
|
||||
"1-of-2 with the second 1 hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022079c7824d6c868e0e1a273484e28c2654a27d043c8a27f49f52cb72efed0759090220452bbbf7089574fa082095a4fc1b3a16bafcf97a3a34d745fafc922cce66b27201",
|
||||
"1 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 2 CHECKMULTISIG",
|
||||
"STRICTENC",
|
||||
"PUBKEYTYPE",
|
||||
"1-of-2 with the first 1 hybrid pubkey"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402206177d513ec2cda444c021a1f4f656fc4c72ba108ae063e157eb86dc3575784940220666fc66702815d0e5413bb9b1df22aed44f5f1efb8b99d41dd5dc9a5be6d205205",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK with undefined hashtype but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402206177d513ec2cda444c021a1f4f656fc4c72ba108ae063e157eb86dc3575784940220666fc66702815d0e5413bb9b1df22aed44f5f1efb8b99d41dd5dc9a5be6d205205",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG",
|
||||
"STRICTENC",
|
||||
"SIG_HASHTYPE",
|
||||
"P2PK with undefined hashtype"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402207409b5b320296e5e2136a7b281a7f803028ca4ca44e2b83eebd46932677725de02202d4eea1c8d3c98e6f42614f54764e6e5e6542e213eb4d079737e9a8b6e9812ec05",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK NOT with invalid sig and undefined hashtype but no STRICTENC"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402207409b5b320296e5e2136a7b281a7f803028ca4ca44e2b83eebd46932677725de02202d4eea1c8d3c98e6f42614f54764e6e5e6542e213eb4d079737e9a8b6e9812ec05",
|
||||
"0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT",
|
||||
"STRICTENC",
|
||||
"SIG_HASHTYPE",
|
||||
"P2PK NOT with invalid sig and undefined hashtype"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901 DUP",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"",
|
||||
"OK",
|
||||
"2-of-2 with two identical keys and sigs pushed using OP_DUP but no SIGPUSHONLY"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901 DUP",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"SIGPUSHONLY",
|
||||
"SIG_PUSHONLY",
|
||||
"2-of-2 with two identical keys and sigs pushed using OP_DUP"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022018a2a81a93add5cb5f5da76305718e4ea66045ec4888b28d84cb22fae7f4645b02201e6daa5ed5d2e4b2b2027cf7ffd43d8d9844dd49f74ef86899ec8e669dfd39aa01 NOP8 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
|
||||
"HASH160 0x14 0x215640c2f72f0d16b4eced26762035a42ffed39a EQUAL",
|
||||
"",
|
||||
"OK",
|
||||
"P2SH(P2PK) with non-push scriptSig but no P2SH or SIGPUSHONLY"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb125101 NOP8",
|
||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||
"",
|
||||
"OK",
|
||||
"P2PK with non-push scriptSig but with P2SH validation"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022018a2a81a93add5cb5f5da76305718e4ea66045ec4888b28d84cb22fae7f4645b02201e6daa5ed5d2e4b2b2027cf7ffd43d8d9844dd49f74ef86899ec8e669dfd39aa01 NOP8 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
|
||||
"HASH160 0x14 0x215640c2f72f0d16b4eced26762035a42ffed39a EQUAL",
|
||||
"P2SH",
|
||||
"SIG_PUSHONLY",
|
||||
"P2SH(P2PK) with non-push scriptSig but no SIGPUSHONLY"
|
||||
],
|
||||
[
|
||||
"0x47 0x3044022018a2a81a93add5cb5f5da76305718e4ea66045ec4888b28d84cb22fae7f4645b02201e6daa5ed5d2e4b2b2027cf7ffd43d8d9844dd49f74ef86899ec8e669dfd39aa01 NOP8 0x23 0x2103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640ac",
|
||||
"HASH160 0x14 0x215640c2f72f0d16b4eced26762035a42ffed39a EQUAL",
|
||||
"SIGPUSHONLY",
|
||||
"SIG_PUSHONLY",
|
||||
"P2SH(P2PK) with non-push scriptSig but not P2SH"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901 0x47 0x304402200abeb4bd07f84222f474aed558cfbdfc0b4e96cde3c2935ba7098b1ff0bd74c302204a04c1ca67b2a20abee210cf9a21023edccbbf8024b988812634233115c6b73901",
|
||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 2 CHECKMULTISIG",
|
||||
"SIGPUSHONLY",
|
||||
"OK",
|
||||
"2-of-2 with two identical keys and sigs pushed"
|
||||
],
|
||||
[
|
||||
"11 0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
|
||||
"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"P2SH",
|
||||
"OK",
|
||||
"P2PK with unnecessary input but no CLEANSTACK"
|
||||
],
|
||||
[
|
||||
"11 0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
|
||||
"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
|
||||
"CLEANSTACK,P2SH",
|
||||
"CLEANSTACK",
|
||||
"P2PK with unnecessary input"
|
||||
],
|
||||
[
|
||||
"11 0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
|
||||
"HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL",
|
||||
"P2SH",
|
||||
"OK",
|
||||
"P2SH with unnecessary input but no CLEANSTACK"
|
||||
],
|
||||
[
|
||||
"11 0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
|
||||
"HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL",
|
||||
"CLEANSTACK,P2SH",
|
||||
"CLEANSTACK",
|
||||
"P2SH with unnecessary input"
|
||||
],
|
||||
[
|
||||
"0x47 0x304402202f7505132be14872581f35d74b759212d9da40482653f1ffa3116c3294a4a51702206adbf347a2240ca41c66522b1a22a41693610b76a8e7770645dc721d1635854f01 0x43 0x410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8ac",
|
||||
"HASH160 0x14 0x31edc23bdafda4639e669f89ad6b2318dd79d032 EQUAL",
|
||||
"CLEANSTACK,P2SH",
|
||||
"OK",
|
||||
"P2SH with CLEANSTACK"
|
||||
]
|
||||
]
|
@ -5,7 +5,6 @@
|
||||
package txscript
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
@ -17,7 +16,6 @@ import (
|
||||
|
||||
"github.com/daglabs/btcd/dagconfig/daghash"
|
||||
"github.com/daglabs/btcd/wire"
|
||||
"github.com/daglabs/btcutil"
|
||||
)
|
||||
|
||||
// scriptTestName returns a descriptive test name for the given reference script
|
||||
@ -403,344 +401,3 @@ func TestScripts(t *testing.T) {
|
||||
func testVecF64ToUint32(f float64) uint32 {
|
||||
return uint32(int32(f))
|
||||
}
|
||||
|
||||
// TestTxInvalidTests ensures all of the tests in tx_invalid.json fail as
|
||||
// expected.
|
||||
func TestTxInvalidTests(t *testing.T) {
|
||||
return //TODO: Rebuild all transactions in tx_invalid.json according to the new data structure (uint64 for locktime and sequence)
|
||||
file, err := ioutil.ReadFile("data/tx_invalid.json")
|
||||
if err != nil {
|
||||
t.Fatalf("TestTxInvalidTests: %v\n", err)
|
||||
}
|
||||
|
||||
var tests [][]interface{}
|
||||
err = json.Unmarshal(file, &tests)
|
||||
if err != nil {
|
||||
t.Fatalf("TestTxInvalidTests couldn't Unmarshal: %v\n", err)
|
||||
}
|
||||
|
||||
// form is either:
|
||||
// ["this is a comment "]
|
||||
// or:
|
||||
// [[[previous hash, previous index, previous scriptPubKey]...,]
|
||||
// serializedTransaction, verifyFlags]
|
||||
testloop:
|
||||
for i, test := range tests {
|
||||
inputs, ok := test[0].([]interface{})
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
if len(test) != 3 {
|
||||
t.Errorf("bad test (bad length) %d: %v", i, test)
|
||||
continue
|
||||
|
||||
}
|
||||
serializedhex, ok := test[1].(string)
|
||||
if !ok {
|
||||
t.Errorf("bad test (arg 2 not string) %d: %v", i, test)
|
||||
continue
|
||||
}
|
||||
serializedTx, err := hex.DecodeString(serializedhex)
|
||||
if err != nil {
|
||||
t.Errorf("bad test (arg 2 not hex %v) %d: %v", err, i,
|
||||
test)
|
||||
continue
|
||||
}
|
||||
|
||||
tx, err := btcutil.NewTxFromBytes(serializedTx)
|
||||
if err != nil {
|
||||
t.Errorf("bad test (arg 2 not msgtx %v) %d: %v", err,
|
||||
i, test)
|
||||
continue
|
||||
}
|
||||
|
||||
verifyFlags, ok := test[2].(string)
|
||||
if !ok {
|
||||
t.Errorf("bad test (arg 3 not string) %d: %v", i, test)
|
||||
continue
|
||||
}
|
||||
|
||||
flags, err := parseScriptFlags(verifyFlags)
|
||||
if err != nil {
|
||||
t.Errorf("bad test %d: %v", i, err)
|
||||
continue
|
||||
}
|
||||
|
||||
prevOuts := make(map[wire.OutPoint][]byte)
|
||||
for j, iinput := range inputs {
|
||||
input, ok := iinput.([]interface{})
|
||||
if !ok {
|
||||
t.Errorf("bad test (%dth input not array)"+
|
||||
"%d: %v", j, i, test)
|
||||
continue testloop
|
||||
}
|
||||
|
||||
if len(input) != 3 {
|
||||
t.Errorf("bad test (%dth input wrong length)"+
|
||||
"%d: %v", j, i, test)
|
||||
continue testloop
|
||||
}
|
||||
|
||||
previoustx, ok := input[0].(string)
|
||||
if !ok {
|
||||
t.Errorf("bad test (%dth input hash not string)"+
|
||||
"%d: %v", j, i, test)
|
||||
continue testloop
|
||||
}
|
||||
|
||||
prevhash, err := daghash.NewHashFromStr(previoustx)
|
||||
if err != nil {
|
||||
t.Errorf("bad test (%dth input hash not hash %v)"+
|
||||
"%d: %v", j, err, i, test)
|
||||
continue testloop
|
||||
}
|
||||
|
||||
idxf, ok := input[1].(float64)
|
||||
if !ok {
|
||||
t.Errorf("bad test (%dth input idx not number)"+
|
||||
"%d: %v", j, i, test)
|
||||
continue testloop
|
||||
}
|
||||
idx := testVecF64ToUint32(idxf)
|
||||
|
||||
oscript, ok := input[2].(string)
|
||||
if !ok {
|
||||
t.Errorf("bad test (%dth input script not "+
|
||||
"string) %d: %v", j, i, test)
|
||||
continue testloop
|
||||
}
|
||||
|
||||
script, err := parseShortForm(oscript)
|
||||
if err != nil {
|
||||
t.Errorf("bad test (%dth input script doesn't "+
|
||||
"parse %v) %d: %v", j, err, i, test)
|
||||
continue testloop
|
||||
}
|
||||
|
||||
prevOuts[*wire.NewOutPoint(prevhash, idx)] = script
|
||||
}
|
||||
|
||||
for k, txin := range tx.MsgTx().TxIn {
|
||||
pkScript, ok := prevOuts[txin.PreviousOutPoint]
|
||||
if !ok {
|
||||
t.Errorf("bad test (missing %dth input) %d:%v",
|
||||
k, i, test)
|
||||
continue testloop
|
||||
}
|
||||
// These are meant to fail, so as soon as the first
|
||||
// input fails the transaction has failed. (some of the
|
||||
// test txns have good inputs, too..
|
||||
vm, err := NewEngine(pkScript, tx.MsgTx(), k, flags, nil)
|
||||
if err != nil {
|
||||
continue testloop
|
||||
}
|
||||
|
||||
err = vm.Execute()
|
||||
if err != nil {
|
||||
continue testloop
|
||||
}
|
||||
|
||||
}
|
||||
t.Errorf("test (%d:%v) succeeded when should fail",
|
||||
i, test)
|
||||
}
|
||||
}
|
||||
|
||||
// TestTxValidTests ensures all of the tests in tx_valid.json pass as expected.
|
||||
func TestTxValidTests(t *testing.T) {
|
||||
return //TODO: Rebuild all transactions in tx_valid.json according to the new data structure (uint64 for locktime and sequence)
|
||||
file, err := ioutil.ReadFile("data/tx_valid.json")
|
||||
if err != nil {
|
||||
t.Fatalf("TestTxValidTests: %v\n", err)
|
||||
}
|
||||
|
||||
var tests [][]interface{}
|
||||
err = json.Unmarshal(file, &tests)
|
||||
if err != nil {
|
||||
t.Fatalf("TestTxValidTests couldn't Unmarshal: %v\n", err)
|
||||
}
|
||||
|
||||
// form is either:
|
||||
// ["this is a comment "]
|
||||
// or:
|
||||
// [[[previous hash, previous index, previous scriptPubKey]...,]
|
||||
// serializedTransaction, verifyFlags]
|
||||
testloop:
|
||||
for i, test := range tests {
|
||||
inputs, ok := test[0].([]interface{})
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
if len(test) != 3 {
|
||||
t.Errorf("bad test (bad length) %d: %v", i, test)
|
||||
continue
|
||||
}
|
||||
serializedhex, ok := test[1].(string)
|
||||
if !ok {
|
||||
t.Errorf("bad test (arg 2 not string) %d: %v", i, test)
|
||||
continue
|
||||
}
|
||||
serializedTx, err := hex.DecodeString(serializedhex)
|
||||
if err != nil {
|
||||
t.Errorf("bad test (arg 2 not hex %v) %d: %v", err, i,
|
||||
test)
|
||||
continue
|
||||
}
|
||||
|
||||
tx, err := btcutil.NewTxFromBytes(serializedTx)
|
||||
if err != nil {
|
||||
t.Errorf("bad test (arg 2 not msgtx %v) %d: %v", err,
|
||||
i, test)
|
||||
continue
|
||||
}
|
||||
|
||||
verifyFlags, ok := test[2].(string)
|
||||
if !ok {
|
||||
t.Errorf("bad test (arg 3 not string) %d: %v", i, test)
|
||||
continue
|
||||
}
|
||||
|
||||
flags, err := parseScriptFlags(verifyFlags)
|
||||
if err != nil {
|
||||
t.Errorf("bad test %d: %v", i, err)
|
||||
continue
|
||||
}
|
||||
|
||||
prevOuts := make(map[wire.OutPoint][]byte)
|
||||
for j, iinput := range inputs {
|
||||
input, ok := iinput.([]interface{})
|
||||
if !ok {
|
||||
t.Errorf("bad test (%dth input not array)"+
|
||||
"%d: %v", j, i, test)
|
||||
continue
|
||||
}
|
||||
|
||||
if len(input) != 3 {
|
||||
t.Errorf("bad test (%dth input wrong length)"+
|
||||
"%d: %v", j, i, test)
|
||||
continue
|
||||
}
|
||||
|
||||
previoustx, ok := input[0].(string)
|
||||
if !ok {
|
||||
t.Errorf("bad test (%dth input hash not string)"+
|
||||
"%d: %v", j, i, test)
|
||||
continue
|
||||
}
|
||||
|
||||
prevhash, err := daghash.NewHashFromStr(previoustx)
|
||||
if err != nil {
|
||||
t.Errorf("bad test (%dth input hash not hash %v)"+
|
||||
"%d: %v", j, err, i, test)
|
||||
continue
|
||||
}
|
||||
|
||||
idxf, ok := input[1].(float64)
|
||||
if !ok {
|
||||
t.Errorf("bad test (%dth input idx not number)"+
|
||||
"%d: %v", j, i, test)
|
||||
continue
|
||||
}
|
||||
idx := testVecF64ToUint32(idxf)
|
||||
|
||||
oscript, ok := input[2].(string)
|
||||
if !ok {
|
||||
t.Errorf("bad test (%dth input script not "+
|
||||
"string) %d: %v", j, i, test)
|
||||
continue
|
||||
}
|
||||
|
||||
script, err := parseShortForm(oscript)
|
||||
if err != nil {
|
||||
t.Errorf("bad test (%dth input script doesn't "+
|
||||
"parse %v) %d: %v", j, err, i, test)
|
||||
continue
|
||||
}
|
||||
|
||||
prevOuts[*wire.NewOutPoint(prevhash, idx)] = script
|
||||
}
|
||||
|
||||
for k, txin := range tx.MsgTx().TxIn {
|
||||
pkScript, ok := prevOuts[txin.PreviousOutPoint]
|
||||
if !ok {
|
||||
t.Errorf("bad test (missing %dth input) %d:%v",
|
||||
k, i, test)
|
||||
continue testloop
|
||||
}
|
||||
vm, err := NewEngine(pkScript, tx.MsgTx(), k, flags, nil)
|
||||
if err != nil {
|
||||
t.Errorf("test (%d:%v:%d) failed to create "+
|
||||
"script: %v", i, test, k, err)
|
||||
continue
|
||||
}
|
||||
|
||||
err = vm.Execute()
|
||||
if err != nil {
|
||||
t.Errorf("test (%d:%v:%d) failed to execute: "+
|
||||
"%v", i, test, k, err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestCalcSignatureHash runs the Bitcoin Core signature hash calculation tests
|
||||
// in sighash.json.
|
||||
// https://github.com/bitcoin/bitcoin/blob/master/src/test/data/sighash.json
|
||||
func TestCalcSignatureHash(t *testing.T) {
|
||||
return //TODO: Rebuild all transactions in sighash.json according to the new data structure (uint64 for locktime and sequence)
|
||||
file, err := ioutil.ReadFile("data/sighash.json")
|
||||
if err != nil {
|
||||
t.Fatalf("TestCalcSignatureHash: %v\n", err)
|
||||
}
|
||||
|
||||
var tests [][]interface{}
|
||||
err = json.Unmarshal(file, &tests)
|
||||
if err != nil {
|
||||
t.Fatalf("TestCalcSignatureHash couldn't Unmarshal: %v\n",
|
||||
err)
|
||||
}
|
||||
|
||||
for i, test := range tests {
|
||||
if i == 0 {
|
||||
// Skip first line -- contains comments only.
|
||||
continue
|
||||
}
|
||||
if len(test) != 5 {
|
||||
t.Fatalf("TestCalcSignatureHash: Test #%d has "+
|
||||
"wrong length.", i)
|
||||
}
|
||||
var tx wire.MsgTx
|
||||
rawTx, _ := hex.DecodeString(test[0].(string))
|
||||
err := tx.Deserialize(bytes.NewReader(rawTx))
|
||||
if err != nil {
|
||||
t.Errorf("TestCalcSignatureHash failed test #%d: "+
|
||||
"Failed to parse transaction: %v", i, err)
|
||||
continue
|
||||
}
|
||||
|
||||
script, _ := hex.DecodeString(test[1].(string))
|
||||
parsedScript, err := parseScript(script)
|
||||
if err != nil {
|
||||
t.Errorf("TestCalcSignatureHash failed test #%d: "+
|
||||
"Failed to parse script: %v", i, err)
|
||||
continue
|
||||
}
|
||||
|
||||
hashType := SigHashType(testVecF64ToUint32(test[3].(float64)))
|
||||
hash, err := calcSignatureHash(parsedScript, hashType, &tx,
|
||||
int(test[2].(float64)))
|
||||
if err != nil {
|
||||
t.Errorf("TestCalcSignatureHash failed test #%d: "+
|
||||
"Failed calculating signature hash: %s", i, err)
|
||||
}
|
||||
|
||||
expectedHash, _ := daghash.NewHashFromStr(test[4].(string))
|
||||
if !bytes.Equal(hash, expectedHash[:]) {
|
||||
t.Errorf("TestCalcSignatureHash failed test #%d: "+
|
||||
"Signature hash mismatch.", i)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -202,7 +202,7 @@ func TestBlockWireErrors(t *testing.T) {
|
||||
// version.
|
||||
pver := uint32(60002)
|
||||
|
||||
tests := []struct { //TODO: need to recheck this part (what are the correct max values)
|
||||
tests := []struct {
|
||||
in *MsgBlock // Value to encode
|
||||
buf []byte // Wire encoding
|
||||
pver uint32 // Protocol version for wire encoding
|
||||
|
@ -432,7 +432,7 @@ func (msg *MsgTx) BtcDecode(r io.Reader, pver uint32) error {
|
||||
}
|
||||
|
||||
lockTime, err := binarySerializer.Uint64(r, littleEndian)
|
||||
msg.LockTime = uint64(lockTime)
|
||||
msg.LockTime = lockTime
|
||||
if err != nil {
|
||||
returnScriptBuffers()
|
||||
return err
|
||||
@ -728,7 +728,7 @@ func writeTxIn(w io.Writer, pver uint32, version int32, ti *TxIn) error {
|
||||
return err
|
||||
}
|
||||
|
||||
return binarySerializer.PutUint64(w, littleEndian, uint64(ti.Sequence))
|
||||
return binarySerializer.PutUint64(w, littleEndian, ti.Sequence)
|
||||
}
|
||||
|
||||
// readTxOut reads the next sequence of bytes from r as a transaction output
|
||||
|
Loading…
x
Reference in New Issue
Block a user