帖子
分享您的知识。
从移动模块返回用户列表和汽油费说明
我有一个Move模块,我想从函数中返回用户列表,而不是使用debug:: print. 以下是更新的代码片段:
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;
}
在这个函数中,我返回list_of_users
而不是打印它. 这种方法可以正确地从Move函数返回数据吗?
此外,当我使用签名者调用函数时,它会产生交易费用吗?我想确认使用签名者调用函数是否有任何汽油费.
完整代码:
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
答案
2是的,你从 Move 函数返回 list_of_users 的方法是正确的. get_users
您提供的更新函数将返回包含用户列表的 SimpleMap.
关于交易费用,当你使用签名者调用函数时,确实涉及交易费用. 在Move智能合约语言的背景下,在区块链上执行交易会产生交易费用,也称为汽油费. 修改区块链状态的函数,例如初始化get_users
,通常需要交易费用来支付所使用的计算资源.
因此,每当您调用涉及状态更改或从区块链读取操作的函数时,都可能产生交易费用. 在区块链上设计智能合约并与之交互时,请务必考虑这些费用.
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);
}
}
刚刚做了一个小改动,添加了一个返回语句并更改了函数的定义
我认为,当你使用签名者调用一个函数时,会花一些 txn 费用. 如果您还有其他问题或需要其他方法的帮助,请随时向他们提问 此处;
get_users``<address, User>
代码中的函数旨在返回用户列表,即一个 SimpleMap. 这种方法应该可以正确地从 Move 函数返回数据. 在 Move 中,函数可以返回任何类型的值,包括像 SimpleMap 这样的复杂类型. 当你从一个函数返回一个值时,它会移出函数的局部作用域,进入调用函数的作用域. 这类似于 Rust 处理函数返回值的方式. 这是一个简化的例子:
public fun return_a_value(): u64 {
let x = 10;
return x;
}
在此示例中u64 value 10
,从函数返回return_a_value
. 值 10 移出函数作用域,进入调用函数的作用域 [move-language.github.io](%5B https://move-language.github.io/move/modules-and-scripts.html). 至于你的第二个问题,在Move中,确实有与执行交易相关的交易费用,包括调用函数. 这些费用以汽油收取,汽油是计算工作的一种衡量标准. 交易的成本取决于计算的复杂性、正在处理的数据量以及网络设定的当前汽油价格. 因此,使用签名者调用函数会产生交易费用.
你知道答案吗?
请登录并分享。
Move is an executable bytecode language used to implement custom transactions and smart contracts.