deserialize: p2sh trnsactions
This commit is contained in:
parent
789223c871
commit
094fb8b0a0
|
@ -2,7 +2,7 @@
|
|||
#
|
||||
#
|
||||
|
||||
from bitcoin import public_key_to_bc_address, hash_160_to_bc_address, hash_encode
|
||||
from bitcoin import public_key_to_bc_address, hash_160_to_bc_address, hash_encode, multisig_script, hash_160
|
||||
#import socket
|
||||
import time
|
||||
import struct
|
||||
|
@ -186,8 +186,7 @@ def parse_TxIn(vds):
|
|||
d['prevout_n'] = vds.read_uint32()
|
||||
scriptSig = vds.read_bytes(vds.read_compact_size())
|
||||
d['sequence'] = vds.read_uint32()
|
||||
d['address'] = extract_public_key(scriptSig)
|
||||
#d['script'] = decode_script(scriptSig)
|
||||
d['address'] = get_address_from_input_script(scriptSig)
|
||||
return d
|
||||
|
||||
|
||||
|
@ -195,8 +194,7 @@ def parse_TxOut(vds, i):
|
|||
d = {}
|
||||
d['value'] = vds.read_int64()
|
||||
scriptPubKey = vds.read_bytes(vds.read_compact_size())
|
||||
d['address'] = extract_public_key(scriptPubKey)
|
||||
#d['script'] = decode_script(scriptPubKey)
|
||||
d['address'] = get_address_from_output_script(scriptPubKey)
|
||||
d['raw_output_script'] = scriptPubKey.encode('hex')
|
||||
d['index'] = i
|
||||
return d
|
||||
|
@ -293,7 +291,7 @@ def match_decoded(decoded, to_match):
|
|||
return False
|
||||
return True
|
||||
|
||||
def extract_public_key(bytes):
|
||||
def get_address_from_input_script(bytes):
|
||||
decoded = [ x for x in script_GetOp(bytes) ]
|
||||
|
||||
# non-generated TxIn transactions push a signature
|
||||
|
@ -303,6 +301,35 @@ def extract_public_key(bytes):
|
|||
if match_decoded(decoded, match):
|
||||
return public_key_to_bc_address(decoded[1][1])
|
||||
|
||||
# p2sh transaction, 2 of n
|
||||
match = [ opcodes.OP_0, opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4 ]
|
||||
if match_decoded(decoded, match):
|
||||
bytes = decoded[3][1]
|
||||
dec2 = [ x for x in script_GetOp(bytes) ]
|
||||
|
||||
# 2 of 2
|
||||
match2 = [ opcodes.OP_2, opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4, opcodes.OP_2, opcodes.OP_CHECKMULTISIG ]
|
||||
if match_decoded(dec2, match2):
|
||||
pubkeys = [ dec2[1][1].encode('hex'), dec2[2][1].encode('hex') ]
|
||||
s = multisig_script(pubkeys)
|
||||
return hash_160_to_bc_address(hash_160(s.decode('hex')), 5)
|
||||
|
||||
# 2 of 3
|
||||
match2 = [ opcodes.OP_2, opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4, opcodes.OP_3, opcodes.OP_CHECKMULTISIG ]
|
||||
if match_decoded(dec2, match2):
|
||||
pubkeys = [ dec2[1][1].encode('hex'), dec2[2][1].encode('hex'), dec2[3][1].encode('hex') ]
|
||||
s = multisig_script(pubkeys)
|
||||
return hash_160_to_bc_address(hash_160(s.decode('hex')), 5)
|
||||
|
||||
return "p2sh, unknown"
|
||||
|
||||
|
||||
return "(None)"
|
||||
|
||||
|
||||
def get_address_from_output_script(bytes):
|
||||
decoded = [ x for x in script_GetOp(bytes) ]
|
||||
|
||||
# The Genesis Block, self-payments, and pay-by-IP-address payments look like:
|
||||
# 65 BYTES:... CHECKSIG
|
||||
match = [ opcodes.OP_PUSHDATA4, opcodes.OP_CHECKSIG ]
|
||||
|
@ -315,4 +342,9 @@ def extract_public_key(bytes):
|
|||
if match_decoded(decoded, match):
|
||||
return hash_160_to_bc_address(decoded[2][1])
|
||||
|
||||
# p2sh
|
||||
match = [ opcodes.OP_HASH160, opcodes.OP_PUSHDATA4, opcodes.OP_EQUAL ]
|
||||
if match_decoded(decoded, match):
|
||||
return hash_160_to_bc_address(decoded[1][1],5)
|
||||
|
||||
return "(None)"
|
||||
|
|
Loading…
Reference in New Issue