Program

Di Solana, smart contract disebut sebagai program. Program adalah akun stateless yang berisi kode yang dapat dieksekusi. Kode ini diorganisir ke dalam fungsi yang disebut instruksi. Pengguna berinteraksi dengan program dengan mengirimkan transaksi yang berisi satu atau lebih instruksi. Sebuah transaksi dapat mencakup instruksi dari beberapa program.

Ketika program di-deploy, Solana menggunakan LLVM untuk mengompilasinya ke dalam format executable and linkable (ELF). File ELF berisi binary program dalam Solana Bytecode Format (sBPF) dan disimpan on-chain dalam akun yang dapat dieksekusi.

sBPF adalah versi kustom Solana dari bytecode eBPF.

Mayoritas program ditulis dalam Rust, dengan dua pendekatan pengembangan yang umum:

  • Anchor: Anchor adalah framework yang dirancang untuk pengembangan Solana yang cepat dan mudah. Framework ini menggunakan Rust macros untuk mengurangi boilerplate code—menjadikannya sangat cocok untuk pemula.
  • Native Rust: Menulis program dalam Rust tanpa memanfaatkan framework apa pun. Pendekatan ini menawarkan lebih banyak fleksibilitas tetapi dengan peningkatan kompleksitas.

Memperbarui program

Untuk memodifikasi program yang sudah ada, sebuah akun harus ditunjuk sebagai upgrade authority. (Biasanya akun yang sama yang awalnya men-deploy program.) Jika upgrade authority dicabut dan diatur ke None, program tidak dapat lagi diperbarui.

Memverifikasi program

Solana mendukung verifiable builds, yang memungkinkan pengguna untuk memeriksa apakah kode on-chain program cocok dengan kode sumber publiknya. Framework Anchor menyediakan dukungan bawaan untuk membuat verifiable build.

Untuk memeriksa apakah program yang ada telah diverifikasi, cari ID program-nya di Solana Explorer. Sebagai alternatif, Anda dapat menggunakan Solana Verifiable Build CLI dari Ellipsis Labs, untuk memverifikasi program on-chain secara independen.

Program bawaan

System Program

System Program adalah satu-satunya akun yang dapat membuat akun baru. Secara default, semua akun baru dimiliki oleh System Program, meskipun banyak yang ditetapkan pemilik baru saat pembuatan. System Program menjalankan fungsi-fungsi kunci berikut:

FungsiDeskripsi
Pembuatan akun baruHanya System Program yang dapat membuat akun baru.
Alokasi ruangMenetapkan kapasitas byte untuk bidang data setiap akun.
Penetapan kepemilikan programSetelah System Program membuat akun, ia dapat menetapkan ulang pemilik program yang ditunjuk ke program account yang berbeda. Begitulah cara program kustom mengambil kepemilikan akun baru yang dibuat oleh System Program.
Transfer SOLMentransfer lamport (SOL) dari akun sistem ke akun lain.

Alamat system program adalah 11111111111111111111111111111111.

Program loader

Setiap program dimiliki oleh program lain—loader-nya. Loader digunakan untuk men-deploy, me-redeploy, meng-upgrade, atau menutup program. Loader juga digunakan untuk menyelesaikan program dan mentransfer otoritas program.

Program loader kadang-kadang disebut sebagai 'BPF Loader'.

Saat ini terdapat lima program loader, seperti yang ditunjukkan dalam tabel di bawah ini.

LoaderID programCatatanTautan instruksi
nativeNativeLoader1111111111111111111111111111111Memiliki empat loader lainnya
v1BPFLoader1111111111111111111111111111111111Instruksi manajemen dinonaktifkan, tetapi program masih berjalan
v2BPFLoader2111111111111111111111111111111111Instruksi manajemen dinonaktifkan, tetapi program masih berjalanInstruksi
v3BPFLoaderUpgradeab1e11111111111111111111111Program dapat diperbarui setelah deployment. Executable program disimpan dalam program account data terpisahInstruksi
v4LoaderV411111111111111111111111111111111111Dalam pengembangan (belum dirilis)Instruksi

Program yang di-deploy dengan loader-v3 atau loader-v4 dapat dimodifikasi setelah deployment, sesuai dengan upgrade authority-nya.

Ketika program baru di-deploy, versi loader terbaru akan digunakan secara default.

Program yang dikompilasi sebelumnya

Selain program loader, Solana menyediakan program yang dikompilasi sebelumnya berikut ini.

Verifikasi tanda tangan ed25519

Program ed25519 digunakan untuk memverifikasi satu atau lebih tanda tangan ed25519.

ProgramProgram IDDeskripsiInstruksi
Program Ed25519Ed25519SigVerify111111111111111111111111111Memverifikasi tanda tangan ed25519. Jika ada tanda tangan yang gagal, error dikembalikan.Instruksi

Program ed25519 memproses sebuah instruksi. u8 pertama dari instruksi berisi jumlah tanda tangan yang akan diperiksa, diikuti oleh satu byte padding. Setelah itu, struktur berikut diserialisasi, satu untuk setiap tanda tangan yang akan diperiksa.

Ed25519SignatureOffsets
struct Ed25519SignatureOffsets {
signature_offset: u16, // offset to ed25519 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to public key of 32 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u16, // index of instruction data to get message data
}
Signature verification pseudocode
process_instruction() {
for i in 0..count {
// i'th index values referenced:
instructions = &transaction.message().instructions
instruction_index = ed25519_signature_instruction_index != u16::MAX ? ed25519_signature_instruction_index : current_instruction;
signature = instructions[instruction_index].data[ed25519_signature_offset..ed25519_signature_offset + 64]
instruction_index = ed25519_pubkey_instruction_index != u16::MAX ? ed25519_pubkey_instruction_index : current_instruction;
pubkey = instructions[instruction_index].data[ed25519_pubkey_offset..ed25519_pubkey_offset + 32]
instruction_index = ed25519_message_instruction_index != u16::MAX ? ed25519_message_instruction_index : current_instruction;
message = instructions[instruction_index].data[ed25519_message_data_offset..ed25519_message_data_offset + ed25519_message_data_size]
if pubkey.verify(signature, message) != Success {
return Error
}
}
return Success
}

Verifikasi pemulihan secp256k1

Program secp256k1 digunakan untuk memverifikasi operasi pemulihan kunci publik secp256k1.

ProgramProgram IDDeskripsiInstruksi
Program Secp256k1KeccakSecp256k11111111111111111111111111111Memverifikasi operasi pemulihan kunci publik secp256k1 (ecrecover).Instruksi

Program secp256k1 memproses sebuah instruksi. Byte pertama dari instruksi berisi jumlah kunci publik yang akan diperiksa. Setelah itu, struktur berikut dibuat sekali untuk setiap kunci publik, kemudian diserialisasi dan ditambahkan ke instruction data.

Secp256k1SignatureOffsets
struct Secp256k1SignatureOffsets {
secp_signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytes
secp_signature_instruction_index: u8, // instruction index to find signature
secp_pubkey_offset: u16, // offset to ethereum_address pubkey of 20 bytes
secp_pubkey_instruction_index: u8, // instruction index to find pubkey
secp_message_data_offset: u16, // offset to start of message data
secp_message_data_size: u16, // size of message data
secp_message_instruction_index: u8, // instruction index to find message data
}
Recovery verification pseudocode
process_instruction() {
for i in 0..count {
// i'th index values referenced:
instructions = &transaction.message().instructions
signature = instructions[secp_signature_instruction_index].data[secp_signature_offset..secp_signature_offset + 64]
recovery_id = instructions[secp_signature_instruction_index].data[secp_signature_offset + 64]
ref_eth_pubkey = instructions[secp_pubkey_instruction_index].data[secp_pubkey_offset..secp_pubkey_offset + 20]
message_hash = keccak256(instructions[secp_message_instruction_index].data[secp_message_data_offset..secp_message_data_offset + secp_message_data_size])
pubkey = ecrecover(signature, recovery_id, message_hash)
eth_pubkey = keccak256(pubkey[1..])[12..]
if eth_pubkey != ref_eth_pubkey {
return Error
}
}
return Success
}

Ini memungkinkan pengguna untuk menentukan instruction data apa pun dalam transaksi untuk data tanda tangan dan pesan. Dengan menentukan sysvar instruksi khusus, seseorang juga dapat menerima data dari transaksi itu sendiri.

Biaya transaksi akan menghitung jumlah tanda tangan yang diverifikasi dikalikan dengan pengali biaya verifikasi tanda tangan.

Program secp256r1 digunakan untuk memverifikasi hingga 8 tanda tangan secp256r1.

ProgramProgram IDDeskripsiInstruksi
Program Secp256r1Secp256r1SigVerify1111111111111111111111111Memverifikasi hingga 8 tanda tangan secp256r1. Mengambil tanda tangan, kunci publik, dan pesan. Mengembalikan error jika ada yang gagal.Instruksi

Program secp256r1 memproses sebuah instruksi. u8 pertama dari instruksi adalah jumlah tanda tangan yang akan diperiksa, diikuti oleh satu byte padding. Setelah itu, struktur berikut dibuat untuk setiap tanda tangan, kemudian diserialisasi dan ditambahkan ke instruction data.

Secp256r1SignatureOffsets
struct Secp256r1SignatureOffsets {
signature_offset: u16, // offset to compact secp256r1 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to compressed public key of 33 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u16, // index of instruction data to get message data
}

Nilai S rendah diberlakukan untuk semua tanda tangan untuk menghindari kemungkinan kerentanan tanda tangan.

Signature verification psuedocode
process_instruction() {
if data.len() < SIGNATURE_OFFSETS_START {
return Error
}
num_signatures = data[0] as usize
if num_signatures == 0 || num_signatures > 8 {
return Error
}
expected_data_size = num_signatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE + SIGNATURE_OFFSETS_START
if data.len() < expected_data_size {
return Error
}
for i in 0..num_signatures {
offsets = parse_signature_offsets(data, i)
signature = get_data_slice(data, instruction_datas, offsets.signature_instruction_index, offsets.signature_offset, SIGNATURE_SERIALIZED_SIZE)
if s > half_curve_order {
return Error
}
pubkey = get_data_slice(data, instruction_datas, offsets.public_key_instruction_index, offsets.public_key_offset, COMPRESSED_PUBKEY_SERIALIZED_SIZE)
message = get_data_slice(data, instruction_datas, offsets.message_instruction_index, offsets.message_data_offset, offsets.message_data_size)
if !verify_signature(signature, pubkey, message) {
return Error
}
}
return Success
}

Program inti

Program dalam daftar di bawah ini menyediakan fungsionalitas inti jaringan.

ProgramProgram IDDeskripsiInstruksi
System11111111111111111111111111111111Membuat akun baru, mengalokasikan data akun, menetapkan akun ke program pemilik, mentransfer lamport dari akun yang dimiliki Program System, dan membayar biaya transaksiSystemInstruction
VoteVote111111111111111111111111111111111111111Membuat dan mengelola akun yang melacak status voting validator dan rewardsVoteInstruction
StakeStake11111111111111111111111111111111111111Membuat dan mengelola akun yang mewakili stake dan rewards untuk delegasi ke validatorStakeInstruction
ConfigConfig1111111111111111111111111111111111111Menambahkan data konfigurasi ke chain, diikuti oleh daftar kunci publik yang diizinkan untuk memodifikasinya. Tidak seperti program lain, program Config tidak mendefinisikan instruksi individual. Program ini hanya memiliki satu instruksi implisit: "store". Data instruksinya adalah sekumpulan kunci yang mengatur akses ke akun dan data yang disimpan di dalamnyaConfigInstruction
Compute BudgetComputeBudget111111111111111111111111111111Menetapkan batas dan harga unit komputasi untuk transaksi, memungkinkan pengguna mengontrol sumber daya komputasi dan biaya prioritasComputeBudgetInstruction
Address Lookup TableAddressLookupTab1e1111111111111111111111111Mengelola tabel pencarian alamat, yang memungkinkan transaksi mereferensikan lebih banyak akun daripada yang biasanya muat dalam daftar akun transaksiProgramInstruction
ZK ElGamal ProofZkE1Gama1Proof11111111111111111111111111111Menyediakan verifikasi bukti zero-knowledge untuk data terenkripsi ElGamal

Is this page helpful?

Daftar Isi

Edit Halaman

Dikelola oleh

© 2026 Yayasan Solana.
Semua hak dilindungi.
Terhubung