Electrum交易解析器:PSBT与部分签名工作流

Electrum交易解析器:PSBT与部分签名工作流

【免费下载链接】electrum Electrum Bitcoin Wallet 【免费下载链接】electrum 项目地址: https://gitcode.com/gh_mirrors/el/electrum

PSBT(部分签名交易)基础

PSBT(Partially Signed Transaction,部分签名交易)是一种交易格式,允许多个签名者分步签署交易,无需共享私钥。Electrum通过模块化设计实现了PSBT的完整生命周期管理,包括创建、解析、签名和合并等核心操作。

PSBT的核心价值

传统交易需要一次性完成所有签名,而PSBT支持:

  • 多签钱包的协作签名流程
  • 硬件钱包与软件钱包的安全交互
  • 离线设备与在线设备的签名分工

在Electrum中,PSBT相关功能主要通过electrum/transaction.py实现,该模块定义了TxInputTxOutput等核心数据结构,以及PSBT的序列化与解析逻辑。

Electrum中的PSBT工作流

1. 交易创建与PSBT生成

Electrum使用PartialTransaction类表示未完成的交易,通过create_psbt()方法生成PSBT格式数据:

# 伪代码:PSBT创建流程
from electrum.transaction import PartialTransaction

# 1. 创建部分交易
partial_tx = PartialTransaction()
partial_tx.add_input(prevout=TxOutpoint(txid=..., out_idx=0))
partial_tx.add_output(scriptpubkey=..., value=10000)

# 2. 生成PSBT
psbt = partial_tx.to_psbt()
psbt_base64 = psbt.serialize()  # 转换为Base64格式以便传输

2. PSBT解析与验证

收到PSBT后,Electrum通过parse_psbt()方法重建交易结构并验证完整性:

# 伪代码:PSBT解析流程
from electrum.transaction import parse_psbt

psbt = parse_psbt(psbt_base64)
# 验证输入输出合法性
psbt.validate()
# 检查是否包含必要的UTXO数据
for txin in psbt.inputs:
    if not txin.utxo:
        raise MissingUTXOError("输入缺少UTXO数据")

3. 签名生成与合并

Electrum支持多种签名方式,包括软件签名和硬件钱包签名:

# 伪代码:PSBT签名流程
from electrum.wallet import Abstract_Wallet

wallet = Abstract_Wallet.load(...)
# 使用钱包密钥签名
signed_psbt = wallet.sign_psbt(psbt)

# 合并多个签名(适用于多签场景)
another_signed_psbt = ...  # 其他签名者的PSBT
final_psbt = signed_psbt.combine(another_signed_psbt)

# 提取完整交易并广播
tx = final_psbt.extract_transaction()
tx.broadcast()

关键数据结构解析

TxInput与UTXO管理

electrum/transaction.py中的TxInput类封装了交易输入信息,包括prevout(前序输出引用)、script_sig(脚本签名)和witness(隔离见证数据)。PSBT通过utxo属性关联未花费交易输出:

class TxInput:
    prevout: TxOutpoint  # 引用前序交易输出
    script_sig: bytes    # 脚本签名
    witness: bytes       # 隔离见证数据
    _utxo: Optional[Transaction]  # 关联的UTXO数据
    
    def value_sats(self) -> Optional[int]:
        """获取输入的货币数量(以聪为单位)"""
        return self._utxo.outputs[self.prevout.out_idx].value if self._utxo else None

Sighash类型与签名生成

Electrum定义了Sighash枚举类,支持标准签名哈希类型(ALL、NONE、SINGLE)及ANYONECANPAY标志:

class Sighash(IntEnum):
    DEFAULT = 0  # Taproot专用
    ALL = 1
    NONE = 2
    SINGLE = 3
    ANYONECANPAY = 0x80  # 可与其他类型组合

签名生成逻辑在sign_input()方法中实现,根据输入类型(P2PKH/P2WPKH/P2TR)选择不同的签名算法:

def sign_input(txin: TxInput, key: Key, sighash: Sighash) -> bytes:
    if txin.is_taproot():
        # Taproot签名(BIP-340)
        return bip340_sign(key, txin, sighash)
    elif txin.is_segwit():
        # 隔离见证签名(BIP-143)
        return segwit_sign(key, txin, sighash)
    else:
        # 传统签名
        return legacy_sign(key, txin, sighash)

多签工作流与硬件集成

多签PSBT协作流程

Electrum的多签钱包通过PSBT实现签名者之间的无信任协作:

  1. 创建阶段:发起者生成包含所有输入输出的PSBT
  2. 分发阶段:通过安全渠道发送PSBT给其他签名者
  3. 签名阶段:各签名者独立签名并返回PSBT
  4. 合并阶段:组合所有签名生成完整交易
  5. 广播阶段:将最终交易发送至网络

硬件钱包交互

PSBT的一大优势是支持硬件钱包安全签名。Electrum通过electrum/hw_wallet/模块与硬件设备通信,将PSBT发送至设备签名,避免私钥暴露:

# 伪代码:硬件钱包签名流程
from electrum.hw_wallet.plugin import HW_PluginBase

hw_plugin = HW_PluginBase.get_instance("trezor")
# 将PSBT发送至硬件设备
hw_signed_psbt = hw_plugin.sign_psbt(psbt)

常见问题与解决方案

PSBT不完整错误

问题:解析PSBT时提示MissingUTXOError
解决:确保PSBT包含所有输入的UTXO数据,可通过add_utxo()方法补充:

psbt.add_utxo(txid=..., out_idx=0, scriptpubkey=..., value=...)

签名验证失败

问题:合并签名后验证失败
解决:检查Sighash类型是否一致,多签场景需确保所有签名使用相同的哈希标志:

# 验证所有输入使用相同的Sighash类型
sighashes = {txin.sighash for txin in psbt.inputs}
if len(sighashes) > 1:
    raise InconsistentSighashError("签名哈希类型不一致")

硬件钱包拒绝签名

问题:硬件设备拒绝签署PSBT
解决:检查交易金额和接收地址是否正确,部分设备要求验证输出脚本:

for txout in psbt.outputs:
    if not txout.address:
        raise InvalidOutputError("输出地址无效")

总结与最佳实践

PSBT通过标准化的部分签名流程,极大简化了多签钱包、硬件钱包等复杂场景的实现。Electrum的PSBT解析器遵循BIP-174规范,提供了完整的创建、解析、签名和合并功能。使用时建议:

  1. 验证PSBT完整性:接收PSBT后先调用validate()方法检查格式
  2. 使用隔离见证地址:优先选择P2WPKH/P2TR等隔离见证类型,降低交易费用
  3. 备份PSBT文件:多签过程中保存中间状态的PSBT,防止签名丢失
  4. 离线签名:敏感操作使用离线设备签名,提高私钥安全性

通过合理使用PSBT,Electrum用户可以安全高效地完成各类交易,尤其是在需要多方协作的场景中。

【免费下载链接】electrum Electrum Bitcoin Wallet 【免费下载链接】electrum 项目地址: https://gitcode.com/gh_mirrors/el/electrum

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值