看下这个,兴许有帮助:
https://bitcointalk.org/index.php?topic=1796142.0
https://bitcoin.stackexchange.com/questions/3374/how-to-redeem-a-basic-tx
https://blog.csdn.net/u014633283/article/details/88601341
http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html
https://chainquery.com/bitcoin-cli/getrawtransaction
http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html
# -*- coding:utf-8 -*-
'''
Created on 2018年12月14日
gen wallet
@author: user
'''
import os, sys
import logging
# from importlib import reload
reload(sys)
# sys.setdefaultencoding('utf8')
PY_GEN_PATH = "D:/download/pygen/bitauto".replace('/', os.sep)
TABLE_NUM = 100
logger = logging.getLogger('parse_input')
LOG_FILE = 'parse_input.log'
# LOG_FORMATTER = '%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)d - %(message)s'
LOG_FORMATTER = '%(message)s'
def config_logger():
logger.setLevel(logging.DEBUG)
if not os.path.exists(PY_GEN_PATH):
logger.info("文件夹不存在,已自行创建")
os.makedirs(PY_GEN_PATH, 777)
handler = logging.FileHandler(os.path.join(PY_GEN_PATH, LOG_FILE))
handler.setLevel(logging.DEBUG)
fmter = logging.Formatter(LOG_FORMATTER)
handler.setFormatter(fmter)
logger.addHandler(handler)
# 控制台打印
console = logging.StreamHandler()
console.setLevel(level=logging.DEBUG) # 设置为INFO级别
console.setFormatter(fmter)
logger.addHandler(console)
def inputParse_detail(raw_tx):
# 每个字段占用的字节数
version_size = 4
input_count = 1
input_prev_out_hash = 32
input_prev_out_idx = 4
input_script_length = 1
input_scriptsig_op_pushdata47 = 1
input_scriptsig_sig = 70
input_scriptsig_hashtype = 1
input_scriptsig_op_pushdata21 = 1
# 未知,动态变化
# input_scriptsig_pubk = 'unknown'
input_sequence = 4
output_count = 1
output_value = 8
output_script_length = 1
output_scriptpubkey_op_dup = 1
output_scriptpubkey_op_hash160 = 1
# output_scriptpubkey_pubkhash = 1
output_scriptpubkey_op_equalverify = 1
output_scriptpubkey_op_checksig = 1
block_lock_time = 4
cur = 0
value_version = raw_tx[cur:2 * version_size]
print("version:{}".format(str(value_version)))
cur = cur + 2 * version_size
value_input_count = raw_tx[cur:cur + 2 * input_count]
print("input count:{}".format(str(value_input_count)))
input_num = int(value_input_count)
cur = cur + 2 * input_count
cur_input = 0
while(cur_input < input_num):
value_input_prev_out_hash = raw_tx[cur:cur + 2 * input_prev_out_hash]
print("input:{} | previous output hash:{}".format(str(cur_input), value_input_prev_out_hash))
cur = cur + 2 * input_prev_out_hash
value_input_prev_out_idx = raw_tx[cur:cur + 2 * input_prev_out_idx]
# print(value_input_prev_out_idx)
print("input:{} | previous output index:{}".format(str(cur_input), value_input_prev_out_idx))
cur = cur + 2 * input_prev_out_idx
value_input_script_length = raw_tx[cur:cur + 2 * input_script_length]
# print(value_input_script_length)
print("input:{} | script length:{}".format(str(cur_input), str(value_input_script_length)))
cur = cur + 2 * input_script_length
value_input_scriptsig_op_pushdata47 = raw_tx[cur:cur + 2 * input_scriptsig_op_pushdata47]
# print(value_input_scriptsig_op_pushdata47)
print("input:{} | scriptSig op_pushdata47:{}".format(str(cur_input), str(value_input_scriptsig_op_pushdata47)))
cur = cur + 2 * input_scriptsig_op_pushdata47
value_input_scriptsig_sig = raw_tx[cur:cur + 2 * input_scriptsig_sig]
#print(value_input_scriptsig_sig)
print("input:{} | scriptSig sig:{}".format(str(cur_input), str(value_input_scriptsig_sig)))
cur = cur + 2 * input_scriptsig_sig
value_input_scriptsig_hashtype = raw_tx[cur:cur + 2 * input_scriptsig_hashtype]
# print(value_input_scriptsig_hashtype)
print("input:{} | scriptSig hashtype:{}".format(str(cur_input), str(value_input_scriptsig_hashtype)))
cur = cur + 2 * input_scriptsig_hashtype
value_input_scriptsig_op_pushdata21 = raw_tx[cur:cur + 2 * input_scriptsig_op_pushdata21]
#print(value_input_scriptsig_op_pushdata21)
print("input:{} | scriptSig op_pushdata21:{}".format(str(cur_input), str(value_input_scriptsig_op_pushdata21)))
cur = cur + 2 * input_scriptsig_op_pushdata21
input_scriptsig_pubk_len = int(value_input_script_length, 16) - input_scriptsig_op_pushdata47 - input_scriptsig_sig - input_scriptsig_hashtype - input_scriptsig_op_pushdata21
# print('length:' + str(input_scriptsig_pubk_len))
value_input_scriptsig_pubk = raw_tx[cur: cur + 2 * input_scriptsig_pubk_len]
# print(value_input_scriptsig_pubk)
print("input:{} | scriptSig PubK:{}".format(str(cur_input), str(value_input_scriptsig_pubk)))
cur = cur + 2 * input_scriptsig_pubk_len
value_sequence = raw_tx[cur:cur + 2 * input_sequence]
# print(value_sequence)
print("input:{} | sequence:{}".format(str(cur_input), str(value_sequence)))
cur = cur + 2 * input_sequence
cur_input = cur_input + 1
value_output_count = raw_tx[cur:cur + 2 * output_count]
# print(str(value_output_count))
print('output count:{}'.format(str(value_output_count)))
output_num = int(value_output_count)
cur = cur + 2 * output_count
cur_output = 0
while(cur_output < int(output_num)):
value_output_value = raw_tx[cur:cur + 2 * output_value]
# print(value_output_value)
print("output:{} | value:{}".format(str(cur_output), str(value_output_value)))
cur = cur + 2 * output_value
value_output_script_length = raw_tx[cur:cur + 2 * output_script_length]
# print(value_output_script_length)
print("output:{} | script length:{}".format(str(cur_output), str(value_output_script_length)))
cur = cur + 2 * output_script_length
value_output_scriptpubkey_op_dup = raw_tx[cur:cur + 2 * output_scriptpubkey_op_dup]
# print(value_output_scriptpubkey_op_dup)
print("output:{} | scriptPubKey op_dup:{}".format(str(cur_output), str(value_output_scriptpubkey_op_dup)))
cur = cur + 2 * output_scriptpubkey_op_dup
value_output_scriptpubkey_op_hash160 = raw_tx[cur:cur + 2 * output_scriptpubkey_op_hash160]
# print(value_output_scriptpubkey_op_hash160)
print("output:{} | scriptPubKey op_hash160:{}".format(str(cur_output), str(value_output_scriptpubkey_op_hash160)))
cur = cur + 2 * output_scriptpubkey_op_hash160
output_scriptpubkey_pubkhash_len = int(value_output_script_length, 16) - output_scriptpubkey_op_dup - output_scriptpubkey_op_hash160 - output_scriptpubkey_op_equalverify - output_scriptpubkey_op_checksig
# print('input_scriptsig_pubk_len length:' + str(input_scriptsig_pubk_len))
# value_input_scriptsig_pubk = raw_tx[cur: cur + 2 * input_scriptsig_pubk_len]
value_output_scriptpubkey_pubkhash = raw_tx[cur:cur + 2 * output_scriptpubkey_pubkhash_len]
# print(value_output_scriptpubkey_pubkhash)
print("output:{} | scriptPubKey PubKeyHash:{}".format(str(cur_output), str(value_output_scriptpubkey_pubkhash)))
cur = cur + 2 * output_scriptpubkey_pubkhash_len
value_output_scriptpubkey_op_equalverify = raw_tx[cur:cur + 2 * output_scriptpubkey_op_equalverify]
# print(value_output_scriptpubkey_op_equalverify)
print("output:{} | scriptPubKey op_equalverify:{}".format(str(cur_output), str(value_output_scriptpubkey_op_equalverify)))
cur = cur + 2 * output_scriptpubkey_op_equalverify
value_output_scriptpubkey_op_checksig = raw_tx[cur:cur + 2 * output_scriptpubkey_op_checksig]
# print(value_output_scriptpubkey_op_checksig)
print("output:{} | scriptPubKey op_checksig:{}".format(str(cur_output), str(value_output_scriptpubkey_op_checksig)))
cur = cur + 2 * output_scriptpubkey_op_checksig
cur_output = cur_output + 1
# cur = cur + 2 * output_scriptpubkey_op_checksig
value_block_lock_time = raw_tx[cur:cur + 2 * block_lock_time]
# print(value_block_lock_time)
print('block lock time:{}'.format(str(value_block_lock_time)))
def inputParse(raw_tx):
# 每个字段占用的字节数
version_size = 4
input_count = 1
input_prev_out_hash = 32
input_prev_out_idx = 4
input_script_length = 1
input_scriptsig_op_pushdata47 = 1
input_scriptsig_sig = 70
input_scriptsig_hashtype = 1
input_scriptsig_op_pushdata21 = 1
# 未知,动态变化
# input_scriptsig_pubk = 'unknown'
input_sequence = 4
output_count = 1
output_value = 8
output_script_length = 1
output_scriptpubkey_op_dup = 1
output_scriptpubkey_op_hash160 = 1
# output_scriptpubkey_pubkhash = 1
output_scriptpubkey_op_equalverify = 1
output_scriptpubkey_op_checksig = 1
block_lock_time = 4
cur = 0
value_version = raw_tx[cur:2 * version_size]
print("{}".format(str(value_version)))
cur = cur + 2 * version_size
value_input_count = raw_tx[cur:cur + 2 * input_count]
print("{}".format(str(value_input_count)))
input_num = int(value_input_count)
cur = cur + 2 * input_count
cur_input = 0
while(cur_input < input_num):
value_input_prev_out_hash = raw_tx[cur:cur + 2 * input_prev_out_hash]
print("{}".format(value_input_prev_out_hash))
cur = cur + 2 * input_prev_out_hash
value_input_prev_out_idx = raw_tx[cur:cur + 2 * input_prev_out_idx]
# print(value_input_prev_out_idx)
print("{}".format(value_input_prev_out_idx))
cur = cur + 2 * input_prev_out_idx
value_input_script_length = raw_tx[cur:cur + 2 * input_script_length]
# print(value_input_script_length)
print("{}".format(str(value_input_script_length)))
cur = cur + 2 * input_script_length
value_input_scriptsig_op_pushdata47 = raw_tx[cur:cur + 2 * input_scriptsig_op_pushdata47]
# print(value_input_scriptsig_op_pushdata47)
print("{}".format(str(value_input_scriptsig_op_pushdata47)))
cur = cur + 2 * input_scriptsig_op_pushdata47
value_input_scriptsig_sig = raw_tx[cur:cur + 2 * input_scriptsig_sig]
print(value_input_scriptsig_sig)
print("{}".format(str(value_input_scriptsig_sig)))
cur = cur + 2 * input_scriptsig_sig
value_input_scriptsig_hashtype = raw_tx[cur:cur + 2 * input_scriptsig_hashtype]
# print(value_input_scriptsig_hashtype)
print("{}".format(str(value_input_scriptsig_hashtype)))
cur = cur + 2 * input_scriptsig_hashtype
value_input_scriptsig_op_pushdata21 = raw_tx[cur:cur + 2 * input_scriptsig_op_pushdata21]
print(value_input_scriptsig_op_pushdata21)
print("{}".format(str(value_input_scriptsig_op_pushdata21)))
cur = cur + 2 * input_scriptsig_op_pushdata21
input_scriptsig_pubk_len = int(value_input_script_length, 16) - input_scriptsig_op_pushdata47 - input_scriptsig_sig - input_scriptsig_hashtype - input_scriptsig_op_pushdata21
# print('length:' + str(input_scriptsig_pubk_len))
value_input_scriptsig_pubk = raw_tx[cur: cur + 2 * input_scriptsig_pubk_len]
# print(value_input_scriptsig_pubk)
print("{}".format(str(value_input_scriptsig_pubk)))
cur = cur + 2 * input_scriptsig_pubk_len
value_sequence = raw_tx[cur:cur + 2 * input_sequence]
# print(value_sequence)
print("{}".format(str(value_sequence)))
cur = cur + 2 * input_sequence
cur_input = cur_input + 1
value_output_count = raw_tx[cur:cur + 2 * output_count]
# print(str(value_output_count))
print('{}'.format(str(value_output_count)))
output_num = int(value_output_count)
cur = cur + 2 * output_count
cur_output = 0
while(cur_output < int(output_num)):
value_output_value = raw_tx[cur:cur + 2 * output_value]
# print(value_output_value)
print("{}".format(str(value_output_value)))
cur = cur + 2 * output_value
value_output_script_length = raw_tx[cur:cur + 2 * output_script_length]
# print(value_output_script_length)
print("{}".format(str(value_output_script_length)))
cur = cur + 2 * output_script_length
value_output_scriptpubkey_op_dup = raw_tx[cur:cur + 2 * output_scriptpubkey_op_dup]
# print(value_output_scriptpubkey_op_dup)
print("{}".format(str(value_output_scriptpubkey_op_dup)))
cur = cur + 2 * output_scriptpubkey_op_dup
value_output_scriptpubkey_op_hash160 = raw_tx[cur:cur + 2 * output_scriptpubkey_op_hash160]
# print(value_output_scriptpubkey_op_hash160)
print("{}".format(str(value_output_scriptpubkey_op_hash160)))
cur = cur + 2 * output_scriptpubkey_op_hash160
output_scriptpubkey_pubkhash_len = int(value_output_script_length, 16) - output_scriptpubkey_op_dup - output_scriptpubkey_op_hash160 - output_scriptpubkey_op_equalverify - output_scriptpubkey_op_checksig
# print('input_scriptsig_pubk_len length:' + str(input_scriptsig_pubk_len))
# value_input_scriptsig_pubk = raw_tx[cur: cur + 2 * input_scriptsig_pubk_len]
value_output_scriptpubkey_pubkhash = raw_tx[cur:cur + 2 * output_scriptpubkey_pubkhash_len]
# print(value_output_scriptpubkey_pubkhash)
print("{}".format(str(value_output_scriptpubkey_pubkhash)))
cur = cur + 2 * output_scriptpubkey_pubkhash_len
value_output_scriptpubkey_op_equalverify = raw_tx[cur:cur + 2 * output_scriptpubkey_op_equalverify]
# print(value_output_scriptpubkey_op_equalverify)
print("{}".format(str(value_output_scriptpubkey_op_equalverify)))
cur = cur + 2 * output_scriptpubkey_op_equalverify
value_output_scriptpubkey_op_checksig = raw_tx[cur:cur + 2 * output_scriptpubkey_op_checksig]
# print(value_output_scriptpubkey_op_checksig)
print("{}".format(str(value_output_scriptpubkey_op_checksig)))
cur = cur + 2 * output_scriptpubkey_op_checksig
cur_output = cur_output + 1
# cur = cur + 2 * output_scriptpubkey_op_checksig
value_block_lock_time = raw_tx[cur:cur + 2 * block_lock_time]
# print(value_block_lock_time)
print('{}'.format(str(value_block_lock_time)))
def main(raw_tx):
inputParse_detail(raw_tx)
# inputParse(raw_tx)
if __name__ == '__main__':
config_logger()
tx = '0100000002f64c603e2f9f4daf70c2f4252b2dcdb07cc0192b7238bc9c3dacbae555baf701010000008a4730440220d47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad1022044e1ff2dfd8102cf7a47c21d5c9fd5701610d04953c6836596b4fe9dd2f53e3e014104dbd0c61532279cf72981c3584fc32216e0127699635c2789f549e0730c059b81ae133016a69c21e23f1859a95f06d52b7bf149a8f2fe4e8535c8a829b449c5ffffffffff29f841db2ba0cafa3a2a893cd1d8c3e962e8678fc61ebe89f415a46bc8d9854a010000008a4730440220d47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad102209a5f1c75e461d7ceb1cf3cab9013eb2dc85b6d0da8c3c6e27e3a5a5b3faa5bab014104dbd0c61532279cf72981c3584fc32216e0127699635c2789f549e0730c059b81ae133016a69c21e23f1859a95f06d52b7bf149a8f2fe4e8535c8a829b449c5ffffffffff01a0860100000000001976a91470792fb74a5df745bac07df6fe020f871cbb293b88ac00000000'
# tx = '010000000196c472ac5cbc3cf6acae1493d4d32f119f39ec9e440176b2fb7de6e6024b9f21010000006a473044022034519a85fb5299e180865dda936c5d53edabaaf6d15cd1740aac9878b76238e002207345fcb5a62deeb8d9d80e5b412bd24d09151c2008b7fef10eb5f13e484d1e0d01210207c9ece04a9b5ef3ff441f3aad6bb63e323c05047a820ab45ebbe61385aa7446ffffffff0140420f00000000001976a914053496c1ea3d54d649ed54de490fda342522244088ac00000000'
#tx = '01000000000101e361e1462e4b198583d25fc4a8188666ded4e727999b35136152659ffde3fe670500000000ffffffff0228dd5e000000000017a91469f37566761ed3f6f1b57f9f358718561fb8a60e87b476a72000000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d04004730440220780d0bdf87f7647acda1b36e4db2070a147af7a88a60b56c9d7f774b31c3cd5e02202d597dd51ab610784aeb9193fd683534dc2eda71c00ec4796f8124da786251460147304402200b14877c86aa7e0a2138a809bdd3afecc82f72a20cabd5b3530dd49bbff247b6022019919c07445f1e15c6b7bee3a7307d4e6d1044709160130dca18230eff156533016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae00000000'
main(tx)
testnet_tx = '010000000196c472ac5cbc3cf6acae1493d4d32f119f39ec9e440176b2fb7de6e6024b9f21010000006a473044022034519a85fb5299e180865dda936c5d53edabaaf6d15cd1740aac9878b76238e002207345fcb5a62deeb8d9d80e5b412bd24d09151c2008b7fef10eb5f13e484d1e0d01210207c9ece04a9b5ef3ff441f3aad6bb63e323c05047a820ab45ebbe61385aa7446ffffffff0140420f00000000001976a914053496c1ea3d54d649ed54de490fda342522244088ac00000000'
# main(testnet_tx)