Programs

นักพัฒนาสามารถเขียน และปล่อย (deploy) programs บน Solana blockchain. Programs (ซึ่งก็คือ smart contracts บน protocols อื่นๆ) เป็นส่วนรากฐานของการทำงาน on-chain, ทำได้ทุกอย่างตั้งแต่ DeFi และ NFTs จนไปถึง Social Media และ Gaming.

เรื่องน่ารู้

Fact Sheet

  • Programs ประมวลผล instructions ทั้งที่มาจาก end users และมาจาก programs อื่นๆ
  • ทุกๆ programs จะเป็น stateless: และ data ที่มันทำงานด้วยจะถูกเก็บแยกไว้ที่ accounts ที่ส่งผ่านมาทาง instructions
  • Programs จะถูกเก็บใน accounts ที่ระบุไว้ว่า executable
  • ทุกๆ programs จะมีเจ้าของคือ BPF Loaderopen in new window และจะถูกดำเนินการ (executed) โดย Solana Runtimeopen in new window
  • นักพัฒนาจะเขียน programs ด้วยภาษา Rust หรือ C++, แต่ก็สามารถเลือกภาษาใดๆ ก็ได้ที่ target LLVMopen in new window's BPFopen in new window ได้
  • ทุกๆ programs จะมีทางเข้า (entry point) ทางเดียว ซึ่งเป็นที่ที่ instruction จะถูกดำเนินการ(process_instruction); parameters จะต้องมีสิ่งเหล่านี้เสมอ:
    • program_id: pubkey
    • accounts: array,
    • instruction_data: byte array

ลงลึก

Solana ไม่เหมือน blockchains อื่นๆ ตรงที่เราจะแยก code กับ data ออกจากกัน ทุกๆ data ที่ programs จะใช้จะถูกเก็บไว้ใน account อีกตัวแยกกัน และ programs จะรับเป็นชุดข้อมูลอ้างอิง (references) ไปถึง account เหล่านั้นผ่านรูปแบบชุดคำสั่ง (instructions) การทำแบบนี้จะทำให้ program สามารถทำงานข้าม หรือเรียกใช้ accounts ต่างๆ โดยไม่ต้อง deploy ใหม่ ตัวอย่างรูปแบบ (pattern) เหล่านี้สามารถเห็นได้ในทั้ง Native และ SPL Programs

Native Programs และ The Solana Program Library (SPL)

Solana มาพร้อมกับ programs หลายตัวที่ใช้สำหรับการทำงาน on-chain. โดยที่ programs จะแบ่งเป็น Native Programsopen in new window และ Solana Program Library (SPL) Programsopen in new window.

Native Programs มีไว้สำหรับการทำงานของ validators โดยตัวที่รู้จักกันมากคือ System Programopen in new window ที่จะคอยรับผิดชอบดูแล accounts ใหม่ และส่ง(transfer) SOL ไปมา.

SPL Programs มีไว้ทำงาน on-chain หลายอย่าง, ทั้งสร้าง (creating), สลับ (swapping), และเช่า (lending) โทเคน (tokens), และยังมีไว้สร้าง stake pools และดูแล on-chain name service อีกด้วย โดย SPL Token Programopen in new window จะสามารถเรียกใช้ (invoke) ได้โดยตรงผ่าน CLI, ในขณะที่ Associated Token Account Programopen in new window จะถูกประกอบขึ้นมาด้วย programs ที่ทำขึ้นมาเอง.

เขียน Programs

Programs ส่วนใหญ่จะเขียนด้วย Rust หรือ C++, แต่ก็สามารถเลือกภาษาใดๆ ก็ได้ที่ target LLVM’s BPF ได้ นอกจากนี้จากความร่วมมือของ Neon Labsopen in new window และ Solangopen in new window ทำให้สามารถสนับสนุน EVMopen in new window ซึ่งทำให้นักพัฒนาสามารถเขียน programs ด้วย Solidity ได้.

programs ที่เขียนด้วย Rust จะยึดโครงสร้างนี้:

ไฟล์ (File)คำอธิบาย
lib.rsลงทะเบียน modules
entrypoint.rsทางเข้า (Entrypoint) ของ program
instruction.rsProgram API, (de)serializing instruction data
processor.rsProgram logic
state.rsProgram objects, (de)serializing state
error.rsProgram-specific errors

ในตอนนี้, Anchoropen in new window เป็น framework ที่นิยมสำหรับพัฒนา programs. Anchor คือ framework ที่มีแนวทางชัดเจน (opinionated), คล้ายกับ Ruby on Rails ที่ลดการเขียนอะไรซ้ำๆ และช่วยให้การแกะ (de)serialization สะดวกขึ้นสำหรับการพัฒนาด้วย Rust.

Programs ปกติแล้วจะถูกพัฒนา (dev) และทดสอบ(test) บนสิ่งแวดล้อม(environments) Localhost และ Devnet ก่อนที่จะ deploy ไปบน Testnet หรือ Mainnet. Solana จะสนับสนุน environments ต่อไปนี้:

Cluster EnvironmentRPC Connection URL
Mainnet-betahttps://api.mainnet-beta.solana.com
Testnethttps://api.testnet.solana.com
Devnethttps://api.devnet.solana.com
LocalhostDefault port: 8899 (e.g. http://localhost:8899, http://192.168.1.88:8899)

เมื่อ deployed ไปบน environment แล้วผู้ใช้ (clients) จะสามารถใช้งาน on-chain programs ผ่าน RPC connectionsopen in new window ไปที่ cluster ตามที่เลือกไว้.

Deploying Programs

นักพัฒนาสามารถ deploy programs ผ่าน CLIopen in new window:

solana program deploy <PROGRAM_FILEPATH>

เมื่อ program ถูก deploy ไปแล้ว, มันจะถูกแปลง (compile) เป็น ELF shared objectopen in new window (ประกอบไปด้วย BPF bytecode) และถูก upload ไปที่ Solana cluster. Programs จะอยู่ใน accounts (บน Solana ทุกอย่างอยุ่ใน accounts), ต่างตรงที่ accounts นี้จะมีสถานะ executable และถูกมอบหมายให้ BPF Loader. ที่อยู่ (address) ของ account เหล่านี้จะถูกเรียกว่า program_id และจะเอาไว้อ้างอิงในการทำ transactions ต่อไป.

Solana สนับสนุน BPF Loaders หลายแบบ, เช่น Upgradable BPF Loaderopen in new window. The BPF Loader จะรับผิดชอบดูแล program’s account และทำให้ clients ใช้ได้ผ่าน program_id. ทุก programs มี entry point ทางเดียว และเป็นที่ประมวลผล instruction (process_instruction) และ parameters ที่จะต้องมีเสมอคือ:

  • program_id: pubkey
  • accounts: array,
  • instruction_data: byte array

เมื่อเกิดการเรียกใช้ (invoke) programs มันจะถูกดำเนินการ (execute) โดย Solana Runtime.

แหล่งข้อมูลอื่น

Last Updated:
Contributors: Todsaporn Banjerdkit