比特币的秘密(一)比特币的交易

前言

目前存在的一些对比特币技术理解上的误区,我将通过一系列文章的方式来阐述常见误区,从而带来对比特币的更深入的了解。我姑且假设读者拥有对比特币技术的最粗浅的认识水平,否则可能会显得冗长啰嗦。

概要

  • 前言
  • 比特币交易处理能力低
    • 交易处理能力
    • 比特币的交易结构
    • UTXO 模型中的交易和找零
    • UTXO 和现金的差别
    • 交易的验证
    • 交易验证的时间复杂度
  • 下一步

比特币交易处理能力低

很多人在第一次刚接触区块链时,都有听说过「比特币是第一代区块链」,「比特币的交易处理能力低」,「比特币的交易很慢」。然后就进入了对「更有潜力」的区块链技术的学习中。看起来比特币是一个非常简单的,可以作为区块链1.0而略过的部分,但我这次要带你重新思考这个问题本身。

交易处理能力

一个广泛的误解,是比特币的交易处理能力上限是大约 7 笔每秒(7TPS)。这个数字是由比特币十分钟一个 1M 大小的区块,而一个典型的交易大约是 240 字节,即比特币的交易处理能力是 1000000/10/60/240≈7 而得出的。之后 BTC 通过被称作「隔离见证」的方式,以扩增交易大小为代价将交易签名移出区块本体,大约将这个上限突破到了 14TPS。但这样的交易吞吐量,显然远远不够当前的交易所需。

但比特币技术带来的交易能力上限远远不止这些。这要从我们对交易的拆解说起。

比特币的交易结构

熟悉比特币交易的朋友可以跳过这个部分。

所有比特币交易事务都是某种形式的一种支付。

每个交易事务使用存储在「未使用的交易输出」(Unspent Transaction Outputs, UTXO)中的比特币作为交易输入,每个交易事务可以包含一个或多个的交易输入。交易过程会汇总每个交易输入中包含的比特币,并使用「解锁脚本」将它们花费到一组新的未使用的交易输出中。当UTXO用于交易时,它们将被消耗。

交易事务被以灵活的脚本语言进行编写,该脚本语言用通过创建脚本定义的任意支出条件的形式为每个事务输出分配保管控制权。通过脚本语言和脚本语言中所包含的密码学操作符,我们可以构造出一系列的条件,被称为「锁定脚本」,用来允许比特币的交易事务中的输出在被再次使用时,需要通过签名的方式进行控制。

一个典型的比特币交易由版本号,锁定时间值,输入列表和输出列表组成。我们的比特币交易,可以看作是将输入的所有比特币熔炼,然后铸造出新的比特币。比特币的输入列表中的每一项,是包含了输入所引用的上一个比特币交易的交易ID(TXID)及对应的输出序号(Index),

UTXO 模型中的交易和找零

就像现金一样,UTXO不可分割。例如,买一杯咖啡,价格为14.75 元;如果您只有五张 ¥ 20 的钞票,则必须在咖啡价格基础上多付(即支付¥ 20)并接受找零——在这种情况下,找零 ¥ 5.25。

UTXO 的行为与之类似。正如您无法掏出 20 元的现金来支付咖啡费用一样,您也无法发送部分的 UTXO。如果要向某人发送 15 BSV,但您的钱包中只有一个价值 20 BSV 的 UTXO,则必须将整个 UTXO 发送给收件人,然后接受找零,就像用现金付款时一样。(当然,此过程由区块链协议处理,不需要您信任收件人即可退还您的找零)。这样,当您进行此转帐时,收件人将收到 15 BSV,而剩余的 5.25 的“零钱”将作为新的较小的UTXO 发送回您的地址。

如果您想向某人发送 23.75 BSV,该怎么办?同样,情况与现金相同。您将不得不发送两个 UTXO(就像交出两张 20 元的现金一样);一个将完全用完,另一个将需要以新的UTXO形式将找零发送回给您。

UTXO 和现金的差别

尽管「UTXO作为现金」类比有助于理解基本概念,但在某些地方这个类比就不够贴切了。

首先,在区块链上进行的交易还需要支付交易费用,该费用从您获得的找回金额中扣除——与现金支付不同。

其次,法币和硬币的价值是固定的,我们无法对现有的现金单位进行自由切割。所以在购买咖啡时,您得不到 ¥ 5.25 的零钱。相反,UTXO 却可以有任意数量。

交易的验证

在矿工收到这个交易之后,需要对交易的合法性进行验证。在这里我们大约需要从以下几个方面对交易进行验证:

  1. 交易输入值的总和必须大于或等于输出值的总和;
  2. 交易事务数据格式,包括某些字段的大小及其编码模式;
  3. 交易的每个输入,均可以在未使用的交易输出(UTXO)中找到;
  4. 交易事务中每个输入所引用的解锁脚本和锁定脚本执行后,可以在堆栈上留下 -1 的返回值。

所以我们可以看到,在这里对一个交易的验证我们只需要关注这个交易和上一个交易(祖先交易),和这个交易自身信息相关的验证,并不会增加其他交易的验证成本。这样的成本可以由这个交易自身来负担,唯一例外的,是需要在未使用的交易输出(UTXO)中找到其引用的祖先交易。

交易验证的时间复杂度

未使用的交易输出(UTXO),是一个包含了所有未被使用的交易输出的集合,这个集合本质上是一个存储了哈希值和输出的哈希表。在其实现中查找/插入/删除项目的时间复杂度是 O(log(n))。

这是一个非常高效的方法,因此,即使是我们在面临相当巨大的 UTXO 数据集合时,对单个交易的成本影响也是微乎其微。

伴随着计算机随摩尔定律性能逐步提升,交易的验证成本将在达到处理峰值后,随着时间下降。

下一步

我们已经知道单个比特币交易事务的发送和验证成本,在接下来的文章中,我将解释比特币技术为什么能够承载海量的交易。

你可能感兴趣的:(比特币,BSV)