Bài viết
Chia sẻ kiến thức của bạn.
Làm thế nào để chuyển một đối tượng thuộc sở hữu của một đối tượng khác?
Tôi đang phải đối mặt với một vấn đề với việc chuyển một đối tượng A, thuộc sở hữu của đối tượng B và đối tượng B thuộc sở hữu của tôi. Tôi gặp lỗi cho biết giao dịch không được ký bởi người gửi chính xác. Có ai biết cách giải quyết vấn đề này và nhận đúng đối tượng A không?
- Move CLI
- Move
Câu trả lời
2Có vẻ như bạn cần sử dụng quy trình 'Transfer To Object' (TTO). Hãy chắc chắn rằng bạn kiểm tra khả năng của các đối tượng liên quan. Kiểu đối tượng cha (obj_b) phải cho phép nhận đối tượng vì nó yêu cầu quyền truy cập có thể thay đổi vào UID của nó. Ngoài ra, hãy đảm bảo rằng nếu đối tượng con (obj_a) không có store
khả năng, nó phải được thiết lập để có thể nhận được. Thông tin chi tiết có thể được tìm thấy trong bảng này: https://docs.sui.io/concepts/transfers/transfer-to-object#custom-receiving-rules
Nếu bạn gặp lỗi cho biết giao dịch không được ký bởi người gửi chính xác khi cố gắng chuyển đối tượng A - thuộc sở hữu của đối tượng B và đối tượng B thuộc sở hữu của tài khoản của bạn - đó là vì cách quyền sở hữu hoạt động trong Sui. Khi một đối tượng thuộc sở hữu của một đối tượng khác, như trong trường hợp của bạn, bạn không thể chuyển trực tiếp nó từ tài khoản của mình. Thay vào đó, bạn cần bao gồm đối tượng B (đối tượng mẹ của nó) trong giao dịch và sử dụng nó để ủy quyền hành động trên đối tượng A. Chỉ cần ký giao dịch với tài khoản của bạn là không đủ, vì đối tượng A không thuộc sở hữu trực tiếp bởi địa chỉ của bạn. Để khắc phục điều này, hãy đảm bảo bạn bao gồm đối tượng B làm đầu vào có thể thay đổi trong lệnh gọi Move hoặc khối giao dịch của bạn, để thời gian chạy Sui biết hành động được ủy quyền.
Dưới đây là một ví dụ cơ bản về cách nó có thể trông như thế nào trong một khối giao dịch sử dụng Sui SDK:
const tx = new TransactionBlock();
const parentObject = tx.object('0xB'); // object B
const childObject = tx.object('0xA'); // object A
// use parentObject to perform operations involving childObject
// for example, calling a Move function to transfer object A
tx.moveCall({
target: '0xYourPackage::your_module::transfer_child',
arguments: [parentObject, childObject, tx.pure(recipientAddress)]
});
await wallet.signAndExecuteTransactionBlock({ transactionBlock: tx });
Chỉ cần đảm bảo chức năng Move của bạn xác định đúng cả đối tượng B và đối tượng A là đầu vào, và đối tượng B đó có quyền hoạt động trên A. Bạn có thể đọc thêm về quyền sở hữu và quyền sở hữu đối tượng Sui trong tài liệu chính thức tại đây: [https://docs.sui.io/understand/ownership](https://docs.sui.io/understand/ownership]
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.
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.