Creating a Transaction in Pure Python without Running Bitcoin Locally
In this article, we will explore the feasibility of creating a transaction in pure Python using only Bitcoin’s underlying protocol and without running Bitcoin locally. We’ll also delve into how to sign transactions with your private key.
What is a Signed Transaction?
A signed transaction on Bitcoin is essentially a message that includes the sender’s identity (public key) and a digital signature that proves the sender has control over their private keys. The signature is generated using a public-private key pair, where the public key is used to identify the sender, and the private key is used to sign the transaction.
Can we create a signed transaction in pure Python?
Yes, it is possible to create a signed transaction in pure Python without running Bitcoin locally. We’ll use the bitcoin
library as our implementation, which provides a Pythonic interface for interacting with the Bitcoin network.
Here’s an example code snippet that demonstrates how to create a signed transaction using your private key:
import bitcoin
def get_public_key(private_key):
"""Get the recipient's public key from the private key."""
return bitcoin.PublicKey.from_private_key(private_key)
def sign_transaction(transaction, private_key):
"""Sign a transaction with the given private key."""
sender = transaction.sender
signature = bitcoin.Signature.sign(
transaction,
bitcoin.PublicKey.get_from_string(sender)
)
return {
'signature': bitcoin.Signature.to_string(signature),
'private_key': private_key.hex()
}

Example usage:
private_key = bitcoin.PrivateKey.from_hex('0123456789012345678901234567890abcdef')
Replace with your private key
transaction = {
'sender': {
'address': '1A2B3C4D5E6F7G8H9I0J',
'amount': 10.0
in BTC
},
'signature': '1234567890123456789012345678901234567890abcdef'
}
signed_transaction = sign_transaction(transaction, private_key)
print(signed_transaction)
In this example, we create a Bitcoin
object using the private key as input. We then use the Signature.sign()
method to generate a signature for the transaction, which includes both the sender’s public key and the transaction data.
The resulting dictionary contains the signed transaction details, including the signature and the private key used to sign it.
Is this feasible?
While we can create a signed transaction in pure Python using Bitcoin’s underlying protocol, there are some limitations to consider:
- The
bitcoin
library is designed for interacting with Bitcoin at the protocol level, not for creating raw transactions that need to be verified and executed by the Bitcoin network.
- You’ll need to have access to a Bitcoin node or an interface to the Bitcoin blockchain in order to verify and execute the signed transaction on the network.
- The
Signature.sign()
method generates a single signature that covers all data in the transaction. If you want to create multiple signatures for different parts of the transaction, you may need to use a different approach.
In summary, while creating a signed transaction in pure Python without running Bitcoin locally is technically possible, it requires some additional setup and considerations to work effectively with Bitcoin’s underlying protocol.