ChainReason: Ethereum과 DeFi 작업에서 LLM 추론 능력을 다섯 가지 축으로 평가하는 벤치마크

ChainReason 소개

LLM이 코드 생성과 일반 추론에서 좋은 성적을 보이면서, 블록체인이나 DeFi(탈중앙 금융, Decentralized Finance) 같은 도메인 특화 작업에서도 활용 가능성이 함께 논의되고 있습니다. 그러나 기존 Solidity 또는 블록체인 관련 LLM 벤치마크는 코드 생성과 취약점 탐지(vulnerability detection) 두 축에 집중되어 있어, 실제 스마트 컨트랙트 엔지니어나 DeFi 분석가가 일상적으로 다루는 추론 능력을 충분히 평가하지 못합니다. 예를 들어 프로토콜 메커니즘(protocol mechanics)에 대한 개념 이해, 트랜잭션의 의도 분류, AMM(Automated Market Maker) 풀 상태에서의 슬리피지(slippage) 계산처럼 모델이 다른 종류의 추론을 동시에 잘하는지 측정하기 어려운 편입니다. ChainReason은 이러한 빈 곳을 채우기 위해 설계된, Ethereum과 DeFi 작업에 특화된 가벼운 LLM 추론 평가 스위트입니다.

ChainReason의 핵심 접근법은 다섯 가지 서로 다른 추론 축을 하나의 벤치마크 안에 모아 모델의 강·약점을 다차원으로 드러내는 것입니다. 다섯 가지 태스크는 각각 객관식 프로토콜 QA, Solidity 스니펫 취약점 분류, ABI 요약 기반 컨트랙트 분류, 디코드된 액션 시퀀스로부터 트랜잭션 의도 추론, AMM 풀 상태에서의 출력량(슬리피지) 계산입니다. 이렇게 여러 태스크를 함께 다루면 어떤 모델은 취약점 분류에는 강하지만 슬리피지 계산에는 약한지, 또는 트랜잭션 그래프 이해에는 강하지만 프로토콜 QA에는 약한지를 분리해 평가할 수 있습니다. 또한 데이터셋은 의도적으로 작고 손으로 큐레이션되어 있어, 새 모델을 1분 이내에 검증해보는 "건강 검진" 도구로 사용하기 좋게 설계되어 있습니다.

기능 면에서 ChainReason은 단순 점수표가 아니라 태스크 정의, 평가 러너(runner), 결과 집계 스크립트, 새로운 태스크를 등록할 수 있는 확장 인터페이스까지 모두 포함합니다. CLI 한 줄로 단일 태스크를 빠르게 돌릴 수 있고, YAML 설정 파일을 사용해 여러 태스크와 모델을 한꺼번에 실행하는 풀 스윕(full sweep)도 지원합니다. 모델 백엔드는 OpenAI 호환 API뿐 아니라 HuggingFace를 통한 로컬 모델 추론도 지원하며, 사용자가 직접 데이터셋을 확장하거나 새 태스크 클래스를 추가하는 것이 매우 단순한 절차로 정리되어 있습니다.

ChainReason의 5가지 태스크와 평가 지표

ChainReason은 각 태스크가 서로 다른 추론 능력을 측정하도록 다음 다섯 가지로 구성되어 있습니다.

protocol_qa: 특정 DeFi 프로토콜 메커니즘에 관한 객관식 질문(A/B/C/D)으로, 정확도(accuracy)를 측정합니다. 모델이 프로토콜 수준의 개념을 정확히 이해하고 있는지 평가하기에 적합합니다.

vuln_detect: Solidity 스니펫을 6가지 취약점 카테고리 중 하나로 분류하는 태스크입니다. 정확도와 macro-F1 두 지표를 함께 사용해, 클래스 불균형이 있는 상황에서도 모델 성능을 공정하게 비교할 수 있도록 합니다.

contract_class: 컨트랙트의 ABI 요약과 선택적 힌트를 입력으로 받아 11개 카테고리 중 하나로 분류하는 태스크입니다. 마찬가지로 정확도와 macro-F1을 사용합니다.

tx_intent: 디코드된 액션 시퀀스를 보고 트랜잭션의 의도를 14개 카테고리 중 하나로 추론합니다. 샌드위치(sandwich)와 단순 스왑(swap), 차익 거래(arbitrage)처럼 표면적으로 비슷해 보이는 트랜잭션을 구조 수준에서 구분하도록 요구합니다.

slippage_pred: AMM 풀 상태와 스왑 입력을 받아 출력량을 수치로 예측합니다. 메트릭은 단계적 상대 오차(tiered relative error)로, 정확한 수치 추론을 강조합니다.

태스크 n (seed) 출력 타입 메트릭
protocol_qa 14 A/B/C/D accuracy
vuln_detect 12 label (1 of 6) accuracy + macro-F1
contract_class 14 label (1 of 11) accuracy + macro-F1
tx_intent 14 label (1 of 14) accuracy + macro-F1
slippage_pred 10 numeric tiered relative error

저자는 README에서 시드(seed) 데이터셋이 의도적으로 작다는 점을 강조합니다. 시드는 벤치마크가 정상적으로 동작하는지를 확인하고 새 모델을 1분 이내에 빠르게 검증하기 위한 "스모크 테스트(smoke test)" 용도이며, 실제 평가에는 사용자가 별도의 보유(held-out) 데이터셋을 더 큰 규모로 준비하기를 권장합니다. 사용자 데이터셋은 --data-path 옵션으로 손쉽게 끼워 넣을 수 있습니다.

ChainReason이 다루는 추론 축

ChainReason의 README는 기존 Solidity/블록체인 LLM 벤치마크가 다루지 않던 세 가지 추론 축을 명시적으로 강조합니다.

첫째는 프로토콜 수준 추론(Protocol-level reasoning)입니다. 단순히 getReserves() 함수가 무엇을 반환하는지를 아는 것은 표면적인 지식이지만, Uniswap v2 페어에서 리저브의 30%를 인출했을 때 가격이 어떻게 움직이는지를 이해하는 것은 또 다른 차원의 추론입니다. ChainReason의 protocol_qaslippage_pred 태스크는 이러한 메커니즘 수준 이해를 직접 측정합니다.

둘째는 트랜잭션 그래프 이해(Transaction-graph understanding)입니다. 샌드위치 공격과 일반 스왑, 차익 거래는 개별 오피코드(opcode) 수준에서는 비슷한 호출이 반복되지만, 전체 실행 트레이스의 구조를 보면 명확하게 다릅니다. tx_intent 태스크는 이러한 그래프 수준 패턴 인식을 평가합니다.

셋째는 수치적 그라운딩(Numeric grounding)입니다. AMM은 닫힌 형태(closed-form) 가격 공식을 가지므로, 모델이 CPMM(Constant Product Market Maker) 수식을 잘못 이해하면 그에 의존하는 모든 분석이 함께 잘못됩니다. slippage_pred 태스크는 모델이 이러한 수치 추론을 정확히 수행하는지를 측정합니다. CPMM의 기본 출력 수식은 다음과 같이 표현할 수 있습니다.

\Delta y = \frac{y \cdot (1 - f) \cdot \Delta x}{x + (1 - f) \cdot \Delta x}

여기서 xy 는 풀 안의 두 토큰 리저브, \Delta x 는 입력 스왑량, f 는 수수료율, \Delta y 는 출력량입니다. 이 식은 단순해 보이지만, 모델이 수수료를 반영하지 않거나 분모와 분자를 혼동하면 실제 결과와 큰 차이를 만들 수 있습니다.

ChainReason 설치 및 사용법

ChainReason은 Python 3.9 이상에서 동작하며, pip 한 번으로 설치할 수 있습니다. 로컬 모델 추론을 사용하려면 torch, transformers, accelerate도 함께 설치해야 합니다.

git clone https://github.com/joshawome/chainreason
cd chainreason
pip install -e .

# 로컬 HuggingFace 모델 추론을 사용할 경우
pip install torch transformers accelerate

가장 간단한 사용 예시는 OpenAI 호환 API를 사용해 단일 태스크를 빠르게 돌려보는 것입니다.

export OPENAI_API_KEY=...
python scripts/run_eval.py --task protocol_qa --client openai --model gpt-4o-mini --limit 5

여러 태스크와 모델 조합을 한 번에 평가하려면 YAML 설정 파일을 작성한 뒤 풀 스윕을 실행하고, 결과를 집계 스크립트로 마크다운 요약으로 변환할 수 있습니다.

python scripts/run_eval.py --config configs/full_run.yaml
python scripts/aggregate_results.py results/full -o results/full/SUMMARY.md

또한 ChainReason은 프로그램 내부에서 직접 호출하기 좋은 파이썬 API도 제공합니다.

from chainreason.tasks import get_task
from chainreason.models.openai_client import OpenAIClient
from chainreason.runner import run_eval

task = get_task("vuln_detect")
model = OpenAIClient(model="gpt-4o-mini")
summary = run_eval(task, model, limit=10, output_dir="results/")
print(summary["metrics"])

베이스라인 수치는 저장소의 results/BASELINES.md 문서에서 확인할 수 있으며, 시드 데이터셋만으로 빠르게 모델을 비교한 결과를 정리합니다.

ChainReason에 새 태스크 추가하기

ChainReason은 새로운 태스크를 추가하기 쉬운 인터페이스를 제공합니다. Task 베이스 클래스를 상속해 4개의 메서드만 구현하면 되고, 그 뒤에는 태스크 레지스트리에 등록만 하면 CLI와 풀 스윕에서 동일하게 사용할 수 있습니다.

from chainreason.tasks.base import Task, Example

class MyTask(Task):
    name = "my_task"

    def load(self):
        ...

    def build_prompt(self, ex):
        ...

    def parse_response(self, text):
        ...

    def score(self, prediction, target):
        ...

작성한 태스크 클래스를 chainreason/tasks/__init__.pyTASK_REGISTRY에 등록하면, 이후 --task my_task 인자로 곧바로 평가에 사용할 수 있습니다. 자체 데이터셋이 있는 사용자는 이 패턴을 활용해 도메인별 평가 슬라이스를 추가하거나, 실험 중인 새 추론 능력(예: 옵션 가격 추론, MEV 분류 등)을 ChainReason 위에 그대로 얹을 수 있습니다.

ChainReason 라이선스

ChainReason은 MIT 라이선스로 공개되어 있어, 연구·교육·상업적 목적 모두 자유롭게 사용·수정·배포할 수 있습니다. 시드 데이터셋과 베이스라인 결과는 저장소 안에 함께 포함되어 있어 별도의 외부 호스팅 없이도 즉시 재현이 가능합니다.

:scroll: ChainReason BibTeX 인용

@misc{yamamoto2025chainreason,
  author       = {Yamamoto, Joshua},
  title        = {{ChainReason}: A Benchmark for LLM Reasoning over On-Chain Tasks},
  year         = {2025},
  howpublished = {\url{https://github.com/joshawome/chainreason}}
}

:github: ChainReason 프로젝트 GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck: