Browse Source

Add full BIP143 semantics for custom sighash flags

master
AdamISZ 8 years ago
parent
commit
6679f92eba
No known key found for this signature in database
GPG Key ID: B3AE09F1E9A3197A
  1. 53
      jmbitcoin/jmbitcoin/secp256k1_transaction.py

53
jmbitcoin/jmbitcoin/secp256k1_transaction.py

@ -189,30 +189,47 @@ def segwit_signature_form(txobj, i, script, amount, hashcode=SIGHASH_ALL):
# amount, hashcode)) # amount, hashcode))
script = binascii.unhexlify(script) script = binascii.unhexlify(script)
nVersion = encode(txobj["version"], 256, 4)[::-1] nVersion = encode(txobj["version"], 256, 4)[::-1]
#create hashPrevouts preimage #create hashPrevouts
pi = "" if hashcode & SIGHASH_ANYONECANPAY:
for inp in txobj["ins"]: hashPrevouts = "\x00"*32
pi += binascii.unhexlify(inp["outpoint"]["hash"])[::-1] else:
pi += encode(inp["outpoint"]["index"], 256, 4)[::-1] pi = ""
hashPrevouts = bin_dbl_sha256(pi) for inp in txobj["ins"]:
#create hashSequence preimage pi += binascii.unhexlify(inp["outpoint"]["hash"])[::-1]
pi = "" pi += encode(inp["outpoint"]["index"], 256, 4)[::-1]
for inp in txobj["ins"]: hashPrevouts = bin_dbl_sha256(pi)
pi += encode(inp["sequence"], 256, 4)[::-1] #create hashSequence
hashSequence = bin_dbl_sha256(pi) if not hashcode & SIGHASH_ANYONECANPAY and not (
hashcode & 0x1f == SIGHASH_NONE) and not (hashcode & 0x1f == SIGHASH_NONE):
pi = ""
for inp in txobj["ins"]:
pi += encode(inp["sequence"], 256, 4)[::-1]
hashSequence = bin_dbl_sha256(pi)
else:
hashSequence = "\x00"*32
#add this input's outpoint #add this input's outpoint
thisOut = binascii.unhexlify(txobj["ins"][i]["outpoint"]["hash"])[::-1] thisOut = binascii.unhexlify(txobj["ins"][i]["outpoint"]["hash"])[::-1]
thisOut += encode(txobj["ins"][i]["outpoint"]["index"], 256, 4)[::-1] thisOut += encode(txobj["ins"][i]["outpoint"]["index"], 256, 4)[::-1]
scriptCode = num_to_var_int(len(script)) + script scriptCode = num_to_var_int(len(script)) + script
amt = encode(amount, 256, 8)[::-1] amt = encode(amount, 256, 8)[::-1]
thisSeq = encode(txobj["ins"][i]["sequence"], 256, 4)[::-1] thisSeq = encode(txobj["ins"][i]["sequence"], 256, 4)[::-1]
#create hashOutputs preimage #create hashOutputs
pi = "" if not (hashcode & 0x1f == SIGHASH_SINGLE) and not (hashcode & 0x1f == SIGHASH_NONE):
for out in txobj["outs"]: pi = ""
pi += encode(out["value"], 256, 8)[::-1] for out in txobj["outs"]:
pi += (num_to_var_int(len(binascii.unhexlify(out["script"]))) + \ pi += encode(out["value"], 256, 8)[::-1]
binascii.unhexlify(out["script"])) pi += (num_to_var_int(len(binascii.unhexlify(out["script"]))) + \
hashOutputs = bin_dbl_sha256(pi) binascii.unhexlify(out["script"]))
hashOutputs = bin_dbl_sha256(pi)
elif hashcode & 0x1f == SIGHASH_SINGLE:
pi = ""
if i < len(txobj['outs']):
pi += encode(txobj["outs"][i]["value"], 256, 8)[::-1]
pi += (num_to_var_int(len(binascii.unhexlify(txobj["outs"][i][
"script"]))) + binascii.unhexlify(txobj["outs"][i]["script"]))
hashOutputs = bin_dbl_sha256(pi)
else:
hashOutputs = "\x00"*32
nLockTime = encode(txobj["locktime"], 256, 4)[::-1] nLockTime = encode(txobj["locktime"], 256, 4)[::-1]
return nVersion + hashPrevouts + hashSequence + thisOut + scriptCode + amt + \ return nVersion + hashPrevouts + hashSequence + thisOut + scriptCode + amt + \
thisSeq + hashOutputs + nLockTime thisSeq + hashOutputs + nLockTime

Loading…
Cancel
Save