Sui — это цепочка на данный момент, и хотя Move — это святой Грааль для написания смарт-контрактов на Sui, поддержка TypeScript значительна. Вы можете взаимодействовать и использовать Sui и большинство приложений DeFi в экосистеме с помощью TypeScript.
В этом уроке я научу вас взаимодействовать с сетью Sui через TypeScript. Вы научитесь читать состояние блокчейна, записывать транзакции в цепочку из своих программ TypeScript.
Единственным предварительным условием является наличие базовых знаний JS/TS для бесперебойной работы с этим руководством. Я расскажу вам обо всем остальном.
Сначала создайте новый проект TypeScript в своем терминале и инициализируйте новый проект Node.js.
mkdir SuiTS cd SuiTS npm init -y
Установите TypeScript в качестве зависимости для разработки, если у вас его еще нет.
npm install typescript --save-dev npm install ts-node //runs TS without the need for transpiling
Теперь вы можете инициализировать новый проект TypeScript. Эта команда создаст файл tsconfig.json с параметрами по умолчанию, которые вы можете настроить для своего проекта.
npx tsc --init
Откройте tsconfig.json и вставьте эти конфигурации.
{ "compilerOptions": { "target": "ES2020", "module": "CommonJS", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "types": ["node"], "resolveJsonModule": true }, "exclude": ["node_modules"], "scripts": { "build": "tsc", "start": "node dist/index.js" } }
Создайте каталог src, куда вы будете добавлять файлы TypeScript.
mkdir src touch src/index.ts
Наконец, установите Sui TypeScript SDK с помощью этой команды.
npm i @mysten/sui.js
Все готово. Вы можете начать писать программы TypeScript, которые взаимодействуют с блокчейном Sui.
Для взаимодействия с цепочкой необходимо подключиться к блокчейну Sui.
Сначала импортируйте getFullnodeUrl и SuiClient из клиентского модуля SDK.
import { getFullnodeUrl, SuiClient } from '@mysten/sui/client';
Теперь, в зависимости от желаемого соединения, вы можете использовать getFullnodeUrl для получения полного URL-адреса узла тестовой, основной, локальной или devnet Sui; затем используйте SuiClient для подключения к экземпляру клиента.
import { getFullnodeUrl, SuiClient } from '@mysten/sui/client'; const rpcUrl = getFullnodeUrl('mainnet'); const client = new SuiClient({ url: rpcUrl });
Чтобы проверить соединение, вы можете использовать getLatestSuiSystemState для получения последнего состояния сети.
// index.ts import { getFullnodeUrl, SuiClient } from '@mysten/sui/client'; const rpcUrl = getFullnodeUrl("mainnet"); const client = new SuiClient({ url: rpcUrl }); async function getNetworkStatus() { const currentEpoch = await client.getLatestSuiSystemState(); console.log(currentEpoch) } getNetworkStatus();
Теперь перенесите код TypeScript в JavaScript и запустите его с помощью этой команды:
ts-node index.ts
При выполнении команды вы должны ожидать вывода, подобного этому.
Создание кошелька — еще одна популярная операция, которая может оказаться полезной, если вы используете сеть Sui.
Вот как сгенерировать пары ключей кошелька Sui и получить из пары ключей секретные и открытые ключи.
import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'; import { getFullnodeUrl, SuiClient } from '@mysten/sui/client'; const rpcUrl = getFullnodeUrl("mainnet"); const client = new SuiClient({ url: rpcUrl }); // random Keypair const keypair = new Ed25519Keypair(); const publicKey = keypair.getPublicKey(); const privatekey = keypair.getSecretKey(); console.log(privatekey.toString()); console.log(publicKey.toSuiAddress());
Функция Ed25519Keypair создает новую пару ключей. Методы getPublicKey и getPrivateKey предоставляют вам доступ к открытому и закрытому ключам соответственно.
Вот строковый вывод закрытых и открытых ключей, которые я сгенерировал с помощью программы:
suiprivkey1qq9r6rkysny207t5vr7m5025swh7w0wzra9p0553paprhn8zshqsx2rz64r New Sui Address: 0xbd46d7582ced464ef369114252704b10317436ef70f196a33fcf2c724991fcba
Я пополняю этот кошелек 0,25 Sui для следующего набора операций. Не стесняйтесь верифицировать и сканировать кошелек. Не отправляйте никаких средств; это просто бумажник-пустышка.
Вы можете использовать функцию getCoins на своем клиентском экземпляре, чтобы получить подробную информацию о монетах в адресе кошелька.
import { getFullnodeUrl, SuiClient } from '@mysten/sui/client'; // use getFullnodeUrl to define the Devnet RPC location const rpcUrl = getFullnodeUrl('mainnet'); // create a client connected to devnet const client = new SuiClient({ url: rpcUrl }); async function getOwnedCoins() { const coins = await client.getCoins({ owner: '0xbd46d7582ced464ef369114252704b10317436ef70f196a33fcf2c724991fcba', }); console.log(coins); } getOwnedCoins();
Функция возвращает подробную информацию только о монете Sui и подробности. Выход осуществляется в MIST, газовом токене Sui. 1 SUI равен 1 миллиарду MIST.
Фунцию getAllCoins можно использовать таким же образом, чтобы получить список всех монет в кошельке.
async function getAllCoins() { // Get the list of owned coins (tokens) for the given owner address const ownedCoins = await client.getAllCoins({ owner: "0xbd46d7582ced464ef369114252704b10317436ef70f196a33fcf2c724991fcba" }); // Access the coin data const coins = ownedCoins.data; // Iterate through the coins and print their details for (const coin of coins) { console.log(`Coin Type: ${coin.coinType}`); console.log(`Coin Object ID: ${coin.coinObjectId}`); console.log(`Balance: ${coin.balance}`); console.log('--------------------'); } // If there is more data, handle pagination if (ownedCoins.hasNextPage) { console.log('More data available. Fetching next page...'); // You can handle the next page using ownedCoins.nextCursor if needed } } getAllCoins();
Для этого примера я обменял немного Sui на $FUD на агрегаторе Hop, и вот результат после запуска программы.
Наконец, самое интересное заключается в том, что вы научитесь отправлять транзакции через блокчейн.
Давайте отправим несколько токенов $FUD в другой кошелек. Это работает для любых монет в сети Sui.
import {getFullnodeUrl, SuiClient} from '@mysten/sui/client'; import {Ed25519Keypair} from '@mysten/sui/keypairs/ed25519'; import {Transaction} from '@mysten/sui/transactions'; // Set the RPC URL to connect to the Sui mainnet const rpcUrl = getFullnodeUrl("mainnet"); const client = new SuiClient({url: rpcUrl}); // Create the keypair using the private key const keypair = Ed25519Keypair.fromSecretKey("suiprivkey1qq9r6rkysny207t5vr7m5025swh7w0wzra9p0553paprhn8zshqsx2rz64r"); // FUD coin type const FUD_TYPE = '0x76cb819b01abed502bee8a702b4c2d547532c12f25001c9dea795a5e631c26f1::fud::FUD'; async function sendFUD() { const tx = new Transaction(); // Fetch FUD coins owned by the sender const coins = await client.getCoins({owner: keypair.getPublicKey().toSuiAddress(), coinType: FUD_TYPE}); if (coins.data.length === 0) { console.log("No FUD coins found in the wallet."); return; } // Choose the first available FUD coin and split it for the transfer (adjust amount if needed) const [coin] = tx.splitCoins(coins.data[0].coinObjectId, [100000000]); tx.transferObjects([coin], '0xb0042cf2c5a16d0a240fc1391d570cd5fe06548f860583f1878c327db70f2a22'); const result = await client.signAndExecuteTransaction({signer: keypair, transaction: tx}); await client.waitForTransaction({digest: result.digest}); console.log("Transaction successful. Digest:", result.digest); } sendFUD().then(console.log).catch(console.error);
Сначала я проверил, есть ли в кошельке немного $FUD, и разделил их для перевода. tx.transferObjects передает разделенную монету на указанный адрес.
Наконец, вам нужно подписать транзакцию с помощью client.signAndExecuteTransaction, и вы можете дождаться транзакции с помощью waitForTransaction, чтобы подтвердить, что транзакция прошла
Вы научились взаимодействовать с блокчейном Sui, используя официальный TypeScript SDK. Вы можете многого добиться от Sui, используя свои недавно приобретенные знания, например, создание кошельков и ботов.
Вы можете пойти дальше, научившись взаимодействовать с контрактами Move на Sui для создания более сложных dApps
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3