Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

对引用类型数据Library资源的增删改查 #121

Merged
merged 1 commit into from
Aug 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions move-dapp/my-library/Move.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
[package]
name = "my_library"
version = "0.0.2"
version = "0.0.3"

[addresses]
StarcoinFramework = "0x1"
MyAddr = "0x1168e88ffc5cec53b398b42d61885bbb"
MyAddr = "0x07Ffe973C72356C25e623E2470172A69"

[dependencies]
StarcoinFramework = {git = "https://github.com/starcoinorg/starcoin-framework.git", rev="cf1deda180af40a8b3e26c0c7b548c4c290cd7e7"}
69 changes: 69 additions & 0 deletions move-dapp/my-library/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Resource 的限制
在代码中,Resource 类型有几个主要限制:
- Resource 存储在帐户下。因此,只有在分配帐户后才会存在,并且只能通过该帐户访问。
- 一个帐户同一时刻只能容纳一个某类型的 Resource。
- Resource 不能被复制;与它对应的是一种特殊的kind:resource,它与copyable不同,这一点在泛型章节中已经介绍。
- Resource 必需被使用,这意味着必须将新创建的 Resource move到某个帐户下,从帐户移出的Resource 必须被解构或存储在另一个帐户下。

> 下文所有的代码的console调用都参见[scripts.sh](../my-counter/sources/scripts.sh)

# 创建
Library资源创建后必须move到账户的存储下,否则后面无法访问。
```
public fun create_library(account: &signer){
move_to<Library>(account, Library{books: Vector::empty<Book>()});
}
```
后面所有的`script`代码均略去。

# 增加
```
public fun addBook(account: &signer,name:vector<u8>, link: vector<u8>) acquires Library {
let lib = borrow_global_mut<Library>(Signer::address_of(account));
let id = Vector::length(&lib.books);
Vector::push_back(&mut lib.books, Book{id:id,name:name,link:link});
}
```
对资源修改首先需要通过`borrow_global_mut<Library>`获取对资源的可变引用,然后通过内建库`Vector`操作可变的books:`&mut lib.books`将新创建的Struct添加进去。需要注意的是函数中操作的所有资源需要再函数签名最后用`acquires Library`表示。
相关知识点参见对资源的[读取和修改](https://move-book.com/cn/resources/resource-by-example/access-resource-with-borrow.html)和[Vector API](https://github.com/diem/diem/blob/latest/language/move-stdlib/docs/Vector.md):
- Function empty
- Function length
- Function borrow
- Function push_back
- Function borrow_mut
- Function pop_back
- Function destroy_empty
- Function swap
- Function singleton
- Function reverse
- Function append
- Function is_empty
- Function contains
- Function index_of
- Function remove
- Function swap_remove

# 删除
与增加类似
```
public fun deleteBookAtId(account: &signer,id:u64) acquires Library {
let lib = borrow_global_mut<Library>(Signer::address_of(account));
Vector::remove(&mut lib.books, id);
}
```

# 更新
这一步与增加的操作类似,只是需要通过`Vector::borrow_mut`获取到单个book的可变引用。
```
public fun updateBookAtId(account: &signer,id:u64,name:vector<u8>, link: vector<u8>) acquires Library {
let lib = borrow_global_mut<Library>(Signer::address_of(account));
let book = Vector::borrow_mut<Book>(&mut lib.books,id);
book.name = name;
book.link = link;
}
```

# 查询
由于Starcoin中script不能有返回值,因此只能通过getresource来读取。
参见[scripts.sh](../my-counter/sources/scripts.sh)

48 changes: 38 additions & 10 deletions move-dapp/my-library/sources/MyLibrary.move
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module MyAddr::MyLibraryV4 {
// use StarcoinFramework::Signer;

module MyAddr::MyLibrary {
use StarcoinFramework::Signer;
use StarcoinFramework::Vector;
// each ability has matching keyword
// multiple abilities are listed with comma
struct Book has store, copy, drop {
Expand All @@ -14,14 +14,42 @@ module MyAddr::MyLibraryV4 {
books: vector<Book>
}

// TODO: A Library can CRUD the Books.
public fun create_library(account: &signer){
move_to<Library>(account, Library{books: Vector::empty<Book>()});
}
//because the script function cannot have return value,
//query only can be done by: state get resource Addr Addr::MyLibraryV4::Library
public fun addBook(account: &signer,name:vector<u8>, link: vector<u8>) acquires Library {
let lib = borrow_global_mut<Library>(Signer::address_of(account));
let id = Vector::length(&lib.books);
Vector::push_back(&mut lib.books, Book{id:id,name:name,link:link});
}

public fun updateBookAtId(account: &signer,id:u64,name:vector<u8>, link: vector<u8>) acquires Library {
let lib = borrow_global_mut<Library>(Signer::address_of(account));
let book = Vector::borrow_mut<Book>(&mut lib.books,id);
book.name = name;
book.link = link;
}

public fun deleteBookAtId(account: &signer,id:u64) acquires Library {
let lib = borrow_global_mut<Library>(Signer::address_of(account));
Vector::remove(&mut lib.books, id);
}

public(script) fun init_library(account: signer){
Self::create_library(&account)
}

// public fun create(account: &signer, the_id: u64, the_name: vector<u8>){
// Book{id: the_id, name: the_name};
// }
public(script) fun s_add_book(account: signer, name:vector<u8>, link: vector<u8>) acquires Library {
Self::addBook(&account,name, link)
}

// public(script) fun create_book(account: signer, the_id: u64, the_name: vector<u8>){
// Self::create(&account, the_id, the_name)
// }
public(script) fun s_update_book_at_id(account: signer, id:u64,name:vector<u8>, link: vector<u8>) acquires Library {
Self::updateBookAtId(&account,id,name,link)
}

public(script) fun s_delete_book_at_id(account: signer, id:u64) acquires Library {
Self::deleteBookAtId(&account,id)
}
}
17 changes: 11 additions & 6 deletions move-dapp/my-library/sources/scripts.sh
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
# deploy
dev deploy [path to blob] -s [addr] -b
# call function incr
account execute-function --function 0x07Ffe973C72356C25e623E2470172A69::MyCounter::incr_counter -s 0x07Ffe973C72356C25e623E2470172A69 -b
# call function incr by
account execute-function --function 0x07Ffe973C72356C25e623E2470172A69::MyCounter::incr_counter_by --arg 3 -s 0x07Ffe973C72356C25e623E2470172A69 -b
# get resource
state get resource 0x07Ffe973C72356C25e623E2470172A69 0x07Ffe973C72356C25e623E2470172A69::MyCounter::Counter
dev deploy /Users/cjf/Documents/bc/Web3-dApp-Camp/move-dapp/my-library/release/my_library.v0.0.3.blob -s 0x07ffe973c72356c25e623e2470172a69 -b
# call function init library
account execute-function --function 0x07Ffe973C72356C25e623E2470172A69::MyLibrary::init_library -s 0x07Ffe973C72356C25e623E2470172A69 -b
# get library
state get resource 0x07Ffe973C72356C25e623E2470172A69 0x07Ffe973C72356C25e623E2470172A69::MyLibrary::Library
# add book
account execute-function --function 0x07Ffe973C72356C25e623E2470172A69::MyLibrary::s_add_book --arg b"web3" --arg b"github.com" -s 0x07Ffe973C72356C25e623E2470172A69 -b
# update book at index
account execute-function --function 0x07Ffe973C72356C25e623E2470172A69::MyLibrary::s_update_book_at_id --arg 0 --arg b"atest" --arg b"noncegeck.com" -s 0x07Ffe973C72356C25e623E2470172A69 -b
# delete book at index
account execute-function --function 0x07Ffe973C72356C25e623E2470172A69::MyLibrary::s_add_book --arg b"web3" --arg b"github.com" -s 0x07Ffe973C72356C25e623E2470172A69 -b