mirror of
https://github.com/ChristopherA/Learning-Bitcoin-from-the-Command-Line.git
synced 2025-06-07 16:06:26 +00:00
70 lines
2.9 KiB
Python
70 lines
2.9 KiB
Python
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
|
|
from pprint import pprint
|
|
import logging
|
|
|
|
#logging.basicConfig()
|
|
#logging.getLogger("BitcoinRPC").setLevel(logging.DEBUG)
|
|
# rpc_user and rpc_password are set in the bitcoin.conf file
|
|
rpc_user = "StandUp"
|
|
rpc_pass = "6305f1b2dbb3bc5a16cd0f4aac7e1eba"
|
|
rpc_host = "127.0.0.1"
|
|
rpc_client = AuthServiceProxy(f"http://{rpc_user}:{rpc_pass}@{rpc_host}:18332", timeout=120)
|
|
|
|
print("Creating a Transaction")
|
|
|
|
## 0. Create New Addresses
|
|
|
|
new_address = rpc_client.getnewaddress("Learning-Bitcoin-from-the-Command-Line")
|
|
new_change_address = rpc_client.getrawchangeaddress()
|
|
|
|
## 1. Select UTXO
|
|
|
|
utxos = rpc_client.listunspent()
|
|
selected_utxo = utxos[0] # we select the first utxo here
|
|
utxo_address = selected_utxo['address']
|
|
utxo_txid = selected_utxo['txid']
|
|
utxo_vout = selected_utxo['vout']
|
|
utxo_amt = float(selected_utxo['amount'])
|
|
# here we are sending bitcoins to an address generated by us in our own wallet.
|
|
recipient_address = new_address
|
|
recipient_amt = utxo_amt / 2 # sending half coins to recipient
|
|
miner_fee = 0.00000300 # choose appropriate fee based on your tx size
|
|
change_address = new_change_address
|
|
change_amt = float('%.8f'%((utxo_amt - recipient_amt) - miner_fee))
|
|
print("---------------------------------------------------------------")
|
|
print("Transaction Details:")
|
|
print("-------------------")
|
|
print("UTXO Address.......: ", utxo_address)
|
|
print("UTXO Txid..........: ", utxo_txid)
|
|
print("Vector ID of Output: ", utxo_vout)
|
|
print("UTXO Amount........: ", utxo_amt)
|
|
print("Tx Amount..........: ", recipient_amt)
|
|
print("Recipient Address..: ", recipient_address)
|
|
print("Change Address.....: ", change_address)
|
|
print("Miner Fee..........: ", miner_fee)
|
|
print("Change Amount......: ", change_amt)
|
|
print("---------------------------------------------------------------\n")
|
|
|
|
## 2. Create Raw Transaction
|
|
txids_vouts = [{"txid": utxo_txid, "vout": utxo_vout}]
|
|
addresses_amts = {f"{recipient_address}": recipient_amt, f"{change_address}": change_amt}
|
|
unsigned_tx_hex = rpc_client.createrawtransaction(txids_vouts, addresses_amts)
|
|
print("---------------------------------------------------------------")
|
|
print("Unsigned Transaction Hex: ", unsigned_tx_hex)
|
|
print("---------------------------------------------------------------\n")
|
|
|
|
## 3. Sign Raw Transaction
|
|
address_priv_key = [] # list of priv keys of each utxo
|
|
address_priv_key.append(rpc_client.dumpprivkey(utxo_address))
|
|
signed_tx = rpc_client.signrawtransactionwithkey(unsigned_tx_hex, address_priv_key)
|
|
print("---------------------------------------------------------------")
|
|
print("Signed Transaction: ")
|
|
print("----------------------")
|
|
pprint(signed_tx)
|
|
print("---------------------------------------------------------------\n")
|
|
|
|
## 4. Broadcast Transaction
|
|
send_tx = rpc_client.sendrawtransaction(signed_tx['hex'])
|
|
print("---------------------------------------------------------------")
|
|
print("TXID of sent transaction: ", send_tx)
|