wip
This commit is contained in:
parent
2753b3385f
commit
0f0dbf4e69
10
bXcat.py
10
bXcat.py
|
@ -100,7 +100,7 @@ def get_tx_details(txid):
|
||||||
def get_redeemer_priv_key(contract):
|
def get_redeemer_priv_key(contract):
|
||||||
if (contract.redeemtype == 'secret'):
|
if (contract.redeemtype == 'secret'):
|
||||||
redeemPubKey = find_redeemAddr(contract)
|
redeemPubKey = find_redeemAddr(contract)
|
||||||
elif (contract.redeemtype = 'timelock'):
|
elif (contract.redeemtype == 'timelock'):
|
||||||
redeemPubKey = find_refundAddr(contract)
|
redeemPubKey = find_refundAddr(contract)
|
||||||
else:
|
else:
|
||||||
raise ValueError("Invalid redeemtype:", contract.redeemtype)
|
raise ValueError("Invalid redeemtype:", contract.redeemtype)
|
||||||
|
@ -118,7 +118,7 @@ def check_and_return_fundtx(contract):
|
||||||
# will abort in this case. This is a conservative approach to prevent the following attack, for example: the funder splits
|
# will abort in this case. This is a conservative approach to prevent the following attack, for example: the funder splits
|
||||||
# the amount into many tiny outputs, hoping the redeemer will not have time to redeem them all by the timelock.
|
# the amount into many tiny outputs, hoping the redeemer will not have time to redeem them all by the timelock.
|
||||||
fundtx = find_transaction_to_address(p2sh)
|
fundtx = find_transaction_to_address(p2sh)
|
||||||
if(fundtx=""):
|
if(fundtx==""):
|
||||||
raise ValueError("fund tx to ", p2sh, " not found")
|
raise ValueError("fund tx to ", p2sh, " not found")
|
||||||
|
|
||||||
amount = fundtx['amount'] / COIN
|
amount = fundtx['amount'] / COIN
|
||||||
|
@ -130,7 +130,7 @@ def check_and_return_fundtx(contract):
|
||||||
return contract
|
return contract
|
||||||
|
|
||||||
# assuming we have the correct fund tx in the contract prepares the signed redeem raw tx
|
# assuming we have the correct fund tx in the contract prepares the signed redeem raw tx
|
||||||
def get_raw_redeem(contract, privkey)
|
def get_raw_redeem(contract, privkey):
|
||||||
|
|
||||||
p2sh = contract.p2sh
|
p2sh = contract.p2sh
|
||||||
p2sh = P2SHBitcoinAddress(p2sh)
|
p2sh = P2SHBitcoinAddress(p2sh)
|
||||||
|
@ -152,11 +152,11 @@ def get_raw_redeem(contract, privkey)
|
||||||
sighash = SignatureHash(redeemscript, tx, 0, SIGHASH_ALL)
|
sighash = SignatureHash(redeemscript, tx, 0, SIGHASH_ALL)
|
||||||
secret = get_secret() # assumes secret is present in secret.json
|
secret = get_secret() # assumes secret is present in secret.json
|
||||||
sig = privkey.sign(sighash) + bytes([SIGHASH_ALL])
|
sig = privkey.sign(sighash) + bytes([SIGHASH_ALL])
|
||||||
if(contract.redeemtype = "secret"):
|
if(contract.redeemtype == "secret"):
|
||||||
print("SECRET", secret)
|
print("SECRET", secret)
|
||||||
preimage = secret.encode('utf-8')
|
preimage = secret.encode('utf-8')
|
||||||
txin.scriptSig = CScript([sig, privkey.pub, preimage, OP_TRUE, redeemscript])
|
txin.scriptSig = CScript([sig, privkey.pub, preimage, OP_TRUE, redeemscript])
|
||||||
elif(contract.redeemtype = "timelock"):
|
elif(contract.redeemtype == "timelock"):
|
||||||
txin.scriptSig = CScript([sig, privkey.pub, OP_FALSE, redeemscript])
|
txin.scriptSig = CScript([sig, privkey.pub, OP_FALSE, redeemscript])
|
||||||
else:
|
else:
|
||||||
raise ValueError("invalid redeemtype:", contract.redeemtype)
|
raise ValueError("invalid redeemtype:", contract.redeemtype)
|
||||||
|
|
10
xcat.py
10
xcat.py
|
@ -13,24 +13,24 @@ import userInput
|
||||||
def get_redeemer_priv_key(contract):
|
def get_redeemer_priv_key(contract):
|
||||||
if contract.currency == 'bitcoin':
|
if contract.currency == 'bitcoin':
|
||||||
return bXcat.get_redeemer_priv_key(contract)
|
return bXcat.get_redeemer_priv_key(contract)
|
||||||
elif contract.currency = 'zcash':
|
elif contract.currency == 'zcash':
|
||||||
return zXcat.get_redeemer_priv_key(contract)
|
return zXcat.get_redeemer_priv_key(contract)
|
||||||
else:
|
else:
|
||||||
raise ValueError("invalid currency value:", contract.currency)
|
raise ValueError("invalid currency value:", contract.currency)
|
||||||
|
|
||||||
|
|
||||||
def get_raw_redeem(contract, privkey)
|
def get_raw_redeem(contract, privkey):
|
||||||
if contract.currency == 'bitcoin':
|
if contract.currency == 'bitcoin':
|
||||||
return bXcat.get_raw_redeem(contract, privkey)
|
return bXcat.get_raw_redeem(contract, privkey)
|
||||||
elif contract.currency = 'zcash':
|
elif contract.currency == 'zcash':
|
||||||
return zXcat.get_raw_redeem(contract, privkey)
|
return zXcat.get_raw_redeem(contract, privkey)
|
||||||
else:
|
else:
|
||||||
raise ValueError("invalid currency value:", contract.currency)
|
raise ValueError("invalid currency value:", contract.currency)
|
||||||
|
|
||||||
def send_raw_tx(rawtx)
|
def send_raw_tx(rawtx):
|
||||||
if contract.currency == 'bitcoin':
|
if contract.currency == 'bitcoin':
|
||||||
return bXcat.send_raw_tx(rawtx)
|
return bXcat.send_raw_tx(rawtx)
|
||||||
elif contract.currency = 'zcash':
|
elif contract.currency == 'zcash':
|
||||||
return zXcat.send_raw_tx(rawtx)
|
return zXcat.send_raw_tx(rawtx)
|
||||||
else:
|
else:
|
||||||
raise ValueError("invalid currency value:", contract.currency)
|
raise ValueError("invalid currency value:", contract.currency)
|
||||||
|
|
42
zXcat.py
42
zXcat.py
|
@ -378,6 +378,44 @@ def get_redeemer_priv_key(contract):
|
||||||
return zcashd.dumpprivkey(redeemPubKey)
|
return zcashd.dumpprivkey(redeemPubKey)
|
||||||
|
|
||||||
|
|
||||||
|
# assuming we have the correct fund tx in the contract prepares the signed redeem raw tx
|
||||||
|
def get_raw_redeem(contract, privkey):
|
||||||
|
|
||||||
|
p2sh = contract.p2sh
|
||||||
|
p2sh = P2SHBitcoinAddress(p2sh)
|
||||||
|
'''if contract.fund_tx['address'] == p2sh:
|
||||||
|
print("Found {0} in p2sh {1}, redeeming...".format(amount, p2sh))
|
||||||
|
'''
|
||||||
|
redeemPubKey = find_redeemAddr(contract)
|
||||||
|
print('redeemPubKey', redeemPubKey)
|
||||||
|
|
||||||
|
redeemscript = CScript(x(contract.redeemscript))
|
||||||
|
txin = CMutableTxIn(fundtx['outpoint'])
|
||||||
|
txout = CMutableTxOut(fundtx['amount'] - FEE, redeemPubKey.to_scriptPubKey())
|
||||||
|
# Create the unsigned raw transaction.
|
||||||
|
tx = CMutableTransaction([txin], [txout])
|
||||||
|
|
||||||
|
|
||||||
|
sighash = SignatureHash(redeemscript, tx, 0, SIGHASH_ALL)
|
||||||
|
secret = get_secret() # assumes secret is present in secret.json
|
||||||
|
sig = privkey.sign(sighash) + bytes([SIGHASH_ALL])
|
||||||
|
if(contract.redeemtype == "secret"):
|
||||||
|
print("SECRET", secret)
|
||||||
|
preimage = secret.encode('utf-8')
|
||||||
|
txin.scriptSig = CScript([sig, privkey.pub, preimage, OP_TRUE, redeemscript])
|
||||||
|
elif(contract.redeemtype == "timelock"):
|
||||||
|
txin.scriptSig = CScript([sig, privkey.pub, OP_FALSE, redeemscript])
|
||||||
|
else:
|
||||||
|
raise ValueError("invalid redeemtype:", contract.redeemtype)
|
||||||
|
|
||||||
|
txin_scriptPubKey = redeemscript.to_p2sh_scriptPubKey()
|
||||||
|
VerifyScript(txin.scriptSig, txin_scriptPubKey, tx, 0, (SCRIPT_VERIFY_P2SH,))
|
||||||
|
print("script verified, writing raw redeem tx in contract")
|
||||||
|
contract.rawredeemtx = tx
|
||||||
|
return contract
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def check_and_return_fundtx(contract):
|
def check_and_return_fundtx(contract):
|
||||||
# How to find redeemscript and redeemblocknum from blockchain?
|
# How to find redeemscript and redeemblocknum from blockchain?
|
||||||
print("Redeeming contract using secret", contract.__dict__)
|
print("Redeeming contract using secret", contract.__dict__)
|
||||||
|
@ -387,7 +425,7 @@ def check_and_return_fundtx(contract):
|
||||||
# will abort in this case. This is a conservative approach to prevent the following attack, for example: the funder splits
|
# will abort in this case. This is a conservative approach to prevent the following attack, for example: the funder splits
|
||||||
# the amount into many tiny outputs, hoping the redeemer will not have time to redeem them all by the timelock.
|
# the amount into many tiny outputs, hoping the redeemer will not have time to redeem them all by the timelock.
|
||||||
fundtx = find_transaction_to_address(p2sh)
|
fundtx = find_transaction_to_address(p2sh)
|
||||||
if(fundtx=""):
|
if(fundtx== ""):
|
||||||
raise ValueError("fund tx to ", p2sh, " not found")
|
raise ValueError("fund tx to ", p2sh, " not found")
|
||||||
|
|
||||||
amount = fundtx['amount'] / COIN
|
amount = fundtx['amount'] / COIN
|
||||||
|
@ -395,5 +433,5 @@ def check_and_return_fundtx(contract):
|
||||||
raise ValueError("Insufficient funds in fund transaction.")
|
raise ValueError("Insufficient funds in fund transaction.")
|
||||||
|
|
||||||
|
|
||||||
contract.fund_tx = fund_tx
|
contract.fund_tx = fundtx
|
||||||
return contract
|
return contract
|
||||||
|
|
Loading…
Reference in New Issue