Sui es la cadena del momento, y aunque Move es el santo grial para escribir contratos inteligentes en Sui, la compatibilidad con TypeScript es significativa. Puede interactuar y utilizar Sui y la mayoría de las aplicaciones DeFi en el ecosistema con TypeScript.
En este tutorial, te enseñaré cómo interactuar con la red Sui a través de TypeScript. Aprenderá cómo leer el estado de la cadena de bloques y escribir transacciones en la cadena desde sus programas TypeScript.
El único requisito previo es que necesitará conocimientos básicos de JS/TS para ejecutar este tutorial sin problemas. Te guiaré en todo lo demás.
Primero, crea un nuevo proyecto TypeScript en tu terminal e inicializa un nuevo proyecto Node.js.
mkdir SuiTS cd SuiTS npm init -y
Instala TypeScript como una dependencia de desarrollo si aún no lo tienes.
npm install typescript --save-dev npm install ts-node //runs TS without the need for transpiling
Ahora puede inicializar un nuevo proyecto de TypeScript. Este comando creará un archivo tsconfig.json con opciones predeterminadas que puedes personalizar para tu proyecto.
npx tsc --init
Abra tsconfig.json y pegue estas configuraciones.
{ "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" } }
Cree un directorio src donde agregará sus archivos TypeScript.
mkdir src touch src/index.ts
Finalmente, instale el SDK de Sui TypeScript con este comando.
npm i @mysten/sui.js
Ya está todo listo. Puede comenzar a escribir programas TypeScript que interactúen con la cadena de bloques Sui.
Debes conectarte a una cadena de bloques Sui para interactuar con la cadena.
Primero, importe getFullnodeUrl y SuiClient desde el módulo cliente SDK.
import { getFullnodeUrl, SuiClient } from '@mysten/sui/client';
Ahora, dependiendo de la conexión que desees, puedes usar getFullnodeUrl para recuperar la URL completa del nodo de Sui testnet, mainnet, localnet o devnet; luego, use SuiClient para conectarse a la instancia del cliente.
import { getFullnodeUrl, SuiClient } from '@mysten/sui/client'; const rpcUrl = getFullnodeUrl('mainnet'); const client = new SuiClient({ url: rpcUrl });
Para probar tu conexión, puedes usar getLatestSuiSystemState para recuperar el estado más reciente de la red.
// 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();
Ahora, transpila el código TypeScript a JavaScript y ejecútalo con este comando:
ts-node index.ts
Deberías esperar un resultado similar a este cuando ejecutes el comando.
Crear una billetera es otra operación popular que puede resultar útil si construyes en Sui Network.
A continuación se explica cómo generar pares de claves de la billetera Sui y recuperar las claves públicas y privadas del par de claves.
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());
La función Ed25519Keypair crea un nuevo par de claves. Los métodos getPublicKey y getPrivateKey te dan acceso a las claves pública y privada, respectivamente.
Aquí está la cadena de salida de las claves públicas y privadas que generé con el programa:
suiprivkey1qq9r6rkysny207t5vr7m5025swh7w0wzra9p0553paprhn8zshqsx2rz64r New Sui Address: 0xbd46d7582ced464ef369114252704b10317436ef70f196a33fcf2c724991fcba
Estoy financiando esta billetera con 0,25 Sui para el próximo conjunto de operaciones. No dudes en verificar y escanear la billetera. No envíe ningún fondo; es sólo una billetera ficticia.
Puedes usar la función getCoins en la instancia de tu cliente para recuperar detalles sobre las monedas en una dirección de billetera.
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();
La función devuelve detalles solo sobre la moneda Sui y los detalles. La salida está en MIST, la ficha de gas Sui. 1 SUI equivale a mil millones de MIST.
La función getAllCoins se puede utilizar de la misma manera para obtener una lista de todas las monedas en una billetera.
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();
Para este ejemplo, cambié algo de Sui por $FUD en Hop Aggregator, y aquí está el resultado después de ejecutar el programa.
Finalmente, lo interesante es que aprenderás a enviar transacciones en blockchain.
Enviemos algunos tokens $FUD a otra billetera. Esto funciona para cualquier moneda en Sui Network.
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);
Primero, verifiqué que la billetera tuviera algo de $FUD y lo dividí para la transferencia. Los tx.transferObjects transfieren la moneda dividida a la dirección especificada.
Finalmente, debe firmar la transacción con client.signAndExecuteTransaction y puede esperar la transacción con waitForTransaction para confirmar que la transacción se realizó
Has aprendido a interactuar con la cadena de bloques Sui utilizando el SDK oficial de TypeScript. Hay muchas cosas que puedes desarrollar en Sui con tus conocimientos recién adquiridos, como crear billeteras y bots.
Puedes ir más allá aprendiendo cómo interactuar con los contratos Move en Sui para crear dApps más sofisticadas
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3