신규: 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만 달러를 탈취했습니다.

지갑에 직접 액세스할 수 있는 봇이나 에이전트는 익스플로잇, 버그 또는 통제되지 않은 의사 결정 루프로 인해 의도하지 않은 되돌릴 수 없는 트랜잭션을 실행할 수 있습니다.

보안과 자율성의 균형 

기존 솔루션에서는 개발자가 보안과 진정한 에이전트 자율성 중 하나를 선택해야 합니다. 기존 방식은 개인 키를 노출하거나 중앙화된 수탁을 요구하며, 둘 다 프로덕션 시스템에는 적합하지 않습니다.

해결책 중 하나는 보안, 확장성, 자동화를 위해 설계된 매우 유연한 키 관리 인프라인 Turnkey입니다. Turnkey는 개인 키를 노출하는 대신, AI 에이전트가 범위와 정책이 제어되는 API 액세스를 통해 지갑과 상호작용하도록 지원합니다.

작동 방식은 다음과 같습니다. 

범위가 제한된 API 키

AI 에이전트는 특정 지갑과 작업에 연결된 제한적 API 자격 증명을 받습니다.

세분화된 정책

개발자는 특정 조건에서 트랜잭션에 서명하거나, 특정 스마트 컨트랙트와 상호작용하거나, 속도 제한을 적용하는 등 AI 에이전트가 수행할 수 있는 작업을 정확하게 정의할 수 있습니다.

사용자 제어

최종 사용자나 개발자는 지갑에 대한 모든 권한을 유지하면서 특정 작업만 AI 에이전트에 위임할 수 있습니다.

이 방식이 효과적인 이유:

이 방식에서는 AI 에이전트가 원본 개인 키를 직접 보유하지 않고도 온체인 자산과 자율적으로 상호작용할 수 있습니다. 암호화폐의 무신뢰성과 무허가 특성을 유지하면서 보안 문제를 해결합니다.

또한 Turnkey의 검증 가능한 컴퓨팅 환경을 사용하면 누구나 실행 중인 코드를 검증할 수 있는 환경에 AI 에이전트를 배포할 수 있습니다. 자세한 내용은 뒤에서 살펴보겠습니다.

간단한 봇에 지갑 권한이 있는 API 키를 프로비저닝하는 실용적인 예제를 살펴보겠습니다. 이후 개발자는 봇을 완전 자율형 AI 에이전트로 발전시킬 수 있습니다.

Solana AI 에이전트를 만드는 방법

Turnkey를 사용해 안전한 거래 봇을 구축해 보겠습니다. 다음 내용을 다룹니다.

  • 정책 제어 기능이 있는 Solana 지갑 설정 
  • 봇용 API 전용 사용자 생성 
  • 봇의 동작을 제한하는 정책 정의 
  • Jupiter Exchange를 사용한 간단한 거래 함수 구현

사전 요구 사항

코드를 작성하기 전에 Node.js와 npm을 설치해야 합니다.

Turnkey 계정도 필요합니다.

Turnkey에서 Solana 지갑 만들기

Turnkey 대시보드에 로그인한 후 다음 단계를 따르세요.

  • 지갑으로 이동하세요
  • 새 지갑 만들기를 클릭하세요
  • 지갑 설정으로 Solana와 ED25519를 선택하세요
  • 거래에 사용할 SOL을 이 지갑에 입금하세요

봇용 API 전용 사용자 만들기

다음 단계를 따르세요.

  • 사용자 탭으로 이동하세요
  • 사용자 추가를 클릭하세요
  • 액세스 유형에서 API 키를 선택하세요
  • 이름을 지정하세요(예: "Trading Bot 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의 검증 가능한 컴퓨팅 인프라를 사용하면 누구나 보안 엔클레이브 내부에서 실행되는 소프트웨어를 검증할 수 있습니다. 오늘날 신뢰 기반 소프트웨어가 직면한 가장 큰 과제 중 하나를 해결합니다.

Turnkey는 핵심적으로 신뢰 실행 환경(TEE), 특히 AWS Nitro Enclaves를 활용해 민감한 작업을 실행할 수 있는 변조 방지 환경을 제공합니다. 이러한 엔클레이브는 영구 스토리지와 외부 네트워크 액세스가 없고, 실행 후 수정할 수 없는 격리된 가상 머신으로 작동합니다. 따라서 엔클레이브가 프로비저닝되면 인프라 제공자를 포함한 외부의 간섭으로부터 코드와 데이터를 안전하게 보호할 수 있습니다.

하지만 안전한 실행만으로는 충분하지 않습니다. 중요한 것은 검증 가능성입니다. Turnkey는 세 가지 핵심 혁신으로 이를 구현합니다.

1. 원격 증명

모든 Turnkey 엔클레이브는 실행 중인 코드를 정확하게 인증하는 암호학적 증명을 생성합니다. 이 증명에는 엔클레이브의 운영 체제와 애플리케이션 바이너리 해시가 포함되며, AWS Nitro Secure Module(NSM)이 서명합니다. 곧 누구나 이 증명을 독립적으로 검증해 엔클레이브가 예상된 소프트웨어를 실행하는지 확인할 수 있습니다.

2. QuorumOS (QOS)

검증 가능성을 위해 특별히 설계된 최소형 오픈 소스 운영 체제입니다. QOS는 모든 엔클레이브가 승인되고 감사 가능한 코드만 실행하도록 보장합니다. 또한 엔클레이브의 실행을 공개적으로 검증 가능한 소프트웨어 지문과 연결하는 머신 리더블 증명인 QOS 매니페스트를 제공합니다.

3. StageX 및 재현 가능한 빌드

Turnkey는 공급망 공격 위험을 제거하기 위해 재현 가능한 빌드를 적용합니다. 엔클레이브 내부에서 실행되는 모든 바이너리는 사람이 읽을 수 있는 소스 코드에서 독립적으로 다시 컴파일할 수 있으므로 변경 여부를 검증할 수 있습니다. 이를 통해 개발자가 검토한 코드와 보안 환경에서 실행되는 소프트웨어가 1:1로 일치합니다.

Turnkey는 TEE, 원격 증명, 재현 가능한 빌드를 결합해 지갑 보안, 암호학적 서명, AI 에이전트 실행 등 다양한 애플리케이션을 완전히 검증 가능한 방식으로 실행할 수 있게 합니다. 이 아키텍처는 신뢰를 전제로 하는 기존 클라우드 보안 모델에서 벗어나 보안을 입증할 수 있고 투명하며 탈중앙화된 새로운 패러다임으로 전환합니다.

AI 에이전트에 중요한 이유

검증 가능한 실행 환경은 보안을 개선하고 자율 시스템, 금융 애플리케이션, 입증 가능한 신뢰가 필요한 모든 서비스의 설계 가능성을 넓힙니다. 

사용자가 엔클레이브에서 실행되는 소프트웨어를 독립적으로 검증할 수 있으면 새로운 가능성이 열립니다. 개발자와 사용자가 “오즈의 마법사” 에이전트, 즉 실제 AI 에이전트인 척하는 사람을 안심하고 피할 수 있는 무신뢰 AI 실행이 대표적입니다.

검증 가능한 AI를 넘어, 팀은 오프체인 코프로세서부터 신뢰할 수 있는 오라클과 AI 추론 엔진까지 다양한 시스템을 배포할 수 있습니다. 약속한 그대로 실행되고 일방적으로 업데이트될 수 없다는 사실을 모두 암호학적으로 증명할 수 있습니다. 증명 가능한 환경으로 이전하면 이점을 얻을 수 있는 민감한 워크로드의 예는 아래 표에서 확인할 수 있습니다.

직접 참여해 중요한 애플리케이션을 검증 가능한 방식으로 실행하고 싶으신가요?

Turnkey 팀은 현재 엄선된 팀과 협력해 완전히 검증 가능한 실행 환경에 AI 에이전트와 기타 애플리케이션을 배포하고 있습니다. 누구나 내부에서 실행되는 정확한 코드를 검증할 수 있습니다.

추가 자료

  1. CoinGecko — AI 에이전트 시가총액
  2. QZ — 봇이 스테이블코인 트랜잭션의 90% 처리
  3. Turnkey의 새로운 백서
  4. Turnkey 공식 사이트
  5. 검증 가능한 AI 배포를 알아보려면 문의하세요

Helius 구독하기

최신 Solana 개발 소식을 확인하고 새 게시물 알림을 받아보세요

확대 이미지