开发者时薪高达 1200 美元?一文带你走近 Move 语言的编程魅力!
区块链世界热点层出不穷,layer1 与 layer2 的争论还未见分晓,新语言的叙事已经成为新的战场。
继 Polkadot 与 Solana 的 Rust 语言之后,Move,这个因 Facebook 折戟的稳定币 Diem 项目而诞生的编程语言,如今因为两条新兴公链的强势亮相,再度走入人们的视野。
这两条公链就是近期逆市狂揽包括 a16z 在内的头部 VC 共计近 5 亿美元投资的 Aptos 和 SUI。其创始团队成员大部分来自 Facebook,是该公司加密货币项目 Diem(原名 Libra)与 加密钱包 Novi 的主要创建者和核心开发者。
由于监管的掣肘,Diem 项目最终在今年年初选择出售,设想终未能落地。出走的成员们“散是满天星”,分别创立了 Aptos、SUI 以及 Linera。而 Move 则是成员们从 Diem 拿到的最核心遗产。
至少目前为止,没有比 Move 阵仗更大的新语言了。如果说是 Solidity、Rust 一开始是以太坊与波卡赋予的光环,那么 Move 则已经反客为主,其热度已经足够赋予新项目噱头。有外网小道消息透露 Move 的开发者时薪已经达到 1200 美元;风投 Multicoin Capital 的合伙人 Kyle Saman 在撰文解释为何投资 Aptos 时,就直接以《 Move Move Move 》作为标题;更有拥趸者发出了“ L1 or L2 is important,Move is the progress ”的感叹。
Move 究竟有什么魅力?自带明星光环的它如何继承了 Diem 项目的遗志?又如何赋能新公链?本文章将基于 Move 与 Solidity 的对比一一探讨,且尝试用更加通俗的语言来阐述它。
Move——为金融而生
探究一门编程语言,先从开发愿景开始,这或许也能解释为什么 Facebook 团队在一开始就决定开发一种新的语言而不沿用旧的语言。
Move 最初由 Facebook 为 Diem 区块链开发,后者最初的设想是打造一个全球化的金融和货币的金融设施,为数十亿人提供支持。
尽管这个设想被证明“出师未捷身先死”,但这也直接决定了 Move 是为资产而生的语言。换而言之,作为编程语言, Move 必须能够以精确、可理解和可验证的方式表达 Libra 货币和治理规则。从长远来看,Move 必须有能力对构成金融基础设施的各种资产和相应的业务逻辑进行编码。
如何实现?Move 给出的答案是“ First-class Resources ”,翻译过来就是将资产作为一等公民编程,也可以引申出,Move 是为操作数字资产而生的智能合约语言。
在 Move,资产不是哈希值,不是字符串,而是被特殊定义的一个代码,由 /resource/ 表示或存储在其中。Move 编程语言抽象了资源的四个属性,可复制( copy ) 、可索引( key )、可丢弃( drop )、可储存( store ),通过这四个属性的不同组合,用户可以方便的定义出任何类型的资源。
与之相对应的是,在 Solidity 中,资产没有被特殊定义,只是将其看作和年龄、电话等一样的变量。
资源优先的概念为程序员写出安全和有效的代码提供了很大的帮助。与此同时,Move 开发团队认为,资产一旦单独成为一个类型,就能在一般的编程中打开了很多可能性。Mysten lab ——也就是 SUI 的开发团队编程工程师 Damir 是这样说的:“一旦您开始像对象一样思考,而不是像在哈希映射这样的编程原语上构建的抽象思考,您就能时时刻刻知道自己在做什么,就像具有无限表达性和明确说明类型一样——过去是什么,现在是什么。”
不过,之所以有如此的考虑,其实也离不开 Diem 的设定。由于 Diem 是与现实储备美元相锚定的稳定币,绑定的是有形资产,这对于资产的转移要求更为严格。
所以,资产不仅仅需要一个专门的代码,同样也需要赋予新的特征:
一、 稀缺性
Move 开发团队认为,稀缺性是有价值的实物资产的重要属性,但是数字资产并不存在固有的物理稀缺性。数字资产计算规则必须以编程方式强制执行稀缺性。
也就是说,系统内资产的供应不应该是无节制的,必须完全禁止代码漏洞导致资产被复制,而创造新的资产应该是一种特权操作。
这主要针对的是公链智能合约漏洞有可能出现的重入与双花攻击。重入攻击首次出现于以太坊,由于项目方采用的转账模型为先给用户发送转账然后才对用户的余额状态进行修改,导致恶意用户可以构造恶意合约,在接受转账的同时再次调用项目方的转账函数。利用这样的方法,导致用户的余额状态一直没有被改变,却能一直提取项目方资金,最终导致项目方资金被耗光。
双花攻击则更为普遍,即一笔钱花了两次,双重支付,利用货币的数字特性两次或多次使用“同一笔钱”完成支付。双花不会产生新的 Token,但能把自己花出去的钱重新拿回来。
对此,为了实现稀缺性, Move 采用了线性逻辑来规定,资产永远不能被复制或隐式丢弃,只能在存储位置之间移动。
二、 访问控制
Move 开发团队还认为,资产应该通过对访问权限的设置来保护。
在 Solidity 中,数据集中存储在合约里,在合约出现漏洞的时候,一旦黑客获取到了合约权限,所有用户数据都将遭受攻击。对此,Move 开发团队认为,数据应存储在拥有它的帐户中,而不是合约中。
如何实现呢?在 Move 中,有一个 Mudele(模块)的设置,模块可以是库或可以创建、存储或传输资产的程序,功能类似于以太坊中的合约,但更类似于使用面向对象编程的银行。
Move 规定只有公共模块功能可以被其他模块访问。除非结构具有公共构造函数,否则它只能在定义它的模块内构造。同样,结构中的字段只能在其模块内或通过公共访问器和设置器访问和更改。
每个 resource(对象)都存储在由所有者的帐户控制的模块里。如果要访问/修改所有者的模块,则必须由所有者签名,在 Move 中,经过验证的所有者,也就是交易的发送者由/签名者/表示。签名者在 Move 中拥有最高级别的权限,并且是唯一能够将 resource 添加到帐户中的实体。
此功能允许在智能合约中维护数字资产的所有权信息和特权。如果资产被发送到智能合约,所有权不会改变。例如,如果黑客获得了 Move 智能合约的访问权限,他也无法将资产提取到自己的钱包中。
Move 如何保障资产安全?
安全,当然是成为一种合格的区块链编程语言的基本要求。
当前,Web3 安全风险已经越来越令人生畏,黑客攻击导致用户资产外流的例子已经屡见不鲜,根据慢雾区块链被黑事件档案库( SlowMist Hacked )统计,2022 年上半年 DeFi 安全事件约 100 起,损失超 16.3 亿美元,其中项目缺陷与合约漏洞是四大原因之首。
所以,对于主要放眼于金融场景的的 Move 而言,从设计上就从 Solidity 可能存在的安全漏洞中吸取经验,无比重视「智能合约安全性、正确性」。
安全是为资产(也就是 resource)服务的,所以在第一部分文章对于资产的安全设计也做了一些简略的描述,在这部分,将进一步阐述 Move 安全的架构设计。
在 Move 中,静态调用是其安全架构的重要基石。在这里这里 Move 的设计借鉴了不少以安全为名的另一种编程语言—— Rust 的经验。
一、 确定性——虚拟机
首先,我们知道,与普通的计算机程序不同,区块链上的智能合约必须同时具备确定性。
怎么理解?作为一个通过多方存储、多方计算的方式来实现数据不可篡改、计算结果可信的分布式系统,智能合约会在区块链网络的多个节点中运行。如果一个智能合约是非确定性的,那么不同节点运行的结果就可能不一致,从而导致共识无法达成,网络陷入停滞。
所以给合约一个确定的输入环境,对于区块链来说是很重要的一件事情。以太坊的虚拟机 EVM 之所以应用而生,就是为以太坊创造一个隔离的、可确定的沙盒来执行合约代码。如下图所示,可以看出,合约之间的调用是同一个进程内不同的智能合约虚拟机之间的调用,安全依赖于智能合约虚拟机之间的隔离。
而在 Move 中,智能合约之间的调用变成如下图所示:
合约之间的调用被集中放置在一个沙盒中,这就变成了:同样也有 Move VM 来保证确定性,但不同的是,在这种架构下,合约的状态的安全性主要要通过编程语言内部的安全性进行隔离,而非依赖虚拟机进行隔离。
二、 静态调用
那如何保证编程语言内部的安全性呢?Move 提出的解决方案是静态调用与形式化验证。
在 Move 团队中,有这样一个说法:“在一个代码就是法律的世界里,动态调度是一种犯罪”。(“ in a world where code is law, dynamic dispatch is a crime ”.)。
如何区分动态与静态调用?通俗地说,一个程序在调用另一个程序时,如果必须在运行时才能确定被调用的目标,则称该调用为动态调用;反之,如果在运行前即可确定被调用的目标,且在运行时无法变更该目标,则称该调用为静态调用。
由于动态调用的目标在运行时决定,因此其行为是非确定的。目前以太坊上的合约间的调用,就是一种动态调用,类似于服务器之间的远程调用,动态调用灵活,但会带来的一个最大的风险是有可能形成循环调用,导致恶意用户可以构造恶意合约,在接受转账的同时再次调用项目方的转账函数。类似的安全事件就有 TheDAO 攻击、PolyNetwork 跨链攻击等等。
而在 Move 中,语言设定每个函数调用都是静态的,开发者确切知道何时调用一个函数,这种静态类型系统是将问题的暴露前置到了编译这个阶段,而非运行的这个阶段,以此降低在运行时出现 crash 的机率。
三、形式化验证
在 Move 中,除了静态验证之外,还引入了链上轻量的形式化验证以分担安全检查的压力。
形式化验证,通俗地说,就是通过数学的手段证明程序的安全性。
目前 Move 开发团队已经初步开发出 Move Prover ,其团队认为,传统软件庞大、复杂,使用的语言特性即使是最简单的验证任务也存在困难。但是, Move Prover 则有着被大多数 Move 程序员使用的潜力。
之所以如此乐观,其原因有三:
首先,Move 语言的几个设计支持验证:
虚拟机沙盒:为确保确定性执行,该语言只能从全局区块链状态或当前事务中读取数据(无文件或网络 I/O);
静态调用:Move 缺少许多难以验证的特性:并发、高阶函数、异常、子类型和动态调用。
Move 具有内置的安全算法:在执行过程中检测到溢出和下溢并导致事务中止。
Move 字节码验证器(Bytecode verifier)可以防止许多常见错误,这是一种在执行前检查每个字节码程序的静态分析器(类似于 JVM 或 CLR 字节码验证器)。它可以检查出各种类型错误,保证非循环递归依赖、非悬空引用、每个基本块的首尾操作数栈高相同、可变引用对其所指对象具有独占访问权等等。
比如,资产中的稀缺性这个特征就是通过字节码验证器实现的,默认情况下会强制执行稀缺性,因为不能复制结构。只有在字节码层明确定义为/副本/的结构才能被复制。
其次,Move 从一开始就致力于建立规范文化:每个 Move 模块都有标准库;
最后,Move 团队正在努力使 Move Prover 尽可能精确、快速和用户友好。目前的进度是,该验证器运行速度已有较大提升,开发人员可以在几分钟内运行测试,使他们能够快速迭代他们的代码。
Move——跨平台的嵌入式语言
对于编程语言来说,灵活性是构建编程语言生态的另外一个重要特性。
按照 Move 创始成员的话说,Move 是一种跨平台的「嵌入式语言」。在 Move 中,有诸如 strux、布尔值、整数和地址之类的东西,但它没有 Solidity 中账户、交易、给定平台使用的密码学或给定平台使用的共识的概念——所有这些东西都被抽象掉了。
在 Move 开发之初,开发团队就认为 Move 这个语言不需要过度拟合平台的细节。他们希望给新平台上的创作者很大的余地来尝试不同的东西,这样就可以推动整个生态的发展。
3NJOY Lab 创始人 Flex 对这一概念讲述得颇为清晰,他认为,以建造一个汽车工厂为例,Solidity 的做法是定义了这个工厂的生产标准以及流程,每一个想来造汽车的人都需要先造一个符合生产标准及流程的工厂,然后才能创造汽车。而 Move 的方式是工厂就只有一个,想要造汽车的人使用这一个工厂就能造出来大家都认可的汽车。
这样带来的好处一方面是节省了合约占用的区块空间,我们不需要重复创造工厂了,另一方面的好处是优化升级变得容易,不会自缚手脚了。
比如在以太坊上,当我们想扩展一些新的行为或者做一些实现上的优化,那我们需要重新定义过往的接口,同时也会影响旧的方法,像 ERC 721 和 ERC 721A, ERC 4907 这些优化和新的定义,是没有办法直接让过去所有使用了 ERC 721 的合约直接进行升级迭代的。
而 Move 基于 Module 间的组合只需要对 Module 进行升级和优化,所有使用过这个 Module 的其他合约都会自动使用最新的版本。
Module 在第一部分已有过提及,类似于智能合约,但更类似于使用面向对象编程的银行。每个资源(对象)都存储在一个单独的保管库中,由所有者的帐户控制。资源操作受特定模块(类)支持的功能的限制,可以从模块外部调用。开发人员可以将新模块部署到网络。
与此同时,Move 并提出脚本(或事务作为脚本)和模块的分离。除了允许开发者扩展区块链功能或实现自定义智能合约与各种选项的模块之外,前者(脚本)允许你将更多的逻辑放入你的事务中,使它们更加灵活,同时节省你的时间和资源。
何为脚本,网络上的每个事务都可能包含一个脚本,该脚本可以调用多个模块或启动多个操作。开发人员可以使用一笔交易来执行各种操作,从而显着减少应用程序所需的智能合约数量。这会带来更安全的应用程序、更好的用户体验和更大的灵活性。
当前,使用 Move 语言的 Aptos、SUI、Linera 以及中国公链 Starcoin 都在 Move 的基础上做了变体,以适应其专注的区块链场景。具体细节值得另起文章了。
总结
总得来说,面向资产编程的设计,使得 Move 语言与支持去中心化金融应用的部署天然适配。而线形逻辑、访问控制、静态调用、形式化验证等等技术逻辑则为 Defi、NFT 等去中心化资产的安全提供了多重保障。
二者正击当前 Web3 中 Defi 重复以及安全痛点,这也是 Move 被市场视作大有施展拳脚的主要原因。
不过,新语言的诞生,必然意味着开发者迁移成本的上升,如何进一步扩大开发者社区仍然是目前 Move 系公链一个道阻且长的课题。
编程语言的选择,往往是在多个因素之间做取舍,最终决定适合自己的那一个,其设计的精巧程度或许也只是其中一个因素。但 Move 的探索方向仍然让人激动人心,我们也期待 Aptos、SUI、Starcoin 等公链能够与 Move 相辅相成,在 Web3 世界大放异彩。
参考文献:
Move 白皮书
https://move-book.com/index.html
Move Github
https://github.com/MystenLabs/awesome-move
the Move Prover
file:///Users/zouluhui/Downloads/The_Move_Prover.pdf
Rescape SUI AMA (两场)https://sui.io/resources-sui/recap-sui-ama-cryptography
https://sui.io/resources-move/recap-sui-sam-blackshear/
为什么是 Move 之编程语言的生态构建
https://mirror.xyz/jolestar.eth/sQ0nMCO3eNig6gCzqQO7xew1mn8oUi1-rKtfZKmGlNI
Move 能否超越 Solidity&EVM 智能合约编程语言,具备强大生态构建能力?
https://jolestar.com/why-move-1/
为什么我认为 Move 终将超越 Solidity
https://www.odaily.news/post/5180762
Move 语言:我眼中的 Libra 最大亮点
https://juejin.cn/post/6844903870980702216
关于我们
TinTinLand 是赋能下一代开发者的技术社区,通过聚集、培育、输送开发者到各开放网络,共同定义并构建未来。
Discord: https://discord.gg/kmPnTDSFu8
Twitter: https://twitter.com/Tintinland2021
Bilibili: https://space.bilibili.com/1152852334
Medium: https://medium.com/@tintin.land2021
YouTube:https://www.youtube.com/channel/UCfHiMcFt-4btbC75FsReQhQ
评论