Cadence 和 Flow 将会如何革新智能合约编程

Tags
Flow
Cadence
Tech
Published
Mar 11, 2022 03:39 AM
Language
ZH
notion image
 
 
通过利用资源的力量,Flow 的编程语言 —— Cadence 为以账本为中心的智能合约世界带来了令人兴奋的新想法。
在完成本文时,就传出了消息:Flow 区块链背后的公司 Dapper Labs 刚刚获得了另一轮 3.05 亿美元的融资。 对我来说,这不足为奇。
是的,显然是因为 NBA Top Shot。 但是老实说,这个项目看起来很有希望的其他原因还有很多:用户友好和面向开发人员的理念,创新的扩展方法或者仅仅是项目背后的强大团队,这已经给加密世界带来了如此奇妙的创新,例如Cryptokitties(以及 ERC721 标准)。
但我认为,真正的创新在于技术的核心,即智能合约语言 Cadence。 这就是为什么我会从对核心原理的总体概述开始,献上这一整篇文章来深入探讨该语言的原因。

剧透:这不仅与NFT有关

在深入探讨细节之前,让我们先弄清楚一些事情。 在谈论 Flow 时,人们似乎在直观上将其与 NFT(非同质化代币)相关联,这也难怪,鉴于 NBA Top Shot 取得了惊人的成功。 但如果你只停止于此,那么你将错过最好的部分。
Cadence 最具颠覆性的一个方面实际上是同质化代币的实现。因此,FT(同质化代币) 的实现恰好也是 Cadence 的主要颠覆性范例之一的一个很好的说明:面向资源
为了掌握这个概念,让我们来看看一些熟悉的东西,并逐步地朝着 Cadence 带来的新想法前进。

Solidity 与 「以账本为中心」的方法

让我们从在以太坊上实现同质化代币开始,这确实是一个非常朴素的实现。 它强调了我所谓的以账本为中心的方法的特征或中心映射的原理。
contract KittyCoin { mapping (address => uint) public balance; function mint(address receiver, uint amount) { balance\\[receiver\\] += amount; } function send(address receiver, uint amount) { balance\\[msg.sender\\] \\-= amount; balance\\[receiver\\] += amount; } }
我们有一个具有以下两个功能的智能合约:一个铸造功能,使我们可以凭空生产代币,以及一个发送功能,这使您可以将钱转移给其他人。 但是,此合同最重要的实体是合同顶部的数据结构:余额映射
mapping(address => uint) public balance;
这就是本质,这就是我们所需要的; 数据创造价值,消耗以太或者获取以太。 它基本上构成了以太坊上每一种同质化的代币:一种状态。 而且这种状态虽然由于某些复杂的合同功能而发生了变化和转变,但始终始终是一切的核心:中央总账。

中心化账本的问题

对于使用加密货币的人来说,这是完全合情合理的,但是对于圈外的人来说,很可能并非如此。 老实说,为什么呢?
是的,我们可能会嘲笑诸如 “等等,我的比特币实际存储在哪里?” 之类的问题。 或 “我的钱包可以容纳多少以太币?”, 但是就像小孩子的问题一样,一旦我们笑了,问题的答案就变得很难回答。
让我们这样看:在我们的日常生活中,我们将金钱作为一种资源,可以触摸的东西,可以感觉到的东西,可以放在枕头底下的东西。 当然,当我们将钱存入银行或在公司工作时,我们一定会偶然发现账本,是的。 但是问题是在我们的传统货币系统中,这些账本都引用了现实世界中的资源,这些东西我们可以感觉到,触摸到或藏在钱包里。
与以太坊不同。 在以太坊中,就像在许多其他区块链网络中一样,账本实际上是货币,从而在用户的不同心理模型之间造成了不匹配。 对我来说,这就是为什么新进入加密货币领域的人如此艰难地将一切都束之高阁的主要原因。 公平地说,整个事情有点违反直觉,不是这样吗?
此外,以账本为中心的整个方法也使我们陷入一些技术难题。 假设我们不仅拥有 KittyCoins的藏品,还拥有 DonkeyCoin 和 SquirrelCoin 之类的其他代币。 如果我们想查看我们拥有的所有不同货币的所有余额,我们将必须查询每种货币的每个账本 —— 即每个地址处的每个智能合约,只是为了汇总我们的资金。 对于开发人员和用户而言,这可能非常繁琐,并且一旦您开始在不同合约之间进行交互,事情就变得更加复杂。
现在,我们将这种思路延伸到犯罪方面。 中央账本带来巨大的安全风险。 对于用户来说,这是一个单一的价值存储方式; 对于黑客来说,这是一个蜜罐。 想一想 500 万美元的 DAO 抢劫案几乎杀死了以太坊。
下面开始:资源为导向的模式。

面向资源的范式

Cadence 将范式从中央账本转移到我所说的分布式资源。 在查看实际实现之前,我们必须讨论 Flow 上的帐户以及它们与以太坊上的帐户有何不同。 关于此主题有一篇很棒的文章,您应该查看:Flow 中的账户和以太坊有什么不同
关键点是:与以太坊不同,Flow 不具有针对用户和合同使用不同帐户的想法。 在 Flow 中,智能合约(与任何种类的资源)实际上存储在帐户本身中,并且一个帐户可以存储多个智能合约。 它们位于帐户的特定子目录中,并且可以使用某些功能公开或私有化,这是本文讨论范围之外的主题。
为什么这很重要? 因为它允许另一级别的数字资产所有权,所以用户实际上拥有其帐户中的资源,而不是依赖于存储在某个远程智能合约中的外部账本中的条目。
所以现在有趣的问题是:资源看起来如何?让我们继续前面的内容,并遵循我们的同质化代币示例。下面是一个同质化代币的实现,取自 Flow docs。
pub resource Vault: Provider, Receiver { pub var balance: UFix64 init(balance: UFix64) { self.balance = balance } pub fun withdraw(amount: UFix64): @Vault { self.balance = self.balance - amount return <-create Vault(balance: amount) } pub fun deposit(from: @Vault) { self.balance = self.balance + from.balance destroy from } }
如您所见,这构成了所有权设计的根本不同概念。 我们没有使用用户余额实现中央合同,而是将用户的余额创建为一个单独的资源 —— Vault。 并且该保管库直接存储在相应用户的帐户中; 它实际上是由用户拥有的,从而完全分散了所有权。
为了接收令牌,用户只需要将 Receiver 接口(包含存款功能)实现到他或她的帐户中,并使其可公开调用即可。 然后,任何其他用户都可以调用此功能,以将令牌存储到用户库中。 相反,为了发送令牌,用户需要实现 Provider 接口(包含提现功能)当然必须以私有方式。

真正的交易:线性类型和移动运算符

在我看来,提现功能是 Cadence 真正的魔术之处,它是整个实现过程中最有趣的部分。 函数主体的第一行看起来很熟悉:我们只需从我们自己的令牌余额中减去令牌数量即可。 但是现在到特别的部分:
return <- create Vault(balance: amount)
如我们所见,我们不只是发送令牌并增加一些接收者余额。 我们实际上要做的是以 Vault 的形式创建另一个资源(我们称其为子 Vault),然后使用要发送的余额实例化该 Vault。 附带说明一下,Cadence 中的资源只能在定义它们的范围内创建,因此我们可以实例化子 Vault库,但无法创建未在帐户中定义的资源的实例。
这个新创建的子 Vault 本身就是一个自己的资源,然后通过移动运算符(<-)发送出去,这是一个很小的细节,影响很大。 这是Cadence文档中关于move运算符的一段:
When a resource is used in an assignment, parameter, or return value, it is moved to a new location and the old location is invalidated. This ensures that the resource only ever exists in one location at a time. 在分配参数或返回值中使用资源时,该资源将移至新位置,并且旧位置无效。 这样可以确保资源一次只能存在于一个位置。
简而言之,移动运算符(以及线性类型的使用)可防止发生许多不良事件,这些不良事件在与智能合约进行交互时很容易在其他任何区块链网络中发生。 它实际上使丢失或错误地复制资源变得不可能。 保证一次只能将资源存在一个位置。 对我来说,这是数字资产所有权,可用性和安全性方面的改变者。

面向资源的优势

上文概述的 Cadence 面向资源的方法相对于中央账本具有一些主要优势。
  • 首先,该方法增强了去中心化,这是区块链技术的核心。 如果您考虑一下,Solidity风格的同质化代币的实现实际上是非常集中的:一个将其全部统治的智能合约。 在Cadence 中,货币不是以账本为中心,而是以资源的形式(在本例中为 Vault)分布在所有帐户中。
  • 其次,它增强了安全性。 在前一点的基础上,增强的权力下放有效地将脆弱性区域最小化。 我们避免建立吸引黑客的中央蜜罐。 攻击者无法抢夺一个中央合同,而必须渗透到每个用户的每个保险库中,从而有效地降低了大范围攻击的可能性。
  • 第三,改善了最终用户的可用性。 如果您要向其发送令牌的人没有实现此货币的接收者接口,则可以根本不能够调用该帐户的存款功能。 这有效地杜绝了代币被错误地发送到从未恢复过的账户。
  • 最后,在帐户级别拥有的资源的概念与普通用户的心理模型非常接近。 与必须掌握账本是货币的想法相比,实际拥有存储令牌的金库的想法要直观得多。 基本上就像拥有一个自己的钱包,并有一个整齐有序的隔层,可以存放您所使用的不同代币。

因此,什么会更好?

我们正处于区块链发展的关键时刻。 第一个和第二个周期已经证明,该技术存在许多用例,甚至为大规模机构流入该空间打开了大门。 我认为,仍然存在一个主要障碍:最终用户和开发人员对技术的大规模采用,这种采用超出了投机性的范围。 这就是 Flow 真正闪耀的地方。 如我们所见,底层技术的智能设计合理地支持了其对用户友好,对开发人员友好的生态系统的承诺。
话虽如此,我认为 Flow 不会是唯一的前进方向。 让我们面对现实:在可预见的未来,以太坊哪里也不会去,尤其是现在随着第二层扩展解决方案的兴旺。 它的生态系统非常庞大,许多主要的智能合约都经过了实战测试和审计,这是非常关键的论据,目前尚无法在 Flow 上进行任何实现。
但当然,极简主义者的论点几乎总是错失了重点,Flow 团队(与其他项目相反)非常清楚地表明,他们不希望以任何方式成为「以太坊杀手」叙事的一部分。

一个多链的未来

我坚信,未来将是多链的,Flow 可能会迈出第一步,将新用户以及易于使用的半托管钱包(如 Blocto )引入这一领域。 我认为,涵盖这些用例中,可以将区块链技术缓慢地融入用户的熟悉体验中,这是 Flow 非常适合做的一项任务。 它还与他们的整体重点,合作伙伴的选择以及链上产品的发布非常吻合。 如果用户的技术水平更高或用例需要更复杂的工作流程,那么总会需要以太坊(Ethereum),从而实现更多关键任务,更细粒度的实施。
无论哪种方式,Flow 极大的拓展了空间,颠覆了智能合约编程的当前状态,并从根本上引入了新的概念。 我想在本文中展示的所有创新的根源都在于 Flow 的智能合约语言 Cadence。
这就是为什么我要大声疾呼 Flow 团队所提出这种创新方法,并祝他们在未来的计划中一切顺利!