Пример #1
0
def write_ew_message(msg):
    """Write a message to the blockchain."""
    print("write_ew_message({})" % msg)

    # Create a bitcoin script object with our message
    if len(msg) > 72:
        raise Exception('Message is too long and may not be accepted.')
    msg = "EW " + msg
    message_script = Script('OP_RETURN 0x{}'.format(utils.bytes_to_str(msg.encode())))

    # Define the fee we're willing to pay for the tx
    tx_fee = 11000

    # Get the first UTXO from our set that can cover the fee
    utxo = None
    for utxo_addr, utxos in wallet.get_utxos().items():
        for u in utxos:
            if u.value > tx_fee:
                utxo = u
                break
        if utxo:
            break

    if not utxo:
        raise Exception('No UTXOs available to pay for the transaction.')

    # Build the transaction inputs (there is only one, but Transaction expects a list)
    inputs = [TransactionInput(outpoint=utxo.transaction_hash,
                               outpoint_index=utxo.outpoint_index,
                               script=utxo.script,
                               sequence_num=0xffffffff)]

    outputs = []
    # Build one output with our custom message script
    outputs.append(TransactionOutput(value=0, script=message_script))
    # Build another output to pay the UTXO money back to one of our addresses
    _, change_key_hash = utils.address_to_key_hash(wallet._accounts[0].get_next_address(True))
    outputs.append(TransactionOutput(value=utxo.value - tx_fee,
                                     script=Script.build_p2pkh(change_key_hash)))

    # Build an unsigned transaction object
    txn = Transaction(version=Transaction.DEFAULT_TRANSACTION_VERSION,
                      inputs=inputs,
                      outputs=outputs,
                      lock_time=0
                      )

    # Sign the transaction with the correct private key
    private_key = wallet.get_private_key(utxo_addr)
    txn.sign_input(input_index=0,
                   hash_type=Transaction.SIG_HASH_ALL,
                   private_key=private_key,
                   sub_script=utxo.script
                   )

    # Broadcast the transaction
    tx = wallet.broadcast_transaction(txn.to_hex())
    return tx
Пример #2
0
 def create_deposit_tx(self, hash160):
     """Return a mocked deposit transaction."""
     utxo_script_sig = Script.build_p2pkh(self._private_key.public_key.hash160())
     inp = TransactionInput(
         outpoint=Hash('0' * 64), outpoint_index=0, script=utxo_script_sig, sequence_num=0xffffffff)
     out = TransactionOutput(value=120000, script=Script.build_p2sh(hash160))
     txn = Transaction(version=Transaction.DEFAULT_TRANSACTION_VERSION, inputs=[inp], outputs=[out], lock_time=0)
     txn.sign_input(
         input_index=0, hash_type=Transaction.SIG_HASH_ALL, private_key=self._private_key,
         sub_script=utxo_script_sig)
     return txn
Пример #3
0
 def create_deposit_tx(self, hash160):
     """Return a mocked deposit transaction."""
     utxo_script_sig = Script.build_p2pkh(
         self._private_key.public_key.hash160())
     inp = TransactionInput(outpoint=Hash('0' * 64),
                            outpoint_index=0,
                            script=utxo_script_sig,
                            sequence_num=0xffffffff)
     out = TransactionOutput(value=120000,
                             script=Script.build_p2sh(hash160))
     txn = Transaction(version=Transaction.DEFAULT_TRANSACTION_VERSION,
                       inputs=[inp],
                       outputs=[out],
                       lock_time=0)
     txn.sign_input(input_index=0,
                    hash_type=Transaction.SIG_HASH_ALL,
                    private_key=self._private_key,
                    sub_script=utxo_script_sig)
     return txn