Flow Community Rewards are here. Earn points for engaging in the ecosystem, spend points on prizes. Learn more.
开发者生态
2021年7月14日
内部流程:Cadence,为数字资产打造的语言
流程
内部流程:Cadence,为数字资产打造的语言

背景。 Flow是一个新的区块链,最初由Dapper Labs设计和开发,Dapper Labs是CryptoKitties和NBA Top Shot的制造商。在这个多部分的系列中,我们将从技术角度探讨Flow区块链的不同组成部分。

- 舞蹈新的编程语言,使智能合约开发 ,更快、更安全
- Flow客户库(FCL),它类似于以太坊上的Web3.js,但为消费者受众考虑而建立
- Flow多节点架构, 面向主流采用的面向未来的扩展性

在持续的加密货币大规模应用中,越来越多的价值流涌入区块链应用,但处理这些数字资产的技术工具仍然缺乏成熟度。尽管进行了漫长而昂贵的审计,智能合约往往不能提供一个可持续的安全模型,以公平对待其中存储的价值量,而且开发人员往往需要重新创造轮子,以实现一些基本功能。到现在为止,一直缺乏一种编程语言,以其应有的重要性对待数字资产。 

进入Cadence。

Cadence是第一种专门为管理有价值的数字资产所有权而设计的语言,如区块链上的艺术品、收藏品或加密货币。在Cadence中,数字资产是头等公民,使其意外丢失或恶意复制成为不可能,同时提供细粒度和人类可读的访问控制。

Cadence为数字资产利用了一个独特的数据模型:资源。资源使数字资产的创建、转移和存储更容易、更安全。与基于能力的访问控制相结合,这导致了一种比目前任何替代方案更快学习、更容易审计和更有成效的语言。

在Flow以人为本的账户模式的基础上,Cadence引入了数字资产的直接所有权模式,使 更高程度的去中心化和抗攻击能力。你的资产被储存在属于它们的地方:你的账户中。

Cadence的编写考虑到了消费者级别的用例,在其坚实的科学研究基础上为可扩展性而构建。它作为NBA Top Shot的骨干,经过了大规模的实战检验,是有史以来增长最快的区块链应用之一,注册人数超过一百万。

除此之外,成千上万的用户每天与越来越多的由Cadence驱动的应用程序互动,如市场、游戏或交易所,证明了其耐用性和可靠性。这些优点每天都吸引着新的开发者,使他们能够享受到Cadence提高安全性、生产力和可读性的好处。

行业的其他大玩家如Diem(Move)开始利用资源的力量,这暗示着下一代智能合约编程可能会迎来面向资源语言的时代,而Cadence是目前第一个可以在区块链上使用的面向资源语言。

数字资产的挑战

让区块链技术开辟一个新的可能性世界的最大创新是启用原生数字价值。在区块链上,代码不仅仅是对某些外部资产的引用--代码就是资产。区块链上的数据是有价值的,是你可以拥有的东西,而不是容易被抛弃、任意复制和容易被篡改的。不管是NFT、收藏品、加密货币还是治理代币,它们都是新资产类别的一部分:数字资产

尽管这种新的演变前景令人振奋,但同样令人担忧的是,日常管理数字资产的工具在旧世界的根基有多深。像Solidity这样的智能合约编程语言将数字资产和它们可能携带的巨大价值与任意可变的数据结构没有区别,同时将它们存储在一个中央账本中。几行代码就足以说明这些语言在处理数字资产方面的巨大风险。

№1: 中央账本创造了有害的蜜罐

下面的代码片段代表了Solidity中可替换代币的一个简化实现。这个受ERC-20启发的可替换代币智能合约由两个功能组成:一个是允许生成新代币的铸币功能,另一个是允许向不同地址转账的发送功能。 

关于数字资产的关键问题是:每个人的代币持有量在哪里以及如何存储?该片段显示,这些代币持有量被合同顶部的一个数据结构所代表:余额的映射。这个数据结构是一个中央账本,将每个持有人的地址映射到具体的代币余额,有效地将所有数字资产存储在智能合约本身。

这些中央映射往往负责一次处理相当于数十亿美元的价值,只要看一眼以太坊上最受欢迎的ERC-20代币合约就知道了。以这种集中的方式存储这些巨额的数字资产,为黑客创造了中央蜜罐。不幸的是,数百万美元的黑客攻击已经成为许多团队和用户的一个悲惨现实。仅在2020年,通过整体加密货币犯罪损失的总价值就达到了19亿美元,黑客攻击的总金额达到了5.13亿美元[来源]。但这种集中存储只是Solidity等语言的一个问题。

№2: 数字资产需要可靠的数据模型

因为中央映射只不过是一个任意可变的数据结构,并没有规定处理数字资产的任何规则,所以没有什么可以阻止开发者错误地编写恶意代码。为了说明这一点,让我们看看另一个代币合约的实现。

在这里,只有一行代码在发送函数中被注释掉了,但这是一个重要的代码。转移BugCoin会导致发送方的余额被扣除,但接收方的余额不会增加。这个合约的任何交易的价值都会因为一行代码的缺失而永久性地丧失。令人震惊的是,在以太坊中没有任何东西可以阻止这种情况的发生。由于编译器不会抱怨,这段代码将可以在测试甚至主网部署,在每笔交易中抹去数字价值并摧毁用户的资产。

智能合约的永久性以及它们可能承载的巨大价值给区块链开发者带来了巨大的责任和压力。正如我们所看到的,现有智能合约编程语言的局限性并没有使程序员的生活变得更轻松。事实上,甚至还有更多的低级代码需要处理,比如管理溢出和欠流问题,或者在不同的货币单位之间进行转换。这些制约因素在一个关于价值的地方形成了一种微妙的混合。这就需要一种语言来对待数字资产,并给予它们应有的重视。

认识Cadence,为数字资产而生的语言。

鏗鏘有力。拯救的资源

Cadence通过引入数字资产的定制数据模型:资源,消除了现有智能编程语言所承担的大部分说明性风险。受线性类型的启发,资源作为开发人员的支持网,使他们在运行时发生潜在的错误之前就意识到。 

Cadence developers immediately know when they’re dealing with resources, because the creation or transfer of resources necessitate the use of the move operator (<-), while their type is explicitly stated with its own symbol (@). These visual cues are key in eliminating human error in production and make Cadence code easy to read, write, learn and maintain.

但是Cadence的资源不仅仅是现有数据模型的语法糖,它们在允许的操作方面执行严格的规则,所以没有数字资产成为开发者错误的受害者。资源只能在一个确切的时间存在于一个确切的地方,使其不可能被恶意复制或意外删除,并提高了所有涉及数字资产价值的过程的整体安全性。 

还记得我们的BugCoin合约中的恶意发送函数吗?在Cadence中,这种代码一开始就不会被编译。这是因为在Cadence中,可替换代币合约的代币持有量是用资源来实现的,这些资源对如何处理这些代币有严格的规定。每个代币持有者都有自己的金库资源,用于持有他们账户中的代币,这个资源也有提款存款方法。

价值在运输过程中的安全性总是被赋予的,因为交易金额在提款后被放入一个临时金库资源。然后这个临时金库可以存入别人的存款 函数中,或者明确删除。但与Solidity例子中的发送函数不同,不可能意外地丢失代币库,因为如果资源没有任何使用,编译器会抛出一个错误。

这个例子说明了这种方法在安全方面的两个额外优势。首先,如果接收方没有实施代币库--无论是因为地址错误还是对方不想接收这类代币--交易将被退回。再也不会因为地址拼错而造成价值损失了!其次,在交易和函数中包含前后条件的可能性使得断言正确的结果更容易实现,所以开发者和用户可以对他们基于区块链的互动的正确性充满信心。 

除了使数字资产的开发更加可读和安全之外,资源还允许高级的使用情况,如组合和嵌套。要对项目进行分组,你只需创建一个集合资源作为单个资源的包装。这使得批量传输--同时传输多个资源--容易实现,加快了开发过程,让你更快、更安全地运送你的产品。

直接所有权模式:把资产放在属于它们的地方 

Cadence的另一个巨大优势来自于它与Flow协议的深度整合。资源被储存在属于它们的地方,直接在用户的账户中。

这种以人为本的账户模式实现了数字资产的直接所有权,与Solidity等语言的中央账本方法相比,具有各种优势。

  • 更高水平的去中心化和安全
    数字资产不是有一个中央故障点,而是由它们所定义的合同创建,但存储在用户的账户中。这大大增加了安全性,因为它最大限度地减少和分配了大规模攻击的载体,通过分散潜在的目标使其在经济上不可行。

  • 增强效率
    收集
    一个特定用户拥有的所有资产的信息在中央账本模式下几乎是不可能的,因为这需要往返于用户可能持有资产的每一个智能合约。有了Flow,用户的所有数字资产都在他们的账户中,使他们易于查询和互动。

  • 更容易使用
    不仅是开发人员,而且最终用户也会发现这种以人为本的账户模型更容易推理,因为它避免了不必要的复杂化,并建立在现有的心智模式之上--虽然中央账簿是反直觉的,很难让人理解,但每个人都知道账户是什么

但最重要的是,Flow的直观账户模型为基于能力的访问控制奠定了基础,这是Cadence以细粒度和高度可读的方式管理访问的方法。

能力:人类可读的访问控制

能力类似于权限:它们控制用户可以在一个给定的资源上采取什么行动。如果你想调用一个资源的方法,你需要有一个有效的能力。

能力是通往资源的门户。像REST API一样,能力有一个路径。如果该路径存在于一个账户的公共领域,那么任何人都可以获得该能力;在私人领域的能力只有该账户的所有者可以访问。

不管是在公共领域还是私人领域,能力总是链接到一个目标。这个目标可以是整个资源或只是其方法的一个子集。对于后者,接口可以作为能力的一个目标。这就是能力如何允许人类可读的细粒度的访问控制。

要与一个资源互动,你首先要在借用其底层资源之前获得特定的能力。这可以在任何事务中轻松完成。

与依赖检查msg.sender的有害做法的Solidity基于访问列表的模型相反,能力允许一个灵活的控制模型,允许以简单、可读和安全的方式给予、修改和撤销对资源或甚至部分资源的访问。

总而言之,资源、能力和Flow的账户模型使Cadence成为一种学习更快、审计更容易、生产力更强的语言,让开发人员在保证用户资产安全的同时更快地构建应用程序。由于这些众多的优势,越来越多的团队正在建立在面向资源范式的好处之上。

一个行业的觉醒:资源导向时代的到来

"社会学家托马斯-库恩(Thomas Kuhn)在其作品《科学革命的结构》(The Structure of Scientific Revolutions)中简明扼要地概述道:"范式转变是一种重要的变化,当人们思考或做某事的通常方式被一种新的、不同的方式所取代时就会发生

这对于技术革命来说也是如此。新的挑战引发了新的解决方案,随着软件进入新的领域,如何构建软件的 "正确方式 "也会发生变化--就像SQL是对原子交易挑战的回答一样,对图形用户界面的需求导致了Java等面向对象语言的出现。

我们今天面临的挑战是在区块链上处理有价值的资产的艰辛。Cadence提出的解决方案是整个行业似乎都在慢慢发现的一种范式。资源导向。

今天,已经有大公司实施了面向资源的范式,比如Diem的团队与他们的智能合约语言Move。因为面向资源的范式的优势很容易理解,所以会有很多人跟进。

Cadence是目前第一个可以用于智能合约编程的面向资源的语言,在智能合约的安全性、可读性和可组合性方面设立了新标准。由于这些相对于现有解决方案的优势,Cadence可能只是成为下一代智能合约的语言。

你可以通过我们为你量身定做的学习资源开始学习Cadence,成为这个智能合约编程新模式的一部分,这些资源由Flow和Cadence背后的核心团队创建和策划。

更多读物