Move的全局存储—Structure

Structure简介

Structure 部分可以理解为以树形结构的的形式持久化到全局存储中。此树之外的文件系统和网络不能访问此结构体的数据。
Structure 是基于 address (账户地址)构成的自定义存储集合。每个 address 都可以存储自己的 resource (自定义的结构资源)和 module (自定义的代码块);每个 address 最多可以存储一个 resource 和一个 module。

Struct语法

  1. struct GlobalStorage {
  2. resources: Map<(address, ResourceType), ResourceValue>
  3. modules: Map<(address, ModuleName), ModuleBytecode>
  4. }

Move的结构体类型—Module

Module简介

Module 部分是定义一个结构体以及这个结构体中有哪些操作的函数库,定义了更新存储数据的规则。

Module语法

  1. module <address>::<module_name> {
  2. (<use> | <friend> | <type> | <function> | <constant>)*
  3. }

例如:

  1. module 0x01::Test {
  2. struct Example has copy, drop { i: u64 }
  3. // 导入 Std address下定义的 Debug module
  4. use Std::Debug;
  5. // friend 关键字表示信任此 module
  6. friend TestAddr::AnotherTest;
  7. // 定义常量
  8. const ONE: u64 = 1;
  9. // 定义公有方法 print
  10. public fun print(x: u64) {
  11. let sum = x + ONE;
  12. let example = Example { i: sum };
  13. Debug::print(&sum)
  14. }
  15. }

总的来说,module 是一个定义 struct 结构体和 fun 函数的模块。也可以使用 use 关键字导入其他模块定义内容;friend 关键字表示此 module 是受到信任的;const 关键字表示定义一个私有常量,在此 module 的函数中使用。

Move的结构体类型—Scripts

Scripts简介

Scripts 部分是程序可执行的入口,类似于传统编程语言的 main 方法。Scripts 通常是调用 Module 里已定义并且已发布的函数方法。

scripts语法

  1. script {
  2. <use>*
  3. <constants>*
  4. fun <identifier><[type parameters: constraint]*>([identifier: type]*) <function_body>
  5. }

script 代码块必须以 use 关键字声明开始,然后是常量和唯一的函数体。函数体可以是任意名称(不是必须定义为main),可以有任意个参数。例如:

  1. script {
  2. // 导入 Std address下定义的 Debug module
  3. use Std::Debug;
  4. // 定义常量
  5. const ONE: u64 = 1;
  6. // 定义主函数即程序执行入口
  7. fun main(x: u64) {
  8. let sum = x + ONE;
  9. Debug::print(&sum)
  10. }
  11. }

scripts 的能力是有限的,她不能声明 friend、struct 类型、也不能访问全局存储的数据。主要目的就是单纯的程序执行入口,无返回值,可以调用 module 中声明的 public 函数。

总结

Move 是关于 resource 的语言,resource 可以定义部分类型的值不能被复制或丢弃,必须被 move 到其他函数。resource 对于账户私有的资源是非常适用。例如区块链中的账户资产,不能被复制或丢弃。