Move的全局存储—Structure
Structure简介
Structure 部分可以理解为以树形结构的的形式持久化到全局存储中。此树之外的文件系统和网络不能访问此结构体的数据。
Structure 是基于 address (账户地址)构成的自定义存储集合。每个 address 都可以存储自己的 resource (自定义的结构资源)和 module (自定义的代码块);每个 address 最多可以存储一个 resource 和一个 module。
Struct语法
struct GlobalStorage {resources: Map<(address, ResourceType), ResourceValue>modules: Map<(address, ModuleName), ModuleBytecode>}
Move的结构体类型—Module
Module简介
Module 部分是定义一个结构体以及这个结构体中有哪些操作的函数库,定义了更新存储数据的规则。
Module语法
module <address>::<module_name> {(<use> | <friend> | <type> | <function> | <constant>)*}
例如:
module 0x01::Test {struct Example has copy, drop { i: u64 }// 导入 Std address下定义的 Debug moduleuse Std::Debug;// friend 关键字表示信任此 modulefriend TestAddr::AnotherTest;// 定义常量const ONE: u64 = 1;// 定义公有方法 printpublic fun print(x: u64) {let sum = x + ONE;let example = Example { i: sum };Debug::print(&sum)}}
总的来说,module 是一个定义 struct 结构体和 fun 函数的模块。也可以使用 use 关键字导入其他模块定义内容;friend 关键字表示此 module 是受到信任的;const 关键字表示定义一个私有常量,在此 module 的函数中使用。
Move的结构体类型—Scripts
Scripts简介
Scripts 部分是程序可执行的入口,类似于传统编程语言的 main 方法。Scripts 通常是调用 Module 里已定义并且已发布的函数方法。
scripts语法
script {<use>*<constants>*fun <identifier><[type parameters: constraint]*>([identifier: type]*) <function_body>}
script 代码块必须以 use 关键字声明开始,然后是常量和唯一的函数体。函数体可以是任意名称(不是必须定义为main),可以有任意个参数。例如:
script {// 导入 Std address下定义的 Debug moduleuse Std::Debug;// 定义常量const ONE: u64 = 1;// 定义主函数即程序执行入口fun main(x: u64) {let sum = x + ONE;Debug::print(&sum)}}
scripts 的能力是有限的,她不能声明 friend、struct 类型、也不能访问全局存储的数据。主要目的就是单纯的程序执行入口,无返回值,可以调用 module 中声明的 public 函数。
总结
Move 是关于 resource 的语言,resource 可以定义部分类型的值不能被复制或丢弃,必须被 move 到其他函数。resource 对于账户私有的资源是非常适用。例如区块链中的账户资产,不能被复制或丢弃。
