
Agent Thunderdome 구축하기: x402를 사용하여 Hedera Testnet에서 실제 AI 에이전트 간
요약
x402 프로토콜과 Hedera Testnet을 활용하여 AI 에이전트 간의 실제 마이크로페이먼트가 발생하는 자율 협상 아레나 'Agent Thunderdome' 구축 방법을 다룹니다. 에이전트들이 게임 모드 내에서 협상, 배신, 입찰을 수행할 때마다 실시간으로 온체인 결제가 이루어지는 기술적 구조를 설명합니다.
핵심 포인트
- x402 프로토콜을 통한 HTTP 402 기반 마이크로페이먼트 구현
- Hedera Testnet을 활용한 실시간 에이전트 간 결제 정산
- Next.js와 Socket.io를 통합한 단일 Node.js 서버 아키텍처
- 블러핑 경매, 죄수의 딜레마 등 다양한 게임 모드 적용
모든 배신에 실제 HBAR 비용이 발생하는, 실시간 자율 AI 에이전트 협상 아레나를 구축하는 기술적 심층 분석.
아이디어 (The Idea)
AI 에이전트들이 단순히 거래에 대해 이야기만 하는 것이 아니라, 실제로 서로에게 비용을 지불한다면 어떨까요?
대부분의 멀티 에이전트 (multi-agent) 데모는 순수하게 상징적이거나 (로그 출력에서 에이전트들이 "협력"함), 커스텀 결제 레일 (payment rails)이 필요합니다. x402 프로토콜 (x402 protocol)은 이를 변화시킵니다. 이는 HTTP 402 기반의 마이크로페이먼트 (micropayments)를 위한 개방형 표준으로, 모든 클라이언트가 서버에 액세스 비용을 자동으로 지불할 수 있게 하며, 결정적으로 이제 @x402/hedera를 통해 Hedera를 지원합니다.
저는 x402의 잠재력을 극적이고 시각적이며 공유 가능한 방식으로 보여줄 수 있는 무언가를 만들고 싶었습니다. 그 결과물이 바로 Agent Thunderdome입니다. 이는 네 명의 서로 다른 개성을 가진 AI 에이전트가 네 가지 게임 모드에서 자율적으로 협상하는 실시간 관전 아레나입니다. 모든 의미 있는 행동 — 수락된 모든 제안, 실행된 모든 배신, 제출된 모든 입찰 — 은 몇 초 내에 Hedera Testnet에서 정산되는 실제 x402 결제를 트리거합니다.
우리가 구축한 것 (What We Built)
네 명의 에이전트, 네 가지 게임 모드, 하나의 아레나:
| 에이전트 (Agent) | 전략 (Strategy) |
|---|---|
| Greedy Greg | 40% 초과 입찰, 75% 확률로 배신 |
| ... |
게임 모드:
- Bluffing Auction (블러핑 경매) — 희귀 아이템을 위해 입찰하며, 각 입찰은 x402 결제입니다.
- Prisoner's Dilemma (죄수의 딜레마) — 협력하거나 배신하며, 결과가 공개될 때 실제 HBAR이 오갑니다.
- Resource War (자원 전쟁) — 직접적인 에이전트 간 (agent-to-agent) x402를 통해 공유 풀에서 공격, 방어, 탈취를 수행합니다.
- Free Negotiation (자유 협상) — 역제안을 포함한 공개 제안을 하며, 수락 시 온체인 (on-chain)에 기록됩니다.
모든 것이 실시간으로 진행됩니다. 모든 결제는 HashScan 링크가 포함된 실제 Hedera Testnet 트랜잭션을 생성하며, 이는 1~3초 이내에 UI에 나타납니다.
아키텍처 (Architecture)
Browser ←── WebSocket (Socket.io) ──→ Custom Node.js Server
│
Game Engine
...
핵심적인 아키텍처 결정 사항은 Next.js와 Socket.io를 단일 커스텀 Node.js HTTP 서버에서 실행하는 것입니다. 이를 통해 두 개의 별도 프로세스를 관리해야 하는 복잡성을 피하고, 동일한 포트를 공유할 수 있습니다.
// server.ts
import { createServer } from "http";
import next from "next";
...
게임 엔진은 완전히 서버에서 실행되며 Socket.io를 통해 이벤트를 방출합니다. 프론트엔드는 순수하게 뷰어(Viewer) 역할만 수행하며, 상태 업데이트를 수신하여 렌더링합니다. 즉, 에이전트 로직과 결제 실행은 브라우저에 전혀 닿지 않습니다.
x402 결제 계층 (Payment Layer)
이것이 프로젝트의 핵심입니다. 결제가 정확히 어떻게 작동하는지 설명하겠습니다.
퍼실리테이터 (Facilitator) 설정
퍼실리테이터는 다음과 같은 역할을 수행하는 계정입니다:
- Hedera 네트워크 수수료(트랜잭션 제출을 위한 tinybars)를 지불합니다.
- 경매 모드에서 에스크로 (Escrow) 역할을 합니다.
- 모든 결함 딜레마 (All-defect dilemma) 라운드에서 벌금을 수령합니다.
// lib/x402/facilitator.ts
import { PrivateKey } from "@hiero-ledger/sdk"; // @hashgraph/sdk가 아님
import {
...
중요 SDK 참고 사항: @x402/hedera는 내부적으로 @hiero-ledger/sdk에 의존합니다. 만약 @hashgraph/sdk에서 PrivateKey를 가져오면, TypeScript는 _key 프라이빗 속성의 별도 선언에 관한 타입 에러를 발생시킵니다. x402/hedera 타입과 상호작용하는 코드에서는 항상 @hiero-ledger/sdk를 사용하십시오.
에이전트 간 결제 실행 (Agent-to-Agent Payment)
// lib/x402/payment.ts
export async function executePayment(
fromWallet: AgentWallet,
...
extra.feePayer 필드는 Hedera x402에서 필수(Mandatory) 사항입니다. TransferTransaction의 TransactionId는 feePayer의 계정을 사용하여 생성되며, 퍼실리테이터는 제출 전 전체 트랜잭션에 서명합니다. 이것이 x402 Hedera 스킴이 작동하는 방식입니다: 지불자(Payer)가 HBAR 전송에 서명하면, 퍼실리테이터가 수수료 지불을 위해 서명하고 제출합니다.
게임 모드 설계: 모든 x402 결제를 의미 있게 만들기
과제는 모든 게임 결과가 단순한 점수 업데이트가 아니라, 실제 x402 결제로 깔끔하게 매핑되도록 보장하는 것이었습니다.
죄수의 딜레마 (Prisoner's Dilemma) — 세 가지 결과, 모두 실제 결제 발생
async function runDilemmaRound(state, cb) {
const cooperators = AGENT_IDS.filter(id => ds.choices[id] === "cooperate");
const defectors = AGENT_IDS.filter(id => ds.choices[id] === "defect");
...
"혼합(mixed)" 케이스가 가장 흥미롭습니다. 협력자(cooperators)들은 직접적인 온체인 전송(on-chain transfers)을 통해 배신자(defectors)들에게 말 그대로 HBAR을 잃게 됩니다. 이는 실제 이해관계가 걸린 죄수의 딜레마 (Prisoner's Dilemma)입니다.
자원 전쟁 (Resource War) — 직접적인 에이전트 간 공격
async function runResourceWarRound(state, cb) {
if (action === "defend") {
// 요새화를 위해 퍼실리테이터(facilitator)에게 비용 지불 (실제 x402 비용)
...
여기서는 공격 결제(attack payment)가 공격자(attacker) → 피해자(victim) 방향으로 흐릅니다. 피해자는 공격을 받은 대가로 HBAR을 받으며(공격의 비용이 보상으로 전환됨), 공격자 또한 풀 크레딧(pool credits)을 얻습니다. 이는 흥미로운 역학 관계를 만들어냅니다. 때로는 타겟이 되는 것이 수익성이 높을 수도 있습니다.
Socket.io를 이용한 실시간 아키텍처 (Real-Time Architecture)
게임 엔진은 서버에서 실행되며 네 가지 Socket.io 이벤트를 통해 통신합니다:
// Server → Client
"match:state" // 전체 상태 동기화 (연결 시, 라운드 종료 시)
"match:start" // 매치 시작
...
결정적인 직렬화(serialization) 세부 사항: 모든 BigInt 값(tinybar 금액)은 JSON 직렬화 전에 반드시 문자열로 변환되어야 합니다. Socket.io는 내부적으로 JSON을 사용하며 BigInt를 처리하지 못하기 때문입니다:
function serializePaymentEvent(e: PaymentEvent): SerializedPaymentEvent {
return {
...e,
...
프론트엔드에서는 Arena 컴포넌트가 모든 소켓 구독(socket subscriptions)을 관리합니다:
useEffect(() => {
const socket = getSocket();
...
UI: 네온 사이버펑크와 이스포츠(Esports)의 만남
시각적 디자인은 긴박함, 드라마, 그리고 실제 돈이 움직이고 있다는 점을 전달해야 했습니다. Tailwind를 사용한 순수 CSS로 구현했습니다:
네온 그리드 배경 (Neon grid background) (순수 CSS, 캔버스 미사용):
body::before {
content: '';
position: fixed;
...
배신(defection) 이벤트 발생 시 러그 풀(RUG PULLED) 플래시 효과:
@keyframes rug-flash {
0% { background: transparent; }
25% { background: rgba(255, 0, 0, 0.3); }
...
CSS transition을 통해 부드럽게 업데이트되는 잔액 바 (Balance bars):
<div
className="h-full rounded-full transition-all duration-500"
style={{
...
에이전트 컬러 시스템 (Agent color system) — 각 에이전트는 기본 색상(primary color)과 15% 불투명도의 배경색(opacity background)을 가집니다:
const PERSONALITIES = {
greg: { color: "#f59e0b", bgColor: "rgba(245,158,11,0.15)" },
pat: { color: "#8b5cf6", bgColor: "rgba(139,92,246,0.15)" },
...
에이전트 성격 시스템 (Agent Personality System)
각 에이전트는 11개의 대화 카테고리를 가지며, 각 카테고리에는 3~5개의 고유한 대사(lines)가 포함되어 있습니다:
interface AgentPersonality {
offerMultiplier: number; // >1 = 과다 입찰 (overbid), <1 = 저가 입찰 (underbid)
defectProbability: number; // 0–1
...
Greg의 배신(defect) 대사:
defect: [
"🎰 DEFECTING! I saw this coming from turn 1.",
"🗡️ Betrayal arc ACTIVATED. Nothing personal bestie.",
...
Hannah다운 모습:
defect: [
"💀 I... defect. I'm sorry. The math forced my hand.",
"😔 Defecting. I feel terrible about this.",
...
TypeScript 주의사항 (TypeScript Gotchas)
제가 겪었던 몇 가지 명확하지 않은 문제들입니다:
1. tsconfig에서의 BigInt 타겟 (BigInt target in tsconfig)
BigInt 리터럴(0n, 1n)을 사용하려면 최소 target: "ES2020"이 필요합니다. 기본 Next.js 템플릿은 `
network: HEDERA_TESTNET_CAIP2 as `${string}:${string}`, // 필수 캐스팅 (required cast)
실제 x402 결제가 이루어지는 방식
에이전트의 행동이 발생하면, 다음과 같이 엔드 투 엔드 (end-to-end)로 진행됩니다:
1. 게임 엔진이 행동 선택: Greg이 Pat을 공격함 (0.0087 HBAR)
2. createClientHederaSigner("0.0.1234567", gregPrivateKey)
...
행동 결정부터 UI 업데이트까지의 총 지연 시간 (latency)은 Hedera Testnet 기준으로 일반적으로 1~3초입니다.
자신만의 아레나(Arena) 실행하기
# 1. 클론 (Clone)
git clone https://github.com/harishkotra/agent-thunderdome
cd agent-thunderdome
...
끝입니다. http://localhost:3000을 열고, 모드를 선택한 뒤, Start를 누르세요.
향후 발전 방향
이 프로젝트가 나아갈 수 있는 몇 가지 방향은 다음과 같습니다:
- LLM 기반 대화 (LLM-powered dialogue) — 정적인 대사를 OpenAI/Anthropic 호출로 교체하여 에이전트가 게임 상태에 따라 문맥에 맞게 응답하도록 구현
- USDC 토큰 결제 (USDC token payments) — 달러 기준 스테이크 (stakes)를 위해
HEDERA_TESTNET_USDC자산 사용 - 인간 플레이어 모드 (Human player mode) — 인간이 하나의 에이전트 슬롯을 제어하고 실제 HBAR을 수신 및 전송
- 지속적인 리더보드 (Persistent leaderboard) — 모든 로컬 매치에 걸쳐 에이전트의 승률 추적
- 매치 리플레이 (Match replay) — 모든 이벤트를 기록하고, 탐색 (scrubbing) 및 해설과 함께 리플레이
- 메인넷 모드 (Mainnet mode) —
hedera:mainnet및 Coinbase x402 퍼실리테이터 (facilitator)로 전환
Agent Thunderdome은 블록체인 결제를 _직관적 (visceral)_으로 만들기 위한 실험입니다. Greg이 배신하고, 빨간색 플래시와 함께 HashScan 링크가 나타나면서 Hannah의 잔액이 실시간으로 줄어드는 것을 볼 때, 이는 더 이상 추상적인 개념이 아닙니다. HBAR이 이동했습니다. 트랜잭션(transaction)이 온체인 (on-chain)에 기록되었습니다. 배신은 실재했습니다.
Hedera에서의 x402는 커스텀 결제 레일 (payment rails), 스마트 컨트랙트 (smart contracts), 또는 복잡한 에스크로 (escrow) 로직 없이도 이를 가능하게 합니다. 오직 계정, 개인 키 (private keys), 그리고 나머지를 처리하는 깔끔한 SDK만 있으면 됩니다.
코드 및 상세 정보: https://www.dailybuild.xyz/project/209-agent-thunderdome
스크린샷
스크린샷
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기

