如何使用Python实现交易Hex的离线签名?求对应签名函数
Python实现交易Hex离线签名的方法
当然可以实现啦!完全不用自己从零搭建签名逻辑——市面上有很多经过安全验证的Python库,能帮你高效搞定这个需求,还能避免手动实现加密逻辑时容易踩的坑。下面我分两种常见链的场景给你写符合要求的函数:
场景1:比特币及兼容链(比如BTC、BCH等)
首先需要安装依赖库python-bitcoinlib,用pip就能搞定:
pip install python-bitcoinlib
接下来是核心函数,它接收原始交易Hex和十六进制格式的私钥,返回签名后的交易Hex:
from bitcoin.core import CTransaction, x from bitcoin.core.script import CScript, OP_CHECKSIG from bitcoin.wallet import CBitcoinSecret def sign_raw_btc_transaction(raw_tx_hex, private_key_hex): # 1. 将原始交易Hex反序列化为交易对象 raw_tx_bytes = x(raw_tx_hex) tx = CTransaction.deserialize(raw_tx_bytes) # 2. 把十六进制私钥转换成可用于签名的对象 priv_key = CBitcoinSecret.from_secret_bytes(x(private_key_hex)) pubkey = priv_key.pub # 3. 遍历交易的每个输入,完成签名 for input_idx in range(len(tx.vin)): # 这里默认交易的输出是P2PKH类型(最常见的普通地址),如果是其他类型需要调整脚本 script_pubkey = CScript([pubkey, OP_CHECKSIG]) # 计算签名哈希 sighash = tx.sighash(input_idx, script_pubkey) # 生成签名并附加哈希类型标识 sig = priv_key.sign(sighash) + bytes([sighash.nHashType]) # 设置输入的解锁脚本 tx.vin[input_idx].scriptSig = CScript([sig, pubkey]) # 4. 把签名后的交易序列化为Hex格式返回 return tx.serialize().hex()
小提示:
- 如果你的私钥是WIF格式(比如以
L或K开头的字符串),直接用CBitcoinSecret(private_key_wif)初始化私钥对象即可,不用转十六进制。 - 如果交易涉及P2SH、P2WPKH等复杂脚本类型,需要针对性调整解锁脚本的构造逻辑,建议参考对应链的脚本规范。
场景2:以太坊及兼容链(比如ETH、BSC等)
这类链可以用web3.py库来实现,先安装依赖:
pip install web3 eth-account
对应的签名函数如下:
from web3 import Web3 from eth_account import Account def sign_raw_eth_transaction(raw_tx_hex, private_key): w3 = Web3() # 1. 解析原始交易Hex为交易字典 tx_dict = w3.eth.account.decode_transaction(raw_tx_hex) # 2. 用私钥签名交易 signed_tx = w3.eth.account.sign_transaction(tx_dict, private_key=private_key) # 3. 返回签名后的交易Hex return signed_tx.rawTransaction.hex()
重要提醒:
千万不要自己手动实现签名的核心加密逻辑!签名涉及哈希算法、签名格式、脚本规则等诸多细节,稍有不慎就会导致交易无效甚至资产丢失,用成熟的第三方库是最稳妥的选择。
内容的提问来源于stack exchange,提问作者Kamil Septio Trojnar
相关产品推荐
相关产品推荐

