Electrum交易解析器:PSBT与部分签名工作流
【免费下载链接】electrum Electrum Bitcoin Wallet 项目地址: https://gitcode.com/gh_mirrors/el/electrum
PSBT(部分签名交易)基础
PSBT(Partially Signed Transaction,部分签名交易)是一种交易格式,允许多个签名者分步签署交易,无需共享私钥。Electrum通过模块化设计实现了PSBT的完整生命周期管理,包括创建、解析、签名和合并等核心操作。
PSBT的核心价值
传统交易需要一次性完成所有签名,而PSBT支持:
- 多签钱包的协作签名流程
- 硬件钱包与软件钱包的安全交互
- 离线设备与在线设备的签名分工
在Electrum中,PSBT相关功能主要通过electrum/transaction.py实现,该模块定义了TxInput、TxOutput等核心数据结构,以及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实现签名者之间的无信任协作:
- 创建阶段:发起者生成包含所有输入输出的PSBT
- 分发阶段:通过安全渠道发送PSBT给其他签名者
- 签名阶段:各签名者独立签名并返回PSBT
- 合并阶段:组合所有签名生成完整交易
- 广播阶段:将最终交易发送至网络
硬件钱包交互
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规范,提供了完整的创建、解析、签名和合并功能。使用时建议:
- 验证PSBT完整性:接收PSBT后先调用
validate()方法检查格式 - 使用隔离见证地址:优先选择P2WPKH/P2TR等隔离见证类型,降低交易费用
- 备份PSBT文件:多签过程中保存中间状态的PSBT,防止签名丢失
- 离线签名:敏感操作使用离线设备签名,提高私钥安全性
通过合理使用PSBT,Electrum用户可以安全高效地完成各类交易,尤其是在需要多方协作的场景中。
【免费下载链接】electrum Electrum Bitcoin Wallet 项目地址: https://gitcode.com/gh_mirrors/el/electrum
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



