d = {}
start = vds.read_cursor
d['version'] = vds.read_int32()
+ d['timestamp'] = vds.read_int32()
n_vin = vds.read_compact_size()
d['inputs'] = []
for i in xrange(n_vin):
for i in xrange(n_vout):
o = parse_TxOut(vds, i)
- #if o['address'] == "None" and o['value']==0:
- # print("skipping strange tx output with zero value")
- # continue
- # if o['address'] != "None":
+ if o['address'] == None or o['value']==0:
+ #print("skipping strange tx output with zero value")
+ continue
d['outputs'].append(o)
d['lockTime'] = vds.read_uint32()
"OP_WITHIN", "OP_RIPEMD160", "OP_SHA1", "OP_SHA256", "OP_HASH160",
"OP_HASH256", "OP_CODESEPARATOR", "OP_CHECKSIG", "OP_CHECKSIGVERIFY", "OP_CHECKMULTISIG",
"OP_CHECKMULTISIGVERIFY",
- ("OP_SINGLEBYTE_END", 0xF0),
- ("OP_DOUBLEBYTE_BEGIN", 0xF000),
- "OP_PUBKEY", "OP_PUBKEYHASH",
- ("OP_INVALIDOPCODE", 0xFFFF),
+ "OP_NOP1", "OP_NOP2", "OP_NOP3", "OP_NOP4", "OP_NOP5", "OP_NOP6", "OP_NOP7", "OP_NOP8", "OP_NOP9", "OP_NOP10",
+ ("OP_INVALIDOPCODE", 0xFF),
])
vch = None
opcode = ord(bytes[i])
i += 1
- if opcode >= opcodes.OP_SINGLEBYTE_END and i < len(bytes):
- opcode <<= 8
- opcode |= ord(bytes[i])
- i += 1
if opcode <= opcodes.OP_PUSHDATA4:
nSize = opcode
elif opcode == opcodes.OP_PUSHDATA4:
(nSize,) = struct.unpack_from('<I', bytes, i)
i += 4
- vch = bytes[i:i+nSize]
- i += nSize
+ if i+nSize > len(bytes):
+ vch = "_INVALID_"+bytes[i:]
+ i = len(bytes)
+ else:
+ vch = bytes[i:i+nSize]
+ i += nSize
yield (opcode, vch, i)
def script_GetOpName(opcode):
+ try:
return (opcodes.whatis(opcode)).replace("OP_", "")
+ except KeyError:
+ return "InvalidOp_"+str(opcode)
def decode_script(bytes):
# non-generated TxIn transactions push a signature
# (seventy-something bytes) and then their public key
- # (65 bytes) onto the stack:
+ # (33 or 65 bytes) onto the stack:
match = [ opcodes.OP_PUSHDATA4, opcodes.OP_PUSHDATA4 ]
if match_decoded(decoded, match):
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') ]
- return pubkeys, signatures, hash_160_to_bc_address(hash_160(redeemScript), 5)
+ return pubkeys, signatures, hash_160_to_bc_address(hash_160(redeemScript), 20)
# 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') ]
- return pubkeys, signatures, hash_160_to_bc_address(hash_160(redeemScript), 5)
+ return pubkeys, signatures, hash_160_to_bc_address(hash_160(redeemScript), 20)
return [], [], None
def get_address_from_output_script(bytes):
- decoded = [ x for x in script_GetOp(bytes) ]
+ try:
+ decoded = [ x for x in script_GetOp(bytes) ]
+ except:
+ return None
# The Genesis Block, self-payments, and pay-by-IP-address payments look like:
# 65 BYTES:... CHECKSIG
# DUP HASH160 20 BYTES:... EQUALVERIFY CHECKSIG
match = [opcodes.OP_DUP, opcodes.OP_HASH160, opcodes.OP_0, opcodes.OP_EQUALVERIFY, opcodes.OP_CHECKSIG]
if match_decoded(decoded, match):
- return "None"
+ return None
# Pay-by-Bitcoin-address TxOuts look like:
# DUP HASH160 20 BYTES:... EQUALVERIFY CHECKSIG
# p2sh
match = [ opcodes.OP_HASH160, opcodes.OP_PUSHDATA4, opcodes.OP_EQUAL ]
if match_decoded(decoded, match):
- addr = hash_160_to_bc_address(decoded[1][1],5)
+ addr = hash_160_to_bc_address(decoded[1][1],20)
return addr
- return "None"
+ return None