Пример #1
0
    def refund(self, contract):
        fundtx = self.find_transaction_to_address(contract.p2sh)
        print("Fund tx found in refund: ", fundtx)
        refundPubKey = self.find_refundAddr(contract)
        print('refundPubKey: {0}'.format(refundPubKey))

        redeemScript = CScript(x(contract.redeemScript))
        txin = CMutableTxIn(fundtx['outpoint'])
        txout = CMutableTxOut(fundtx['amount'] - FEE,
                              refundPubKey.to_scriptPubKey())
        # Create the unsigned raw transaction.
        tx = CMutableTransaction([txin], [txout])
        # Set nSequence and nLockTime
        txin.nSequence = 0
        tx.nLockTime = contract.redeemblocknum
        # Create the unsigned raw transaction.
        sighash = SignatureHash(redeemScript, tx, 0, SIGHASH_ALL)
        privkey = self.zcashd.dumpprivkey(refundPubKey)
        sig = privkey.sign(sighash) + bytes([SIGHASH_ALL])
        # Sign without secret
        txin.scriptSig = CScript([sig, privkey.pub, OP_FALSE, redeemScript])
        txin_scriptPubKey = redeemScript.to_p2sh_scriptPubKey()
        print('Raw redeem transaction hex: {0}'.format(b2x(tx.serialize())))
        res = VerifyScript(txin.scriptSig, txin_scriptPubKey, tx, 0,
                           (SCRIPT_VERIFY_P2SH, ))
        print("Script verified, sending raw transaction... (NOT)", res)
        txid = self.zcashd.sendrawtransaction(tx)
        refund_tx = b2x(lx(b2x(txid)))
        fund_tx = str(fundtx['outpoint'])
        return {"refund_tx": refund_tx, "fund_tx": fund_tx}
Пример #2
0
 def redeem(self, contract, fundtx, secret):
     # TODO: parse the script once, up front.
     redeemPubKey = self.find_redeemAddr(contract)
     print('redeemPubKey', redeemPubKey)
     zec_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(zec_redeemScript, tx, 0, SIGHASH_ALL)
     # TODO: figure out how to better protect privkey
     privkey = self.zcashd.dumpprivkey(redeemPubKey)
     sig = privkey.sign(sighash) + bytes([SIGHASH_ALL])
     print("SECRET", secret)
     preimage = secret.encode('utf-8')
     txin.scriptSig = CScript(
         [sig, privkey.pub, preimage, OP_TRUE, zec_redeemScript])
     txin_scriptPubKey = zec_redeemScript.to_p2sh_scriptPubKey()
     print('Raw redeem transaction hex: ', b2x(tx.serialize()))
     VerifyScript(txin.scriptSig, txin_scriptPubKey, tx, 0,
                  (SCRIPT_VERIFY_P2SH, ))
     print("Script verified, sending raw redeem transaction...")
     txid = self.zcashd.sendrawtransaction(tx)
     redeem_tx = b2x(lx(b2x(txid)))
     fund_tx = str(fundtx['outpoint'])
     return {"redeem_tx": redeem_tx, "fund_tx": fund_tx}
Пример #3
0
    def redeem_contract(self, contract, secret):
        # How to find redeemScript and redeemblocknum from blockchain?
        p2sh = contract.p2sh
        #checking there are funds in the address
        amount = self.check_funds(p2sh)
        if (amount == 0):
            print("Address ", p2sh, " not funded")
            quit()
        fundtx = self.find_transaction_to_address(p2sh)
        amount = fundtx['amount'] / COIN
        # print("Found fund_tx: ", fundtx)
        p2sh = P2SHBitcoinAddress(p2sh)
        if fundtx['address'] == p2sh:
            print("Found {0} in p2sh {1}, redeeming...".format(amount, p2sh))

            # Where can you find redeemblocknum in the transaction?
            # redeemblocknum = find_redeemblocknum(contract)
            blockcount = self.zcashd.getblockcount()
            print("\nCurrent blocknum at time of redeem on Zcash:", blockcount)
            if blockcount < contract.redeemblocknum:
                # TODO: parse the script once, up front.
                redeemPubKey = self.find_redeemAddr(contract)

                print('redeemPubKey', redeemPubKey)
                zec_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(zec_redeemScript, tx, 0, SIGHASH_ALL)
                # TODO: figure out how to better protect privkey
                privkey = self.zcashd.dumpprivkey(redeemPubKey)
                sig = privkey.sign(sighash) + bytes([SIGHASH_ALL])
                print("SECRET", secret)
                preimage = secret.encode('utf-8')
                txin.scriptSig = CScript(
                    [sig, privkey.pub, preimage, OP_TRUE, zec_redeemScript])
                txin_scriptPubKey = zec_redeemScript.to_p2sh_scriptPubKey()
                print('Raw redeem transaction hex: ', b2x(tx.serialize()))
                VerifyScript(txin.scriptSig, txin_scriptPubKey, tx, 0,
                             (SCRIPT_VERIFY_P2SH, ))
                print("Script verified, sending raw redeem transaction...")
                txid = self.zcashd.sendrawtransaction(tx)
                redeem_tx = b2x(lx(b2x(txid)))
                fund_tx = str(fundtx['outpoint'])
                return {"redeem_tx": redeem_tx, "fund_tx": fund_tx}
            else:
                print("nLocktime exceeded, refunding")
                refundPubKey = self.find_refundAddr(contract)
                print('refundPubKey', refundPubKey)
                txid = self.zcashd.sendtoaddress(refundPubKey,
                                                 fundtx['amount'] - FEE)
                refund_tx = b2x(lx(b2x(txid)))
                fund_tx = str(fundtx['outpoint'])
                return {"refund_tx": refund_tx, "fund_tx": fund_tx}
        else:
            print("No contract for this p2sh found in database", p2sh)
Пример #4
0
    txin = CMutableTxIn(COutPoint(fund_tx, fund_vout))
    # The default nSequence of FFFFFFFF won't let you redeem when there's a CHECKTIMELOCKVERIFY
    txin.nSequence = 0
    txout = CMutableTxOut(send_amount - FEE, alicepubkey.to_scriptPubKey())
    # Create the unsigned raw transaction.
    tx = CMutableTransaction([txin], [txout])
    # nLockTime needs to be at least as large as parameter of CHECKLOCKTIMEVERIFY for script to verify
    tx.nLockTime = redeemblocknum
    # Calculate the signature hash for that transaction. Note how the script we use
    # is the redeemScript, not the scriptPubKey. EvalScript() will be evaluating the redeemScript
    sighash = SignatureHash(zec_redeemScript, tx, 0, SIGHASH_ALL)
    sig = alice_seckey.sign(sighash) + bytes([SIGHASH_ALL])
    txin.scriptSig = CScript(
        [sig, alice_seckey.pub, OP_FALSE, zec_redeemScript])
    print("Time lock has passed, Alice redeeming her own tx:")
    print("Refund tx hex:", b2x(tx.serialize()))
    VerifyScript(txin.scriptSig, txin_scriptPubKey, tx, 0,
                 (SCRIPT_VERIFY_P2SH, ))
    txid = zcashd.sendrawtransaction(tx)
    print("Txid of submitted refund tx: ", b2x(lx(b2x(txid))))
    quit()

# ================= BEFORE 48 HRS: BOB REDEEMS WITH ALICE'S REVEALED SECRET =========================
print("Bob -- Redeeming tx.....")
txin = CMutableTxIn(COutPoint(fund_tx, fund_vout))
txout = CMutableTxOut(send_amount - FEE, bobpubkey.to_scriptPubKey())
# Create the unsigned raw transaction.
tx = CMutableTransaction([txin], [txout])
# nLockTime needs to be at least as large as parameter of CHECKLOCKTIMEVERIFY for script to verify
tx.nLockTime = redeemblocknum
sighash = SignatureHash(zec_redeemScript, tx, 0, SIGHASH_ALL)
Пример #5
0
# corresponding SignatureHash() function will use that same script when it
# replaces the scriptSig in the transaction being hashed with the script being
# executed.
sighash = SignatureHash(txin_redeemScript, tx, 0, SIGHASH_ANYONECANPAY)
print('sighash', b2x(sighash))

# privkey = CBitcoinSecret('cNUMK7zPWDq8YLFoARbLiFSgJnZ4jDuJzXxdSebNupzHB8ZSbQ4n')
# Now sign it. We have to append the type of signature we want to the end, in
# this case the usual SIGHASH_ALL.
# sig = privkey.sign(sighash) + bytes([SIGHASH_ANYONECANPAY])

# Set the scriptSig of our transaction input appropriately.
txin.scriptSig = CScript([preimage, txin_redeemScript])

print('tx', tx)
# Verify the signature worked. This calls EvalScript() and actually executes
# the opcodes in the scripts to see if everything worked out. If it doesn't an
# exception will be raised.
VerifyScript(txin.scriptSig, txin_scriptPubKey, tx, 0, (SCRIPT_VERIFY_P2SH, ))

# Done! Print the transaction to standard output with the bytes-to-hex
# function.
print('Serialized txn', b2x(tx.serialize()))

redeemtx = proxy.sendrawtransaction(tx)
print('redeemtx', b2x(redeemtx))

# Display final tx
info = proxy.getrawtransaction(redeemtx, 1)
print(info)
Пример #6
0
    [OP_DUP, OP_HASH160,
     Hash160(seckey.pub), OP_EQUALVERIFY, OP_CHECKSIG])

# Create the txout. This time we create the scriptPubKey from a Bitcoin
# address.
txout = CMutableTxOut(
    0.001 * COIN,
    CBitcoinAddress('1C7zdTfnkzmr13HfA2vNm5SJYRK6nEKyq8').to_scriptPubKey())

# Create the unsigned transaction.
tx = CMutableTransaction([txin], [txout])

# Calculate the signature hash for that transaction.
sighash = SignatureHash(txin_scriptPubKey, tx, 0, SIGHASH_ALL)

# Now sign it. We have to append the type of signature we want to the end, in
# this case the usual SIGHASH_ALL.
sig = seckey.sign(sighash) + bytes([SIGHASH_ALL])

# Set the scriptSig of our transaction input appropriately.
txin.scriptSig = CScript([sig, seckey.pub])

# Verify the signature worked. This calls EvalScript() and actually executes
# the opcodes in the scripts to see if everything worked out. If it doesn't an
# exception will be raised.
VerifyScript(txin.scriptSig, txin_scriptPubKey, tx, 0, (SCRIPT_VERIFY_P2SH, ))

# Done! Print the transaction to standard output with the bytes-to-hex
# function.
print(b2x(tx.serialize()))