1. 首页 > 创业 > 求职

a16z对话Move语言之父:从编程语言说起,为何Move是未来智能合约的重要方向

你说,这是我的代币的类型参数,然后它会给你一个叫做“资金宝库能力”的东西。然后有其他的逻辑确保只有持有t的宝库能力的人才能铸造和销毁t类型的代币。你可以拿到这个宝库能力,将它锁定在一个不同的合约中,强制执行总供应量的限制。你可以将它放在某个地方,比如说只在周二评论,但不在周四评论。你倒置了控制流,这就允许你进行任意的组合。这是一个技巧的例子,但这个技巧可以在几乎所有地方使用,如果你想要让行为以某种方式工作,你需要硬编码。这听起来不好,但你实现特定的两种方法,然后你为你想允许的东西定义这些能力。

a16z Eddy Lazzarin:你认为能力是你可以添加到一个看起来像是传统程序员的接口的约束吗?

Sui CTO Sam Blackshear :是的,我认为大多数这些接口模式可以非常直接地变体。这有点难以编译,但是你可以说,这是这个接口想要做的事情的等效能力模式。

主持人 Sonal Chokshi:顺便问一下,Sam,你觉得这样满意吗?请随意表示异议,有点冲突感是好事。

Sui CTO Sam Blackshear :我觉得这样还算满意,因为我认为如果你可以有具有内在能力的模块或者结构体,而这些模块可以被喂入具有非常预定义行为的模块中,你最终可以得到完全相同的行为,就像模块可以做到的那样。模块接受抽象的结构体,那个结构体在那个模块中被定义,然后这个结构体里面有一个内在的能力。这实际上非常好用,因为你可以得到非常好的权限样式注册表,它们几乎自然地从这里产生,就像什么叫做DS-Off注册表就是这样,是吧?

a16z Noah:完全正确。这些能力是可以扩展表示你被允许做的事情。因此这有很多其他的好处。比如说,你想知道我的账户能做什么,你看看我有哪些能力就行了。然后,你可以做程序分析,看看如果我有一个宝库能力,那么我可以调用哪些函数,还有其他一些类似的东西。

5、面向对象和面向资产的编程

a16z Eddy Lazzarin:所以我可能有点提前谈到证明器,但是这些能力对类型系统可见吗?在对程序进行静态分析的时候,这些能力在程序的哪个时候是可见的?如果我写了一些特定实例化的代码,其中有能力,那么在我运行它之前,能够很早地发现我违反了能力吗?a16z Noah:是的,这些能力是对类型系统可见的,并且在程序的静态分析阶段就可见了。如果我写了一个具有能力的特定实例化的类型的代码,那么非常早就可以发现我是否违反了能力,不需要在虚拟机上运行它。

Sui CTO Sam Blackshear :让我简单回答一下这个问题,然后再提供一些背景信息,它们对编译器可见,并且是类型系统的一部分。这是我们非常重要的一个利用点。但我想稍微讲一下Move可移动性系统中的结构体,以及它如何卷入到类似于审计的能力等级中。如果这不会分散注意力的话。在Move中,你有结构体类型和类似于其他语言的结构体,它们可以有字段,可以是基本类型的字段,也可以是其他结构体。

而更加有趣,也许更加不同的是,这些结构体具有能力。如果你熟悉Rust,那么能力有点像标记交易。它们声明了你在结构体上允许进行的内置操作。同样重要的是,如果你没有能力,你就不能做那些事情。比较简单的一个能力是非常重要的,那就是复制的能力。如果你有一个代币类型或者非同质化代币之类的东西,在计算机中,它只是一些比特,但你不希望允许别人随意复制这个东西。在Move中,如果你没有声明你的结构体具有复制的能力,那么你就不能使用我们相当于“man copy”的操作。

所以像整数和字符串这样的东西都有复制。但如果你不想让你的类型具有复制的能力,那么你就不给它。然后还有其他的能力,比如丢弃,这被称为drop能力。这就涉及到了有趣的线性类型的东西,如果你想要丢弃某些东西,比如把它放到作用域之外,或者覆盖掉它,那么你就给它drop能力。但如果你不给drop,那么消除它的唯一方法就是定义该类型的模块所期望的任何策略。

公共语言运行库(common language runtime,CLR) 举个具体的例子,如果你想为你的代币保持一个总供应量,你就不给你的代币drop能力。然后除了在声明它的模块中定义的burn函数,没有其他方式可以摆脱它,这个函数可以更新总供应量。这些都是你可以使用的技巧。还有几个与存储有关的能力,比如它是否可以存储在全局存储中,我不会详细讲述,因为它们对这个问题不太相关。但基本上,能力已经融入到审计程序中,审计程序了解类型系统,知道如何利用类型系统来解决问题。如果我编写一个说明,说只有一个这样的东西,那么审计程序可以利用这个来证明这个属性。因此,能力和类型系统的保证是相辅相成的。

a16z Noah:当你提到drop时,我就想谈谈我最喜欢的东西。你能不能谈一下热土豆模式是什么?如果还有其他类似的酷东西,它是我最喜欢的奇怪事情之一,是从Move中产生的。

Sui CTO Sam Blackshear :这确实是一个奇怪的东西。这与能力非常密切相关。通常在编程语言中,你对于何时可以消除你的值没有太多的控制,可能你有一个析构函数来说明你的值何时会消失。但是有时析构函数的保证比较弱,或者你不能简单地说类似于“你不能删除我的类型”。这听起来像是一个奇怪的限制,但它实际上非常有力,特别是在没有动态分派的情况下。我先举一个热土豆的例子,然后我们可以深入了解闪电贷之类的东西。

如果你在以太坊上进行闪电贷,这是一个标准,你可以重载它,基本上你公开一个回调函数,就像一个闪电贷合约,你给我钱,我的回调函数然后取回钱之类的,而在Move中,你这样做的方式是有人去闪电贷合约,他们说,“嘿,给我53块,但他们也给你所谓的热土豆对象。热土豆对象是一个结构体,它没有能力。它没有复制,所以你不能复制它。它没有全局存储的能力,你不能像将它放在一个合约中一样将其藏起来。

它也没有drop能力,所以你无法将其丢弃。因此,唯一的摆脱它的方法是将它传回闪电贷合约。让你传回它的闪电贷合约的代码,强制你还款。如果你不还,它的程序将在运行时失败,甚至不会通过类型检查。因此,这是利用有趣的能力控制你的值的破坏,作为一个程序员,可以在任何时候强加任意的不变量,以决定何时可以销毁这些对象。这些看起来很像API调用模式非常明确。另一个非常明显的例子是,如果你想要强制某人在调用unlock之后调用lock,但在两者之间可以做任何想做的事情,你也可以用这种方法实现。

a16z Eddy Lazzarin:当我第一次听到“烫手山芋”模式时,我想到了像“mute texas”这样的锁的有趣用途,这些锁仅出于人体工程学目的,利用了类型系统,以强制特定对象的使用方式,几乎是商业逻辑级别的要求。我认为这是非常聪明的,感觉非常现代化,是编程语言中人体工程学的高质量使用方式,而这种方式在传统的编程语言中甚至还不是很常见,但在智能合约环境中显然非常有价值,因为在这里有更多的逻辑要求,要考虑可能涉及的价值和安全性。

Sui CTO Sam Blackshear :在我们讨论任何具体的例子之前,您能否快速概述一下我们的对象系统的高级概述?对象是什么,谁拥有它们?对象如何拥有其他对象,模块如何与它们一起工作?

a16z Noah:是的,完全正确。这是关于Move语言的一个方言,特别是Sui Move。这个东西的基础是全局存储的不同结构,而不是我们曾经使用的原始Move方言的全局存储方案。原始的Move全局存储方案非常类似于以太坊使用的公司模型。在Sui Move中,我们希望将事物的中心点放在对象上,高度激励能够尽可能精确地表示细粒度访问。这有助于你做很多事情,我们不会在这个播客上详细介绍,比如更有效地处理事务,告诉钱包用户事务将要做什么等等。所以在Sui Move中,全局存储的结构是一个从对象ID到对象ID的映射。然后对象只是具有一个称为键(key)的能力的Move结构。

它说:“嘿,我可以作为键。”它可以出现在全局对象池中。然后每个对象必须具有一个全局唯一的ID。然后你可以为你的模块编写入口点函数,它们可以直接将对象作为输入。如果你在写一个事务,这个WeRunTime就会有对象ID。如果你写的是事务,WeRunTime就能够使用这些ID来将ID解析为对象,并将其插入函数中。

这种面向对象和面向资产的编程体验非常棒。它比我们在原始Move版本中的做法直接得多。你还提到了父对象和子对象以及对象层次结构。这非常有用,但你仍然希望能够像表示大型集合这样的东西比如,我正在构建一个类似于DNS的注册表,我希望有数百万个条目。我们有一个对象大小限制,一个对象可以是几兆字节,但不能更大。但是如果你有像DNS这样的东西,它应该是任意大的。我们表示它的方式是使用父子对象关系,我们基本上有一种方式将一个对象视为异构映射。然后你可以添加具有动态选择字段的键。这在某种程度上非常类似于JavaScript。

我们可以说,这个对象有一个映射在里面,然后我可以在这个映射里放一些东西。或者你可以说,当我定义这个对象时,它有十个字段,但我实际上想在后来添加一个新字段,我将升级我的合同。我想在事后添加一个新字段。我们表示它的方式是使用这些父对象和子对象关系,每个子对象都与一个键值相关联,可以是任意的Move值,例如字符串或u64,或任何你想要的其他值。

a16z Noah:是的,与父对象的概念有关,我认为让它真正成为我的“灵光一闪”的事情实际上是几个月前我花时间深入研究 Sui Move,并从写一个只有一个对象的程序一直到重新实现了大部分Uniswap V2风格的卡牌组合。我做的一个小项目真正让我意识到拥有对象的对象是如此有价值。这个项目只有三个对象,锁、金子和一个空的障碍物。有一个很基本的模块,你可以想象它可以创建由钥匙对象拥有的金子。然后唯一的取出金子的方法是有一个函数,它需要锁和钥匙,并显然销毁锁,把金子给你,然后销毁你的钥匙。这种方式非常有趣,通过这种方式,你可以描述对象之间的关系,并以非常细粒度的方式描述权限。

Sui CTO Sam Blackshear :这也正是我们所考虑的。我喜欢你描述三个不同对象的嵌套方式,因为这种方式在深入到更深层次时变得更加强大。这使得作为程序员更容易结构化,以确保我可以到达第二层,然后可以触及第三层,但我不能直接从第一层到达第三层。我认为这也使得对于从智能合约空间之外的程序员来说更容易理解,比如这些人非常熟悉编写对象树、DOM对象树,如果你是游戏程序员,一切都是场景层次结构,其中有一个角色,他们有一个库存,然后库存里可能有一些小东西。你可以非常直接地在Move中编码这些内容,然后类型系统允许你以非常直接和安全的方式设置这种访问控制。我认为这是一种非常实际的编程体验,它真正反映了关于现实世界的直觉,或者如何描述某些东西,然后直接转化为相关的代码。

6、Move 与 Solidity 的安全性对比

主持人 Sonal Chokshi:顺便说一下,在来到 Wired 杂志之前,我曾经在施乐公园呆了6天,这让我想起了一点关于面向对象编程的历史。你刚才说的超级有趣,因为他们发明了 Smalltalk,这是许多今天面向对象框架的早期前身。无论如何,有没有其他的话题想讨论?a16z Noah:我只有一个普遍性的问题,但实际上,有没有在 EVM 世界中发生的黑客事件等等,你认为如果使用 Move,由于类型系统的缘故,这些事件就不会发生在第一次。

Sui CTO Sam Blackshear :在 EVM 世界中,我们已经提到了动态分配和重入,Move 通过构造消除了重入,任何与重入相关的问题都会消失,我认为人们做得很好。现在,我认为它避免了反应和查看。

a16z Eddy Lazzarin:但是你能解释一下,为什么 Move 会让这些问题不可能发生吗?

Sui CTO Sam Blackshear :重入,对吧?发生了什么?你写了一些代码,调用了某个函数。问题在于,有人提供了一个你最初没有预料到的函数实现。为了实现这一点,函数调用必须是动态的。它必须调用代码,这基本上是由调用者提供的函数指针,可能是攻击者。如果你没有任何动态函数调用,如果你总是知道一个函数调用的目标,那么这根本就不可能发生,就像你调用的任何东西,你可能不知道代码做了什么,但是你知道它是什么,你可以测试它,你可以验证它,所有的东西都在那里。所以从根本上说,别人不可能提供让你的模块行为变得出乎你意料的代码,因为这只是一个静态的函数调用。太酷了。

a16z Eddy Lazzarin:因此,这就消除了可重入攻击,这在Solidity开发中一直是一个永恒的问题。

Sui CTO Sam Blackshear :是的,我认为Move基本上消除了智能合约编程中缺失的权限检查问题。有很多时候你在写一些代码时需要显式地传递所有的账户,并且你必须说,我是否有权做这件事。你写了一个简单的代码,但是却忘记了检查发送者是否是某个人,或者是否这个人可以访问它。我认为这些问题经常发生。所以在Move中,对象所有权信息实际上存储在对象元数据中。这不是程序员可以控制的东西。

 4/6   首页 上一页 2 3 4 5 6 下一页 尾页

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:http://www.longfuchaju.com//chuangye/qiuzhi/6604.html

联系我们

在线咨询:点击这里给我发消息

微信号:wx123456