如何在 Solana 上构建安全的 AI 代理

Solana 上交易的人工智能代理的激增引发了人们对自主代理进行金融交易的强烈猜测。

当前这波人工智能代币 24 小时交易量超过 10 亿美元,市值超过 95 亿美元。[1]但在这些投机市场之外,加密货币领域已经在发生更深层次的转变——这种转变建立在多年来自动化程度不断提高的基础上。

机器人已经推动了绝大多数加密交易,在某些加密领域甚至高达 90%。[2]这些还不是完全自主的人工智能代理。但它们显然是先驱,随着时间的推移,它们会变得更加通用和独立。

它们的流行强调了一些关键的东西:加密基础设施特别适合程序化、自主交易。

安全挑战:AI 代理如何安全地访问 Solana 钱包?

随着 Solana 及其他领域中 AI 代理的崛起,一个重大的安全挑战也随之出现:自主系统如何在不损害安全性的情况下访问钱包? 

要执行链上操作,AI 代理需要访问钱包。但存储在代码中的私钥会带来大量漏洞: 

  • 它们是攻击者的主要目标
  • 它们容易出现代码错误,从而导致资金损失 
  • 开发商很少会以隔离资金的方式构建这些资产
  • 它们可能会为人工智能的恶意行为打开大门

这些风险的一个真实例子发生在 2024 年 9 月,当时攻击者利用了基于 Telegram 的交易机器人 Banana Gun 的一个漏洞。其消息预言机中的一个漏洞让黑客从用户的钱包中窃取了 300 万美元。

具有直接钱包访问权限的机器人或代理可能会因漏洞、错误或未经检查的决策循环而进行意外、不可逆转的交易。

平衡安全性和自主性 

传统解决方案迫使开发人员在安全性和真正的代理自主性之间做出选择。传统方法要么暴露私钥,要么需要集中保管,这两种情况对于生产系统来说都是不可接受的。

Turnkey提供了一种解决方案,这是一种高度灵活的密钥管理基础设施,专为安全性、规模和自动化而构建。Turnkey 无需暴露私钥,而是允许 AI 代理通过范围化、策略控制的 API 访问与钱包进行交互。

工作原理如下: 

范围 API 密钥

AI 代理接收与特定钱包和操作相关的有限 API 凭证。

细粒度策略

开发人员可以准确定义 AI 代理可以做什么——无论是在特定条件下签署交易、与特定智能合约交互,还是执行速率限制。

用户控制

最终用户或开发人员可以保留对钱包的全部权限,同时将特定操作委托给 AI 代理。

为什么有效:

这种方法确保人工智能代理无需持有原始私钥即可自主与链上资产交互,从而解决安全问题,同时保留加密货币的无需信任、无需许可的性质。

此外,Turnkey 的可验证计算环境允许团队在任何人都可以验证正在运行的代码的环境中部署 AI 代理。稍后将详细介绍。

让我们来看一个实际示例,向一个简单的机器人提供具有钱包权限的 API 密钥。从这里开始,开发人员可以采取下一步行动:将机器人发展为完全自主的 AI 代理。

如何创建 Solana AI 代理

让我们使用 Turnkey 构建一个安全的交易机器人。我们将介绍:

  • 设置具有策略控制的 Solana 钱包 
  • 为机器人创建仅 API 用户 
  • 定义策略来限制机器人的行为 
  • 使用 Jupiter Exchange 实现简单的交易功能

先决条件

在深入研究代码之前,您必须安装 Node.js 和 npm。

您还需要一个交钥匙帐户

立即创建 Solana 钱包

登录您的 Turnkey 仪表板然后:

  • 导航至钱包
  • 点击创建新钱包
  • 选择SolanaED25519作为你的钱包设置
  • 向该钱包注入一些 SOL 以进行交易
Create a new Solana wallet in the Turnkey dashboard.

为您的机器人创建仅限 API 的用户

下一个:

  • 转到“用户”选项卡
  • 单击“添加用户”
  • 在访问类型下选择API 密钥
  • 给它起个名字(例如“Trading Bot Alpha”)
Create a Solana wallet API key using Turnkey

记下用户 ID,然后单击批准。您将需要此密钥来进行策略配置。

复制 API 私钥将其保存在安全的地方

通过策略限制你的机器人

首先,导航到“策略”选项卡并单击“添加新策略”。然后,配置策略以限制机器人可以采取的操作。让我们定义一个策略来确保机器人:

  • 只能执行代币转移(不支持其他交易类型)
  • 仅可交易 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 代理

确保人工智能代理安全交易不仅仅是为了保护钱包访问,还为了验证代理是否正在运行它声称正在运行的代码。

想象一个人工智能代理可以安全地进行交易并在完全可验证的环境中运行的世界。在这个环境中,任何人都可以独立确认代理运行的代码到底是什么。

Turnkey 的可验证计算基础设施使任何人都可以验证安全区域内运行的软件——解决了当今可信软件的最大挑战之一。

Turnkey 的核心是利用可信执行环境 (TEE),特别是 AWS Nitro Enclaves,为运行敏感操作提供防篡改环境。这些 Enclaves 作为隔离的虚拟机运行,没有持久存储、没有外部网络访问,启动后也无法修改。这可以保证 Enclave 调配后,其代码和数据不会受到外部干扰(包括来自基础设施提供商本身的干扰)。

然而,仅有安全执行是不够的,可验证性才是关键。Turnkey 通过三项关键创新实现了这一点:

1. 远程证明

每个 Turnkey 安全区都会生成一个加密证明,以精确证明其正在运行的代码。此证明包括安全区的操作系统和应用程序二进制文件的哈希值,由 AWS 的 Nitro 安全模块 (NSM) 签名。很快,任何人都可以独立验证此证明,以确认安全区运行预期的软件。

2. QuorumOS(QOS)

专为可验证性而设计的极简开源操作系统。QOS确保每个 enclave 仅运行经过批准的可审计代码,并提供 QOS 清单 - 机器可读的证明,将 enclave 的执行与可公开验证的软件指纹联系起来

3. StageX 和可重复构建

为了消除供应链攻击的风险,Turnkey 强制执行可重现的构建。任何在安全区内运行的二进制文件都可以从人类可读的源代码独立重新编译,以验证它没有被更改。这确保了开发人员审查的代码与在安全环境中运行的软件之间的 1:1 映射。

通过结合 TEE、远程认证和可重现构建,Turnkey 可以运行具有绝对可验证性的应用程序 - 无论是钱包安全、加密签名还是 AI 代理执行。这种架构超越了传统的云安全模型(假定信任),转向了安全性可证明、透明且分散的新范式。

为什么这对人工智能代理很重要

可验证的执行环境提高了安全性,并拓宽了自主系统、金融应用程序和任何需要可证明信任的服务的设计空间。 

当用户可以独立验证在安全区中运行的软件时,就会出现新的可能性——例如无需信任的人工智能执行,开发人员和用户可以自信地避开“绿野仙踪”代理(即假装是真实人工智能代理的人类演员)。

除了可验证的 AI,团队还可以部署从链下协处理器到可信预言机和 AI 推理引擎等一切。所有这些都具有加密证明,证明它们完全按照承诺执行,并且无法单方面更新。下表列出了一些可以从迁移到可验证环境中受益的敏感工作负载示例:

想要参与并以可验证的方式运行您自己的关键应用程序吗?

Turnkey 团队目前正在与精选团队合作,在完全可验证的执行环境中部署 AI 代理和其他应用程序——任何人都可以验证幕后运行的确切代码。

其他资源

  1. CoinGecko — AI 代理市值
  2. QZ—— 90% 的稳定币交易由机器人完成
  3. Turnkey 的新白皮书
  4. Turnkey 官方网站
  5. 联系我们,探讨部署可验证的人工智能

本文由 SlerfTools 翻译自 How to Build a Secure AI Agent on Solana