经过几个月的小团体测试,Cardano公共测试网最近被升级为支持智能合约。随后涌现的活动包括许多dApp测试和实验,开发人员渴望进行大规模的测试并展示他们的辛勤工作。这种努力围绕着Cardano背后的一些设计决定,引起了激烈的讨论。许多批评者正利用这次讨论作为一个机会,指向Cardano,歪曲问题,并最终低估了加密货币行业巨头之一的潜力。现在流传着一些误解,认为Cardano每个区块只支持一笔交易,一次只能有一个用户与智能合约互动,而且Cardano最终注定是中心化的。所有这些都是不准确的,我们在下面提出一个新的框架和一些解决方案的开始,dApp构建者可能会选择。
对于SundaeSwap团队来说,现在似乎是一个很好的时机,来权衡一些被提出的更常见的问题–特别是导致Cardano选择eUTXO模型而不是Ethereum的方法的设计和会计决策,以及这种选择对Cardano区块链上的并发性的影响。
虽然我们看到这个讨论很激烈,但我们希望冷静地探讨一些优点、缺点、误解,最后,提出一些潜在的解决方案。这篇文章从这里开始就比较技术性了,但我们会以非技术性的总结来结束。
系统设计的艺术往往是在权衡中选择的艺术。通常,你可以通过一个软件工程师对这些权衡的认识和运用来解决问题的程度来追踪他们的职业发展。对于我们所有Cardano社区的人来说,值得分析的是,Cardano选择了什么权衡,一个有用的比较点是以太坊。
许多人指出,Cardano对eUTXO的选择会在移植协议时产生问题。这当然是真的;我们在几个月前的白皮书中提到了这一点。同样,IOG的教育总监Lars Brünjes也在推特上提到了这一点,还有很多人和他一起。
为了充分理解这一决定的影响,让我们讨论一些背景。
历史
比特币向世界介绍了通过 “未使用的交易产出”(简称UTXO)列表追踪用户资金的概念。用户之间的每笔交易都会消耗一些投入,并产生一些产出,每个产出都代表一捆价值(一些比特币),并声明谁可以花费它。
因此,如果有人给我发了1个比特币,就会有一个输出为1个比特币的交易,其所有者是我的公钥。然后,我可以通过发布一个交易来发送这1个比特币给别人,这个交易消耗了这个输入,证明我有权利这样做,并宣布一个新的输出和一个新的所有者。
这有很多好处。
它的验证是非常简单和安全的。如果价值被创造或被破坏,就会变得非常明显:比较进入的比特币总数和流出的比特币总数。
在一个区块中并行验证交易是非常容易的;只需在不同的线程中检查每笔交易的签名。
它是高度确定性的。当用户创建并提交交易时,他们明确声明了交易被接受后他们的账本部分应该是什么样子的
然而,这种对本地、单笔交易关注的强调是以具有全球关注的系统为代价的。比特币在引入智能合约时遇到了困难,因为许多应用程序自然希望访问一些全球状态:例如,授权用户的列表,当前的价格或总供应量。
相比之下,以太坊选择跟踪一组(全球)账户余额:账本状态是一个从地址到余额的映射,一个简单的交易成对地增加和减少账户余额。更复杂的交易可以做更复杂的事情,并且可以访问他们自己的全局状态。例如,一个ERC-20代币,只不过是一个实现这种会计模型的智能合约,并为这些代币的铸造、燃烧和转移提供一个接口。
这两者之间的区别可以类比为你口袋里的现金和你银行账户里的余额之间的区别。
获取全球信息,如价格,在这些模型中是微不足道的。然而,这种选择有很多下游的负面效应。
首先,每笔交易都必须按照一定的顺序进行排序和处理,因为很难甚至不可能确定哪些交易可能试图接触同一块状态。如果一个交易与另一个交易同时更新你的账户余额,你可能会无意中破坏代币,重复消费,以及其他讨厌的错误。
第二,作为上述情况的结果,交易的排序很重要,这从根本上给了排序这些交易的实体很大的权力。这导致了一些不良现象,包括矿工可提取价值(MEV)和前置运行。
第三,这种模式从根本上要求牺牲确定性,因此需要更大的信任。因为在你构建交易和提交交易之间,区块链的状态可能会发生变化,智能合约需要被信任,以便在运行时做 “对你最有利的事情”,即使这不是你的初衷。例如,DEX需要知道,如果价格移动了某个大的百分比,那么你就不再对这个交易感兴趣了。大量的开发工作、错误的来源和黑客的攻击面都来自于此,因为每个智能合约都需要被信任来检查所有 "正确 "的不变性。
主要的问题是,Ethereum为每个DApp做出了这种全球化状态的选择,因此所有的DApp都遭受了增加的交易成本,容易被前置运行,以及额外的开发负担。
你可能会看到有三个词经常进入讨论,那就是 “并发性”、"并行性 "和 “竞争”。这可能是一个微妙的概念,如果你对这些词的含义只有一个模糊的感觉,那就值得下一些定义了。并发是指多个行动者在一项任务上取得进展的能力,而不会相互干扰。平行性是指多个行为者同时在一项任务上取得进展,而不互相干扰的能力。
争执是指多个行动者实际上相互干扰。
为了更好地理解这一点,让我们用一个比喻:厨房里的厨师。一个熟练的厨师可以同时准备多道菜,在适当的时候在它们之间切换。这个厨师是高度并发的。多名厨师可以在自己的工作站上各自处理不同的菜肴。这些厨师是高度并行的。不过,一个运行良好的厨房可以有很多厨师一起做很多菜,而且既是并发的,又是平行的。如果他们在拿取共同的原料时开始互相碰撞,他们就会突然出现争执。
误解
在谈论解决方案之前,值得解决关于这个问题的一些误解。
误解1:Cardano是有缺陷的,因为它只允许每个区块有1笔交易。
事实上,情况恰恰相反。Cardano允许每个区块有许多数百个交易。
相反,它是 准确地说,Cardano允许特定的交易输出被单个交易花费一次,所以让多个人访问同一个UTXO的协议可能会面临争夺问题。
误解2:每个区块/交易只能有一个用户与智能合约互动。
也不对;争论点是围绕UTXO的,但许多UTXO可能受同一个智能合约的管辖。
这从根本上归结为以太坊思维的转变,在以太坊,你调用智能合约让它做一些事情,而在Cardano,你用合约锁定产出,这决定了它们以后什么时候可以被花费。
误解3:解决这个问题的唯一方法是通过集中化。
集中化是解决这个问题的一种方式,但它不是唯一的方式。见下文。
潜在的解决方案
今天,这个问题似乎有两类解决方案:要么设计你的协议以容忍对你的状态进行分割,要么聚合与该状态的交互。
让我们设计一些假想的DEX来探索其中的一些解决方案。
人们可以设计一个DEX,使其不需要一个单一的流动性池。相反,流动性被分割成若干个池子,它被分割得越远,人们互动的端口就越多,对这些资金的争夺就越少。然而,你把资金池分割得越远,你的资本效率就越低,跨池套利的价值损失就越大。那么,聪明的部分在于设计这些问题的解决方案。例如,Uniswap v3风格的集中流动资金。
另外,交易所的订单簿模型,在以太坊上维护和更新的成本是灾难性的,似乎在根本上更适合Cardano:每个订单是一个单独的UTXO。不过,棘手的是,你仍然对最接近当前价格的订单有争议,因为沙堆在那里相遇。一个可行的解决方案是将市场订单列在链上,由第三方聚合器匹配并执行这些订单。那么,聪明的部分在于确保匹配者对市场没有太多的权力。
最后,你可以创建一个混合交易所,资金的保管是分散的,存储在区块链上,但做市和匹配是通过一个中央后台服务器发送的。这解决了工程问题,但很可能使你成为一个受到严格监管的经纪商,这也带来了一系列的挑战。