วิธีใช้ Solana API: คู่มือฉบับสมบูรณ์สำหรับนักพัฒนา

Ashley Goolam

Ashley Goolam

6 February 2026

วิธีใช้ Solana API: คู่มือฉบับสมบูรณ์สำหรับนักพัฒนา

จะเป็นอย่างไรหากคุณสามารถสร้างแอปพลิเคชันบล็อกเชนที่ประมวลผลธุรกรรมได้ 65,000 รายการต่อวินาทีด้วยความสมบูรณ์ของธุรกรรมภายใน 400 มิลลิวินาที? API ของ Solana ทำให้สิ่งนี้เป็นไปได้ โดยนำเสนออินเทอร์เฟซ JSON-RPC ที่ช่วยให้คุณสามารถสอบถามบัญชี ส่งธุรกรรม และสมัครรับการอัปเดตแบบเรียลไทม์โดยไม่ต้องจัดการโครงสร้างพื้นฐานของผู้ตรวจสอบความถูกต้องด้วยตนเอง

การพัฒนาบล็อกเชนแบบดั้งเดิมบังคับให้คุณต้องเลือกระหว่างความเร็วและการกระจายอำนาจ 15 TPS ของ Ethereum สร้างคอขวดระหว่างที่เครือข่ายแออัด โซลูชัน Layer 2 เพิ่มความซับซ้อน Solana ขจัดข้อแลกเปลี่ยนนี้ด้วยกลไกฉันทามติแบบ Proof-of-History (PoH) ที่รวมเข้ากับ Proof-of-Stake (PoS) ซึ่งให้ประสิทธิภาพระดับ Web2 พร้อมการรับประกันของ Web3 คุณสามารถสร้างแอปพลิเคชันที่ให้ความรู้สึกฉับไวในขณะที่ยังคงรักษาการต่อต้านการเซ็นเซอร์

สารบัญ:

💡
เมื่อสร้างแอปพลิเคชัน Solana การจัดการ RPC endpoints หลายจุดและการแก้ไขข้อผิดพลาดในการทำธุรกรรมจะมีความซับซ้อน Apidog ให้บริการ การทดสอบ API แบบภาพ, เอกสารประกอบอัตโนมัติ และคุณสมบัติการทำงานร่วมกันเป็นทีมที่ออกแบบมาโดยเฉพาะสำหรับการพัฒนาบล็อกเชน ลองใช้ Apidog ฟรี เพื่อปรับปรุงเวิร์กโฟลว์ Solana ของคุณ—ไม่ต้องใช้บัตรเครดิต
button

ทำความเข้าใจสถาปัตยกรรมของ Solana

Solana ใช้สถาปัตยกรรมที่เป็นเอกลักษณ์ซึ่งมีศูนย์กลางอยู่ที่ Solana Program Library (SPL) และรันไทม์ที่มีปริมาณงานสูง การทำความเข้าใจพื้นฐานเหล่านี้ช่วยให้คุณสามารถเขียนการเรียก API ได้อย่างมีประสิทธิภาพ

Proof of History (PoH)

PoH สร้างการประทับเวลาทางเข้ารหัสสำหรับทุกธุรกรรมก่อนที่จะเกิดฉันทามติ ซึ่งช่วยลดความจำเป็นที่โหนดต้องตกลงเรื่องเวลาลงไปได้มาก ลดความหน่วงเวลาลงอย่างมาก เมื่อคุณส่งธุรกรรมผ่าน API ธุรกรรมจะได้รับการประทับเวลาทันทีและเข้าสู่คิวของผู้นำเพื่อรอการประมวลผล

บัญชีและโปรแกรม

ต่างจากโมเดลที่อิงบัญชีของ Ethereum ซึ่งมีการจัดเก็บโค้ด Solana แยกโค้ด (โปรแกรม) ออกจากข้อมูล (บัญชี) โปรแกรมไม่มีสถานะ—โดยมีเพียงตรรกะที่สามารถประมวลผลได้ บัญชีจะจัดเก็บข้อมูลและระบุว่าโปรแกรมใดเป็นเจ้าของ สถาปัตยกรรมนี้ช่วยให้การประมวลผลธุรกรรมแบบขนานเป็นไปได้ เนื่องจากบัญชีที่ไม่ซ้ำซ้อนกันสามารถดำเนินการพร้อมกันได้

ทุกบัญชีมีที่อยู่ 32 ไบต์ที่ไม่ซ้ำกัน ซึ่งได้มาจากคีย์สาธารณะ Ed25519 บัญชีจะจ่ายค่าธรรมเนียม (rent) เป็น lamports (1 SOL = 10^9 lamports) เพื่อให้อยู่บนเชนต่อไป บัญชีที่ได้รับการยกเว้นค่าธรรมเนียม—คือบัญชีที่ถือค่าธรรมเนียมอย่างน้อย 2 ปี—จะคงอยู่ตลอดไปโดยไม่เสื่อมสลาย

ระดับการยืนยัน (Commitment Levels)

Solana มีระดับการยืนยันสามระดับ:

ระบุระดับการยืนยันในการเรียก API เพื่อสร้างสมดุลระหว่างความเร็วกับการรับประกันความสมบูรณ์ของธุรกรรม

solana api

การตั้งค่าสภาพแวดล้อมการพัฒนาของคุณ

คุณต้องมีสามองค์ประกอบ: Solana CLI สำหรับการจัดการคีย์และการปรับใช้, RPC endpoint สำหรับการเข้าถึงบล็อกเชน และ JavaScript SDK สำหรับการรวมแอปพลิเคชัน

การติดตั้ง Solana CLI

ติดตั้งเครื่องมือ CLI อย่างเป็นทางการ:

sh -c "$(curl -sSfL https://release.solana.com/stable/install)"

ตรวจสอบการติดตั้ง:

solana --version

กำหนดค่าสภาพแวดล้อมของคุณสำหรับ Devnet (สำหรับการทดสอบ) หรือ Mainnet (สำหรับการผลิต):

# For development
solana config set --url https://api.devnet.solana.com

# For production
solana config set --url https://api.mainnet-beta.solana.com

การสร้างกระเป๋าเงิน

สร้างคู่คีย์ใหม่สำหรับการลงนามธุรกรรม:

solana-keygen new --outfile ~/.config/solana/id.json

CLI จะแสดงที่อยู่สาธารณะของคุณและวลีรหัสผ่าน 12 คำ (seed phrase) จัดเก็บวลีรหัสผ่านอย่างปลอดภัย—ซึ่งใช้ในการกู้คืนกระเป๋าเงินของคุณ ไฟล์ JSON มีคีย์ส่วนตัวของคุณ; ปกป้องด้วยการตั้งค่าสิทธิ์ไฟล์ (chmod 600)

ตรวจสอบยอดคงเหลือของคุณ:

solana balance

เติมเงินในกระเป๋าเงิน Devnet ของคุณด้วย SOL ฟรี:

solana airdrop 2

การแจกจ่าย Airdrop ของ Devnet จะให้ 2 SOL ต่อคำขอ จำกัดเพียงหนึ่งคำขอต่อ 10 วินาที สำหรับ Mainnet จำเป็นต้องซื้อ SOL ผ่านการแลกเปลี่ยน

การเลือกผู้ให้บริการ RPC

แม้ว่า Solana จะมี RPC endpoints สาธารณะ แต่แอปพลิเคชันที่ใช้งานจริงจำเป็นต้องมีโครงสร้างพื้นฐานเฉพาะ ตัวเลือกได้แก่:

โดยทั่วไปแล้วแพ็กเกจฟรีจะอนุญาตให้ส่งคำขอได้ 100,000 ครั้งต่อเดือน แผนแบบชำระเงินจะเสนอขีดจำกัดที่สูงขึ้น, การเชื่อมต่อแบบ Stake สำหรับการยืนยันธุรกรรม และ API สำหรับค่าธรรมเนียมลำดับความสำคัญ

การติดตั้ง Web3.js

Solana's JavaScript SDK มีสองเวอร์ชันหลัก เวอร์ชัน 2.0 เป็นการเขียนใหม่ทั้งหมดด้วยรูปแบบการเขียนโปรแกรมเชิงฟังก์ชัน, ความสามารถในการตัดโค้ดที่ไม่จำเป็นออก (tree-shakability) และไม่มีการพึ่งพาใดๆ (zero dependencies)

ติดตั้งเวอร์ชัน 2.0:

npm install @solana/web3.js@2 @solana-program/system @solana-program/compute-budget

สำหรับการใช้งานร่วมกับเวอร์ชัน 1.x:

npm install @solana/web3.js
เคล็ดลับApidogSolana

วิธีการ Core Solana RPC API

JSON-RPC ของ Solana API มี HTTP endpoints สำหรับการสอบถามและ WebSocket endpoints สำหรับการสมัครรับข้อมูล คำขอทั้งหมดเป็นไปตามข้อกำหนด JSON-RPC 2.0

Core Solana RPC API Methods

การดำเนินการเกี่ยวกับบัญชี

รับข้อมูลบัญชีและยอดคงเหลือ:

curl https://api.devnet.solana.com \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getAccountInfo",
    "params": [
      "vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36zEGQp",
      {"encoding": "base58"}
    ]
  }'

เรียกข้อมูลหลายบัญชีอย่างมีประสิทธิภาพ:

curl https://api.devnet.solana.com \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getMultipleAccounts",
    "params": [
      [
        "vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36zEGQp",
        "4fYNw3dojWGPgVMtUU7ziPwq1r2VMGrhCrKZC9EQTbkV"
      ],
      {"encoding": "base64"}
    ]
  }'

การสอบถามบล็อกและธุรกรรม

รับ blockhash ล่าสุดสำหรับการสร้างธุรกรรม:

curl https://api.devnet.solana.com \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getLatestBlockhash",
    "params": [{"commitment": "confirmed"}]
  }'

สอบถามสถานะธุรกรรม:

curl https://api.devnet.solana.com \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getSignatureStatuses",
    "params": [
      [
        "5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpEz7CmGVZxhEHppBrGK"
      ],
      {"searchTransactionHistory": true}
    ]
  }'

การสมัครรับข้อมูล WebSocket

ตรวจสอบการเปลี่ยนแปลงบัญชีแบบเรียลไทม์:

import { createSolanaRpcSubscriptions } from "@solana/web3.js";

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

const abortController = new AbortController();

await rpcSubscriptions.accountNotifications(
  "vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36zEGQp",
  { commitment: "confirmed" },
  (notification) => {
    console.log("Account changed:", notification);
  },
  { abortSignal: abortController.signal }
);

// Stop listening after 60 seconds
setTimeout(() => abortController.abort(), 60000);

การเชื่อมต่อ WebSocket ต้องมีการส่ง ping เป็นระยะทุกๆ 30-60 วินาทีเพื่อให้ยังคงทำงานอยู่ได้ ใช้วิธีการเชื่อมต่อใหม่ (reconnection logic) สำหรับแอปพลิเคชันที่ใช้งานจริง

เคล็ดลับมือโปรApidogSolana

การสร้างธุรกรรมด้วย Web3.js

ธุรกรรมของ Solana ประกอบด้วยคำสั่งตั้งแต่หนึ่งคำสั่งขึ้นไปที่มุ่งเป้าไปที่โปรแกรมเฉพาะ แต่ละคำสั่งจะระบุโปรแกรม บัญชีที่โปรแกรมโต้ตอบด้วย และข้อมูลที่ถูกจัดเรียง (serialized data)

การสร้างธุรกรรมการโอน

โอน SOL ระหว่างบัญชีโดยใช้ SDK เวอร์ชัน 2.0:

import {
  airdropFactory,
  createKeyPairSignerFromBytes,
  createSolanaRpc,
  createSolanaRpcSubscriptions,
  generateKeyPairSigner,
  lamports,
  sendAndConfirmTransactionFactory,
  pipe,
  createTransactionMessage,
  setTransactionMessageFeePayer,
  setTransactionMessageLifetimeUsingBlockhash,
  appendTransactionMessageInstruction,
  signTransactionMessageWithSigners,
  getSignatureFromTransaction,
} from "@solana/web3.js";
import { getTransferSolInstruction } from "@solana-program/system";

const LAMPORTS_PER_SOL = BigInt(1_000_000_000);

// Setup RPC connections
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const rpcSubscriptions = createSolanaRpcSubscriptions("wss://api.devnet.solana.com");
const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });

// Generate sender and recipient
const sender = await generateKeyPairSigner();
const recipient = await generateKeyPairSigner();

// Fund sender with airdrop
await airdropFactory({ rpc, rpcSubscriptions })({
  recipientAddress: sender.address,
  lamports: lamports(2n * LAMPORTS_PER_SOL),
  commitment: "confirmed",
});

// Get latest blockhash
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();

// Build transaction using pipe
const transactionMessage = pipe(
  createTransactionMessage({ version: 0 }),
  (msg) => setTransactionMessageFeePayer(sender.address, msg),
  (msg) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, msg),
  (msg) => appendTransactionMessageInstruction(
    getTransferSolInstruction({
      amount: lamports(LAMPORTS_PER_SOL / BigInt(2)),
      destination: recipient.address,
      source: sender,
    }),
    msg
  )
);

// Sign and send
const signedTransaction = await signTransactionMessageWithSigners(transactionMessage);
console.log("Transaction signed");

await sendAndConfirmTransaction(signedTransaction, {
  commitment: "confirmed",
  maxRetries: 0n,
  skipPreflight: true,
});

console.log("Confirmed:", getSignatureFromTransaction(signedTransaction));

ฟังก์ชัน pipe สร้างสายโซ่ฟังก์ชันที่แต่ละขั้นตอนจะแปลงข้อความธุรกรรม รูปแบบนี้ช่วยขจัดสถานะที่เปลี่ยนแปลงได้ (mutable state) และทำให้การสร้างธุรกรรมเป็นแบบประกาศ (declarative)

การปรับปรุงประสิทธิภาพด้วยค่าธรรมเนียมลำดับความสำคัญ (Priority Fees)

ในระหว่างที่เครือข่ายแออัด ค่าธรรมเนียมลำดับความสำคัญ (priority fees) ช่วยให้มั่นใจว่าธุรกรรมจะถูกรวมอยู่ด้วย ดึงค่าธรรมเนียมที่แนะนำจาก Helius API:

import { getBase64EncodedWireTransaction } from "@solana/web3.js";

const base64Transaction = getBase64EncodedWireTransaction(signedTransaction);

const response = await fetch("https://mainnet.helius-rpc.com/?api-key=YOUR_KEY", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    jsonrpc: "2.0",
    id: "priority-fee-request",
    method: "getPriorityFeeEstimate",
    params: [{
      transaction: base64Transaction,
      options: { recommended: true }
    }]
  })
});

const { result } = await response.json();
const priorityFee = result.priorityFeeEstimate;

// Add priority fee instruction
import { getSetComputeUnitPriceInstruction } from "@solana-program/compute-budget";

const optimizedMessage = pipe(
  transactionMessage,
  (msg) => appendTransactionMessageInstruction(
    getSetComputeUnitPriceInstruction({ microLamports: priorityFee }),
    msg
  )
);

ค่าธรรมเนียมลำดับความสำคัญจะระบุเป็น micro-lamports ต่อ compute unit ค่าธรรมเนียมที่สูงขึ้นจะเพิ่มลำดับความสำคัญของธุรกรรมในระหว่างที่เครือข่ายแออัด

การจัดการข้อผิดพลาด

Solana จะส่งคืนรหัสข้อผิดพลาดเฉพาะสำหรับข้อผิดพลาดทั่วไป:

import { isSolanaError, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE } from "@solana/web3.js";

try {
  await sendAndConfirmTransaction(signedTransaction);
} catch (error) {
  if (isSolanaError(error)) {
    switch (error.contextErrorCode) {
      case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE:
        console.error("Preflight failed:", error.message);
        break;
      default:
        console.error("Solana error:", error);
    }
  }
}

ข้อผิดพลาดทั่วไป ได้แก่ เงินไม่เพียงพอ (0x1), blockhash ไม่ถูกต้อง (หมดอายุ) และบัญชีถูกใช้งานอยู่ (ข้อขัดแย้งในการทำธุรกรรม)

แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัย

ปริมาณงานที่สูงของ Solana ทำให้เกิดข้อพิจารณาด้านความปลอดภัยที่ไม่เหมือนใคร ใช้วิธีการเหล่านี้เพื่อปกป้องแอปพลิเคชันและผู้ใช้ของคุณ

การจัดการคีย์

ห้ามคอมมิตคีย์ส่วนตัวไปยังระบบควบคุมเวอร์ชัน (version control) โดยเด็ดขาด ใช้ตัวแปรสภาพแวดล้อม (environment variables) แทน:

# .env
SOLANA_PRIVATE_KEY="[1,2,3,...]"

โหลดคีย์อย่างปลอดภัยในแอปพลิเคชันของคุณ:

import { createKeyPairSignerFromBytes } from "@solana/web3.js";
import { getBase58Encoder } from "@solana/codecs";

const secretKey = JSON.parse(process.env.SOLANA_PRIVATE_KEY);
const signer = await createKeyPairSignerFromBytes(
  new Uint8Array(secretKey)
);

สำหรับแอปพลิเคชันเบราว์เซอร์ ให้รวมอะแดปเตอร์กระเป๋าเงิน (เช่น Phantom, Solflare) แทนที่จะจัดการคีย์ส่วนตัวโดยตรง ผู้ใช้ลงนามธุรกรรมผ่านส่วนขยายกระเป๋าเงินของตน เพื่อรักษาคีย์ให้ปลอดภัย

การจำลองธุรกรรม

ควรจำลองธุรกรรมก่อนส่งเสมอเพื่อตรวจจับข้อผิดพลาดตั้งแต่เนิ่นๆ:

const simulationResult = await rpc.simulateTransaction(signedTransaction).send();

if (simulationResult.value.err) {
  console.error("Simulation failed:", simulationResult.value.err);
  // Handle error without wasting fees
}

การจำลองจะดำเนินการธุรกรรมกับสถานะปัจจุบันโดยไม่ทำการคอมมิตการเปลี่ยนแปลง ซึ่งจะเผยให้เห็นข้อผิดพลาดทางตรรกะ บัญชีไม่เพียงพอ และการละเมิดงบประมาณการคำนวณ (compute budget)

การป้องกันการเล่นซ้ำ (Replaying Protection)

ธุรกรรมของ Solana จะมี blockhash ล่าสุดที่หมดอายุหลังจากประมาณ 90 วินาที ซึ่งช่วยป้องกันการโจมตีแบบเล่นซ้ำ (replay attacks)—คือการส่งธุรกรรมเดียวกันหลายครั้ง สำหรับการดำเนินการที่ทำซ้ำได้ผลลัพธ์เหมือนเดิม (idempotent operations) ให้สร้างข้อมูลคำสั่งหรือบัญชีที่ไม่ซ้ำกันสำหรับแต่ละธุรกรรม

การจำกัดอัตรา (Rate Limiting)

RPC endpoints สาธารณะมีการจำกัดอัตราที่เข้มงวด (โดยทั่วไปคือ 100 คำขอต่อ 10 วินาที) ใช้วิธี exponential backoff:

async function withRetry(fn, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await fn();
    } catch (error) {
      if (error.status === 429) {
        await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i)));
        continue;
      }
      throw error;
    }
  }
}

สำหรับการใช้งานจริง ให้ใช้โหนด RPC เฉพาะหรือแพ็กเกจผู้ให้บริการแบบชำระเงินที่มีขีดจำกัดสูงกว่า

การตรวจสอบโปรแกรม

ก่อนที่จะโต้ตอบกับโปรแกรมของบุคคลที่สาม ให้ตรวจสอบซอร์สโค้ดของโปรแกรมเหล่านั้นบน explorer เช่น SolanaFM หรือ Solscan มองหาเครื่องหมาย "verified" ที่ระบุว่า bytecode ที่ถูกปรับใช้นั้นตรงกับที่เก็บโอเพนซอร์ส โปรแกรมที่ไม่ได้รับการยืนยันอาจมีตรรกะที่เป็นอันตรายที่สามารถดูดเงินของผู้ใช้ไปได้

สรุป

API ของ Solana มอบประสิทธิภาพที่แอปพลิเคชันสมัยใหม่ต้องการ—ความสมบูรณ์ของธุรกรรมภายในหนึ่งวินาที (sub-second finality), ปริมาณงานสูง และค่าธรรมเนียมที่คาดการณ์ได้ คุณสามารถสอบถามสถานะบัญชีผ่าน JSON-RPC, สมัครรับการอัปเดตแบบเรียลไทม์ผ่าน WebSocket และสร้างธุรกรรมโดยใช้ Web3.js 2.0 SDK ที่เป็นเชิงฟังก์ชัน สถาปัตยกรรมที่อิงบัญชีช่วยให้การดำเนินการแบบขนานเป็นไปได้ ในขณะที่ระดับการยืนยัน (commitment levels) ช่วยให้คุณเลือกความสมดุลระหว่างความปลอดภัยและความเร็วได้

เริ่มต้นด้วย Devnet เพื่อทดลองโดยไม่มีความเสี่ยงทางการเงิน ใช้ค่าธรรมเนียมลำดับความสำคัญ (priority fees) ในช่วงที่ Mainnet แออัด ใช้งานการจำลองและการจัดการคีย์ที่เหมาะสมก่อนที่จะปรับใช้แอปพลิเคชันที่ผู้ใช้เข้าถึงได้ ระบบนิเวศของ Solana มีเครื่องมือให้พร้อม; ตรรกะของแอปพลิเคชันของคุณจะเป็นตัวกำหนดคุณค่า

เริ่มต้นใช้งาน Apidog วันนี้—นำเข้า Solana API endpoints ของคุณได้ในไม่กี่วินาที และเริ่มทดสอบได้ทันทีโดยไม่ต้องตั้งค่าใดๆ

button

ฝึกการออกแบบ API แบบ Design-first ใน Apidog

ค้นพบวิธีที่ง่ายขึ้นในการสร้างและใช้ API