复制成功

分享至

主页 > 比特币 >

从安全角度看 Move 语言特性与可能存在的漏洞

2022.11.25

原文标题:《Beosin | 正式推出针对 Move 智能合约的安全审计服务,从安全角度看 Move 语言(上、下)》

撰文:Beosin

从安全角度看 Move 语言特性与可能存在的漏洞

图片来源:由无界版图AI工具生成

此前,Beosin 宣布了全新升级的安全审计服务,而现在,Beosin 安全团队正式宣布推出针对 Move 智能合约的安全审计服务,旨在提前发现并协助项目方修复项目中的安全风险,保障用户与项目方的资产安全。


1、基础概念


Move 语言最初是由 Facebook 团队为 Diem(原名 Libra)区块链而设计开发的一门新语言。而 Libra 的使命是打造一个简单的全球货币和金融基础设施,为数十亿人提供支持。Move 语言旨在提供一个安全、可编程的基础,可以在此基础上构建这一愿景。Move 必须能够以精确、可理解和可验证的方式表达 Diem 货币和治理规则。从长远来看,Move 必须能够对构成金融基础设施的各种资产和相应的业务逻辑进行编码。

那么,如何实现这一愿景呢?在 Move 的白皮书中提出了设计时考虑的四个关键目标:first-class 资产、灵活性、安全性和可验证性。其中 first-class 资产是实现这一愿景的基础。要理解 first-class 资产,我们先来介绍 Move 语言中的几个比较重要的基础概念。

1.1 结构体

和其他很多语言一样,Move 语言中的结构体也是使用 struct 定义。它是自定义类型,也是 Move 中创建自定义类型的唯一方法。结构体可以包含复杂数据,也可以不包含任何数据,但不允许定义递归结构体。结构体由字段组成,可以简单地理解成「key-value」存储,其中 key 是字段的名称,而 value 是存储的内容。

1.2 能力

Move 的类型系统非常灵活,每种类型都可以被四种限制符所修饰。这四种限制符我们称之为 abilities,它们的功能分别是:

  • Copy - 被修饰的值可以被复制。
  • Drop - 被修饰的值在作用域结束时可以被丢弃。
  • Key - 被修饰的值可以作为键值对全局状态进行访问。
  • Store - 被修饰的值可以被存储到全局状态。
  • 而 Move 的基本类型缺省具有 store, copy 和 drop 限制,自定义类型缺省情况下结构体不带任何限制符。

    1.3 资源

    介绍完了结构体和能力,接下来就是 Move 语言中的核心概念:资源(resource)。

    如果定义的结构体(struct)不能复制(copy)也不能丢弃(drop),我们就将它们称为资源。默认情况下,结构体是线性和短暂的。它们不能复制,不能丢弃,不能存储在全局存储中。这意味着所有值都必须拥有被转移的所有权,并且值必须在程序执行结束时处理。我们可以通过赋予结构体能力(abilities)来简化这种行为,允许值被复制或删除,以及存储在全局存储中或定义全局存储的模式。

    Move 语言中的这个属性对于现实世界中资源(例如货币)的建模非常有用,因为货币在理论上是不希望在流通过程中被复制或丢失的。

    1.4 模块

    Move 语言中,代码都是以模块(module)的形式进行组织的。如何理解模块呢?抽象的理解,Move 语言中的模块(module)/ 资源(resource)/ 方法(function)之间的交互与传统的面向对象语言中的类(class)/ 对象(object)/ 方法(function)之间的关系非常相似。

    而与其他区块链语言相比,Move 中的模块类似于其他区块链中的智能合约。开发者在模块中声明资源类型和方法,这些类型和方法定义了创建、销毁和更新已声明资源的规则。

    1.5 泛型

    Move 因为是静态语言,所以为了保证扩展性,Move 选择了泛型编程的范式。

    以 Aptos 为例,只要查看你持有的资产是 0x1::coin::CoinStore 这样的类型,就可以知道该资产是由标准模组 0x1::coin 所定义。比如说 Aptos 的原生币 AptosCoin 的类型是 0x1::aptos_coin::AptosCoin ,意思是 0x1 帐号之下的 aptos_coin 模块所定义的 AptosCoin 类型,不过这个类型并没有赋予 key 能力,所以不能成为资源,他只提供一个种类,而这个类型可以作为泛型来使用,像是被 0x1::coin::CoinStore 使用。

    那么,0x1::coin::CoinStore<0x1::aptos_coin::AptosCoin> 就是 0x1 帐号下 coin 模块所定义的 CoinStore 类型,记录地址下某种 coin 的资产状态。所以你的地址下任何 0x1::coin::CoinStore 的资产都通用相同逻辑、有一样的行为,都是定义在 0x1::coin 这个模块里。


    2. 安全性


    2.1 设计安全

    Move 在白皮书中明确表示,Move 必须拒绝不满足关键属性的程序,例如 Resource 安全、类型安全和内存安全。我们如何选择一个可执行的表示,以确保在区块链上执行的每个程序都满足这些属性?两种可能的方法是:

    (a) 使用带有检查这些属性的编译器的高级编程语言

    (b) 使用低级无类型汇编并在运行时执行这些安全检查。

    免责声明:数字资产交易涉及重大风险,本资料不应作为投资决策依据,亦不应被解释为从事投资交易的建议。请确保充分了解所涉及的风险并谨慎投资。OKEx学院仅提供信息参考,不构成任何投资建议,用户一切投资行为与本站无关。

    加⼊OKEx全球社群

    和全球数字资产投资者交流讨论

    扫码加入OKEx社群

    相关推荐

    industry-frontier