有些智能合约要依赖交易线性排序?
首先概念梳理,什么是全序什么是偏序。== 偏序和全序:
1:简单来说,对于集合中的元素:全部有序(全部可以说清关系)则为全序,部分有序(部分可以说清关系)则为偏序。
链表是全序关系:
A - B - C - D
任意两者关系明确。
DAG是偏序关系:
A -B - D
\C/
B和C的关系不明确。
2:交易顺序:比特币和以太坊交易模型的区别
- 比特币的交易模型(UTXO模型)并不要求严格的全序关系,而只要求偏序关系。以三个交易ABC为例子,
只要不存在双花交易,交易顺序不论是A,B,C还是A,C,B,对于比特币都是OK的(打入Block中的交易
的排序不重要)。如果交易之间存在双花,例如B和C存在双花,那么,B和C一定有一个被拒绝(要么是B,
要么是C被打入Block,另一个被拒绝)。
- Ethereum采取的是账户模型。交易的顺序就很重要。因为账户状态的改变(合约的执行)
按照交易的顺序执行。依旧以ABC交易为例子,假如都是针对相同账户发起的交易,那么A,B,C还是A,
C,B,这个就很重要,因为这个顺序决定了账户状态的改变的顺序。对于双花来说,以太坊因为是账户模型,
如果我们用B'代表B的重复交易(即双花交易),以太坊通过加nounce的办法来拒绝双花,因为B和B'的nounce
是不一样的,所以可以加以区别。
- 总结一下,都是双花,但是比特币模型和以太坊模型有着本质的区别,因为两者的交易模型概念不一样。
* 对于比特币来说,意味着两个不同的交易试图花相同的UTXO。模型上这是不可能做到的(不可能有两个输入)。
* 而对于以太坊来说,意味着相同的状态被使用两次(数据库的脏读),模型上可以做的,但是可以防止的。(加nounce)
* 注意:这里说的双花指的是解决不允许花两笔的问题,具体那笔是对的,是共识算法保证的(例如POW)。 == 交易顺序:比特币脚本和以太坊智能合约的区别
- 对于以太坊智能合约来说,是利用了账户模型建立了一个状态机模型,而建立了交易驱动的计算模型。
(或者说事件驱动的计算模型)那么针对该合约账户地址的交易A、B、C的顺序,就决定了该合约状态改变的顺序。
这就是一个至关重要的事情。而以太坊虚拟机的执行需要按照交易顺序来执行,所以需要一个无歧义的全顺序。
- 对于比特币来说,由于没有这种基于状态机的计算模型,所以也没有对状态修改需要按顺序的要求。所以
比特币拥有的智能,所谓的比特币脚本,只是保证交易本身的合法性的验证过程,而并不需要对交易顺序制。
3:DAG就不能做智能合约吗?
- 这种提法容易使人误解。如果DAG只是指有向无环图这种数据结构,而智能合约指的是以太坊为例子建立的
基于区块链和以账户模型为基础的同步状态机模型或者类似的系统。这句话在某种程度上是正确的,因为单纯的
DAG图本身并没有代表一个全局一致顺序,以BlockDAG为例:在DAG图本身这个层次是说不清Block的全排
序的。那么而使用某种算法的目的是就是为了能建立某种排序的关系,
- Spectre算法建立的是Block间的偏序关系,所以可以支持比特币模型,而不能支持以太坊模型。
而Phantom算法以及相关的算法建立了Block的全排序,所以就可以支持以太坊模型。所以问DAG能不能能做
智能合约的这个问题,就好像问链表能不能做智能合约一样,过于简化。
- 理论上可以只是在理论基础上具备条件,但是工程实践上才能决定基于BlockDAG算法的某种协议是否可以
很好的支持比特币模型,以及以太坊模型,或者未来更加先进的技术、平台和系统。
- "UTXO本身的顺序"这种说法不精确,UTXO只是一个状态集合中的元素,通过你建立的交易的顺序,来判断
UTXO是否可以被销毁(移除集合)和创建新的UTXO(加入集合)。对于UTXO模型来说,只要建立交易的偏序
关系就足以完成这个操作了。
定规约。
- 或者可以说一个是stateful的,一个是stateless的。一个是同步模型,一个是异步模型。