zl程序教程

您现在的位置是:首页 >  其他

当前栏目

1.MOVE从入门到实战-Solidity v.s. Move有何不同

入门 实战 不同 有何 move Solidity
2023-06-13 09:14:41 时间

本文作者:木头[1]

Resource 特性

Move 语言被誉为最适合编写区块链智能合约的语言之一,并且多次被拿来与目前主流的 Solidity 进行比较并力压其一头,主要原因是 Move 对于区块链最核心的 Token 资产进行了更为贴合的处理,弥补了 Solidity 在直观性和安全性的缺陷,这里我们单独将其最具有特色的 Resource 类型进行重点讲解。

因资产上链使得安全问题成为了区块链核心要解决的问题。在 Web2 中如果产品 Bug 或者数据泄露,难以导致用户资产损失,最多引发产品崩坏或个人信息泄漏、黑市贩卖,但是因为资产上链使得智能合约一旦出现了 Bug 就会直接导致背后无数的用户资产外流或者被锁死。我们也可以经常从新闻看到黑客对某些交易平台或跨链桥进行攻击产生了数以亿计的资产损失,BuidlerDAO 之前也产出过大量的研报对这些事件进行研究,大部分都是因为合约出现了比较低级的问题被黑客盯上所导致的。这引发了一个需要读者注意的关键属性:Solidity 是面向区块链智能合约的编程语言,但不是面向区块链链上资产的编程语言。

为什么这样说呢?举个例子,Solidity 和绝大多数编程语言一样将 Token 作为数值变量处理,就是将 Token 的转移过程是进行加减法操作的,即张三要给李四转 10 块钱,于是则先将张三的余额-10,再将李四的余额+10。

所以在 Solidity 中资产就是一个可以被加减的数字,那么这里面就需要合约代码非常严谨,比如在进行加减法操作时出现了一些问题,给张三-10,李四+20,或者张三-0,李四+10 呢?因为这个过程就是通过很多代码逻辑去来回在若干个钱包中进行加减操作,很难保证不会出现一些问题。

究其原因是资产在 Solidity 中没有被特殊定义,只是将其看作和年龄、电话等一样的变量。而资产的定义本就应该是独一无二的,就像是在物理世界中,我手里有一块金条,我要将它给某个人,不论给予中间的过程是怎么样的,这个金条不会从 1 根变成 2 根。所以我们常说的数字资产,在 Solidity 中只可称之为可以被加减的数字,而谈不上资产。

Move 的可编程 Resource 是其变得安全且强大的核心,实现了真正意义上的数字资产化。Resource 是一种数据类型。数据类型即定义一种数据结构的方式:

字符:比如姓名、住址,是 String 类型; 数字:比如年龄、电话,可以是 Int 类型; 是否、对错:一些对立,则可以用 Boolean 的 Ture 和 False 来表示。

Move 认为 Token 资产是一种很特殊且重要的数据,不应该用普通的数值类型来定义和表示,所以单独创建了 Resource 来定义链上资产。这种方式呈现出三个特性:

  1. Resource 在 Move 中依然是以一个数值的形式存在,可以作为数据结构被储存,也可以作为参数被传递和返回。
  2. Resource 可以安全的表示数字资产,它的特殊在于不能被复制,丢弃或重用,但是它却可以被安全地存储和转移,并且 Resource 类型的值只能由定义该类型的模块创建和销毁,所以其实现了资产的含义而非数字。
  3. Resource 适配了区块链应用特性,如与账户进行绑定。Resource 数据必须要存储在账户下面,所以只有分配了账户后才会存在对应的 Resource 资产,以及 Resource 只要取出后就必须被「使用」,用内置的 Move_form 方法将资产从账户中取出后,要么将其作为返回值传递即必须要流向一个地方,要么直接将其销毁,这意味着资产取多少就用多少。还记得 Solidity 是如何操作的吗?它将一个地址的余额减少,再去另外一个地址增加,然后通过代码使得减少和增加的数字是一致的,所以在 Solidity 是完全靠代码逻辑强硬的实现了资产使用,但是 Resource 则是在底层将资产的概念进行了封装而非加减法,避免了资产凭空产生和随意访问,极大的提高了安全性,可以将 Move 的 Token 移动看作是搬砖,从一个地方搬到另一处,而 Solidity 则是加减法,一处减了,另一处加上。

综上所述,Move 是一种更加原生且贴合的专用于发行数字资产的编程语言,它实现了程序与数字资产的直接集成。

技术差异

面向资源编程

Move 专门针对金融场景进行了增强,引入了面向资源编程。对于 FT 和 NFT 等常用场景,Move 将数据定义成资源,能够从虚拟机层面保障了数据的安全。

纯静态语言

动态调用是 Solidity 的基石,所有的跨合约调用都要通过动态调用来实现,例如 DelegateCall,但是也是大部分安全漏洞的入口,例如 TheDAO 攻击、PolyNetwork 跨链攻击等等。鉴于 Solidity 的真实经验,Move 采用了完全纯静态的实现,更好的保障链上资产安全。

形式化验证

形式化验证是 FV(formal verification) 是指使用数学工具分析设计可能行为的空间,而不是计算特定值的结果。也就是说,通过数学的手段证明程序的安全性。Move 自带形式化验证的工具,我们可以使用数学的手段来测试和证明合约的可靠性,这是 Solidity 不可比拟的优势。

分散存储

Web3 时代,用户掌握数据是所有权。Solidity 是通过 Map 的形式,集中存储合约数据,在合约出现漏洞的时候,例如获取到了合约 Owner 权限,所有用户数据都将遭受攻击。Move 巧用 Resource,能够将数据分散的存储到每个用户自己的 Account 下,既保证了数据的安全,又真正的做到了数据的所有权归用户所有,合约的 Owner 没有修改数据的权限。

面向泛型编程

出于安全的考虑,Move 设计成了纯静态语言,但是灵活性并没有因此而减少,Move 通过面向泛型编程,保障了合约的扩展性,增加了代码的复用能力。

参考资料

[1]

木头: https://learnblockchain.cn/people/3015