Допис
Діліться своїми знаннями.
Як я можу зателефонувати з програми node js за допомогою SUI TS SDK?
Ось фрагмент кодової бази Sui move
public enum Category has copy, drop, store {
A,
B,
C
}
public entry fun process_categories(categories: vector<Category>, ctx: &mut TxContext)
Як я можу викликати з програми node js за допомогою SUI TS SDK, щоб викликати функцію process_category, зокрема надіслати категорії як аргумент?
- Sui
Відповіді
4process_categories``categories
Щоб викликати [0, 1]
функцію з програми Node.js за допомогою SDK Sui TypeScript, передайте A
аргумент у вигляді масиву чисел, що відповідають варіантам enum (наприклад, B
for,). Функція «vector<Category>
Переміщення» автоматично десеріалізує числові значення у правильні варіанти енуму. Використовуйте transaction
об'єкт у SDK для побудови виклику:
const tx = new Transaction();
tx.moveCall({
target: `${packageId}::module_name::process_categories`,
arguments: [tx.pure([0, 1])], // e.g., Category::A, Category::B
});
Переконайтеся, що у вашому модулі Move визначено enum, і що пакунок правильно посилається.
Щоб викликати process_categories
функцію з вашої програми Node.js за допомогою SDK Sui TypeScript, ось що вам потрібно зробити:
1.Встановіть SDK Sui
По-перше, переконайтеся, що у вашому проекті встановлено SDK Sui:
npm install @mysten/sui.js
2.Налаштування з'єднання
Далі вам потрібно буде підключитися до мережі Sui. Це робиться з метою JsonRpcProvider
отримання доступу до блокчейну.
import { JsonRpcProvider, RawSigner, Ed25519Keypair } from '@mysten/sui.js';
const provider = new JsonRpcProvider('https://fullnode.devnet.sui.io:5001'); // Change the URL if you're using Testnet/Mainnet
const keypair = Ed25519Keypair.fromFile('path/to/your/secret.key'); // Path to your private key
const signer = new RawSigner(keypair, provider);
3.Створіть вектор категорії
Функція, яку ви викликаєте, приймає вектор знач Category
ень, тому вам потрібно буде передати це як аргумент. Оскільки ви передаєте значення enum, як- A
о B
т, іC
, вам потрібно підготувати масив категорій.
const categories = ["A", "B", "C"]; // These are the categories you want to pass
4.Створіть та надішліть транзакцію
Тепер ви створите транзакцію, яка викликає вашу process_categories
функцію, передаючи категорії як аргумент. Ви будете використовувати, TransactionBlock
щоб налаштувати його.
import { TransactionBlock } from '@mysten/sui.js';
const tx = new TransactionBlock();
// Create the vector of categories as an argument
const categoriesArg = tx.makeMoveVec(categories.map(category => tx.pure(category)));
// Call the Move function, passing the categories
tx.moveCall({
target: '0xYourPackageAddress::YourModule::process_categories', // Replace with your actual package and module address
arguments: [categoriesArg],
});
// Sign and execute the transaction
const response = await signer.signAndExecuteTransactionBlock({ transactionBlock: tx });
console.log('Transaction response:', response);
Що відбувається:
*Створення категорій: Ви створюєте вектор категорійA
, B
і C
як простий масив і перетворюєте їх у формат, який Sui розуміє.
*Виклик функції переміщення: Ви кажете Sui телефонувати process_categories
з вектором категорій.
*Підписання транзакції: Підпи RawSigner
сує транзакцію, потім ви виконуєте її в мережі.
Ключові примітки:
*Адреса пакету: Замініть 0xYourPackageAddress::YourModule::process_categories
фактичною адресою вашого модуля Move.
*Підтвердження транзакції: Це має надіслати транзакцію, і ви отримаєте відповідь на свою консоль. Якщо є проблема, відповідь зазвичай повідомить вам, що пішло не так.
Щоб викликати process_categories
з Node.js за допомогою SDK Sui TS, потрібно:
1.Серіалізуйте вектор Category
енумза допомогою BCS.
2.Створіть та виконайте транзакцію.
####Приклад коду (Node.js) :
import { Transaction } from '@mysten/sui.js/transactions';
import { bcs } from '@mysten/sui.js/bcs';
// Define BCS type for the enum (must match Move definition)
bcs.registerEnumType('Category', {
A: null,
B: null,
C: null,
});
const tx = new Transaction();
tx.moveCall({
target: '0xPACKAGE_ID::module_name::process_categories',
arguments: [
tx.pure(bcs.vector(bcs.Category).serialize(['A', 'B', 'C']), // Categories vector
tx.pure.address('0xYourAddress'), // TxContext (if needed)
],
});
// Sign and execute
const signedTx = await wallet.signTransaction(tx);
const result = await client.executeTransaction(signedTx);
###Ключові кроки:
A``B``C
Реєстрація номера BCS: Узгоджуйте значення переміщення (,,).bcs.vector()
Серіалізуйте вектор: Використовуйте для аргументу. 3.Функція переміщення виклику: Вкажіть пакет, модуль та функцію.
###Примітки:
- Замініть
0xPACKAGE_ID
іmodule_name
з вашими фактичними значеннями. - Переконайтеся, що гаманець (
wallet
) та клієнт (client
) ініціалізовані.
Щоб викликати process_categories
функцію з програми Node.js за допомогою SDK Sui TypeScript і передати a vector<Category>
як аргумент, вам потрібно буде серіалізувати значення enum у форматі, який Sui Move очікує під час виконання транзакції. У вашому випадку Category
це переміщення enum
з варіантами, A``B
іC
, які представлені у вигляді числовихдискримінаційних(0, 1, 2) у кодуванні BCS. vector<Category>
Оскільки Move очікує avector<u8>
, вам потрібно буде серіалізувати значення enum як a TransactionBlock
і правильно передати їх у функцію за допомогою.
Ось як ви можете зробити це з Node.js за допомогою@mysten/sui.js
:
import { TransactionBlock, SuiClient, getFullnodeUrl } from '@mysten/sui.js';
import { bcs } from '@mysten/bcs';
// Enum mapping: A = 0, B = 1, C = 2
const CategoryEnum = {
A: 0,
B: 1,
C: 2,
};
// Example categories you want to send
const selectedCategories = [CategoryEnum.A, CategoryEnum.B];
// Serialize the enum values into a BCS vector<u8>
const serializedCategories = bcs.vector(bcs.u8()).serialize(selectedCategories).toBytes();
// Build the transaction
const tx = new TransactionBlock();
tx.moveCall({
target: '0xYourPackage::your_module::process_categories',
arguments: [tx.pure(serializedCategories, 'vector<u8>')],
});
// Execute the transaction
const client = new SuiClient({ url: getFullnodeUrl('testnet') });
const result = await client.signAndExecuteTransactionBlock({
signer: yourWalletOrKeypair,
transactionBlock: tx,
});
console.log('Transaction result:', result);
Цей шаблон гарантує, що ваші значення enum передаються як належним чином закодовані vector<Category>
з JavaScript до Move. Просто переконайтеся, що ваш модуль Move опубліковано в ланцюжку і що ви вказуєте правильну target
адресу та назву модуля.
Для довідки про переміщення аргументів та серіалізацію enum за допомогою BCS див.: https://docs.sui.io/build/programmable-transactions
Ви знаєте відповідь?
Будь ласка, увійдіть та поділіться нею.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Зароби свою частку з 1000 Sui
Заробляй бали репутації та отримуй винагороди за допомогу в розвитку спільноти Sui.
- Чому BCS вимагає точного порядку полів для десеріалізації, коли структури Move мають названі поля?65
- Як максимізувати прибуток від SUI: Sui Staking проти Liquid Staking514
- Помилки перевірки кількох джерел» у публікаціях модуля Sui Move - автоматичне вирішення помилок55
- Помилка Sui Move - Неможливо обробити транзакцію Не знайдено дійсних газових монет для транзакції417
- Невдала операція Sui: об'єкти, зарезервовані для іншої транзакції49