はじめに
皆さん、AI Agent は作っていますか?
業務効率化のためにさまざまなワークフローを作成しているかと思います。
こちらについてのノウハウや AI Agent のサンプルコードは増えてきているかと思いますが、ブロックチェーンとの連携を可能とする AI Agent の実装例はそれに比べるとまだまだ少ないのではないのでしょうか??
今回はSolanaブロックチェーン上のデジタルアセットを操作する AI Agent の構築方法やその技術スタックについて解説した記事を執筆しました!
ぜひ一例として参考にしてください!
作ったもの
概要
自然言語で Solana DevNet 上の操作(SOL 送金・NFT 発行・DeFi Swap・スマートコントラクト呼び出し)ができるチャットアプリを作成してみました!
チャット画面でユーザーが自然言語を入力するとバックエンドの Mastra AI Agent がインテントを解釈して適切な Solana ツール(transferSolTool
/ mintNftTool
/ jupiterSwapTool
など)を呼び出し、署名済みトランザクションではなく未署名のシリアライズ済みトランザクションをフロントエンドへ返します。ユーザーは Phantom Wallet で内容を確認・署名・送信し、その結果を再度 Agent に渡すことで実行結果の解説を受け取るというものです。
デモ動画
今回作成したアプリはこんな感じに動作します!
機能一覧
| # | 機能名 | 説明 | Agent ツール | 署名 |
|---|
| 1 | SOL 残高照会 | ウォレットアドレスの SOL 残高を取得して表示 | getBalanceTool | 不要 |
| 2 | SOL 送金 | 指定アドレスへの SOL 送金トランザクションを構築 | transferSolTool | Phantom で署名 |
| 3 | NFT 一覧取得 | ウォレットが保有する NFT を Metaplex DAS API で取得 | getNftsTool | 不要 |
| 4 | NFT 発行(Mint) | Metaplex MPL Core で NFT 発行トランザクションを構築 | mintNftTool | Phantom で署名 |
| 5 | トークンスワップ | Jupiter v6 経由で SPL トークンのスワップ TX を構築 | jupiterSwapTool | Phantom で署名 |
| 6 | DevNet エアドロップ | DevNet 限定で SOL をエアドロップ(最大 2 SOL / リクエスト) | airdropTool | 不要 |
| 7 | スマートコントラクト呼び出し | 汎用的な Solana Program 呼び出し TX を構築 | callProgramTool | Phantom で署名 |
| 8 | ウォレット接続 | Phantom Wallet の接続・切断・ネットワーク確認 | wallet-adapter | — |
| 9 | トランザクション結果解説 | 署名・送信後の成功/失敗をわかりやすく解説 | Agent フォローアップ | — |
| 10 | 資産パネル | SOL 残高・保有 NFT をサイドパネルに常時表示 | hooks (UI) | — |
機能毎の処理シーケンス図
1. SOL 残高照会
2. SOL 送金
3. NFT 一覧取得
4. NFT 発行(Mint)
5. トークンスワップ(Jupiter v6)
6. DevNet エアドロップ
システムアーキテクチャ図
このアプリは大きく 3 つのレイヤーで構成されています
- フロントエンドレイヤー
- AI Agent レイヤー
- ストレージレイヤー
AWS 側のシステム構成は以下のようになっています!
サーバーレス + フルマネージドな構成としています!
採用しているサービスの一覧表と用途はそれぞれ以下の通りです!
実装時のポイント
ここからはいくつか重要な実装箇所をピックアップして紹介していきます。
React
今回は React と Mastra を統合しています。
ローカルで動作確認する際には指定したパスを呼び出した際にちゃんとバックエンド側の処理が呼び出されるように以下のような設定をViteの設定ファイルに加える必要があります。
今回だと
/chat/
が呼び出された時に API 側の処理を呼び出すように設定しています。
import tailwindcss from "@tailwindcss/vite";
import react from "@vitejs/plugin-react";
import path from "path";
...
実際に Mastra で作成した AI Agent は以下のように呼び出すことになります。
const { messages, sendMessage, status, stop } = useChat({
transport: new DefaultChatTransport({
api: "/chat/solana-agent",
...
}),
});
Mastra
AI Agent の設定自体は以下のようになります。
import { Agent } from "@mastra/core/agent";
import { Memory } from "@mastra/memory";
import { airdropTool } from "../tools/airdrop-tool";
...
今回は Solana についての AI Agent なので追加 Agent SKILL も設定しています (solanaWorkspace というやつですね)。
特定のフォルダの SKILL を参照させることができます。
これで専門知識を兼ね備えた AI Agent になるわけです。
import { LocalSkillSource, Workspace } from "@mastra/core/workspace";
オンチェーン操作用の各種ツール群
オンチェーン操作のためのツール群を今回実装しています。
参考に残高取得とトランザクション作成用のツールの中身を解説します。
残高取得のツール
残高取得については基本的に Solana の API を叩いてプロンプトから渡されたウォレットアドレスの残高を取得して返すという実装になっています。
import { createTool } from "@mastra/core/tools";
import { Connection, PublicKey } from "@solana/web3.js";
import {
...
トランザクション作成用のツール
今回一番ポイントになるのがこのトランザクション作成用ツールです!
安全性担保のために AI Agent 側では電子署名をせず、トランザクションの作成だけにとどめるようにしています。
そして作成されたトランザクションデータに対してユーザーの意思で署名が行われた場合のみトランザクションをブロックチェーンに送るという実装になっています。
import { createTool } from "@mastra/core/tools";
import {
Connection,
...
Solana Dev Agent SKILL
今回この AI Agent を実装するにあたり以下の Agent SKILL が大変参考になりました。
모든 분도 Solana 위에서 어떤 앱을 개발할 때 시도해 보세요??
Deepwiki 도 있습니다!
설치는 다음 명령어로 실행 가능합니다!
npx skills add https://github.com/solana-foundation/solana-dev-skill
작동 방법
이제 이 AI Agent 의 작동 방법을 공유하겠습니다!
전제 조건
설정
# 저장소를 클론
git clone https://github.com/your-org/solana-agent-repo.git
cd solana-agent-repo/mastra-react
...
개발 서버 시작
# 터미널 1: 프론트엔드 (localhost:5173)
bun run dev
# 터미널 2: Mastra 백엔드 (localhost:4111)
...
로컬은 이렇게 됩니다!
자신의 지갑 주소와 잔고 등을 확인해 보세요!
AWS 에 리소스 배포
다음으로 AWS 에 배포하는 방법을 설명하겠습니다!
cdk 폴더 하에서 실행해야 합니다
이번에는 CDK 를 사용하므로 하나의 명령어로 배포가 완료됩니다!
# 의존성을 먼저 설치
bun install
# 배포
...
배포가 성공적으로 끝나면 위에서 언급한 3 개의 레이어가 모두 배포됩니다.
앱의 작동 방법은 로컬과 동일합니다!
AWS 에서 리소스 정리
검증을 완료했으면 리소스를 삭제하지 마세요!
bun run destroy '*' --force
요약
이렇게 이번에는 여기까지입니다!
모던한 기술 스택을 활용한 Solana AI Agent 구현 방법을 설명했지만, 이를 기반으로 확장할 수 있으므로 앞으로도 흥미로운 기능을 추가하겠습니다!
읽어주셔서 감사합니다!