2022年4月,据安全团队消息,UTXO多签机制可被用于发起对交易所的假充值攻击。起因是获取交易数据接口返回结果中对 MultiSig 类型交易展示不完善。如果交易所、钱包客户端或者其它中心化服务仅根据返回结果进行入账判断,可能造成误判导致假充值。目前已知可能受此多签特性影响的币种有BTC/LTC/DOGE/BCH/BSV/BHD/CPU/DFI/BTCV/BXC/ZCL等。

什么是UTXO?

我们经常会在区块链浏览器看到地址余额等信息,然而,比特币不使用 “账户-余额” 的模式来表示价值。UTXO全称Unspent Transaction Outputs,表示未花费交易输出,被用作比特币交易的输出。一笔交易由输入和输出组成,而 UTXO 是这个交易输入输出的一部分,所以我们也称 UTXO 是交易最基本的组成单元。

创世交易-输出交易

有些特殊交易没有输入,只有输出,这样的交易我们称之为 coinbase 交易,也被称为创世交易(这个coinbase交易和上市公司 Coinbase 没有关系)。因为这笔交易为比特币系统创造了比特币,这笔创造出来的比特币就是系统对于矿工的工作量证明的奖励,也就是所说的比特币矿工的 “爆块奖励”。使用Tokenview 比特币区块浏览器查看区块链第一笔交易:

https://btc.tokenview.com/cn/tx/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b

BTC未花费交易模型是什么样的?如何调用UTXO API

普通交易-输入与输出

一个 UTXO 创建后就不可分割,只能将其花掉,而花掉 UTXO 又会产生新的 UTXO, 这样子周而复始地实现比特币价值的转移。

BTC未花费交易模型是什么样的?如何调用UTXO API

如上图,Transaction 1 就是一个UTXO,输入了5个BTC,输出了4个和1个BTC;Transaction 2是另外一个UTXO,输入了3个BTC,输出了0.5个BTC和2.4个BTC;Transaction 3 的UTXO的输入是来自Transaction 1 和Transaction 2 的输出共1.5个BTC。

UTXO模型原理就是每一笔 UTXO 的输入都来自上一笔 UTXO 的输出,直到 coinbase 交易为止,也就是只有输出没有输入。

比特币网络转账UTXO的变化

假设 Alice 给 Bob 转账,则转账可分为三个阶段:

  • 假设 Alice 之前通过挖矿获得了 6.25 个比特币,那么在她的地址中,这 6.25 个比特币是某个 coinbase 交易的 UTXO。
  • Alice 发起一笔交易,输入是自己的上一笔交易,输出是 Bob 的地址,数量为 6.25 BTC,不考虑矿工手续费。Alice 对该交易用自己的私钥进行签名。
  • 当交易被全网确认后,Alice 的 UTXO 就变成了 0。而 Bob 的地址则新增了一个 UTXO,来自 Alice 且包含 6.25 BTC。
BTC未花费交易模型是什么样的?如何调用UTXO API

例如Tokenview 比特币区块浏览器查看到的一笔交易:

https://btc.tokenview.com/cn/address/3LQUu4v9z6KNch71j7kbj8GPeAGUo1FW6a

该地址的“余额”是37,926.9774891 BTC,表示该地址的UTXO,未花费交易输出为37,926.9774891 BTC。

BTC未花费交易模型是什么样的?如何调用UTXO API

UTXO模型基本原则和作用

所有比特币都必须来源于前面某一个或者几个交易的 UTXO,除非是爆块奖励的比特币。任何一笔交易的输入比特币之和必须等于输出比特币之和(矿工费视为包含在输出里的话)。可以看成 “等式两边必须配平”。

UTXO模型是为了防止双花,就是双重花费数字资产。UTXO模型原理下,双花发生概率很低而且极易被全网验证时所发现并剔除。每一笔输入同时也需要上一笔输出所对应的私钥进行签名,而且每个矿工都存储着比特币网络所有 UTXO 的信息,全网矿工通过 UTXO 规则及签名算法就可以验证新交易的合法性。

Tokenview未花费交易 API

比特币区块链和其分叉链都是使用的UTXO交易模型,除了在BTC区块浏览器查询交易信息外,在哪里可以获取未花费交易数据呢?Tokenview 未花费 API (https://services.tokenview.com) 就可以获取相关交易数据,并支持多条链包括:BTC, BCH, BCHSV, DASH, LTC, DOGE, RVN, PIVX, NMC, RDD, XZC, NRG, SYS, NEBL, VTC, VITAE, GIN, HC, CRW, GAME, PART, EMC, UNO, XSN, WGR, EMC2, BCI, BLK, CLAM, XVG, LUX, SMART, DCR, BAY, FLO, NAV, STRAT, XMY, BCA, MONA, DGB,LCC。

Tokenview 未花费交易 API接口:

https://services.tokenview.com/vipapi/unspent/btc/1DfDKUMzSxJD8dontsxTvXVUUBZrQ24ZfA/1/50?apikey=R8UNuoal7yGtw32PlksD

BTC未花费交易模型是什么样的?如何调用UTXO API

未花费交易接口字段含义:

  • 'block_no': 658084,此未花费交易所在的区块高度是658084;
  • 'output_no': 4, 此UTXO 的第4个输出(从0开始);
  • 'index': '201', 此笔交易在该区块里的位置是第201笔(从0开始);
  • 'txid':'de44f8aece76d48ba72ddb3710f44a29e8239c4bed20bf2a36e6d3adaed0adb2', 此未花费交易的交易哈希;
  • 'hex': '76a9148adb995199ef0d0f5e90e8514030e135b944cbaa88ac', 输出地址的16进制格式;
  • 'confirmations': 17051, 此未花费交易的确认数是17051;
  • 'value': '71.95205342' 此UTXO 第4个输出的总金额为71.95205342 BTC。
BTC未花费交易模型是什么样的?如何调用UTXO API