欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

浅谈比特币UTXO模型和以太坊账户模型的优劣

程序员文章站 2022-04-22 12:17:28
随着Defi的火热,大家都开始关注在区块链上实现智能合约。BSV在今年年初的Genesis升级中解锁了中本聪时代的脚本,让“非标”脚本成为了可能性。可惜的是,近一年的发展下,利用非标脚本来实现一层合约还没有出现一个完美的方案,各路开发者都在各自为战,还没有形成事实上的token标准。是什么原因导致在ETH等区块链上非常容易实现的智能合约,在比特币的场景下就那么复杂呢,在比特币上实现合约与以太坊上有什么区别呢。这里先抛出结论,以太坊实现合约非常容易,但是很难进行扩容和并行交易,很难突破天生的性能瓶颈,而比特...

随着Defi的火热,大家都开始关注在区块链上实现智能合约。BSV在今年年初的Genesis升级中解锁了中本聪时代的脚本,让“非标”脚本成为了可能性。可惜的是,近一年的发展下,利用非标脚本来实现一层合约还没有出现一个完美的方案,各路开发者都在各自为战,还没有形成事实上的token标准。

是什么原因导致在ETH等区块链上非常容易实现的智能合约,在比特币的场景下就那么复杂呢,在比特币上实现合约与以太坊上有什么区别呢。这里先抛出结论,以太坊实现合约非常容易,但是很难进行扩容和并行交易,很难突破天生的性能瓶颈,而比特币上实现的合约,技术实现非常困难,但是一旦实现,从交易速度和性能以及并行交易的角度,远超以太坊的方案,可以支持全人类使用。

交易结构的根本区别

为了更好的帮助我们理解在比特币上实现智能合约的困难点,我们需要拆解一下比特币与以太坊在账本的基础结构上的根本区别。

以太坊

首先是以太坊,以太坊用来记账的方式被称为账户制。这个很容易理解,非常像我们的银行卡或者支付宝,每个人有一个账户,账户上记载着余额。而A->B转账的过程就是从账户A的余额中减去X,然后再从账户B的余额中增加X(不考虑手续费)。如果给这个转账过程增加一些逻辑条件,设定满足特定的条件,这个转账才能发生,那么就形成了智能合约。以太坊内部有一个虚拟机,被称为EVM,这个虚拟机就是用来监听特定的条件,满足条件之后,自动执行转账。因为这个虚拟机可以执行编程代码,因此只需要用计算机高层编程语言编写逻辑,并且部署到链上就可以轻松实现任意的逻辑。

然而,如果懂计算机的同学很快就会发现一个问题,就是虚拟机在分布式节点的条件下如何保证一致性。由于以太坊上所有的合约都是由发送以太坊交易来驱动的,因此收到交易的顺序会影响交易的结果,为了保证所有节点都执行相同的逻辑,就必须保证所有节点收到交易的顺序是一致的,如果不一致则会造成混乱。显然,在分布式的环境下,所有节点很难保持接收交易的一致性,尤其是高频交易的场景下,如果A给B连续快速发送10笔金额,必须要等到所有节点按顺序接受到所有交易后,才能结算完成。如果某个节点先收到了第十笔交易,那么就需要等待其他9笔交易都就位之后,才能处理第十笔。另外,每笔以太坊交易只能进行1对1转账,在高频场景,尤其是多对多的复杂情形下,非常吃力。

为了突出以下以太坊的性能问题,我们假设以下场景,A账户要给100个人派发红包。如果使用ETH来发红包的话,必须按照顺序发送给1号,2号,3号…需要构造100个交易,一个接着一个进行发送,节点也必须一个接着一个按次序处理。因为每次发送都要等待上一次余额确定,因此1号,2号他们收到红包的顺序是确定的,100号只有等前面的人都收到红包之后,才能收到红包。

比特币

比特币则完全不一样,它使用的是一种称为UTXO(未花费交易输出)的模型来表示余额。这种模型非常类似我们日常使用的现金(纸币与硬币),可以看做一种改良版的现金(这里顺道提一句,央行发行的数字货币就是UTXO模型)。

区块链并不记载和维护某个地址有多少余额,记载的是一张张钞票是属于哪个地址。比特币的场景下,某个地址A的余额不能直接查询到,需要统计有多少张钞票是属于A的。比方说,我们有一个钱包(真的钱包),里面放了一张10元,一张100元,还放了一个1块的硬币,那么我们可以说,我们的钱包余额是111元(而且知道余额是由一张100,一张10块和一个1块所组成的),换言之,如果不去计算每一张纸币与面值,仅凭钱包本身是不知道有多少余额的,这与以太坊支付宝之类的账户模型有很大不同。

比特币转账的时候怎么转呢,同样很接近(但是不完全一样)我们平时使用现金支付的样子。还是刚才的真钱包,如A要给B付1块钱,那么A有3种方法可以付给B,给他1块,给他10块找回9块,给他100块找回99块。找钱这一点与现金不太一样,或者可以说是改良的地方。A给B10块找回9块,并不是让B找出来9块钱还给A,而是A把10块钱烧掉(销毁UTXO),然后由系统重新印出一张1块给B,印出一张9块给A(重建UTXO)。经过交易后,A的钱包有一张面值100的钞票,一张面值9块的钞票,还有一张1块,余额是110块。

根据上面的描述,我们可以知道,比特币的转账和收款就是钱包里的纸钞不断消灭和生成的过程。需要知道比特币地址的余额,就需要把这个钱包地址的所有钞票拿出来,计算所有面值并求和。同时,比特币支持多对多交易,比如说可以一笔交易让A同时给DEF转账1块,

  1. 拿出100面值烧掉,印出99块还给A,1块给F。
  2. 拿出10块面值烧掉,印出9块还给A,1块给E。
  3. 拿出1块面值烧掉,不找零给A,1块给F。

UTXO模型神奇之处就在于,上面3个步骤可以分三个不相关(并行交易与顺序无关)的交易来发送,也可以直接使用1个交易来进行发送。

对比以太坊,比特币要同时发送给100个人,只需要一笔交易就够了,性能差距可想而知。这样就理解为什么央行数字货币使用的是UTXO模型了,不然深圳怎么给5万个钱包发送1000万数字人民币?

总结来说,以太坊的智能合约是在用程序控制,针对一笔交易能不能满足条件发送出去,因为控制的粒度是交易级别,因此交易必须要按照顺序串行处理,这也就是ETH很难扩容的根本原因,碰到Defi这种一个账号对多个账号进行交易的场景,很容易出现性能瓶颈。

比特币的智能合约是在用程序可控制,一个UTXO(含有一定面值的钞票)可不可以被销毁,控制的粒度是UTXO(单个钞票)的级别,对交易没有顺序要求,因此可以进行多对多交易以及并行交易校验,在现金转账的场景下有极高的性能。但是因为比特币脚本是用来控制UTXO能否花费的,输出的结果只有是或者否两种,没有中间状态,因此使用比特币脚本进行合约的编程非常复杂,比特币的脚本使用的是类forth的双栈语言,编写起来如同直接拿汇编写代码,因此需要编译器来进行翻译,比特币的合约结构也同以太坊有很大的不同,这部分内容以后再讨论。

这里再总结一下结论,以太坊易编程,难扩容。比特币(BSV)易扩容,难编程。我个人认为,以太坊扩容的难度,远远大于比特币编程的难度。

本文地址:https://blog.csdn.net/weixin_43953732/article/details/109016118