Допис
Діліться своїми знаннями.
Як передати об'єкт, що належить іншому об'єкту?
Я стикаюся з проблемою з передачею об'єкта А, який належить об'єкту B, а об'єкт B належить мені. Я отримую помилку, що повідомляє, що транзакція не була підписана правильним відправником. Хтось знає, як це вирішити і правильно отримати об'єкт А?
- Move CLI
- Move
Відповіді
2Схоже, вам потрібно використовувати процес «Передати об'єкту» (TTO). Переконайтеся, що ви перевіряєте здібності залучених об'єктів. Батьківський тип об'єкта (obj_b) повинен дозволяти отримувати об'єкти, оскільки він вимагає змінного доступу до свого UID. Також переконайтеся, що якщо дочірній об'єкт (obj_a) не має store
можливості, він повинен бути налаштований як дебіторський. Більш детальну інформацію можна знайти в цій таблиці: https://docs.sui.io/concepts/transfers/transfer-to-object#custom-receiving-rules
Якщо ви отримуєте помилку, яка говорить про те, що транзакція не була підписана правильним відправником під час спроби передати об'єкт A, який належить об'єкту B, а об'єкт B належить вашому обліковому запису, це пов'язано з тим, як працює право власності в Sui. Коли об'єкт належить іншому об'єкту, як у вашому випадку, ви не можете безпосередньо передати його зі свого облікового запису. Замість цього вам потрібно включити об'єкт B (його батьківський об'єкт) в транзакцію та використовувати його для авторизації дій щодо об'єкта А. Простого підписання транзакції з вашим обліковим записом недостатньо, оскільки об'єкт A безпосередньо не належить вашій адресі. Щоб виправити це, переконайтеся, що ви включили об'єкт B як змінний вхід у ваш виклик Move або блок транзакції, щоб запуск Sui знав, що дія дозволена.
Ось базовий приклад того, як це може виглядати в блоці транзакцій за допомогою SDK Sui:
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 });
Просто переконайтеся, що функція Move належним чином визначає як об'єкт B, так і об'єкт A як вхідні дані, і що об'єкт B має дозвіл працювати з A. Ви можете прочитати більше про право власності та дозволи на об'єкт Sui в офіційних документах тут: https://docs.sui.io/understand/ownership
Ви знаєте відповідь?
Будь ласка, увійдіть та поділіться нею.
Move is an executable bytecode language used to implement custom transactions and smart contracts.
Зароби свою частку з 1000 Sui
Заробляй бали репутації та отримуй винагороди за допомогу в розвитку спільноти Sui.