首页 百科知识 交易输出和输入

交易输出和输入

时间:2023-12-20 百科知识 版权反馈
【摘要】:比特币交易的基本结构单元是未花费输出,或者被称为UTXO,UTXO是一个不可拆分的比特币结构,锁定一个特定的所有者,记录在区块链上,并被全网看作一个货币单元。这样,一个用户的比特币资金可能会以UTXO的形式分散存放在数百个交易和区块上。比特币能够分割到小数点后8位,被称作“聪”。它们通过引用交易哈希和UTXO在区块链中的顺序号指向一个特定的UTXO。为了花费UTXO,交易输入需要包含解锁脚本以满足UTXO设置的花费条件。

比特币交易的基本结构单元是未花费输出,或者被称为UTXO,UTXO是一个不可拆分的比特币结构,锁定一个特定的所有者,记录在区块链上,并被全网看作一个货币单元。比特币网络跟踪数以百万计的所有有效(未花费)UTXO。当一个用户接收到比特币,金额就以UTXO的形式记录在区块链上。这样,一个用户的比特币资金可能会以UTXO的形式分散存放在数百个交易和区块上。实际上,没有任何东西会去记录一个比特币地址或者账户的余额,只有分散的UTXO,锁定到特定的所有者。用户比特币账户余额的概念是钱包应用软件从传统应用中继承而来的。钱包软件通过扫描区块链,收集所有属于这个用户的UTXO,以此来统计用户的余额。

一个UTXO可以由任意倍的“聪”构成,就像美元可以被分割为小数点后两位的“分”一样。比特币能够分割到小数点后8位,被称作“聪”。虽然UTXO可以是任意金额,但是一旦创建,它就是不可分割的,就如同一枚硬币不能剖成两半一样。如果UTXO比交易所需要的金额大,它也需要一次性花完,超出的部分通过在交易中找零被索回。换句话说,如果你有20比特币的UTXO,需要支付1比特币,交易首先要将20比特币的UTXO全部花完,那么就需要创建两个输出:一个是支付1比特币给指定的接收人,另外一个则将19比特币返回到你的钱包。结果是,绝大部分交易都需要创建找零输出。

如果一个顾客需要买一份1.5美元的饮料,她在她的钱包里找一些钞票和硬币以凑够这笔费用。如果钱刚好够用,顾客会选择精确的零钱(比如1张1美元纸币和2枚25分硬币,或者6枚25分的硬币)付款,不凑巧的话,她可能会掏出一张5美元的纸币。如果给了店员太多的钱,比方说5美元,她会收到3.5美元的零钱,这些零钱将放回到她的钱包供以后的交易使用。

类似地,比特币交易不管多大金额,都需要从用户的UTXO中进行创建。用户无法将UTXO拆成两半,就像不能把一张纸票撕成两半来用一样。用户的钱包应用自动从可用的UTXO中选取不同的金额,组合成大于或等于所需金额的交易。

在真实生活中,比特币应用会使用不同的策略来满足采购金额的要求:组合较小单位、找到精确的零钱,或者使用单一的大于交易金额的单元并进行找零。所有这些复杂的UTXO组合都是由用户钱包软件自动完成的,用户看不到具体过程。只有当用户以编程的方式自己从UTXO中创建原始交易,才需要关心这个选择的过程。

交易消费的UTXO叫作交易输入,交易创建的UTXO叫作交易输出。如此,比特币价值不停地从一个所有者转移到另一个所有者,形成一个消费和创建UTXO的交易链条。交易通过当前所有者的签名解锁并消费UTXO,通过将其锁定到新的所有者的方式创建新的UTXO。

对于输出输入链来说,也有一个例外,它是一种特殊类型的交易,叫作铸币(coinbase)交易,铸币交易是每个区块的第一笔交易。这笔交易是矿工“赢家”放进区块的,作为矿工挖到区块的奖励。这也就是比特币系统在挖矿过程中发行新币的过程。我们将在第8章介绍这部分内容。

每个比特币交易都产生输出,输出将被记录在比特币账本上。除一种情况外[参见本章中“数据输出(OP_RETURN)”],几乎所有这些输出都创建可使用的比特币,被称为UTXO,这些UTXO会被全网识别,并可被新的所有者在将来的交易中花费。向某人发送比特币就是创建一个UTXO并注册到他的地址上,随后他就可以花费这笔UTXO。

UTXO将被所有完全客户端,通过其维护在内存中的数据库的方式进行跟踪,这个数据库叫作UTXO集合或者UTXO池。新交易将从UTXO集合中消费(花费)一个或多个输出。

交易输出包含两部分:

●比特币金额,“聪”的任意倍数,“聪”是比特币的最小单位。

●锁定脚本,也被称为“受限”,通过指定花费输出必须符合某种条件,将这个金额锁定。

对于前面提到的锁定脚本,其使用的交易脚本语言将在本章“交易脚本和脚本语言”中详细讨论。表5.2显示一个交易输出的结构。

表5.2 交易输出结构

在例5-1中,我们利用blockchain.info的API来查找特定地址的UTXO。

运行脚本,我们将看到一个列表,其格式类似:“交易ID:UTXO的索引号,以‘聪’为单位计算的价值”。锁定脚本在例5-2中的输出并未显示。

交易输出将特定金额(单位为“聪”)与特定的受限或者锁定脚本相关联,明确了花费这个金额必须满足的条件。在大多数情况下,锁定脚本将输出锁定到一个特定的比特币地址上,从而将这笔资金的所有权转移给新的所有者。当爱丽丝向鲍勃咖啡店支付一杯咖啡的比特币时,她的交易创建了一个0.015比特币的输出,锁定到咖啡店的比特币地址上。这个0.015比特币的输出记录在区块链上,成为UTXO集合的一部分,也意味着在鲍勃的钱包上,这笔输出已成为可使用余额的一部分。当鲍勃选择花费这笔余额时,他的交易将解开这个受限,通过提供包含私钥签名的解锁脚本对输出进行解锁。

简而言之,交易输入是一个指向UTXO的指针。它们通过引用交易哈希和UTXO在区块链中的顺序号指向一个特定的UTXO。为了花费UTXO,交易输入需要包含解锁脚本以满足UTXO设置的花费条件。解锁脚本通常就是证明锁定脚本中比特币地址所有权的签名。

当用户进行支付时,钱包通过选择可用的UTXO创建一笔交易。举例来说,为了创建一笔0.015的支付交易,钱包应用可能会选择一个0.01的UTXO和一个0.005的UTXO进行组合,以汇总成交易所需金额。

在例5-3中,我们使用一个“贪婪”算法,选择可用UTXO来创建一个特定支付金额的交易。在例子中,可用UTXO以常量数组的形式提供,但在现实中,可用的UTXO通常需要通过RPC访问比特币核心或者其他第三方API,就像在例5-1中看到的那样。

如果不带参数运行select-utxo.py脚本,它会尝试构建一个UTXO集合(包含找零)来支付55000000聪(0.55比特币)。如果提供一个目标支付金额作为参数,脚本将选择UTXO来创建指定金额的支付。在例5-4中,我们执行脚本,并尝试创建一个0.5比特币(50000000聪)的支付。

一旦UTXO选定后,钱包应用便开始创建包含每个UTXO签名的解锁脚本,使它们满足锁定脚本的条件,从而可以花费。钱包应用加入这些UTXO的引用和解锁脚本作为交易输入。表5.3显示了交易输入的结构。

表5.3 交易输入结构

大多数交易包含交易费用,提供给为比特币网络安全做出贡献的矿工作为报酬。矿工挖矿、收集费用和奖励将在第8章详细讨论。本节主要研究交易费用是如何包含进典型交易的。大多数钱包软件会计算并自动包含交易费用。但是如果你使用程序创建交易,或者使用命令行界面,就必须手工计算并包含这笔费用。

通过在每笔交易中包含一小笔费用,可以形成令交易被加入下一区块的激励,也能成为对“垃圾”交易和系统滥用的反激励措施。矿工挖出新区块,将交易记录到区块链上,并收集交易费用。

交易费用基于交易大小进行计算,以千字节为单位,而不是基于交易价值计算。总的来说,交易费用是基于网络中的市场力量来设置的。矿工们基于不同的规则包括交易费用,对交易的优先级进行排序,在一定条件下,他们也免费处理交易。交易费用影响交易处理的优先级,也就是说,含有足够费用的交易更有可能被包含进最近的下一个区块,而费用不足或者没有费用的交易就可能被延迟,并遵循尽量处理的原则在后面的区块中被包含,或者干脆就得不到处理。交易费用不是必需的,没有费用的交易最终可能也会被处理;但是附加一定费用会提高处理的优先级。

随着时间推移,交易费用的计算方式,以及它对交易优先级的影响也在变化。最初,交易费用是固定的,是网络中的一个常量。慢慢地,费用结构逐渐放宽,以便让基于网络容量和交易数量的市场力量对其产生影响。当前最小交易费用固定为0.0001比特币或者每千字节0.1毫比特,这也是最近刚从1毫比特降到这个值的。大多数交易均小于1千字节,但是对于有多个输入和输出的交易,就会更大一些。在将来的比特币协议修订版中,钱包应用软件可能会统计分析近期交易的平均费用,从而计算合理的交易费用并附加到交易中。

当前矿工基于交易费用对交易优先级进行排序,并打包进区块的算法,将会在第8章中详细介绍。

交易的数据结构中并没有费用字段。实际上,费用隐含在交易输入汇总和交易输出汇总的差值中。交易输入加总扣除所有输出后,剩余的金额就成为交易费用,最终被矿工收集走。

交易费用是隐含的,是输入减输出的差额。

费用是交易中很容易让人感到迷惑的因素,但也是一个必须弄懂的关键点。如果用户自己创建交易,就必须确保不会因为疏忽而使用太少的输入以此形成一笔很大的交易费用。也就是说,你必须计算所有的输入,必要时创建找零,否则你将向矿工贡献一笔巨额的小费!

举例来说,如果你使用一个20比特币的UTXO来创建一笔1比特币的支付交易,那么你必须包含一个19比特币的找零输出,以使资金回到你的钱包。否则,余下的19比特币将被认定为交易费用,将你的交易含进区块的矿工将收走这笔交易费用。虽然你的交易处理优先级别提高了,而矿工也会因为收到一大笔交易费用而高兴,但是这很可能并不是你所希望的。

我们再来看看爱丽丝购买咖啡的过程,可以观察到在实践中这个流程是如何工作的。爱丽丝希望花费0.015比特币购买一杯咖啡。为确保交易能快速得到处理,她想在交易中添加一些费用,比方说0.001比特币,这意味着交易总费用是0.016比特币。她的钱包软件必须找到一些UTXO,加起来余额要大于等于0.016比特币。当然,如有必要就创建找零。假设爱丽丝的钱包中有一笔0.2比特币的可用UTXO。交易需要耗尽这个UTXO,并创建两个输出,一个是支付给鲍勃咖啡店0.015比特币,另一个是回到爱丽丝钱包的交易找零的0.184比特币,还剩0.001比特币未分配,就作为这笔交易隐含的费用。

我们来看另一个场景。尤金妮娅——菲律宾的儿童慈善机构负责人,已经完成一项为学校儿童采购课本的募捐。她从世界各地接收到几千笔的小额捐款,总共有50比特币。因此,她的钱包里充满了非常小额的UTXO。现在,她想从当地一个出版商那里采购几百本课本,使用比特币支付。

当尤金妮娅的钱包应用尝试创建一个大额的支付交易时,它首先需要从大量小额的可用UTXO集合中抽取合适的UTXO作为交易输入。这笔交易需要抽取超过100个小额UTXO作为输入,而只有一个交易输出,即付款给出版商。一个包含这么多输入的交易,其大小将超过1千字节,可能需要2000到3000字节。其结果是,交易费用必须高过网络最低费用0.0001比特币。

尤金妮娅的钱包应用会通过测算交易大小,并将其与每千字节的费用相乘,得到合适的交易费用。很多钱包软件会对大笔交易多付一定的费用,以确保交易能被及早处理。付出更高的交易费用不是因为尤金妮娅花费的钱更多,而是因为她的交易更复杂,规模也更大——交易费用与交易涉及的比特币价值无关。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈