Солана Блинкови – Блокчејн који „живи” у твом претраживачу

Серија текстова о програмирању на Солана блокчејну се наставља! Апликација за гласање је давно готова и полако идем даље! Замисли да читаш објаву на X-у (Твитеру) и желиш да донираш 0.1 SOL свом омиљеном креатору. Уместо да копираш адресу, отвараш новчаник, пакујеш трансакцију и чекаш – ти само кликнеш на дугме директно у објави. То су Блинкови (Blockchain Links).

Шта су заправо Блинкови?

Једноставном аналогијом: Ако је традиционални блокчејн као одлазак у банку да попуниш налог, Блинк је као QR код на рачуну у кафићу. Све је већ спремно, твоје је само да одобриш.

Како то ради испод хаубе?

Блинкови се ослањају на Solana Actions. То су API ендпоинти који враћају трансакцију коју корисник треба да потпише. Када новчаник (попут Phantom-а или Backpack-а) препозна специјални URL, он га „распакује” и приказује ти лепо дугме уместо сувопарног линка.

Солана блинк у акцији

Пример кода (TypeScript/Next.js)

Ево како изгледа једноставан API ендпоинт који омогућава некоме да ти пошаље „бакшиш” од 1 SOL преко Блинка.

import { ActionPostResponse, ACTIONS_CORS_HEADERS, createPostResponse } from "@solana/actions";
import { PublicKey, SystemProgram, Transaction, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js";

// Постављамо износ бакшиша
const TIP_AMOUNT_SOL = 0.1;

export const POST = async (req: Request) => {
const { account } = await req.json();
const userPubKey = new PublicKey(account);
const myPubKey = new PublicKey("TVOJA_SOLANA_ADRESA_OVDE");

// Повезивање на Солана мрежу (Mainnet или Devnet)
const connection = new Connection("https://api.mainnet-beta.solana.com");

// 🚨 ПРОВЕРА СТАЊА НОВЧАНИКА
const balance = await connection.getBalance(userPubKey);
const requiredAmount = TIP_AMOUNT_SOL * LAMPORTS_PER_SOL;

if (balance < requiredAmount) {
return new Response(
JSON.stringify({ message: "Упс! Немаш довољно SOL-а за ову кафу. ☕" }),
{ status: 400, headers: ACTIONS_CORS_HEADERS }
);
}

// Ако је све у реду, настављамо са трансакцијом
const transaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: userPubKey,
toPubkey: myPubKey,
lamports: requiredAmount,
})
);

transaction.feePayer = userPubKey;
const { blockhash } = await connection.getLatestBlockhash();
transaction.recentBlockhash = blockhash;

const payload: ActionPostResponse = await createPostResponse({
fields: {
transaction,
message: `Успешно си послао ${TIP_AMOUNT_SOL} SOL! Хвала пуно! ✨`,
},
});

return Response.json(payload, { headers: ACTIONS_CORS_HEADERS });
};

Детаљно објашњење кода:

  • connection.getBalance(userPubKey): Ова функција „зове” Солану и враћа стање новчаника у Lamports (мања јединица, 1SOL = 10^9 Lamports).
  • Логички услов (if): Проверавамо да ли је стање мање од потребног износа. Ако јесте, враћамо status: 400 и поруку коју ће новчаник приказати кориснику.
  • Оптимизација: Ово штеди кориснику време јер трансакција неће ни бити послата на мрежу ако је осуђена на неуспех.

Идеје за примену:

Оваква провера је кључна за Ticket Sales (да провериш да ли корисник има довољно новца за карту) или за Whitelist провере (где уместо стања провераваш да ли новчаник поседује одређени NFT).