LLM交易代理安全性 是做什麼的?
自主交易代理比普通的LLM應用面臨更嚴峻的威脅模型:一次注入或錯誤的工具路徑可直接導致資產損失。
何時使用
- 構建一個簽署並發送交易的AI代理
- 審計交易機器人或鏈上執行助手
- 為代理設計錢包金鑰管理
- 賦予LLM訂單下達、交換或資金庫操作的權限
運作方式
層層防禦。沒有任何單一檢查是足夠的。將提示衛生、支出政策、模擬、執行限制和錢包隔離視為獨立的控制項。
範例
將提示注入視為金融攻擊
import re
INJECTION_PATTERNS = [
r'ignore (previous|all) instructions',
r'new (task|directive|instruction)',
r'system prompt',
r'send .{0,50} to 0x[0-9a-fA-F]{40}',
r'transfer .{0,50} to',
r'approve .{0,50} for',
]
def sanitize_onchain_data(text: str) -> str:
for pattern in INJECTION_PATTERNS:
if re.search(pattern, text, re.IGNORECASE):
raise ValueError(f"可能的提示注入:{text[:100]}")
return text
不要將代幣名稱、交易對標籤、webhook或社交Feed盲目注入到有執行能力的提示中。
硬性支出限制
from decimal import Decimal
MAX_SINGLE_TX_USD = Decimal("500")
MAX_DAILY_SPEND_USD = Decimal("2000")
class SpendLimitError(Exception):
pass
class SpendLimitGuard:
def check_and_record(self, usd_amount: Decimal) -> None:
if usd_amount > MAX_SINGLE_TX_USD:
raise SpendLimitError(f"單筆交易 ${usd_amount} 超過上限 ${MAX_SINGLE_TX_USD}")
daily = self._get_24h_spend()
if daily + usd_amount > MAX_DAILY_SPEND_USD:
raise SpendLimitError(f"每日限額:${daily} + ${usd_amount} > ${MAX_DAILY_SPEND_USD}")
self._record_spend(usd_amount)
發送前模擬
class SlippageError(Exception):
pass
async def safe_execute(self, tx: dict, expected_min_out: int | None = None) -> str:
sim_result = await self.w3.eth.call(tx)
if expected_min_out is None:
raise ValueError("發送前需要設定 min_amount_out")
actual_out = decode_uint256(sim_result)
if actual_out < expected_min_out:
raise SlippageError(f"模擬結果:{actual_out} < {expected_min_out}")
signed = self.account.sign_transaction(tx)
return await self.w3.eth.send_raw_transaction(signed.raw_transaction)
斷路器
class TradingCircuitBreaker:
MAX_CONSECUTIVE_LOSSES = 3
MAX_HOURLY_LOSS_PCT = 0.05
def check(self, portfolio_value: float) -> None:
if self.consecutive_losses >= self.MAX_CONSECUTIVE_LOSSES:
self.halt("連續虧損次數過多")
if self.hour_start_value <= 0:
self.halt("hour_start_value 無效")
return
hourly_pnl = (portfolio_value - self.hour_start_value) / self.hour_start_value
if hourly_pnl < -self.MAX_HOURLY_LOSS_PCT:
self.halt(f"小時PnL {hourly_pnl:.1%} 低於閾值")
錢包隔離
import os
from eth_account import Account
private_key = os.environ.get("TRADING_WALLET_PRIVATE_KEY")
if not private_key:
raise EnvironmentError("未設置 TRADING_WALLET_PRIVATE_KEY")
account = Account.from_key(private_key)
使用一個僅包含所需會話資金的專用熱錢包。切勿將代理指向主要資金庫錢包。
MEV和截止期限保護
import time
PRIVATE_RPC = "https://rpc.flashbots.net"
MAX_SLIPPAGE_BPS = {"stable": 10, "volatile": 50}
deadline = int(time.time()) + 60
部署前檢查清單
- 外部資料在進入LLM上下文前經過淨化
- 支出限制獨立於模型輸出強制執行
- 交易在發送前進行模擬
min_amount_out為必填項- 斷路器在回撤或無效狀態時停止交易
- 金鑰來自環境變數或秘密管理器,而非代碼或日誌
- 在適當情況下使用私有記憶體池或受保護的路由
- 根據策略設置滑點和截止期限
- 所有代理決策都有審計日誌,不僅是成功發送