当前位置:首页 > 热门币 > 正文内容

为了确保每次都是全新的环境,可以删除旧的同名钱包

eeo2026-05-25 22:18:25热门币10
摘要:

Python编程实战:如何创建并签名一笔比特币交易比特币作为第一个去中心化的数字货币,其核心在于交易,每一笔比特币的转移都通过一笔精心构造的交易来完成,对于开发者而言,理解并亲手创建一笔比特币交易是...

Python 编程实战:如何创建并签名一笔比特币交易


比特币作为第一个去中心化的数字货币,其核心在于交易,每一笔比特币的转移都通过一笔精心构造的交易来完成,对于开发者而言,理解并亲手创建一笔比特币交易是深入理解区块链技术的关键一步,本文将带你使用 Python,一步步从零开始,创建一笔简单的比特币交易。

重要声明: 本文仅用于技术教育和知识分享目的,比特币交易是不可逆的,错误操作可能导致资金永久丢失,请务必在测试网络上进行实践,切勿在主网上使用以下代码处理真实资金。

核心概念:一笔比特币交易是什么?

在深入代码之前,我们必须理解比特币交易的基本构成,一笔比特币交易本质上是一个数据结构,包含以下关键部分:

  1. 输入: 指向之前一笔未花费的交易输出,它告诉你“这笔钱从哪里来”,输入主要包括:

    • txid:前一笔交易的哈希值,用来唯一标识它。
    • vout:在前一笔交易中,你想要使用的输出的索引。
    • scriptSig:解锁脚本,包含签名和公钥,用于证明你拥有对应UTXO的私钥。
  2. 输出: 指定交易接收方以及接收金额,它告诉你“钱要到哪里去”,输出主要包括:

    • value:转账金额(以聪为单位,1 BTC = 100,000,000 聪)。
    • scriptPubKey:锁定脚本,定义了未来花费这笔比特币的条件(通常是一个公钥的哈希,只有拥有对应私钥的人才能签名解锁)。
  3. 锁定时间: 一个可选字段,指定交易在哪个区块高度或时间戳之后才有效。

我们的目标就是用 Python 来构建这个数据结构,并用私钥对其进行签名。

准备工作:安装必要的库

我们将使用 bitcoinlib 库,这是一个功能强大且相对易用的 Python 库,可以极大地简化比特币交易的处理。

通过 pip 安装它:

pip install bitcoinlib

实战演练:创建一笔交易

我们将执行以下步骤:

  1. 设置测试网络: 我们在比特币的测试网 上操作,这样就不会损失真实的比特币。
  2. 创建或导入钱包: 我们需要一个钱包来管理私钥和地址。
  3. 获取未花费的交易输出: 我们需要一个有效的 UTXO 作为交易的输入。
  4. 构建原始交易: 创建包含输入、输出等原始数据的交易。
  5. 签名交易: 使用私钥对交易输入进行签名。
  6. 广播交易: 将签名后的交易发送到测试网络,使其上链。

步骤 1 & 2:创建钱包

我们将创建一个新钱包,并生成一个新的地址来接收一些测试币。

from bitcoinlib.wallets import Wallet, wallet_delete
from bitcoinlib.mnemonic import Mnemonic
from bitcoinlib.transactions import Transaction
import os
if os.path.exists('my_test_wallet'):
    wallet_delete('my_test_wallet')
# 创建一个名为 'my_test_wallet' 的新钱包,使用测试网络
try:
    wallet = Wallet.create('my_test_wallet', network='testnet')
    print(f"钱包 '{wallet.name}' 创建成功!")
    # 获取一个接收地址
    receiving_address = wallet.get_key().address
    print(f"请向此测试网地址发送少量测试币: {receiving_address}")
    # 为了演示,我们假设已经收到了一些测试币,需要刷新一下钱包状态
    wallet.utxos_update()
    print("钱包UTXO已更新。")
except Exception as e:
    print(f"操作失败: {e}")
    # 如果钱包已存在,尝试加载它
    wallet = Wallet('my_test_wallet')
    wallet.utxos_update()

步骤 3:获取 UTXO

交易需要输入。bitcoinlib 可以方便地获取钱包中所有可用的 UTXO。

# 获取钱包中所有未花费的交易输出
utxos = wallet.utxos()
if not utxos:
    print("错误:钱包中没有找到任何UTXO,请先向上述地址发送一些测试币。")
    exit()
# 我们选择第一个UTXO作为输入
input_utxo = utxos[0]
print(f"选择的UTXO: Transaction ID: {input_utxo['txid']}, Output Index: {input_utxo['output_n']}, Value: {input_utxo['value']} satoshis")
# 定义接收方和找零地址
# 假设我们要发送 0.001 BTC (100,000 聪) 到另一个地址
# 这里我们使用同一个钱包的另一个地址作为接收方和找零方,以简化示例
recipient_address = wallet.get_key().address  # 新的接收地址
change_address = wallet.get_key().address      # 找零地址
# 计算金额
# 注意:交易需要支付矿工费,这里我们简单预估为 1000 聪
fee = 1000
send_value = 100000  # 0.001 BTC in satoshis
change_value = input_utxo['value'] - send_value - fee
print(f"计划发送: {send_value} 聪到 {recipient_address}")
print(f"找零: {change_value} 聪到 {change_address}")
print(f"矿工费: {fee} 聪")

步骤 4:构建原始交易

我们创建一个 Transaction 对象,并添加输入和输出。

# 创建一个空的交易
tx = Transaction(network='testnet')
# 添加输入
# 输入需要提供 txid, vout, 以及锁定脚本(scriptPubKey)的模板
tx.add_input(input_utxo['txid'], input_utxo['output_n'], keys=wallet.keys()[0])
# 添加输出
# 输出需要提供地址和金额(以聪为单位)
tx.add_output(send_value, recipient_address)
tx.add_output(change_value, change_address)
print("\n--- 原始交易信息 (未签名) ---")
print(tx.info())
print(f"原始交易十六进制: {tx.raw_hex()}")
# 你可以将这个原始交易粘贴到 https://blockstream.info/testnet/decoderawtx/ 进行解码查看

步骤 5:签名交易

这是最关键的一步,我们需要使用与输入 UTXO 对应的私钥来对交易进行签名。bitcoinlib 会自动处理这个细节。

# 签名交易
# wallet.sign() 方法会自动找到对应的私钥并进行签名
tx.sign(wallet)
print("\n--- 签名后交易信息 ---")
print(tx.info())
print(f"签名后交易十六进制: {tx.raw_hex()}")
# 再次解码,你会发现输入部分已经有了签名数据

步骤 6:广播交易

我们将签名后的交易广播到比特币测试网络,让矿工打包。

# 广播交易
try:
    txid = tx.send()
    print(f"\n广播成功!交易ID: {txid}")
    print(f"你可以在 https://blockstream.info/testnet/tx/{txid} 查看这笔交易。")
except Exception as e:
    print(f"广播失败: {e}")
    print("可能的原因:余额不足、矿工费太低、或网络问题。")

总结与展望

通过以上步骤,我们成功地使用 Python 和 bitcoinlib 库创建、签名并广播了一笔比特币交易,这个过程让我们深刻理解了:

  • UTXO 模型: 比特币交易是基于 UTXO 的,而不是账户余额。
  • 交易结构: 交易由输入和输出构成,并通过脚本锁定和解锁资金。
  • 数字签名: 私钥签名是确保交易所有权和安全的核心机制。

虽然 bitcoinlib 库为我们封装了许多复杂的底层细节(如序列化、脚本操作、签名算法等),但了解其背后的原理至关重要,如果你想更进一步,可以尝试使用更底层的库(如 python-bitcoinlib)手动构建脚本,或者研究 SegWit、Taproot 等新的交易类型,区块链的世界充满了挑战和机遇,希望这篇文章能成为你探索之旅的坚实起点。

    币安交易所

    币安交易所是国际领先的数字货币交易平台,低手续费与BNB空投福利不断!

扫描二维码推送至手机访问。

版权声明:本文由e-eo发布,如需转载请注明出处。

本文链接:http://www.e-eo.com/post/27791.html

分享给朋友: