Bài viết
Chia sẻ kiến thức của bạn.
Trả lại danh sách người dùng từ mô-đun di chuyển và làm rõ về phí gas
Tôi có mô-đun Move nơi tôi muốn trả về danh sách người dùng từ một hàm thay vì sử dụng debug: :print. Đây là đoạn mã cập nhật:
public fun get_users(acc: &signer): SimpleMap<address,User> acquires Users{
address = signer::address_of(acc);
assert_is_owner(signer_address);
let users = borrow_global<Users>(signer_address);
return users.list_of_users;
}
Trong chức năng này, tôi trả list_of_users
về thay vì in nó. Cách tiếp cận này có hoạt động chính xác để trả về dữ liệu từ hàm Move không?
Ngoài ra, khi tôi gọi một hàm bằng người ký, nó có phải chịu phí giao dịch không? Tôi muốn xác nhận xem có bất kỳ khoản phí gas nào liên quan đến các chức năng gọi bằng người ký hay không.
Mã đầy đủ:
module my_addrx::TRADE{
use std::simple_map;
use std::simple_map::SimpleMap;
use std::string::{String,utf8};
use std::signer;
use std::account;
use std::debug;
struct Users has key, drop{
list_of_users: SimpleMap<address,User>
}
struct User has copy, drop, store{
name: String
}
public fun assert_is_owner(addr: address){
assert!(addr==@my_addrx, 0);
}
public fun assert_is_initialized(addr: address){
assert!(exists<Users>(addr), 1);
}
public fun assert_uninititalized(addr: address){
assert!(!exists<Users>(addr), 2);
}
public fun initialize(acc: &signer, newUser: User) acquires Users{
let signer_address = signer::address_of(acc);
assert_is_owner(signer_address);
assert_uninititalized(signer_address);
let new_users = Users{
list_of_users: simple_map::create()
};
move_to(acc, new_users);
let users = borrow_global_mut<Users>(signer_address);
simple_map::add(&mut users.list_of_users, signer_address, newUser);
}
public fun get_users(acc: &signer) acquires Users{
let signer_address = signer::address_of(acc);
assert_is_owner(signer_address);
let users = borrow_global<Users>(signer_address);
debug::print(&users.list_of_users);
}
#[test(admin = @my_addrx)]
public fun testing(admin: signer) acquires Users{
let acc = account::create_account_for_test(signer::address_of(&admin));
let user = User{
name: utf8(b"strong")
};
initialize(&acc, user);
get_users(&acc);
// debug::print(&check_users);
}
}
- Move Module
- Move Script
Câu trả lời
2Có, cách tiếp cận của bạn để trả về list_of_users từ hàm Move là chính xác. Chức get_users
năng cập nhật mà bạn cung cấp sẽ trả về SimpleMap chứa danh sách người dùng.
Về phí giao dịch, khi bạn gọi một hàm bằng người ký, nó thực sự liên quan đến phí giao dịch. Trong bối cảnh ngôn ngữ hợp đồng thông minh Move, phí giao dịch, còn được gọi là phí gas, được phát sinh để thực hiện các giao dịch trên blockchain. Các chức năng sửa đổi trạng thái blockchain, chẳng hạn như khởi tạo và get_users
trong trường hợp của bạn, thường yêu cầu phí giao dịch để trang trải các tài nguyên tính toán được sử dụng.
Do đó, bất cứ khi nào bạn gọi một hàm liên quan đến thay đổi trạng thái hoặc các hoạt động đọc từ blockchain, bạn có thể mong đợi phí giao dịch sẽ phát sinh. Điều quan trọng là phải xem xét các khoản phí này trong khi thiết kế và tương tác với các hợp đồng thông minh của bạn trên blockchain.
module my_addrx::TRADE{
use std::simple_map;
use std::simple_map::SimpleMap;
use std::string::{String,utf8};
use std::signer;
use std::account;
use std::debug;
struct Users has key, drop {
list_of_users: SimpleMap<address,User>
}
struct User has copy, drop, store{
name: String
}
public fun assert_is_owner(addr: address){
assert!(addr==@my_addrx, 0);
}
public fun assert_is_initialized(addr: address){
assert!(exists<Users>(addr), 1);
}
public fun assert_uninititalized(addr: address){
assert!(!exists<Users>(addr), 2);
}
public fun initialize(acc: &signer, newUser: User) acquires Users{
let signer_address = signer::address_of(acc);
assert_is_owner(signer_address);
assert_uninititalized(signer_address);
let new_users = Users{
list_of_users: simple_map::create()
};
move_to(acc, new_users);
let users = borrow_global_mut<Users>(signer_address);
simple_map::add(&mut users.list_of_users, signer_address, newUser);
}
public fun get_users(acc: &signer): SimpleMap<address,User> acquires Users{
let signer_address = signer::address_of(acc);
assert_is_owner(signer_address);
let users = borrow_global<Users>(signer_address);
// debug::print(&users.list_of_users);
return users.list_of_users
}
#[test(admin = @my_addrx)]
public fun testing(admin: signer) acquires Users{
let acc = account::create_account_for_test(signer::address_of(&admin));
let user = User{
name: utf8(b"strong")
};
initialize(&acc, user);
let user = get_users(&acc);
debug::print(&user);
}
}
Chỉ cần thực hiện một thay đổi nhỏ, thêm một câu lệnh return và cũng thay đổi định nghĩa của hàm
Tôi nghĩ khi bạn gọi một hàm bằng signer thì nó sẽ mất một số phí txn. Nếu bạn có thêm câu hỏi hoặc cần hỗ trợ với một cách tiếp cận khác, vui lòng hỏi họ tại đây;
get_users
Chức năng <address, User>
trong mã của bạn được thiết kế để trả về danh sách người dùng, đó là SimpleMap. Cách tiếp cận này sẽ hoạt động chính xác để trả về dữ liệu từ hàm Move. Trong Move, các hàm có thể trả về các giá trị thuộc bất kỳ loại nào, bao gồm các kiểu phức tạp như SimpleMap. Khi bạn trả về một giá trị từ một hàm, nó sẽ được chuyển ra khỏi phạm vi cục bộ của hàm và vào phạm vi của hàm gọi. Điều này tương tự như cách Rust xử lý các giá trị trả về hàm. Đây là một ví dụ đơn giản:
public fun return_a_value(): u64 {
let x = 10;
return x;
}
Trong ví dụ này, u64 value 10
được trả về từ hàmreturn_a_value
. Giá trị 10 được chuyển ra khỏi phạm vi của hàm và vào phạm vi của hàm gọi [move-language.github.io](%5B https://move-language.github.io/move/modules-and-scripts.html). Đối với câu hỏi thứ hai của bạn, trong Move, thực sự có phí giao dịch liên quan đến việc thực hiện giao dịch, bao gồm các chức năng gọi. Những khoản phí này được tính bằng khí đốt, một thước đo của công việc tính toán. Chi phí của một giao dịch phụ thuộc vào độ phức tạp của tính toán, lượng dữ liệu được xử lý và giá gas hiện tại do mạng thiết lập. Do đó, việc gọi một hàm bằng cách sử dụng người ký sẽ phát sinh phí giao dịch.
Bạn có biết câu trả lời không?
Hãy đăng nhập và chia sẻ nó.