BARU: Helius mengakuisisi Light Protocol
Token Extensions Siap Pakai
Blog/Pengembangan

Token Extensions Siap Pakai

Engineer Integrasi0xSolanaGirl di X
Bacaan 8 menit

Pendahuluan

Token Extensions memudahkan pembuatan token yang dapat diprogram di Solana. Developer dapat menggabungkan lebih dari selusin Mint dan Account Extensions menggunakan program Token Extensions baru. Dengan menyelesaikan tutorial ini, Anda akan membuat dan berinteraksi dengan token fungibel dan nonfungibel, token berbunga, token yang dibekukan, token yang sepenuhnya berada di bawah kendali Anda (termasuk memindahkannya dari akun yang bukan milik Anda), serta menutup akun mint untuk memulihkan dana. 

Token Extensions Siap Pakai adalah tutorial dengan contoh interaktif di Solana Playground untuk membantu Anda mempelajari Token Extensions menggunakan TypeScript guna membuat token berikut:

Kode yang digunakan untuk tutorial ini diadaptasi dari Panduan Developer Solana. Skrip untuk membuat Token Extensions dapat ditemukan di bagian Sumber Daya Tambahan. 

Akun Token Extensions

Dengan memperkenalkan instruksi baru, Token Extensions dibangun di atas Token Program. Akun yang dibuat dengan kedua program tersebut identik pada panjang awal hingga instruksi Token Program berakhir dan instruksi Token Extensions dimulai. Pembaca yang belum memahami data akun dapat mempelajari ruang akun dalam Pengantar Anchor. Singkatnya, akun di Solana harus dibuat dengan ruang yang dialokasikan secara eksplisit untuk menyimpan data secara on-chain. Dengan ukuran ruang tersebut, kita dapat menghitung jumlah lamport yang diperlukan agar akun bebas biaya sewa.

Berikut tampilan proses pembuatan akun mint dengan ekstensi. Untuk mengalokasikan ruang bagi Token Extensions, gunakan fungsi getMintLen guna memperoleh ukuran akun mint dengan ekstensi. Dalam contoh NonFungibleToken.ts, dapatkan panjang mint dari jenis Extension MetadataPointer dan MintCloseAuthority.

NonFungibleToken.ts baris 54:

Kode
  // Size of Mint Account with extension
  const mintLen = getMintLen([
    ExtensionType.MetadataPointer,
    ExtensionType.MintCloseAuthority,
  ]);

Ekstensi Metadata dan Metadata Pointer memungkinkan Anda menyimpan serta menunjuk ke metadata tanpa bergantung pada protokol pihak ketiga. TokenMetadata adalah antarmuka dari @solana/spl-token-metadata dengan bidang seperti updateAuthority, mint, name, symbol, uri, dan additionalMetadata. Panjang metadata diperoleh menggunakan fungsi pack pada objek metadata. 

‍NonFungibleToken.ts baris 60:

Kode
  // Metadata to store in Mint Account
  const metaData: TokenMetadata = {
    updateAuthority: updateAuthority,
    mint: mint,
    name: "Solana Soldier",
    symbol: "SOLD",
    uri: "https://shdw-drive.genesysgo.net/G1Tzt42SDqCV3x9vPY5X826foA8fEk8BR4bB5wARh75d/OIG2.jpg",
    additionalMetadata: [["armor", null]],
  };
  // Size of metadata
  const metadataLen = pack(metaData).length;
  // Size of MetadataExtension 2 bytes for type, 2 bytes for length
  const metadataExtension = TYPE_SIZE + LENGTH_SIZE;

Jumlahkan panjang mint, ekstensi metadata, dan panjang metadata untuk menemukan jumlah minimum lamport yang diperlukan bagi Akun Mint.

NonFungibleToken.ts baris 75:

Kode
  // Minimum lamports required for Mint Account
  const lamports = await connection.getMinimumBalanceForRentExemption(
    mintLen + metadataExtension + metadataLen
  );

Instruksi Token Extensions

Library Solana seperti @solana/spl-token dan @solana/spl-token-metadata menambahkan dukungan TypeScript untuk program Token Extensions. Mulailah dengan membuat akun yang memiliki ruang dan lamport bebas biaya sewa dalam jumlah yang tepat menggunakan SystemProgram dari @solana/web3.js.

NonFungibleToken.ts baris 80:

Kode
  // Instruction to invoke System Program to create new account
  const createAccountInstruction = SystemProgram.createAccount({
    fromPubkey: payer.publicKey, // Account that will transfer lamports to created account
    newAccountPubkey: mint, // Address of the account to create
    space: mintLen, // Amount of bytes to allocate to the created account
    lamports, // Amount of lamports transferred to created account
    programId: TOKEN_2022_PROGRAM_ID, // Program assigned as owner of created account
  });

Selanjutnya, kita dapat membuat instruksi untuk menentukan mint. Instruksi berikut harus dijalankan sebelum memanggil initializeMint. Instruksi pra-mint yang digunakan dalam Siap Pakai adalah:

Akun metadata dapat diinisialisasi dan diperbarui secara terpisah dari initializeMint. Namun, Metadata Pointer harus diinisialisasi sebelum mint. Urutan instruksi dalam transaksi menentukan urutan eksekusinya. Buat akun mint, inisialisasi metadata pointer, lalu mint close authority dengan kunci publik mint. Setelah itu, inisialisasi akun mint dan metadata, lalu perbarui metadata tambahan.

‍NonFungibleToken.ts baris 135:

Kode
  transaction = new Transaction().add(
    createAccountInstruction,
    initializeMetadataPointerInstruction,
    initializeMintCloseAuthorityInstruction,
    initializeMintInstruction,
    initializeMetadataInstruction,
    updateFieldInstruction
  );

File nonFungibleToken.ts, soulboundToken.ts, interestBearingToken.ts, dan delegateToken.ts mengikuti struktur yang sama untuk membuat token. Perbedaannya terletak pada ekstensi dan instruksi yang digunakan. 

Proses dimulai dengan mengimpor semua fungsi yang diperlukan dari library Solana terkait, menentukan pembayar, dan menghasilkan alamat mint. Kemudian, temukan ruang dan lamport yang diperlukan untuk alamat mint dengan ekstensi token yang diinginkan. Buat instruksi menggunakan library @solana/spl-token dan @solana/spl-token-metadata, tambahkan ke transaksi, kirim transaksi ke jaringan, lalu validasi hasilnya. 

Operasi token seperti transfer dan burn dapat digunakan pada berbagai ekstensi token. Token dengan Metadata Extension dapat menggunakan instruksi createUpdateFieldInstruction dan createRemoveKeyInstruction untuk masing-masing memperbarui atau menghapus metadata. 

Siap Pakai 

Di Solana Playground, klien berisi fungsi yang diperlukan untuk berinteraksi dengan Token Extensions. Sebagai contoh, token Soulbound menggunakan Non-Transferable dan Metadata Extensions untuk membuat NFT soulbound. Fungsi untuk membuat dan berinteraksi dengan token tersedia dalam file yang sama dan dapat diimpor (untuk Solana Playground, Anda harus menyalin dan menempelkan kode, bukan mengimpornya). 

File quest.ts memungkinkan Anda memainkan Solana Soldier. Atau, jalankan setiap file yang berisi ekstensi token untuk melihat fungsi spesifiknya. Playground Wallet memerlukan SOL Devnet untuk menjalankan misi. Faucet Devnet Solana kami juga tersedia untuk melakukan airdrop SOL Devnet.

Misi dimulai dengan membuat Solana Soldier, yaitu NFT yang memberikan pembayar (pg.wallet.keypair) mint close authority—sehingga pembayar dapat menutup akun mint dan mengambil kembali SOL darinya. Mekanisme ini berguna bagi aplikasi untuk mengembalikan SOL dari akun yang tidak lagi aktif.

Setelah membuat Solana Soldier, gunakan alamat mint-nya untuk memperbarui metadata NFT. Mari perbarui zirah prajurit menjadi iron. Fungsi getMetadata, updateMetadata, dan removeMetadata dapat ditemukan dalam file NonFungibleToken.ts mulai dari baris 167. Fungsi tersebut dapat dipanggil untuk akun mint yang menggunakan Metadata Extension. Agar tetap sederhana, fungsi metadata hanya akan disertakan dalam file NonFungibleToken.ts.

Selanjutnya, saatnya mulai naik level. Sebuah token berbunga akan mewakili level Solana Soldier. Dari InterestBearingToken.ts, impor createInterestBearingToken dan gunakan instruksi tersebut untuk membuat token. Bunga pada akun akan bertambah sesuai tingkat yang ditetapkan dalam InterestBearingToken.ts pada baris 43. Fungsi amountToUiAmount dapat digunakan untuk menentukan jumlah token beserta bunga yang telah terakumulasi. Bunga terakumulasi seiring waktu, dan kita dapat memanggil amountToUiAmount untuk memeriksa level Solana Soldier.

Setelah prajurit mulai naik level, ia perlu menerima misi. Misi tersebut diwakili oleh token soulbound—prajurit tidak dapat mentransfernya (cobalah menangkap error dengan memanggil fungsi transfer), dan satu-satunya cara untuk menyingkirkan misi tersebut adalah dengan melakukan burn. Alih-alih meninggalkan misi, mari kita periksa. Petunjuk: periksa metadatanya!

Setelah Anda membaca misi tersebut, tutorial Siap Pakai akan mengerahkan pasukan ke sebuah alamat token. Solana Soldier harus dapat memanggil kembali pasukan kepada pembayar setelah token dikerahkan. Token Extensions memungkinkan hal ini dengan memperkenalkan delegate authority. Delegate authority dapat mentransfer dan melakukan burn pada token tanpa memandang siapa pemiliknya. Tetapkan permanent delegate ke keypair yang dapat Anda akses. Keypair ini harus menandatangani proses burn dan transfer token.

Token delegasi akan mewakili Solana Army. Buat token delegasi dengan createDelegateTokens dari DelegateToken.ts baris 33 ke akun token musuh. Setelah token di-mint, Solana Army dan musuh terlibat dalam pertempuran hipotetis. Setelah pertempuran, panggil kembali prajurit dari akun musuh menggunakan fungsi transferDelegateTokens yang terdapat dalam DelegateTokens.ts baris 176.

Perhatikan bahwa tidak semua prajurit dipanggil kembali dari alamat musuh. Anggap saja mereka telah gugur. Gunakan fungsi burn dari @solana/spl-token untuk melakukan burn pada token yang tersisa di akun token musuh (sourceTokenAccount). 

Dengan kemenangan dalam pertempuran, misi Solana Soldier pun berakhir. Fungsi closeAccount dari @solana/spl-token digunakan untuk menutup akun dan mengembalikan biaya sewa. Token Extensions yang tidak dibahas dalam artikel ini mencakup transfer rahasia, biaya transfer, dan transfer hook. Hampir semua ekstensi token dapat dipadukan, dengan beberapa pengecualian seperti transfer hook dan token yang tidak dapat ditransfer. Referensi Solana Playground untuk Token Extensions yang dibahas dalam tutorial ini ditautkan di Sumber Daya Tambahan. 

Kesimpulan

Terinspirasi oleh CryptoZombies, tutorial Siap Pakai ini membahas dasar-dasar pembuatan Token Extensions populer dengan menggabungkan beberapa ekstensi. Tutorial ini menunjukkan komposabilitas Token Extensions melalui pengalaman bermain yang praktis. Contoh-contohnya dapat langsung digunakan atau dijadikan panduan bagi developer yang membuat token mereka sendiri. Mulai dari menentukan ukuran akun hingga mengurutkan instruksi, contoh-contoh tersebut menyediakan proses yang efisien untuk membuat akun dengan Token Extensions.  Jika pengalaman belajar bergaya permainan ini bermanfaat bagi Anda, silakan bagikan masukan di Discord kami atau tandai @helius di X.

Sumber Daya Tambahan

Berlangganan Helius

Ikuti perkembangan terbaru dalam pengembangan Solana dan dapatkan pembaruan saat kami memublikasikan postingan

Gambar diperbesar