Пост
Поделитесь своими знаниями.
Как позвонить из приложения 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)
Как вызвать функцию process_categories из приложения node js с помощью SUI TS SDK, в частности отправить категории в качестве аргумента?
- Sui
Ответы
4process_categories``categories``[0, 1]
Чтобы вызвать A
функцию из приложения Node.js с помощью Sui TypeScript SDK, передайте B
аргумент в виде массива чисел, соответствующих вариантам перечисления (например, for,). Функция Move 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 и ссылка на пакет указана правильно.
Чтобы вызвать process_categories
функцию из приложения Node.js с помощью Sui TypeScript SDK, вам нужно сделать следующее:
1.Установите пакет SDK
Сначала убедитесь, что в вашем проекте установлен Sui SDK:
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
значений, поэтому его нужно передать в качестве аргумента. Поскольку вы передаете такие значения перечисления 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.
process_categories
*Вызов функции Move: вы говорите Суи позвонить, указав вектор категорий.
*Подписание транзакции: пользователь RawSigner
подписывает транзакцию, затем вы выполняете ее в сети.
Ключевые примечания:
*Адрес пакета: замените его 0xYourPackageAddress::YourModule::process_categories
фактическим адресом модуля Move.
*Подтверждение транзакции: это должно отправить транзакцию, и вы получите ответ в консоли. В случае возникновения проблемы в ответе обычно будет указано, что пошло не так.
Чтобы позвонить process_categories
из Node.js с помощью Sui TS SDK, вам необходимо:
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 Enum: соответствует перечислению Move (,,).bcs.vector()
Сериализовать вектор: используйте в качестве аргумента. 3.Функция перемещения вызовов: укажите пакет, модуль и функцию.
###Примечания:
- Замените на
0xPACKAGE_ID``module_name
свои фактические значения. - Убедитесь, что кошелек (
wallet
) и клиент (client
) инициализированы.
Чтобы вызвать process_categories
функцию из приложения Node.js с помощью Sui TypeScript SDK и передать a в vector<Category>
качестве аргумента, вам необходимо сериализовать значения перечислений в формат, ожидаемый Sui Move во время выполнения транзакции. В вашем случае Category
это Move enum
с вариантами A``B
и вариантами, C
которые представлены в виде числовыхдискриминантов(0, 1, 2) в кодировке BCS. vector<Category>
Поскольку Move ожидает значение avector<u8>
, вам необходимо сериализовать значения перечисления в виде a TransactionBlock
и правильно передать их в функцию, используя.
@mysten/sui.js
Вот как это можно сделать из Node.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);
Этот шаблон обеспечивает передачу значений перечисления в правильной кодировке vector<Category>
из JavaScript в Move. Просто убедитесь, что ваш модуль Move опубликован в блокчейне и что вы указали правильный target
адрес и имя модуля.
Сведения об аргументах Move и сериализации перечислений с использованием 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: стейкинг и ликвидный стейкинг514
- «Ошибки проверки нескольких источников» в публикациях модуля Sui Move — автоматическое устранение ошибок55
- Ошибка Sui Move — невозможно обработать транзакцию Не найдено действительных газовых монет для транзакции417
- Сбой транзакции Sui: объекты, зарезервированные для другой транзакции49