Move,一场智能合约的安全革命
Move,一场智能合约的安全革命
* 本文由Starcoin社区原创

区块链的大航海时代,各大公链都在不同的领域进行大量的探索。尤其是DeFi爆发之后,区块链技术通过GameFi、NFT、DAO、Web3、Oracle等各个途径逐步进入大众的视野和生活,让大家体验到区块链带来的红利。然而,在高歌猛进的同时,层出不穷的安全问题也一直困扰着整个行业,每年都有数亿资产因为漏洞而遭受损失。尤其是在Solidity引领下的DeFi时代,链上数据裸露在所有人的面前,对开发人员的要求很高,安全的问题被无限放大。

Starcoin是新一代分层智能合约与分布式金融网络。从设计之初,就高度重视安全的问题。一方面,Starcoin期望能够解决常见的安全问题,另一方面,Starcoin希望降低开发者的安全门槛。最终,Starcoin选择Move作为智能合约语言。Move有非常多的优点,而最大的亮点就是安全。Move在不增加开发人员负担的情况下,针对智能合约的场景,引入了很多安全的特性。本文将分析历史上真实的安全漏洞,逐一盘点Move这些开箱即用的安全特性。

面向资源编程

面向资源编程是Move最大的创新之一。那么,到底什么是面向资源编程呢?面向资源编程跟安全有什么关系呢?

先了解一下wikipedia关于资源的定义:

资源是指任何一种有形或者无形、可利用性有限的物体,或者是任何有助于维持生计的事物。

在资源的定义中,有“可利用性”和“有限”这两个词。说到底,就是数量有限,并且能产生价值。既然资源具备这两个特点,那意味着对资源进行编程的时候应该遵循下面的约束:

  • 不能凭空消失(“有价值”的物体丢掉了多可惜);
  • 禁止复制(不管在哪,在什么情况下,都不能复制。即便只是内存中的一段二进制,也要禁止复制,否则就违反了“数量有限”的定义)

Move引入了一种资源类型,并且从虚拟机的层面保证资源类型遵循上面的约束,既不能凭空消失,也不能复制。开发者只需要简单的把结构体声明为资源类型,结构体就会受到虚拟机的保护,从而避免很多常见的安全隐患,例如通过内存拷贝而产生的无限增发漏洞。

Move的面向资源编程是一种全新的编程模式,能够轻松地避免很多常见的安全问题,降低开发门槛。

starcoin_move_resource

Ability

Ability是Move针对面向资源编程的落地,让面向资源编程非常的简单易懂。

starcoin_move_ability

Move有4种Ability,分别是:Copy、Drop、Key、Store,可以任意排列组合使用。对于资源类型的结构体,不加Copy和Drop的Ability就可以了,开箱即用,使用简单,安全可靠,能够避免资产丢失和无限增发,很好的为链上资产保驾护航。

starcoin_move_struct_ability

明确数据的所有权和操作权归用户个人所有

在Solidity的项目中,所有人通过合约产生的数据被集中存储在产生数据的那个合约账户下,这是一个非常不安全的做法,存在重大的安全隐患。一方面,某个用户的个人数据被集中存储在另一账户下,不合理;另一方面,一旦合约出现安全问题,所有人的数据都会遭受损失。

在Move的项目中,数据被分散地保存在所属用户个人的账户下,明确了数据的所有权属于所属用户,同时也只有他能主动操作属于自己的数据。这样分散存储数据,即便合约存在漏洞,黑客也没有权利去修改所有人的数据,大大缩小漏洞的影响范围,起到保护数据的作用,同时也避免了大数组带来的安全问题。

starcoin_account_example

纯静态调用

DeFi时代,很多著名的安全漏洞都跟Solidity的动态调用有关,比如TheDAO漏洞。

动态调用虽然很方便,但是有很多的不确定性:

  • 被调用的合约实现是不确定的,只要函数签名一样,具体实现可以自行定义

  • 动态调用过程中,上下文切换,尤其是sender用户的变更,很容易导致权限放大

  • 可以构造循环递归调用,TheDAO漏洞就构造了一个递归调用

在区块链的特殊领域,动态调用导致了非常多的安全漏洞,Move吸取了经验教训,采用纯静态调用的方式,能够极大程度的避免安全隐患。

thedao

更合理的容错机制

在Solidity合约的真实漏洞中,有的漏洞是因为溢出产生的,溢出导致判断条件被绕过,进而导致链上资产被盗,还有的漏洞是由于函数定义的时候使用了默认的函数可见性,导致黑客获取到了不该获取的权限,例如Parity钱包漏洞。

针对溢出的情况,Move会直接抛出异常,回滚交易。

针对函数可见性,Move除了有private和public的可见性,还增加了script和friend两种可见性,同时,默认是private的可见性,避免因为疏忽导致函数泄露出去。

Move在很多细节方面,有更合理的机制,能很好的避免由于疏忽导致的一些低级漏洞。

完善的测试体系,为安全护航

为了更好地保障安全,Move设计了完善的测试体系,包括Unit Test和Functional Test两种。UT通常用于对单个函数的单元测试,FT用于功能性的测试。善用UT和FT,在上线前发现可能存在的安全隐患,更好的保障链上的资产安全可靠。

形式化验证

形式化验证是通过数学的方式来证明代码的安全性,这是一个非常前沿的领域。

很多行业从业人员希望在Solidity的体系内,增加形式化验证的特性,一直没有成熟的落地。而Move从推出开始,一直拥有一套成熟落地的形式化验证工具,包括move-prover的验证工具和SPEC语言。开发人员能够使用Move的形式化验证工具,检查出Move合约代码可能存在的一些安全隐患,修复并证明Move合约代码的安全性。

starcoin_move_prover

Starcoin & Move,让你的数据更放心

区块链的大航海时代,一切都在探索升级、快速迭代。Move是智能合约语言的一次革命,针对金融场景做了语言层的安全加固,在不增加开发人员负担的同时,让资产更加地安全。Starcoin高度重视安全的问题,在保障一层安全的情况下,使用Move作为智能合约语言,让DeFi更加安全,让数据更加放心。