Move.

Bài viết

Chia sẻ kiến thức của bạn.

Jackson.
Nov 09, 2023
Hỏi đáp Chuyên Gia

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_usersvề 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
0
2
Chia sẻ
Bình luận
.

Câu trả lời

2
Steven.
Nov 9 2023, 12:30

Có, 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_usersnă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_userstrong 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;

0
Bình luận
.
Jeremy.
Nov 9 2023, 12:41

get_usersChứ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.

0
Bình luận
.

Bạn có biết câu trả lời không?

Hãy đăng nhập và chia sẻ nó.

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

148Bài viết231Câu trả lời
Sui.X.Peera.

Kiếm phần của bạn từ 1000 Sui

Tích lũy điểm danh tiếng và nhận phần thưởng khi giúp cộng đồng Sui phát triển.

Chiến dịch phần thưởngTháng Bảy