区块链/等级 II · 运作机制/2.2 交易/课程 2
输入与输出
交易的结构:outpoint、脚本与隐含的手续费
材料区块浏览器,如 mempool.space 或 blockchain.com用于对聪数值求和的计算器
好奇
- 一笔交易如何证明自己有权使用另一笔交易创建的价值?
- 如果没有明确的费用字段,矿工们如何知道自己能获得多少报酬?
- 为什么每个区块中的第一笔交易在结构上都不寻常?
探索
- 比特币交易是一种包含版本号和nLockTime的数据结构,但其核心由输入和输出构成。输入本身不包含价值,而是指向价值。每个输入都通过一个outpoint引用之前的某个特定输出:outpoint由源交易32字节的txid加上4字节的索引组成,索引用于标识该交易中被花费的是哪个输出。正是这种引用将交易连接成一条链。
- 每个输入还携带解锁数据和一个nSequence字段。nSequence用于控制时间锁以及手续费替换(RBF)信号。解锁数据在传统交易中存放于scriptSig,在SegWit交易中存放于见证(witness)部分,它提供满足所引用输出条件所需的密码学证明。私钥签名就存放在这里。
- 输出部分存储着价值。每个输出都会用一个8字节的整数来表示聪的数量,同时还会有一段锁定脚本(scriptPubKey),用于指定日后谁有权限花费这些聪。一笔交易可以包含多个输入和输出,但所有输入的总值必须至少等于所有输出的总值。
- 手续费并不存储在任何地方,而是推导得出的:即输入所消耗的总价值与输出所创建的总价值之间的差额。这部分余额归将该交易打包进区块的矿工所有。如果两者相等,手续费为零;如果输出超过输入,交易即为无效。
- coinbase交易是印证这一规则的例外。它有一个特殊的输入,没有之前的outpoint,实际上是凭空创造了新价值。其输出包含区块补贴(目前为3.125 BTC)以及该区块中其他交易所支付的全部手续费。任何交易的txid都是其序列化数据(不含见证信息)的双重SHA-256哈希值。
- 打开区块浏览器,查询2009年1月12日挖出的第170个区块。除了coinbase交易外,该区块还包含一笔交易:中本聪向哈尔·芬尼发送10 BTC。这笔交易唯一的输入花费了第9个区块50 BTC的coinbase输出。它有两个输出:10 BTC发给芬尼,40 BTC返还给中本聪。输入和输出的总额均为50 BTC,因此手续费为零;早期的交易通常不付手续费,因为当时区块空间十分充裕。
关键事实
- 输入通过由txid和输出索引组成的outpoint引用之前的输出。
- 交易费用是输入值之和与输出值之和之间的差值。
- 输出包含一个8字节的聪数值以及一个锁定脚本(scriptPubKey)。
- 输入包含解锁数据(签名)以及用于时间锁或RBF信号的nSequence字段。
- coinbase交易通过一个没有之前outpoint的特殊输入来创建新的比特币。
- txid 是经过序列化处理后的交易数据(不包括见证数据)的双重 SHA-256 哈希值。
练习 九、六、三、一
9收集在区块浏览器上查看最近9笔交易。对于每笔交易,记录其输入数量、输出数量以及以聪为单位的手续费。
6归类按结构将这9笔交易分为6组:一进一出、一进二出、多进一出(合并)、一进多出(批量支付)、多进多出,或其他。
3提炼将这6组归纳为一笔交易具有多个输入或多个输出的3个原因。
1凝结用1句话说明为什么比特币可以让手续费隐含在交易中,而无需明确写出。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。