Move.

帖子

分享您的知识。

Jackson.
Nov 09, 2023
专家问答

从移动模块返回用户列表和汽油费说明

我有一个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
0
2
分享
评论
.

答案

2
Steven.
Nov 9 2023, 12:30

是的,你从 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 费用. 如果您还有其他问题或需要其他方法的帮助,请随时向他们提问 此处

0
评论
.
Jeremy.
Nov 9 2023, 12:41

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中,确实有与执行交易相关的交易费用,包括调用函数. 这些费用以汽油收取,汽油是计算工作的一种衡量标准. 交易的成本取决于计算的复杂性、正在处理的数据量以及网络设定的当前汽油价格. 因此,使用签名者调用函数会产生交易费用.

0
评论
.

你知道答案吗?

请登录并分享。

Move is an executable bytecode language used to implement custom transactions and smart contracts.

148帖子231答案
Sui.X.Peera.

赚取你的 1000 Sui 份额

获取声誉积分,并因帮助 Sui 社区成长而获得奖励。

奖励活动七月