Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/anbang/sui-move-123
sui move
https://github.com/anbang/sui-move-123
Last synced: about 8 hours ago
JSON representation
sui move
- Host: GitHub
- URL: https://github.com/anbang/sui-move-123
- Owner: anbang
- Created: 2023-06-29T11:52:24.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2023-06-29T11:53:26.000Z (over 1 year ago)
- Last Synced: 2024-05-28T16:22:57.506Z (6 months ago)
- Language: Move
- Size: 7.81 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## Hello
- 官方说明: https://docs.sui.io/build/sui-local-network#install-sui-locally
- 中文文档: https://move-book.com/cn/index.html
- 英文文档:
- packages: https://move-language.github.io/move/packages.html
- sui farmework:
- docs: https://github.com/MystenLabs/sui/tree/main/crates/sui-framework/docs
- 教程: https://github.com/sui-foundation/sui-move-intro-course/blob/main/unit-four/lessons/2_dynamic_fields.md
- https://github.com/randypen/sui-move-intro-course-zh/blob/main/unit-four/lessons/2_dynamic_fields.md## 创建 SUI 项目
创建命令: `sui move new hello_world`
项目结构
```
├── Move.toml
├── README.md
├── doc_templates
│ └── XXXX
├── examples
│ └── XXXX
├── sources
│ └── hello_world.move
└── tests
└── XXXX
```## Move.toml 3 个部分
- package
- dependencies
- addresses## 常见命令
```
sui client addresses
sui client active-addresssui client active-env
sui client envssui move build
sui client publish --gas-budget 3000 --skip-fetch-latest-git-deps
# 调用方法
sui client call --function mint2 --module hello_world --package 0x666 --args "你好,世界!" --gas-budget 3000
```## sui move 语法
```
module package_name::module_name {// imports
::;
// use
use std::string;
use sui::object::{Self,UID};
use sui::transfer;
use sui::tx_context::{Self,TxContext};// types
// 拥有四种能力 copy,drop,key,store,
struct HelloWorldObjects has key,store{
id:UID,
text: string::String
}// functions
// 拥有三种可见性: private/public/public(friend)// entry 函数
public entry fun mint(ctx: &mut TxContext){
let object = HelloWorldObjects{
id : object::new(ctx),
text : string::utf8(b"Hello World!")
};
transfer::transfer(object,tx_context::sender(ctx));
}
}
```**所有权类型**
- 被拥有
- 被一个地址拥有
- 被另一个 object 拥有
- 共享
- 不可变的共享
- `transfer`
- 可变的共享**不可变的对象**: `transfer::freeze_object(obj)`
**共享对象**: `transder::share_object(obj)`
参数传递与删除 Object
- view: `(transcriptObject : &TranscriptObject)`
- update: `(transcriptObject : &mut TranscriptObject,score :u8)`
- delete: `(transcriptObject : TranscriptObject)`**范型**
```
module Storage{
struct Box has key, store{
value: T
}
}
```phantom 关键字
```
struct Box has key, store{
id: UID
value: T
}
struct BoomBox has key{
id:UID
}
``````
public entry fun create_box(value: T, ctx: &mut TxContent){}
```**witness**: 只能被启动一次,必须具有 drop 能力,使用后必须立即被销毁或丢弃,确保不能重复使用。
**One Time Witness**: (OTW),一个 move 包整个生命周期只能创建这一个 witness。(普通的 witness 无此限制)。OTW 创建的资源可以保证是整个区块链上都是唯一的。
- 名字使用"大写的模块名"
- 该类型只具有 drop 能力```
module fungible_tokens::move{
struct MOVE has drop{}; // OTW
fun init(witness:MOVE, ctx: &mut TxContext){}
}
```**数组**: vectors
- `vector::empty()`
- `vector::push_back()` 创建
- `vector::pop_back(,value)` put
- `vector::pop_back()` remove
- `vector::length()` size**动态字段**
```
struct Parent has key{
id: UID
}// dynamic field
struct DFChild has store{
count:u64
}// dynamic object field
struct DOFChild has key,store{
id:UID,
count:u64
}
```- 动态字段:可以存储任何具有 store 能力的值,但是储存在这种字段种的对象被视为被包装过。无法直接访问,可以通过浏览器查看存储 ID
- 动态对象字段:值必须是 Sui 对象(具有 key store,以及 `id: UID` 作为第一个字段)。仍然可以通过对象 id 直接访问被附上。方法
- 添加都是 `xxx::add()`,但是使用不同的包 `ofield / field`
- 修改: `xxx::borrow`
- 删除: `xxx::remove`
- 动态: `object::delete(id);`
- 动态对象: `transfer::transfer(child, tx_context::sender(ctx));````
module collection::dynamic_fields {use sui::dynamic_object_field as ofield;
use sui::dynamic_field as field;// Adds a DFChild to the parent object under the provided name
public fun add_dfchild(parent: &mut Parent, child: DFChild, name: vector) {
field::add(&mut parent.id, name, child);
}// Adds a DOFChild to the parent object under the provided name
public entry fun add_dofchild(parent: &mut Parent, child: DOFChild, name: vector) {
ofield::add(&mut parent.id, name, child);
}
}
```**映射**: table, table 是对动态字段的封装.
- `table::add`
- `table::remove`
- `table::borrow`
- `table::borrow_mut`
- `table::coitains`
- `table::length`**异构集合 Bag 类型**
vector 和 table 可以保存相同类型的元素,如果对于不同类型的对象,或者在变异时不知道要保存什么类型的对象。则需要异构集合的概念。
- `bag::new(ctx)`
- `bag::add(&mut bag.items, k, v);`
- `bag::remove(&mut bag.items, k)`
- `bag::borrow(&bag.items, k)`
- `bag::borrow_mut(&mut bag.items, k)`
- `bag::contains(&bag.items, k)`
- `bag::length(&bag.items)`Bag 集合交互的函数签名与与 Table 集合交互的函数签名非常相似,都是对对动态字段的封装. 底层一样的。
主要区别在于在创建新的 Bag 时不需要声明任何类型,并 添加到其中的键值对类型不需要是相同的类型。