术语表 /交易与手续费
Outpoint
- Outpoint 是什么?
- Outpoint 是长度为36字节的指针,用于唯一标识一个交易输出,由创建该输出的交易的32字节 ID 与表示其位置的4字节索引组合而成。
比特币没有账号,因此每一笔支出都必须准确说明自己花费的是哪一枚币。按人类可读的写法,这个指针由交易 ID、冒号和一个数字组成,它是每个全节点所维护的整个未花费输出数据库的主键。如果两笔交易指向同一个 outpoint,其中只有一笔可以有效,正是这一条规则防止了同一枚币被重复花费。
运作方式
Outpoint 位于每笔交易的每个输入的最前面,节点在检查某笔支出是否被允许时,首先查找的就是它。
在网络传输中,它由两个字段组成,中间没有分隔符:32字节的交易哈希,然后是以小端序存储的4字节索引。哈希按内部字节序书写,与区块浏览器上显示的顺序相反,因此十六进制的原始交易看起来像是引用了一个倒写的交易 ID。每个人第一次阅读原始十六进制数据时都会被这一点绊住,但这纯粹是一种显示约定,数据本身并无差别。
索引从零开始计数。交易的第一个输出是索引0,第二个是索引1,写作以:2结尾的币是第三个输出。该字段为4字节,因此理论上限是4,294,967,295,没有任何真实交易会接近这个数字。
有一个值是保留的。Coinbase 交易,即向矿工付款的那笔交易,只有一个输入,其 outpoint 为32个零字节,索引全部置为一,即0xffffffff。这一组合不指向任何输出,表示该输入是创造价值,而不是转移价值。
唯一性必须通过规则来强制,而不能想当然地假定。两笔内容完全相同的 coinbase 交易会产生相同的 ID,从而产生重复的 outpoint,这在比特币早期历史中发生过两次。BIP30 直接禁止了这种情形,随后 BIP34 又要求每笔 coinbase 交易在其输入脚本中包含区块高度,从而保证内容各不相同。BIP34 在2013年3月的区块227,931起强制执行。
在哪里会遇到它
当您需要精确地谈论某一枚具体的币,而不是某个余额时,处理的标识符就是 outpoint。
钱包的币控制界面以交易 ID 和索引列出持有的币。Bitcoin Core 的 RPC 接口把这两个字段作为一对来处理:listunspent 返回它们,gettxout 用来查询其中一个,createrawtransaction 则需要输入它们。闪电网络使用资金交易的 outpoint 作为通道的永久名称,因此节点软件中的通道标识符看起来是一串哈希加一个小数字。
在争议中引用它也是恰当的。一个地址可能被支付过几十次,一笔交易可能有几十个输出,但一个 outpoint 指的是某一时刻的某一笔金额的某一次付款,不存在可争辩的歧义。如果交易所要求您证明某一笔具体的充币,这样的精确程度足以结束这场交涉。
Outpoint vs 输出索引
输出索引是 outpoint 内部的一个字段,并不是它的简称。单独的索引不携带任何信息,因为数千万笔交易都有索引为0的输出,这个数字并不能说明指的是哪一笔。混淆源于区块浏览器的界面,它们把索引标为"vout"并放在显眼位置,于是人们开始把整个指针称为 vout。记录时请把它们分开:交易 ID 说明是哪笔交易,索引说明是该交易中的哪个输出,只有两者合在一起才能标识一枚币。