parse-input

看下这个,兴许有帮助:

https://bitcointalk.org/index.php?topic=1796142.0

https://bitcoin.stackexchange.com/questions/32628/redeeming-a-raw-transaction-step-by-step-example-required/32695#32695


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

https://gist.githubusercontent.com/shirriff/6f7ca9aadf0db855b383/raw/4599bd43867e18aeeadc368dbfd3caa4910e638f/txnUtils.py

https://gist.githubusercontent.com/shirriff/b00515b8583064487ff3/raw/a3a69f11218b565268d7e02c28764498f7710c1a/txnUtils.py



# -*- 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)