浅谈比特币UTXO模型和以太坊账户模型的优劣
随着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块,
- 拿出100面值烧掉,印出99块还给A,1块给F。
- 拿出10块面值烧掉,印出9块还给A,1块给E。
- 拿出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
上一篇: 数据结构--快速排序
下一篇: 计算机二级python(四)