新着:HeliusがLight Protocolを買収
Solana AIボットの構築チュートリアル
ブログ/開発

Solanaで安全なAIエージェントを構築する方法

Turnkey スタッフエンジニアXのAndrew MinLinkedInのAndrew Min
読了時間:8分

Solana上で取引するAIエージェントの急増により、自律型エージェントが金融取引を行う可能性をめぐる活発な議論が起きています。

現在のAIトークンの波は、24時間の取引高が10億ドルを超え、時価総額は95億ドル以上に達しています。[1]

しかし、こうした投機市場の先では、長年にわたる自動化の進展を基盤とする、より根本的な変化がすでに暗号資産分野で始まっています。

すでに暗号資産取引の大部分はボットが担っており、一部の領域では最大90%に達します。[2]

これらはまだ完全自律型のAIエージェントではありません。しかし、その明確な前身であり、時間とともに汎用性と自律性を高めています。

その普及は重要な事実を示しています。暗号資産インフラは、プログラムによる自律的な取引に非常に適しています。

セキュリティ上の課題:AIエージェントがSolanaウォレットへ安全にアクセスするには?

Solanaをはじめとする領域でAIエージェントが台頭する中、重大なセキュリティ課題が生じています。自律型システムは、セキュリティを損なわずにウォレットへアクセスするにはどうすればよいのでしょうか?

オンチェーン操作を実行するには、AIエージェントがウォレットへアクセスする必要があります。しかし、コード内に秘密鍵を保存すると、深刻な脆弱性が生じます:

  • 攻撃者の主要な標的になります
  • コードのエラーによって資金を失う可能性があります
  • 資金を分離する形で設計されることはほとんどありません
  • AIの不正な挙動を許す可能性があります

こうしたリスクは、2024年9月に現実のものとなりました。攻撃者がTelegramベースの取引ボットBanana Gunの脆弱性を悪用したのです。メッセージオラクルの欠陥により、ハッカーはユーザーのウォレットから300万ドルを流出させました。

ウォレットへ直接アクセスできるボットやエージェントは、攻撃、バグ、または制御されていない意思決定ループによって、意図しない取り消し不能な取引を実行する可能性があります。

セキュリティと自律性の両立

従来のソリューションでは、開発者はセキュリティと真のエージェント自律性のどちらかを選ばざるを得ません。従来のアプローチは秘密鍵を公開するか、中央集権的なカストディを必要としますが、どちらも本番システムには適していません。

この問題に対するソリューションの1つが、Turnkeyです。Turnkeyは、セキュリティ、スケーラビリティ、自動化のために設計された柔軟性の高い鍵管理インフラです。秘密鍵を公開する代わりに、スコープとポリシーで制御されたAPIアクセスを通じて、AIエージェントがウォレットを操作できるようにします。

仕組みは次のとおりです:

スコープ付きAPIキー

AIエージェントには、特定のウォレットと操作に紐づいた、権限が限定されたAPI認証情報が付与されます。

きめ細かなポリシー

開発者は、特定の条件下でのトランザクション署名、特定のスマートコントラクトとのやり取り、レート制限の適用など、AIエージェントに許可する操作を正確に定義できます。

ユーザーによる制御

エンドユーザーや開発者は、特定の操作をAIエージェントへ委任しながら、ウォレットに対する完全な権限を保持できます。

この仕組みが有効な理由:

このアプローチにより、AIエージェントは生の秘密鍵を保持することなく、オンチェーン資産を自律的に操作できます。暗号資産のトラストレスかつパーミッションレスな性質を維持しながら、セキュリティ上の問題を解決します。

さらに、Turnkeyの検証可能なコンピューティング環境を使えば、実行されるコードを誰でも検証できる環境にAIエージェントをデプロイできます。詳しくは後ほど説明します。

簡単なボットにウォレット権限付きのAPIキーを付与する実践例を見ていきましょう。その後、ボットを完全自律型のAIエージェントへ進化させる次のステップへ進めます。

Solana AIエージェントの作成方法

Turnkeyを使用して、安全な取引ボットを構築します。以下の内容を扱います:

  • ポリシー制御付きSolanaウォレットの設定
  • ボット用のAPI専用ユーザーの作成
  • ボットの動作を制限するポリシーの定義
  • Jupiter Exchangeを使用したシンプルな取引機能の実装

前提条件

コードの作成を始める前に、Node.jsとnpmをインストールしておく必要があります。

Turnkeyアカウントも必要です。

TurnkeyでSolanaウォレットを作成する

Turnkeyダッシュボードへログインし、次の手順を実行します:

  • ウォレットへ移動します
  • Cをクリックし、新しいウォレットを作成を選択します
  • ウォレット設定としてSolanaとED25519を選択します
  • 取引用に、このウォレットへSOLを入金します

ボット用のAPI専用ユーザーを作成する

次に、以下の手順を実行します:

  • ユーザータブへ移動します
  • ユーザーを追加をクリックします
  • アクセスタイプでAPIキーを選択します
  • 名前を付けます(例:取引ボットAlpha)

ユーザーIDを書き留め、承認をクリックします。このキーはポリシーの設定に必要です。

ポリシーでボットを制限する

まず、ポリシータブへ移動し、新しいポリシーを追加をクリックします。次に、ボットが実行できる操作を制限するポリシーを設定します。以下の条件を満たすポリシーを定義します:

  • トークン転送のみを実行できるようにします(ほかのトランザクションタイプは禁止します)
  • SOLとUSDCのみを取引できるようにします
  • 1 SOLを超えるトランザクションを実行できないようにします
コード
{
  "policyName": "AI Trading Bot Policy",
  "effect": "EFFECT_ALLOW",
  "consensus": "approvers.any(user, user.id == '<BOT_USER_ID>')",
  "condition": "solana.tx.instructions.count() == solana.tx.spl_transfers.count() && solana.tx.spl_transfers.all(transfer, transfer.token_mint == '<USDC_MINT>' || transfer.token_mint == '<SOL_MINT>') && solana.tx.spl_transfers.all(transfer, transfer.amount < 1000000000)"
}

プロジェクトを設定する

次に、プロジェクトを作成して依存関係をインストールします。

コード
mkdir ai-trading-bot
cd ai-trading-bot
npm init -y
npm install @solana/web3.js @turnkey/sdk-server @turnkey/solana @jup-ag/api

認証情報を保存するための.envファイルを作成します。

コード
TURNKEY_API_PRIVATE_KEY="YOUR_API_PRIVATE_KEY_HERE"
TURNKEY_API_PUBLIC_KEY="YOUR_API_PUBLIC_KEY_HERE"
TURNKEY_ORGANIZATION_ID="YOUR_TURNKEY_ORGANIZATION_ID_HERE"

シンプルなボットを作成する

それでは、コードを記述します。index.jsファイルを作成してください:

コード
import process from "node:process";
import { Turnkey } from "@turnkey/sdk-server";
import { TurnkeySigner } from "@turnkey/solana";
import {
  Connection,
  clusterApiUrl,
  PublicKey,
  VersionedTransaction
} from "@solana/web3.js";
import { createJupiterApiClient } from "@jup-ag/api";

// Load environment variables
process.loadEnvFile(".env");

// Define token addresses
const USDC = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
const SOL = "So11111111111111111111111111111111111111112";
const BOT_ADDRESS = "YOUR_TURNKEY_WALLET_ADDRESS_HERE";
const BOT_PUBLIC_KEY = new PublicKey(BOT_ADDRESS);

async function main() {
  // Initialize Turnkey and Jupiter clients
  const turnkey = new Turnkey({
    apiBaseUrl: "https://api.turnkey.com",
    apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY,
    apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY,
    defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID,
  });

  const signer = new TurnkeySigner({
    organizationId: process.env.TURNKEY_ORGANIZATION_ID,
    client: turnkey.apiClient(),
  });

  const connection = new Connection(clusterApiUrl("mainnet-beta"), "confirmed");
  const jupiterClient = createJupiterApiClient();

ポリシー制御された認証情報を作成する

ここからが重要です。AIエージェントへウォレットの完全なアクセス権を与える代わりに、ポリシー制御された認証情報を作成します:

コード
const agentUSDCPolicy = {
  "policyName": "Require consensus on Solana transactions containing SPL token transfers of over 1000 USDC",
  "effect": "EFFECT_ALLOW",
  "consensus": "approvers.count() >= 2",
  "condition": "solana.tx.spl_transfers.all(transfer, transfer.token_mint == 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v') && solana.tx.spl_transfers.all(transfer, transfer.amount > 1000000000)",
  "notes": "",
}

const agentSOLPolicy = {
  "policyName": "Require consensus on Solana transactions containing SOL transfers over 1 SOL",
  "effect": "EFFECT_ALLOW",
  "consensus": "approvers.count() >= 2",
  "condition": "solana.tx.transfers.count == 1 && solana.tx.transfers[0].amount > 1000000000",
  "notes": "",
}

const createUSDCPolicyResponse = await turnkey.apiClient().createPolicy(agentUSDCPolicy);

const createSOLPolicyResponse = await turnkey.apiClient().createPolicy(agentSOLPolicy);

ボットの取引機能を実装する

制約を設定したら、取引機能を実装できます:

コード
async function executeTrade(fromToken: string, toToken: string, amount: string) {
  // Get quote from Jupiter
  const quoteResponse = await jupiterClient.quoteGet({
    inputMint: fromToken,
    outputMint: toToken,
    amount: amount
  });

  // Create swap transaction
  const swapResponse = await jupiterClient.swapPost({
    swapRequest: {
      userPublicKey: BOT_PUBLIC_KEY,
      quoteResponse: quoteResponse,
    },
  });

  // Sign and submit transaction
  const transaction = VersionedTransaction.deserialize(
    Buffer.from(swapResponse.swapTransaction, "base64")
  );

  const signedTx = await signer.signTransaction(
    transaction,
    BOT_PUBLIC_KEY
  );

  const txid = await connection.sendRawTransaction(
    signedTx.serialize(),
    { skipPreflight: true, maxRetries: 5 }
  );

  await connection.confirmTransaction(txid);
  return txid;
}

main();

これで完成です!

まだ本格的なAIエージェントではありませんが、このシンプルなポリシー制御型ボットが基盤になります。

ここから自律性を拡張し、意思決定ロジックを追加して、より高度なエージェントへ進化させられます。

高額なトランザクションにマルチシグ承認を必須としたり、エンドユーザーが管理するウォレットへのアクセス権をエージェントへ付与したりすることで、セキュリティをさらに強化できます。

安全なウォレットの先へ:検証可能な環境が安全なAIエージェントを実現する仕組み

AIエージェントによる取引の安全性を確保するには、ウォレットへのアクセスを保護するだけでは不十分です。エージェントが、実行していると主張するコードを実際に実行していることも検証する必要があります。

AIエージェントが安全に取引し、完全に検証可能な環境で動作する世界を想像してみてください。この環境では、エージェントが実行するコードを誰でも独立して正確に確認できます。

Turnkeyの検証可能なコンピューティングインフラでは、安全なエンクレーブ内で動作しているソフトウェアを誰でも検証できます。これにより、現在の信頼できるソフトウェアが抱える最大の課題の1つを解決します。

Turnkeyは中核技術として、Trusted Execution Environment(TEE)、特にAWS Nitro Enclavesを活用し、機密性の高い処理を実行するための改ざん防止環境を提供します。これらのエンクレーブは、永続ストレージも外部ネットワークへのアクセスも持たず、起動後に変更することもできない、隔離された仮想マシンとして動作します。これにより、エンクレーブをプロビジョニングした後は、インフラプロバイダー自身を含む外部からの干渉に対して、コードとデータが安全に保たれます。

ただし、安全に実行できるだけでは不十分です。重要なのは検証可能性です。Turnkeyは、3つの重要な技術革新によってこれを実現しています:

1. リモートアテステーション

各Turnkeyエンクレーブは、実行中のコードを正確に証明する暗号学的証明を生成します。このアテステーションには、エンクレーブのオペレーティングシステムとアプリケーションバイナリのハッシュが含まれ、AWSのNitro Secure Module(NSM)によって署名されます。まもなく誰でもこの証明を独立して検証し、エンクレーブが想定されたソフトウェアを実行していることを確認できるようになります。

2. QuorumOS(QOS)

検証可能性のために特別に設計された、最小構成のオープンソースオペレーティングシステムです。QOSは、各エンクレーブが承認済みで監査可能なコードのみを実行することを保証します。また、エンクレーブでの実行と、公開検証可能なソフトウェアフィンガープリントを結び付ける機械可読な証明、QOS Manifestsを提供します。

3. StageXと再現可能なビルド

サプライチェーン攻撃のリスクを排除するため、Turnkeyは再現可能なビルドを適用します。エンクレーブ内で実行されるすべてのバイナリは、人間が読めるソースコードから独立して再コンパイルでき、改変されていないことを検証できます。これにより、開発者がレビューしたコードと、安全な環境で実行されるソフトウェアが1対1で対応することを保証します。

TEE、リモートアテステーション、再現可能なビルドを組み合わせることで、Turnkeyはウォレットのセキュリティ、暗号署名、AIエージェントの実行など、さまざまな用途で完全に検証可能なアプリケーションの実行を実現します。このアーキテクチャは、信頼を前提とする従来のクラウドセキュリティモデルを超え、セキュリティを証明可能、透明、分散型にする新しいパラダイムへ移行します。

AIエージェントにとって重要な理由

検証可能な実行環境はセキュリティを強化し、自律型システム、金融アプリケーション、証明可能な信頼を必要とするあらゆるサービスの設計可能性を広げます。

ユーザーがエンクレーブ内で動作するソフトウェアを独立して検証できれば、新たな可能性が生まれます。たとえば、開発者とユーザーが「オズの魔法使い」型エージェント、つまり実際のAIエージェントを装う人間を確実に回避できる、トラストレスなAI実行が可能になります。

検証可能なAIだけでなく、チームはオフチェーンのコプロセッサから、信頼できるオラクルやAI推論エンジンまで、あらゆるものをデプロイできます。すべてが宣言どおりに実行され、一方的に更新できないことを暗号学的に証明できます。検証可能な環境への移行によってメリットを得られる、機密性の高いワークロードの例を以下の表に示します:

参加して、独自の重要なアプリケーションを検証可能な形で実行してみませんか?

Turnkeyチームは現在、一部のチームと提携し、完全に検証可能な実行環境へAIエージェントやその他のアプリケーションをデプロイしています。この環境では、裏側で実行されている正確なコードを誰でも検証できます。

その他のリソース

  1. CoinGecko — AIエージェントの時価総額
  2. QZ — ステーブルコイン取引の90%をボットが実行
  3. Turnkeyの新しいホワイトペーパー
  4. Turnkey公式サイト
  5. 検証可能なAIのデプロイについては、お問い合わせください

Heliusを購読

Solana開発の最新情報や新しい記事の公開通知を受け取れます

拡大画像