BARU: Helius mengakuisisi Light Protocol
mengembangkan smart contract Solana dengan Gill
Blog/Pengembangan

Cara Membangun Aplikasi Solana dengan Gill

Membangun @useDecal, sebelumnya @SolanaFndnNick Frostbutter di XNick Frostbutter di LinkedIn
Bacaan 9 menit

Gill adalah library tooling developer Solana berbasis JavaScript/TypeScript terbaru. Awalnya dikembangkan oleh Nick Frostbutter, salah satu pendiri Decal, saat bergabung dengan tim Developer Relations Solana Foundation, Gill bertujuan meningkatkan pengalaman developer secara signifikan untuk aplikasi berbasis JavaScript.

Gill mencakup abstraksi dengan opini ringan untuk mempercepat produktivitas developer serta primitive tingkat rendah, sehingga developer bebas memilih pendekatan mereka sendiri.

Abstraksi yang ringan mengurangi berbagai kompleksitas dan boilerplate yang diperlukan untuk melakukan interaksi umum dengan Solana. Sementara itu, primitive tingkat rendah menyediakan "jalur keluar" ketika developer memerlukan (atau menginginkan) kontrol yang lebih mendetail atas logika aplikasi mereka.

Artikel ini akan membahas dasar-dasar "library Gill", apa saja yang tersedia di dalamnya, cara memulai dengan gill, dan perbedaannya dengan @solana/kit (sebelumnya dikenal sebagai "web3.js v2").

Apa Itu Gill?

Gill adalah library TypeScript modern untuk mengembangkan aplikasi Solana di lingkungan berbasis JavaScript apa pun, mulai dari browser hingga server dan perangkat seluler.

Library Gill ditujukan bagi developer Solana dari semua tingkat pengalaman, mulai dari pemula hingga mahir. Dengan menyediakan abstraksi tingkat tinggi dan primitive tingkat rendah dalam satu paket, developer dapat dengan mudah menggunakan fungsionalitas yang lebih canggih saat diperlukan atau ketika belum didukung oleh abstraksi. 

Bagian terbaiknya? 

Gill sepenuhnya mendukung tree-shaking, sehingga bundler Anda akan otomatis menghapus primitive atau abstraksi yang tidak digunakan dalam codebase Anda.

Tujuan utama Gill adalah meningkatkan pengalaman developer dengan menyederhanakan tugas pengembangan Solana yang umum dan menghapus boilerplate, tanpa mengorbankan kemampuan untuk bekerja pada tingkat yang lebih rendah jika developer menginginkan atau memerlukannya. Developer tidak semestinya dibatasi hanya pada abstraksi tingkat tinggi atau primitive tingkat rendah. Developer semestinya dapat dengan mudah memilih salah satunya sesuai kebutuhan.

Menginstal Gill

Gill dapat diinstal di proyek berbasis JavaScript atau TypeScript apa pun, termasuk NodeJS/Bun, browser, React Native, atau hampir semua lingkungan JavaScript lainnya.

Kode
npm install gill

Library Gill memiliki dukungan TypeScript yang kuat dan semestinya langsung berfungsi di sebagian besar aplikasi. Namun, konfigurasi proyek Anda mungkin perlu disesuaikan agar bekerja lebih baik dengan Gill. Lihat dokumentasi untuk informasi selengkapnya tentang dukungan TypeScript di Gill.

Gill vs. @solana/kit

Library Gill dibangun langsung di atas @solana/kit, primitive JavaScript tingkat rendah baru yang dikembangkan oleh Anza sebagai pengganti @solana/web3.js lama dengan performa lebih tinggi.

Karena Kit hanya menyediakan primitive tingkat rendah ini, developer terpaksa menggunakan satu pendekatan dengan merangkai semuanya secara manual. Akibatnya, ukuran aplikasi membengkak dengan boilerplate yang bertele-tele.

Hadir Gill.

Gill menyediakan primitive tingkat rendah yang sama seperti Kit sekaligus abstraksi dengan opini ringan untuk menyederhanakan tugas umum, semuanya melalui satu antarmuka yang kompatibel. Dengan penyederhanaan menyeluruh dari Gill, developer dapat lebih berfokus pada logika bisnis aplikasi dan menghabiskan lebih sedikit waktu untuk boilerplate yang bertele-tele.

Contoh Kode Gill vs. Kit

Cuplikan kode berikut menunjukkan bagaimana kode Anda dapat disederhanakan sambil mempertahankan fungsionalitas yang sama (dan berpotensi menambahkan lebih banyak fungsi). Hampir semua aplikasi perlu melakukan dua tugas: membuat koneksi ke blockchain dan membuat transaksi.

Koneksi ke blockchain dengan @solana/kit dibuat sebagai berikut:

Kode
import {
  devnet,
  createSolanaRpc,
  createSolanaRpcSubscriptions,
  sendAndConfirmTransactionFactory,
} from "@solana/kit";

const rpc = createSolanaRpc(devnet("https://api.devnet.solana.com"));

const rpcSubscriptions = createSolanaRpcSubscriptions(
  devnet("wss://api.devnet.solana.com"),
);

const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({
  rpc,
  rpcSubscriptions,
});

Logika yang sama dapat diterapkan dan disederhanakan dengan fungsi createSolanaClient milik Gill:

Kode
import { createSolanaClient } from "gill";

const { rpc, rpcSubscriptions, sendAndConfirmTransaction } = createSolanaClient({
  urlOrMoniker: "devnet",
});

Kini Anda dapat membuat permintaan RPC sederhana menggunakan objek rpc yang dibuat dengan salah satu library dalam contoh di atas:

Kode
// get the latest blockhash from your RPC provider
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();

Pembuatan transaksi sederhana yang menyertakan instruksi memo dengan pengoptimalan dasar (menggunakan instruksi compute budget) dalam @solana/kit dilakukan sebagai berikut:

Kode
import {
  pipe,
  createTransactionMessage,
  setTransactionMessageFeePayerSigner,
  appendTransactionMessageInstructions,
  setTransactionMessageLifetimeUsingBlockhash,
} from "@solana/kit";
import { getAddMemoInstruction } from "@solana-program/memo";
import {
  getSetComputeUnitLimitInstruction,
  getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";

const transaction = pipe(
  createTransactionMessage({ version: "legacy" }),
  (tx) => setTransactionMessageFeePayerSigner(signer, tx),
  (tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
  (tx) =>
    appendTransactionMessageInstructions(
      [
        getAddMemoInstruction({
          memo: "gm world!",
        }),
        getSetComputeUnitLimitInstruction({ units: 5000 }),
        getSetComputeUnitPriceInstruction({ microLamports: 1000 }),
      ],
      tx,
    ),
);

Logika yang sama dapat sangat disederhanakan menggunakan gill sebagai berikut:

Kode
import { createTransaction } from "gill";
import { getAddMemoInstruction } from "gill/programs";

const transaction = createTransaction({
  version: "legacy",
  feePayer: signer,
  instructions: [
    getAddMemoInstruction({
      memo: "gm world!",
    }),
  ],
  latestBlockhash,
  computeUnitLimit: 5000,
  computeUnitPrice: 1000,
});

Untuk perbandingan yang lebih menyeluruh antara kedua library ini, lihat dokumentasi Gill tentang Gill vs. @solana/kit.

Apa saja yang dilakukan dalam proses migrasi dari Kit ke Gill?

Untuk aplikasi apa pun yang menggunakan library @solana/kit, proses migrasi ke paket gill sangat mudah:

  1. Instal gill
  2. Ganti semua impor @solana/kit dengan gill
  3. Hapus instalasi @solana/kit

Karena Gill juga secara langsung menyertakan klien Solana Program Library (SPL) yang paling umum, Anda juga dapat mengganti impor paket tersebut dengan Gill. Gill secara langsung menyertakan klien SPL berikut, yang dapat diakses melalui jalur impor gill/programs:

  • @solana-program/system
  • @solana-program/memo
  • @solana-program/compute-budget
  • @solana-program/address-lookup-table
  • @solana-program/token-2022 (lihat catatan di bawah tentang klien program token)

Untuk menggunakan satu paket gill bagi klien program SPL ini:

  1. Ganti impor paket @solana-program/* yang tercantum di atas dengan gill/programs
  2. Hapus instalasi paket @solana-program/* yang tercantum di atas.

Setelah memperbarui impor, aplikasi Anda langsung siap menggunakan library "Gill core". Kini Anda dapat dengan mudah merefaktor dan menghilangkan boilerplate Kit yang bertele-tele (seperti membuat koneksi blockchain dan transaksi) menggunakan abstraksi gill yang tersedia.

Komponen Apa Saja yang Disertakan dalam Gill?

Library Gill dapat dibagi menjadi beberapa komponen utama:

  • Fungsionalitas inti (alias "Gill core")
  • Helper khusus runtime server (yaitu NodeJS dan Bun)
  • Klien program
  • Builder transaksi
  • Mode debug

Fungsi Helper Node.js

Paket gill menyertakan beberapa utilitas khusus runtime server JavaScript. Meskipun disertakan dalam paket gill, utilitas tersebut memiliki jalur impor terpisah untuk meningkatkan tree-shaking. Utilitas ini mencakup kemampuan untuk memuat dan menyimpan keypair ke file atau variabel ENV dengan mudah.

Kode
import { ... } from "gill/node"

Untuk memuat file keypair dari filesystem lokal Anda dengan mudah (seperti keypair Solana CLI):

Kode
import { loadKeypairSignerFromFile } from "gill/node";

// default file path: ~/.config/solana/id.json
const signer = await loadKeypairSignerFromFile();
console.log("address:", signer.address);

Anda juga dapat memuat keypair yang dienkode dengan base58 dari variabel ENV:

Kode
import { loadKeypairSignerFromEnvironmentBase58 } from "gill/node";

// loads signer from base58 keypair stored at `process.env[variableName]`
const signer = await loadKeypairSignerFromEnvironmentBase58(variableName);
console.log("address:", signer.address);

Builder Transaksi

Untuk menyederhanakan pembuatan transaksi umum yang sering berinteraksi dengan beberapa program sekaligus, Gill menyertakan berbagai "builder transaksi" yang membantu merangkai transaksi siap tanda tangan dengan mudah untuk tugas-tugas ini.

Karena setiap builder transaksi memiliki cakupan pada satu tugas, builder tersebut dapat dengan mudah mengabstraksikan berbagai boilerplate sekaligus membantu membuat transaksi yang optimal.

Beberapa builder transaksi yang disediakan Gill meliputi:

  • buildCreateTokenTransaction - membuat token dengan metadata
  • buildMintTokensTransaction - mencetak token ke wallet tujuan
  • buildTransferTokensTransaction - mentransfer token ke wallet tujuan

Setiap builder transaksi dilengkapi dengan "builder instruksi" untuk meningkatkan fleksibilitas developer dalam menggunakan abstraksi Gill ini.

Mode Debug

Di dalam Gill, Anda dapat mengaktifkan "mode debug" untuk secara otomatis mencatat informasi tambahan yang akan membantu mengatasi masalah pada transaksi Anda.

Mode debug dinonaktifkan secara default untuk meminimalkan log tambahan dari aplikasi Anda. Dengan pengontrolnya yang fleksibel, Anda dapat mengaktifkan mode debug dari tempat-tempat paling umum tempat kode Anda dijalankan, termasuk kode itu sendiri, backend NodeJS, fungsi serverless, dan bahkan konsol browser web.

Untuk mengaktifkan mode debug, atur salah satu dari berikut ini menjadi true atau 1:

  • process.env.GILL_DEBUG
  • global.__GILL_DEBUG__
  • window.__GILL_DEBUG__ (yaitu di konsol browser web Anda)
  • atau atur level log debug secara manual (lihat dokumentasi)

Lihat dokumentasi Mode Debug Gill untuk informasi selengkapnya.

Tool Developer Pelengkap untuk Membangun dengan Gill

@gillsdk/react

Di dalam library Gill terdapat paket lain, @gillsdk/react, yang merupakan kumpulan hook React yang dirancang untuk meningkatkan pengalaman developer secara radikal bagi aplikasi frontend berbasis React. Paket ini juga dibangun di atas TanStack Query, library reaktivitas populer, sehingga dapat lebih mudah digunakan oleh aplikasi yang sudah ada.

Paket @gillsdk/react masih dalam tahap awal dan sedang dikembangkan secara aktif. Saat ini, paket tersebut menyediakan beberapa hook React yang berguna untuk aplikasi Solana:

  • useAccount - mendapatkan informasi account untuk suatu alamat
  • useBalance - mendapatkan saldo account (dalam lamport)
  • useLatestBlockhash - mendapatkan blockhash terbaru
  • useSignatureStatuses - mendapatkan status tanda tangan
  • useProgramAccounts - mendapatkan account program (GPA)
  • useTokenMint - mendapatkan account Mint milik token yang telah didekode
  • useTokenAccount - mendapatkan account token untuk Mint dan pemilik tertentu (atau ATA)

Codama

Codama adalah tool yang memungkinkan developer menggunakan IDL program Solana untuk menghasilkan library klien (misalnya JavaScript dan Rust) yang dapat digunakan oleh aplikasi lain. Codama menangani seluruh kompleksitas dalam merangkai instruksi Solana menjadi IDL, file konfigurasi, dan impor fungsi.

Gill dan Codama dapat diintegrasikan dengan mudah melalui fungsi createCodamaConfig milik Gill. Pengelola Gill juga sedang aktif meningkatkan integrasi Gill<>Codama lebih jauh, termasuk dukungan langsung dalam Codama CLI!

Secara default, klien program TypeScript yang dihasilkan Codama akan menggunakan @solana/kit, tetapi hal ini dapat diperbarui dengan mudah dalam file konfigurasi Codama milik program Solana Anda. Upgrade untuk menggunakan gill dalam konfigurasi Codama Anda menjadi sangat mudah berkat fungsi createCodamaConfig.

Berikut adalah contoh file codama.js yang akan menghasilkan klien TypeScript untuk program Solana yang menggunakan gill:

Kode
import { createCodamaConfig } from "gill";

export default createCodamaConfig({
  idl: "program/idl.json",
  clientJs: "clients/js/src/generated",
});

Anda dapat menemukan panduan lengkap dalam dokumentasi Gill untuk menghasilkan klien program Solana dengan Codama.

Masa Depan Gill

Masa depan library Gill terlihat cerah, dan masih banyak yang dapat dikerjakan. Situs dokumentasi resmi Gill baru saja diluncurkan, dan library ini mendekati 20.000 unduhan per bulan.

Anda dapat menemukan informasi lebih lanjut tentang roadmap Gill saat ini di halaman GitHub Projects. Saat ini, daftar singkatnya mencakup:

  • Dukungan langsung untuk spesifikasi Solana Pay
  • Integrasi native untuk spesifikasi Digital Assets Standard (DAS) API
  • Dukungan yang lebih baik untuk token berbasis Token Extension
  • Dukungan yang lebih baik untuk Address Lookup Tables
  • Dokumentasi yang lebih menyeluruh

Paket @gillsdk/react yang disertakan dalam library Gill masih berada pada tahap awal (dengan sembilan hook React yang berbeda). Paket ini terus dikembangkan agar developer dapat dengan mudah menambahkan reaktivitas ke dalam aplikasi berbasis React mereka, termasuk dukungan untuk semua metode RPC Solana yang umum dan integrasi yang lebih erat dengan wallet-ui.

Fakta menarik: Ada rencana untuk mengintegrasikan Gill secara langsung ke dalam framework Anchor agar developer dapat lebih mudah memanfaatkan pengoptimalan dan peningkatan pengalaman developer dari Gill dalam aplikasi mereka. Siapa tahu, mungkin Gill akan menjadi pilihan default di Anchor v2. :shhh:

Cara Berkontribusi pada Gill

Library Gill bersifat open-source (lisensi MIT), dan kontribusi sangat diterima! Jika Anda tertarik untuk berkontribusi pada library ini, lihat issue yang masih terbuka dan pertimbangkan untuk menangani salah satunya.

Jika Anda ingin merekomendasikan fitur baru atau peningkatan untuk library ini, buka issue terlebih dahulu untuk memulai diskusi dengan para pengelola sebelum mengerjakan kode untuk PR.

Referensi Tambahan

Temukan informasi dan referensi lebih lanjut tentang Gill melalui tautan berikut:

Berlangganan Helius

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