面向资源编程:更好的数字所有权模型

  • 链求君
  • 更新于 2020-12-15 22:05
  • 阅读 2900

Cadence 介绍,一种高级的面向资源的编程语言

软件工程师们经常使用“所有权”一词,用来表示,某块代码负责管理某种数据结构或系统资源。这种隐喻在编程环境中最为普遍,在这种环境中,内存管理并非是从程序员那里抽象出来的,所谓的代码“拥有”一个对象,就是说代码有权管理并释放分配给该对象的内存。

但是,当我们在其他任何情况下谈论“所有权”时,通常是在谈论具有持久价值的资产,而不是短暂的数据结构。尽管可以使用现有的编程环境来跟踪资产的所有权,但是它们通常用于反映所有权,而不是直接定义资产的所有权。公链区块链的独特之处在于,它们明确设计用于管理真正稀缺和完全访问控制的数字资产所有权。诸如比特币或Flow之类的公链区块链上的数字资产应表现得像有形资产:不得复制或伪造,只能转让。

随着区块链的发展,代表所有权的机制也发生了变化。比特币是使用“未用交易输出”或称之为 UTXO 的所有权模型构建的。虽然 UTXO 模型非常高效,但它很复杂并且会创建一些异常的边缘情况,因此以太坊采用了更灵活的分类账模型。不幸的是,以太坊模型几乎没有针对编程出现的错误进行保护措施,导致程序的错误造成加密货币社区损失了超过1亿美元的资金。

理想情况下,旨在管理数字所有权的编程语言应包括数字资产的本身的表示形式,并具有防止破坏价值的错误的内置保护措施。

Cadence 介绍,一种高级的面向资源的编程语言

去年,在对更好的智能合约语言进行学术研究之后,Flow团队正在研究在区块链环境中使用线性类型。而几乎在同一时间,Libra 团队发布了最初的公告,其中包括MoveVM的技术细节。

Libra 团队基于线性类型的启发,构建了新所有权模型:资源(Resource),为 Move 定义了新的编程模型。资源是一种直接用编程语言表示资产所有权和启用加密数字资产属性的新方法。

关于Move的简介:

Move 的主要功能是能够定义自定义资源类型。资源类型用于对具有丰富可编程性的安全数字资产进行编码。

资源导向编程的强大功能令我们震惊,它是 Cadence 的核心功能之一,而 Cadence 正是我们为 Flow 开发的智能合约编程语言。

作为第一种高级的面向资源的编程语言,Cadence 具有舒适的,符合人体工程学的语法,非常易于阅读。它使用强大的静态类型系统来最大程度地减少运行时错误,并允许所有方法,接口和事务包含前置条件和后置条件以强制执行预期的行为。我们认为,这将导致一种语言,比任何其他替代方法更易于学习,更易于审核,最终最终将提高生产力。

您可以在Flow Playground 上体验 Cadence。

面向资源的编程如何工作?

资源提供了比 EVM 或 WASM 更丰富的可组合性选项,并且非常适合数字资产。将某物标记为“资源”可以告诉编程环境,该数据结构代表某种有形的价值,并且与该数据结构交互的所有代码都需要遵循一系列特殊规则,以保持该数据结构的价值。

那么,这些规则是什么?

  • 每个资源在任何给定时间都恰好存在于一个地方。

  • 不能通过编程错误或恶意代码来复制或意外删除资源。

  • 资源的所有权由其存储位置定义。无需参考中央分布式帐本的方式来确定所有权。

  • 对资源上方法的访问仅限于所有者。例如,只有CryptoKitty的所有者才能发起繁殖操作,从而导致新Kitty的诞生。

  • 仅仅由编译器强制执行资源(Resource)对象的特殊状态是不够的。这些代码还必须在链上执行时强制执行。如果没有链上运行时的支持,攻击者很容易使用被篡改过的编译器绕过确保资源安全的规则。

然而,如果确实的正确执行了这些规则,则可以确保将区块链网络中最重要的资产,安全地存储在由用户提交的代码控制的数据结构中。这样做的确很强!

我们来看个例子!

理解资源(Resource)的最简单方法是通过使用诸如谜恋猫(CryptoKitty) 之类的非同质化通证(NFT)作为示例思考。每个谜恋猫(CryptoKitty) 是不可分割的,不可复制的,并且可以有一个直接所有者,该所有者直接与 Resource 数据结构相匹配。

在以太坊等账本模型中,所有 CryptoKitties 都作为一个巨型列表存储在单个智能合约中。通过将每个所有者的帐户ID存储在中央区块链帐本中来跟踪每个Kitty的所有权,而更改 Kitty 所有权的唯一方法是发起调用合约请求,并要求其更新与该 Kitty 相关的帐户ID。

在资源模型中,Kitty 本身表示为一个Resource对象,它直接存储在拥有它的帐户中。就像在现实世界中一样,所有权是通过拥有它来表示的。您无需查看中央账本,即可查看您是否拥有某物,可以将其存储在帐户中,也可以不用。而且,如果您拥有它,则可以转移它或以其他方式对其进行控制,如果您没有,则无法捕获或更改它。

注意:为了专注于账本模型和资源模型之间的差异,以上两个示例都忽略了访问控制,定义每个变量以及实时代码需要担心的其他因素等问题。

为什么资源很重要

资源可以便于管理所有权的抽象,并且防止错误的同时提高智能合约开发人员的生产力,但是使用资源还有一些其他的好处,每个好处本身都非常重要:

  • 费用管理

可扩展的智能合约平台需要某种方式来收取“租金”,因为每一份计算资源的使用都需要支付费用,存储在区块链上的数据若不支付则会被删除。

使用账本模型,很难知道应该由谁支付租金。例如,CryptoKitties 合约代表着数以万计的玩家,拥有近200万只 Kitty 和超过 111MB 的链上数据。以太坊无法向所有 Kitty 所有者公平地收取租金。

使用通过资源类型的直接所有权模型,每只猫咪都将与该人的其他资产一起存储在其所有者的帐户内。谁需要为此存储付费,责任很明确。此外,单个用户(在其客户端软件的帮助下)可以归档未使用的资产,以降低成本并减少网络负载。

  • 灵活的所有权

将账本模型用于所有权会限制所有者与其他拓展方案的兼容。例如,ERC-721为NFT定义了一种所有权模型,该模型假定只有以太坊地址才能拥有NFT。但是,资产本身拥有其他资产的想法(例如,拥有一副漂亮的太阳镜的CryptoKitty)在某些用例中非常有趣,并且需要创建新的规范(ERC-998)。ERC-998非常强大,但它也比ERC-721复杂得多。正确实施它非常困难,由于以太坊智能合约的不变性,将其功能追溯应用到现有ERC-721资产实际上是不可能的。

资源模型允许将使用“资源类型”建模的任何资产安全地存储在系统中的任何位置,包括在其他资产“内部”(如果适用)。所有安全性和价值保证都可以由运行时系统维护,同时为开发人员提供了创造性和灵活性,而又不会带来过多的复杂性。

  • 基于功能的安全性

资源类型是提供了基于功能的安全模型,其中具备实现“功能”概念所需的所有保证。功能是定义安全系统的强大机制,可以遵守最小特权原则(安全系统中的一种常见最佳做法)更加容易,该原则要求安全系统的所有部分都没有绝对的特权。是他们完成工作所必需的)。 基于功能的安全模型通常被认为更容易推理(增强了安全性),同时具有更大的灵活性。

  • 消除重入错误

以太坊历史上最著名的智能合约错误是由于重入问题而引起的,Solidity开发人员需要时刻保持警惕,以防止引入容易受到重入攻击的逻辑流。 幸运的是,在Resource对象上定义的方法不能成为任何可重入漏洞利用的受害者。 这似乎是一个大胆的改变!遵循资源的定义方式:每个资源都有一个所有者,只有资源的所有者才能在其上调用方法。如果Resource方法是“堆栈上的”,则我们知道对该对象的单个所有权引用已经被明确分配;我们从该方法内部调用的任何代码(无论是间接调用)根本不可能再次获得对该对象的引用以进行可重入方法调用。

当然,直接使用全局共享状态(绕过Resource对象的使用)仍然可以创建易受重入错误影响的代码。这就是为什么惯用的Cadence 编程范式是对所有共享状态使用Resources的原因;精通面向资源编程的合约开发者,将无需再考虑可重入的bug!


翻译自 Dieter Shirley 原文

点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
链求君
链求君
0xB10D...5888
https://lianqiujun.co