メインコンテンツまでスキップ

「integration」タグの記事が1件件あります

Platform integrations

すべてのタグを見る

Solana 上の PYUSD: 実践的な統合ガイド (BlockEden.xyz RPC を活用)

· 約12分
Dora Noda
Software Engineer

PayPal USD (PYUSD) が Solana に上陸しました。これはデジタル決済における重要な節目となります。このガイドでは、エンジニアが Solana 上のウォレット、dApps、およびコマースプラットフォームに PYUSD を統合するための、本番環境を意識した直接的な手順を説明します。

すべての例では、最新の Token-2022 対応コードを使用しており、BlockEden.xyz の低遅延な Solana RPC エンドポイントでシームレスに動作するように設計されています。

要約(TL;DR)

  • 内容: PayPal USD (PYUSD) は、Solana 上のネイティブな Token-2022 SPL トークンであり、世界的に認知されたステーブルコインの高速かつ低手数料な決済を提供します。
  • 主要パラメータ: Mint 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo、小数点以下桁数 6、トークンプログラム Token-2022
  • 機能セット: Solana Token Extensions (Token-2022) を活用しています。Transfer Hook は初期化されていますが現在は非アクティブ(null プログラム)で、機密送金機能やその他の拡張機能も備えています。
  • クロスチェーン: 公式の LayerZero 統合により、従来のブリッジを介さず、安全な Burn-and-Mint(焼却と鋳造)メカニズムを通じて Ethereum と Solana 間で PYUSD を移動できます。
  • アクション: BlockEden.xyz の信頼性の高い Solana RPC を使用して、アプリケーションに PYUSD サポートを追加するためのドロップインテンプレートとしてこのガイドを活用してください。

なぜ Solana 上の PYUSD が重要なのか

PayPal のブランド力と Solana のパフォーマンスの組み合わせは、デジタルドルのための強力な新しいレールを作り出します。

  1. 消費者の信頼と Crypto UX の融合: PYUSD は規制対象の信託会社である Paxos によって発行され、PayPal および Venmo に深く統合されています。これにより、ユーザーは馴染みのある資産を保有できます。ユーザーは単一の PYUSD 残高を保持し、Ethereum または Solana のいずれかの外部ウォレットへの出金を選択できるため、チェーンの複雑さが抽象化されます。
  2. 決済対応のレール: Solana のアーキテクチャは、1 秒未満のトランザクション確定と 1 セント未満の手数料を提供します。PYUSD は、この効率的な決済ネットワークの上に安定した認識しやすい計算単位を重ねることで、決済、コマース、送金に理想的なものとなります。
  3. 機関グレードのコントロール: Token-2022 トークンとしてローンチすることで、PYUSD は機密送金、豊富なメタデータ、恒久的な委任者(Permanent Delegate)などの組み込み拡張機能を利用できます。これにより、独自で監査の困難なスマートコントラクトを必要とせずに、高度なコンプライアンスと機能を実現できます。

絶対に必要な基本情報(固定項目)

コードを書く前に、これらのパラメータを確定させてください。詐欺トークンとのやり取りを避けるため、常に信頼できるエクスプローラーで Mint アドレスを確認してください

  • Mint (メインネット): 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
  • 小数点以下桁数 (Decimals): 6 (1 PYUSD = 1,000,000 最小単位)
  • トークンプログラム: Token-2022 (プログラム ID: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb)
  • 使用されている Token Extensions (ミント時):
    • Metadata & Metadata Pointer
    • Permanent Delegate
    • Transfer Hook (null プログラムで初期化)
    • Confidential Transfer Configuration

これらはすべて Solana Explorer で確認できます。エクスプローラーには、公式の Mint アドレスと有効化された拡張機能が明確に表示されます。

プロジェクトのセットアップ

環境を準備しましょう。Token-2022 との完全な互換性を確保するために、最新の Solana web3 および SPL トークンライブラリが必要になります。

1. ライブラリ

npm から必要なパッケージをインストールします。

npm i @solana/web3.js @solana/spl-token

2. RPC 接続

アプリケーションを BlockEden.xyz の Solana メインネット RPC URL に指定します。本番環境では、環境変数の使用が不可欠です。

// package.json
// npm i @solana/web3.js @solana/spl-token

import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import {
TOKEN_2022_PROGRAM_ID,
getMint,
getOrCreateAssociatedTokenAccount,
getAssociatedTokenAddress,
createTransferCheckedInstruction,
} from "@solana/spl-token";

// ダッシュボードから取得した BlockEden.xyz Solana RPC URL を使用してください
const RPC_ENDPOINT =
process.env.SOLANA_RPC_URL ??
"[https://your-blockeden-solana-mainnet-endpoint.com](https://your-blockeden-solana-mainnet-endpoint.com)";
export const connection = new Connection(RPC_ENDPOINT, "confirmed");

// PYUSD (メインネット)
export const PYUSD_MINT = new PublicKey(
"2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo",
);

PYUSD Mint データの読み取り

まず、プログラムで PYUSD ミントのプロパティを確認しましょう。これは、定数が正しいことを確認し、総供給量などの詳細を取得するための重要な最初のステップです。

// Token-2022 API を介して PYUSD ミント情報を確認する
const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID, // プログラム ID を指定
);

console.log({
supply: mintInfo.supply.toString(),
decimals: mintInfo.decimals, // 6 を期待
isInitialized: mintInfo.isInitialized,
});

TOKEN_2022_PROGRAM_ID を明示的に渡していることに注意してください。これは、Token Extensions を使用する際によくあるエラーの原因です。

Associated Token Accounts (ATA) の作成または取得

Token-2022 トークンの Associated Token Account は、必ず Token-2022 プログラム ID を使用して派生させる必要があります。レガシーな TOKEN_PROGRAM_ID を使用すると、トランザクションは "incorrect program id" エラーで失敗します。

// 新しい ATA の支払者および所有者。ウォレットのロジックに置き換えてください。
const owner = Keypair.generate();

// 所有者の PYUSD ATA を作成または取得(Token-2022 対応)
const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner, // 作成のための支払者
PYUSD_MINT, // ミント
owner.publicKey, // ATA の所有者
false, // allowOwnerOffCurve
"confirmed",
undefined, // オプション
TOKEN_2022_PROGRAM_ID, // <-- 重要: Token-2022 プログラム ID を使用
);

console.log("Owner PYUSD ATA:", ownerAta.address.toBase58());

PYUSD 残高の確認

ユーザーの PYUSD 残高を確認するには、正しいプログラム ID を指定することを忘れずに ATA を照会します。

@solana/spl-token を使用する場合

import { getAccount } from "@solana/spl-token";

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

const balance = Number(accountInfo.amount) / 10 ** mintInfo.decimals; // decimals = 6
console.log("PYUSD balance:", balance);

直接 JSON-RPC (curl) を使用する場合

所有者のすべてのトークンアカウントを確認し、Token-2022 プログラム ID でフィルタリングすることもできます。

curl -X POST "$SOLANA_RPC_URL" -H 'content-type: application/json' -d '{
"jsonrpc":"2.0",
"id":1,
"method":"getTokenAccountsByOwner",
"params":[
"<OWNER_PUBLIC_KEY>",
{ "programId":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" },
{ "encoding":"jsonParsed" }
]
}'

PYUSD の送金(ユーザー間)

Token-2022 資産を送金する際の鉄則は、createTransferCheckedInstruction を使用することです。この命令にはトークンの小数点以下桁数が含まれており、小数点関連の潜在的な脆弱性を防ぐことができます。

以下は、PYUSD 送金のための完全で再利用可能な関数です。

import { Transaction } from '@solana/web3.js';

async function transferPyusd({
fromWallet, // 送信者の Keypair
toPubkey, // 受信者の PublicKey
uiAmount, // PYUSD 単位の金額(例:1.25)
}: {
fromWallet: Keypair;
toPubkey: PublicKey;
uiAmount: number;
}) {
const decimals = 6; // mintInfo.decimals から取得
const rawAmount = BigInt(Math.round(uiAmount * (10 ** decimals)));

// 送信者の ATA アドレスを取得
const fromAta = await getAssociatedTokenAddress(
PYUSD_MINT,
fromWallet.publicKey,
false,
TOKEN_2022_PROGRAM_ID
);

// 受信者の Token-2022 用 ATA が存在することを確認
const toAta = await getOrCreateAssociatedTokenAccount(
connection,
fromWallet, // 支払者
PYUSD_MINT,
toPubkey,
false,
'confirmed',
undefined,
TOKEN_2022_PROGRAM_ID
);

const transferInstruction = createTransferCheckedInstruction(
fromAta, // 送信元 ATA
PYUSD_MINT, // ミント
toAta.address, // 送信先 ATA
fromWallet.publicKey, // 送信元 ATA の所有者
rawAmount, // 最小単位での金額
decimals, // 小数点以下桁数
[], // マルチシグ署名者
TOKEN_2022_PROGRAM_ID // <-- 重要
);

const transaction = new Transaction().add(transferInstruction);

// 最新のブロックハッシュと手数料支払者を設定
transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
transaction.feePayer = fromWallet.publicKey;

const signature = await connection.sendTransaction(transaction, [fromWallet]);
await connection.confirmTransaction(signature, 'confirmed');

console.log('Transaction successful with signature:', signature);
return signature;
}

Transfer Hook に関する注意: PYUSD のミントは Transfer Hook 拡張機能を初期化していますが、そのプログラムを null に設定しています。これは、標準的な送金が現時点では追加のアカウントやロジックなしで動作することを意味します。PayPal/Paxos がフックをアクティブにする場合、ミントを更新して新しいプログラムを指すようにします。その場合、統合にはそのプログラムのインターフェースで要求される追加のアカウントを渡す必要があります。

Solana CLI によるクイックテスト

コマンドラインから素早く手動テストを行うには、正しいプログラム ID を指定して spl-token を使用します。

# CLI がメインネットを指しており、キーペアに資金があることを確認してください。
# 受信者に 1.00 PYUSD を送金します。
spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb \
transfer 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo 1.00 <RECIPIENT_PUBKEY> \
--fund-recipient --allow-unfunded-recipient

クロスチェーン PYUSD (Ethereum ↔ Solana)

PayPal は、LayerZero を使用した公式のクロスチェーン機能を実装しました。リスクのあるサードパーティ製ブリッジに頼る代わりに、これはネイティブな Burn-and-Mint(焼却と鋳造)プロセスです。PYUSD は送信元チェーン(例:Ethereum)でバーンされ、同等の量が送信先チェーン(Solana)でミントされます。これにより、ブリッジ固有のリスクやスリッページが排除されます。

詳細なチュートリアルとパラメータは、公式の PayPal 開発者ドキュメント で確認できます。

蛇口(Faucet)でのテスト

開発とテストには、メインネットの資産を使用しないでください。公式の蛇口を使用してください。

  • Paxos PYUSD Faucet: テストネットの PYUSD トークンを取得するため。
  • Solana Faucet: トランザクション手数料のためのデブネット/テストネット SOL を取得するため。

よくある落とし穴(とその解決策)

  1. 間違ったプログラム ID: 問題: トランザクションが incorrect program id for instruction で失敗する。解決策: すべての spl-token ヘルパー関数(getOrCreateAssociatedTokenAccountgetAccountcreateTransferCheckedInstruction など)に TOKEN_2022_PROGRAM_ID を明示的に渡します。
  2. 間違ったミントまたは偽造資産: 問題: アプリケーションが偽の PYUSD トークンとやり取りしてしまう。解決策: 公式のミントアドレス 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo をハードコードして検証します。正規のミントではない場合に警告を出すエクスプローラーを使用してください。
  3. 小数点以下の不一致: 問題: 1 PYUSD を送ったつもりが、実際には 0.000001 PYUSD しか送られない。解決策: 常に UI 上の金額に 10^6 を掛けて最小単位に変換します。安全のためにミントの小数点以下桁数をプログラムで取得してください。
  4. フックに関する想定: 問題: アクティブではない Transfer Hook のために複雑なロジックを事前に構築してしまう。解決策: ミントの拡張データを確認してください。現時点では、PYUSD のフックは null です。将来フックプログラムが有効になった場合に適応できるようにシステムを構築してください。

PYUSD + BlockEden.xyz の本番環境チェックリスト

本番環境に移行する際は、インフラストラクチャが堅牢であることを確認してください。

  • RPC: 高可用な BlockEden.xyz エンドポイントを使用してください。レスポンスの良い UX のためには confirmed コミットメントを使用し、台帳の整合性が必要な操作には finalized でクエリを実行してください。
  • リトライと冪等性: トランザクションの送信を指数バックオフのリトライメカニズムでラップしてください。重複送金を防ぐために、各ビジネス操作に冪等性キーを保存してください。
  • オブザーバビリティ: トランザクション署名、スロット番号、およびトランザクション後の残高をログに記録してください。BlockEden.xyz の WebSocket サブスクリプションを使用して、アプリケーションのバックエンドでリアルタイムの決済シグナルを取得してください。
  • コンプライアンス: Token-2022 はコンプライアンスのためのプリミティブを提供します。トラベルルールなどの機能を実装する必要がある場合、拡張モデルを使用することで、ビジネスロジックをトークンのコア機能から切り離してクリーンに実装できます。

付録 A — クイックリファレンス

  • Mint (メインネット): 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
  • 小数点以下桁数: 6
  • トークンプログラム ID: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
  • 背景: PayPal は 2024 年 5 月 29 日に Solana サポートを発表しました。
  • 公式ドキュメント: Solana Token Extensions, PayPal 開発者ポータル

付録 B — 直接 JSON-RPC 呼び出し (curl)

ミントアカウント情報の取得と所有者の確認

この呼び出しはミントアカウントデータを取得し、その所有者が Token-2022 プログラムであることを確認できるようにします。

# BlockEden.xyz RPC URL に置き換えてください
curl -s -X POST "$SOLANA_RPC_URL" -H 'content-type: application/json' -d '{
"jsonrpc":"2.0","id":1,"method":"getAccountInfo",
"params":["2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo",
{"encoding":"base64","commitment":"confirmed"}]
}'

# JSON レスポンスで、"owner" フィールドが "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" と一致する必要があります。

ユーザーのすべての PYUSD トークンアカウントを一覧表示

これは、特定のユーザーのすべての PYUSD 保有資産を検出する必要があるウォレットに役立ちます。

curl -s -X POST "$SOLANA_RPC_URL" -H 'content-type: application/json' -d '{
"jsonrpc":"2.0",
"id":1,
"method":"getTokenAccountsByOwner",
"params":[
"<OWNER_PUBLIC_KEY>",
{"mint":"2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo"},
{"encoding":"jsonParsed","commitment":"confirmed"}
]
}'

構築の準備はできましたか? 高パフォーマンスな BlockEden.xyz RPC エンドポイント を取得して、今すぐ決済の未来の統合を始めましょう。