比特币交易签名实战:token-core-android 的 UTXO 模型、找零与多输入签名

📅 2026/8/19 19:06:34
比特币交易签名实战:token-core-android 的 UTXO 模型、找零与多输入签名
比特币交易签名实战token-core-android 的 UTXO 模型、找零与多输入签名【免费下载链接】token-core-androida blockchain private key management library on android项目地址: https://gitcode.com/gh_mirrors/to/token-core-android比特币交易签名与以太坊式的扣余额完全不同它要做的不是减少账户数字而是把历史 UTXO 一枚枚花掉。token-core-android 是一款面向 Android 平台的区块链私钥管理库它把 UTXO 模型、找零输出与多输入签名封装成统一且简洁的 API。本文以BitcoinTransaction为切入点用最通俗的语言拆解比特币交易签名的完整流程帮你快速上手避开新手常见的大坑。为什么说比特币交易签名是花硬币而不是扣余额比特币里根本没有账户余额这个概念。每个地址拥有的是一堆未花费的交易输出Unspent Transaction OutputUTXO。你可以把它们想象成钱包里的一枚枚硬币每枚都有固定面值、有来路记录花的时候必须整枚花掉——面值不够就得多拿几枚凑花不完的部分就要找零回来。UTXO 由哪些字段组成在 token-core-android 中UTXO 被建模为BitcoinTransaction.UTXO这个内部类定义于app/src/main/java/org/consenlabs/tokencore/wallet/transaction/BitcoinTransaction.java字段含义txHash这枚硬币来自哪一笔交易交易哈希vout它是该交易的第几个输出从 0 开始amount硬币面值单位是聪1 BTC 1 亿聪address这枚硬币被锁定在哪个地址scriptPubKey锁定脚本证明这枚硬币属于谁derivedPath该地址在 HD 钱包中的派生路径如0/22sequence序列号与 RBF 手续费替换等功能相关所以一笔比特币交易签名的本质是选若干 UTXO 作为输入 → 生成收款输出 找零输出 → 对每个输入分别签名。一次转账的完整旅程输入、输出与找零怎么算用 token-core-android 发起转账非常简单构造一个BitcoinTransaction传入收款地址、找零索引、转账金额、手续费和 UTXO 列表再调用signTransaction()即可。核心逻辑位于app/src/main/java/org/consenlabs/tokencore/wallet/transaction/BitcoinTransaction.java输入总和 Σ 所有 UTXO 的 amount 找零金额 输入总和 - 转账金额 - 手续费这里有个容易忽略的细节只有找零金额 ≥ 防粉尘阈值DUST_THRESHOLD 2730聪时才会追加找零输出。如果找零金额低于这个值就直接放弃找零把零头留给矿工作手续费。这样做是为了避免产生粉尘输出dust防止区块链被微小金额交易刷屏。找零地址钱包如何安全地收回零钱找零地址绝对不能直接用收款地址——那样链上任何人都能顺着地址扒出你的全部资金流水隐私瞬间归零。token-core-android 的做法是从 HD 主密钥按 BIP44 规范派生出一个独立的找零分支change key再结合你传入的changeIdx定位到具体的找零地址。这段逻辑见app/src/main/java/org/consenlabs/tokencore/wallet/transaction/BitcoinTransaction.java。常用的 BIP44 派生路径定义在app/src/main/java/org/consenlabs/tokencore/wallet/model/BIP44Util.java钱包类型主网路径测试网路径普通比特币钱包m/44/0/0m/44/1/0SegWit 钱包m/49/0/0m/49/1/0多输入签名实战一枚硬币不够花怎么办当转账金额超过单枚 UTXO 的面值时就需要把多个 UTXO 塞进同一笔交易。测试用例app/src/test/java/org/consenlabs/tokencore/wallet/transaction/BitcoinTransactionTest.java里就演示了同时消费 4 个 UTXO 的场景。这里的关键在于每个输入都必须用对应地址的私钥单独签名。token-core-android 会读取每个 UTXO 的derivedPath从 HD 主密钥逐层派生出对应的子私钥然后逐个计算签名哈希hashForSignature、生成 ECDSA 签名最后写回每个输入的scriptSig。签名类型固定为SIGHASH_ALL表示签名覆盖整个交易任何改动都会让签名失效——这也是防篡改的核心。私钥从哪来WIF 钱包与 HD 钱包的差异WIF 钱包从导入的 WIF 私钥直接恢复ECKey所有 UTXO 共用同一把私钥签名HD 钱包从助记词派生出 xprv 主密钥再按每个 UTXO 的derivedPath分别派生对应子私钥。SegWit 交易签名见证数据与 wtxID 是什么隔离见证SegWit改变了签名的组织方式签名不再放进scriptSig而是移入独立的见证数据区witness因此交易体积更小、手续费更省。token-core-android 通过signSegWitTransaction()实现 P2WPKH 地址的签名app/src/main/java/org/consenlabs/tokencore/wallet/transaction/BitcoinTransaction.java签名前需要预先计算hashPrevouts、hashOutputs、hashSequence等一系列哈希字段。SegWit 交易还有一个独特现象wtxID见证交易 ID和 txHash 可能不一样。wtxID 的哈希覆盖了见证数据而 txHash 不含见证数据。这就是为什么签名结果里会同时返回两个哈希。签名完成后拿到什么签名结果被封装在TxSignResult中app/src/main/java/org/consenlabs/tokencore/wallet/transaction/TxSignResult.java返回值用途signedTx序列化后的完整签名交易十六进制可直接广播上链txHash交易哈希用于查询交易确认状态wtxID仅 SegWit 交易返回见证交易 ID新手避坑指南5 个最容易踩的坑 ⚠️单位换算金额与手续费都用聪别拿 BTC 当单位直接传差 1 亿倍防粉尘拦截转账金额低于 2730 聪会直接被拒绝这是防粉尘保护机制余额不足输入 UTXO 总和小于转账金额时会抛出INSUFFICIENT_FUNDS异常测试网隔离调试务必使用测试网TestNet地址和测试网 WIF别拿主网私钥乱试压缩公钥SegWit 地址要求压缩公钥导入非压缩私钥会直接报错。如何获取源码动手实践想要亲手跑一遍多输入签名与找零逻辑可以克隆源码到本地git clone https://gitcode.com/gh_mirrors/to/token-core-android然后重点阅读BitcoinTransactionTest.java中的测试用例——它们演示了 WIF 钱包、HD 钱包、多 UTXO、SegWit 等多种场景还附带了可校验的签名结果是学习比特币交易签名的最佳入门材料。【免费下载链接】token-core-androida blockchain private key management library on android项目地址: https://gitcode.com/gh_mirrors/to/token-core-android创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考