Nostra 기술 백서

고급 시장 모델 및 체인링크 오라클 통합

작성자: 이현재 | 2025년 12월

1부: 시장 설계 기초

예측 시장 경제학의 이해

1.1시장 구조

두 가지 주요 접근 방식

50% Grouped Binary

  • 각 결과는 50% YES / 50% NO로 시작
  • 시장은 독립적임 (연결되지 않음)
  • YES의 합은 무엇이든 될 수 있음 (N × 50%)
  • 차익거래를 통해 ~100%로 수렴
  • 구현이 간단함
5개 결과가 각각 50%일 때:
합계 = 250%
(거래를 통해 수렴)

100/n% Binary Market

  • 각 결과는 100/N %로 시작
  • 독립적이거나 기계적으로 연결될 수 있음 (CTF)
  • YES의 합 = 100%
  • 초기 차익거래 기회 없음
  • 제작자가 초기에 차익거래자에게 손해를 보지 않음
5개 결과가 각각 20%일 때:
합계 = 100%
(차익거래 기회 없음)

Polymarket의 하이브리드 접근 방식 (NegRisk CTF)

시장에 따른 다른 구조
  • 거래량이 많은 시장 (예: 슈퍼볼): NegRisk CTF - YES + NO = 결과당 100¢
  • 거래량이 적은 시장 (예: CFP): Grouped Binary - YES + NO ≠ 100¢
슈퍼볼 (NegRisk CTF):
┌────────────┬───────┬───────┬──────────┐
│ 팀         │ YES   │ NO    │ YES + NO │
├────────────┼───────┼───────┼──────────┤
│ Chiefs     │ 23¢   │ 77¢   │ 100¢ ✓   │
│ Eagles     │ 19¢   │ 81¢   │ 100¢ ✓   │
└────────────┴───────┴───────┴──────────┘

CFP (Grouped Binary):
┌────────────┬───────┬───────┬──────────┐
│ 팀         │ YES   │ NO    │ YES + NO │
├────────────┼───────┼───────┼──────────┤
│ Indiana    │ 93.4¢ │ 99¢   │ 192.4¢   │
│ Ohio State │ 72¢   │ 98¢   │ 170¢     │
└────────────┴───────┴───────┴──────────┘

1.2초기 확률 설정

50% 초기 확률의 문제점

차익거래 손실 각 결과가 50%에서 시작하면 합계가 100%를 초과하여, 제작자의 비용으로 차익거래자에게 보장된 수익을 제공합니다.
5개 결과가 각각 50%일 때:
합계 = 250%

차익거래자:
- 모든 NO 토큰 매수
- 한 결과가 패배할 때 보장된 수익
- 제작자는 차익거래자에게 손실

해결책: 100/n% 초기 확률

차익거래 없음 100/n%에서 시작하면 합계 = 100%입니다. 차익거래자에게 공짜 돈을 주지 않습니다.

중요한 설명: 250% 합계는 차익거래가 아닙니다

흔한 오해 Grouped Binary 시장에서 250% 합계(5 × 50%)는 차익거래를 생성하지 않습니다. 각 시장은 독립적입니다!
Grouped Binary (5개 결과 × 50%):

시장 1: 팀 A  YES (50¢) + NO (50¢) = $1 ✓
시장 2: 팀 B  YES (50¢) + NO (50¢) = $1 ✓
시장 3: 팀 C  YES (50¢) + NO (50¢) = $1 ✓
시장 4: 팀 D  YES (50¢) + NO (50¢) = $1 ✓
시장 5: 팀 E  YES (50¢) + NO (50¢) = $1 ✓

YES의 합 = 250%... 하지만 그래서요?

왜 차익거래가 아닌가?
• 각 시장은 독립적입니다
• 다른 시장 간에 토큰을 병합할 수 없습니다
• 각 시장은 개별적으로 YES + NO = $1 ✓

250% → 100% 수렴은 단지 가격 발견(Price Discovery)일 뿐,
차익거래가 아닙니다. 스마트 트레이더들이 이를 정상화합니다.

진짜 차익거래란 무엇인가?

케이스 조건 행동 결과
단일 시장 YES + NO < $1 둘 다 매수 보장된 수익
단일 시장 YES + NO > $1 둘 다 발행 및 매도 보장된 수익
CTF 다중 결과 합계 < $1 모두 매수, 병합 보장된 수익
CTF 다중 결과 합계 > $1 분할 및 모두 매도 보장된 수익
크로스 플랫폼 YES_A + NO_B < $1 양쪽 매수 보장된 수익

핵심: 차익거래는 무위험, 보장된 수익을 의미합니다. 250% 합계는 이에 해당하지 않습니다.

비교: 5개 결과 (실제 확률: 60%, 15%, 10%, 10%, 5%)

50% 초기 (합계 = 250%)

결과 초기 공정가 차이
A (우승후보) 50¢ 60¢ -10¢
B 50¢ 15¢ +35¢
C 50¢ 10¢ +40¢
D 50¢ 10¢ +40¢
E 50¢ +45¢

우승후보: 약간 저평가 (-10¢)
언더독: 극심한 고평가 (+35~45¢)

100/n% = 20% 초기 (합계 = 100%)

결과 초기 공정가 차이
A (우승후보) 20¢ 60¢ -40¢
B 20¢ 15¢ +5¢
C 20¢ 10¢ +10¢
D 20¢ 10¢ +10¢
E 20¢ +15¢

우승후보: 큰 저평가 (-40¢)
언더독: 약간 고평가 (+5~15¢)

진짜 문제: 우승후보에 대한 고립된 NO 토큰

100/n% (20% 초기) 사용 시
  • 우승후보 YES = 20¢ (매우 저평가) → 트레이더 매수 → 제작자 싸게 매도
  • 우승후보 NO = 80¢ (매우 고평가) → 아무도 안 삼 → 제작자 고립됨

우승후보가 이기면, 제작자는 가치 없는 80¢ NO 토큰만 보유하게 됩니다.

결론: 둘 다 문제를 해결하지 못함

100/n%는 하나의 문제를 다른 문제로 바꿀 뿐임
  • ✅ 언더독이 공정 가치에 더 가깝게 책정됨
  • ❌ 우승후보가 50%일 때보다 더 저평가됨
  • ❌ 우승후보에 대한 비싼 NO 토큰(80¢)이 팔리지 않음

손실을 최소화하는지는 거래 패턴에 달려 있습니다.

진정한 해결책:

  1. CTF 다중 결과 - 재고 고립 없음 (병합 가능)
  2. 마켓 메이커 - 전문가가 재고 위험 감수
  3. 초기 플랫폼 유동성 없음 - 시장이 먼저 가격을 발견하게 함
  4. 손실을 부트스트랩 비용으로 감수 - 비즈니스의 일부

1.3유동성 공급

부트스트랩 문제

유동성 부트스트랩 사이클
유동성 없음 → 거래 없음 → 수수료 없음 → LP 유입 안 됨

플랫폼이 사이클을 깨야 함

플랫폼이 유동성 공급 → 거래 시작 →
수수료 발생 → 거래량 증명 → 외부 LP 참여

누가 유동성을 공급하는가?

공급자 현실 언제
무작위 트레이더 빈 시장에 오지 않음 초기에는 절대 없음
전문 MM 검증된 고거래량 시장에만 참여 거래량이 확립된 후
플랫폼 자체 새로운 시장을 부트스트랩해야 함 첫날부터

균형 포지션 전략

$1000 유동성으로 5개 결과 시장의 경우:

균등 분할: 시장당 $200

각 시장에 대해 (20% YES / 80% NO):
- 200 YES @ $0.20 = $40
- 200 NO @ $0.80 = $160
- 합계: $200 → 200 YES + 200 NO (균형)

A가 이길 경우:
- A: 200 YES × $1 = $200
- B: 200 NO × $1 = $200
- C: 200 NO × $1 = $200
- D: 200 NO × $1 = $200
- E: 200 NO × $1 = $200

반환: $1000 ✓ (균형 상태일 때 본전)

적은 유동성 문제

$500 유동성은 충분하지 않습니다
  • 넓은 스프레드 (나쁜 가격)
  • 작은 거래에도 높은 슬리피지
  • 대량 주문 실행 불가
  • 나쁜 사용자 경험
유동성 수준 거래 품질 사용자 경험
시장당 $500 나쁨 좌절스러움, 큰 슬리피지
시장당 $5,000 보통 소액 트레이더에게 허용 가능
시장당 $50,000+ 좋음 전문가 수준

1.4재고 고립 문제

핵심 문제

치명적인 문제 Grouped Binary 시장에서 LP는 아무도 사려 하지 않는 가치 없는 토큰을 떠안게 될 수 있습니다.
초기: 시장 A 20% YES / 80% NO
제작자 보유: 200 YES + 200 NO

시간 경과... A가 우승후보가 됨 (80% YES):

트레이더: "A의 YES를 사고 싶어!"
제작자: YES 매도, 행복 😊

트레이더: "A의 NO는 안 사, A가 이길 거니까!"
제작자: NO 매도 불가, 고립됨 😰

결과:
- YES: 200 → 50 (150개 매도, 좋음!)
- NO: 200 → 200 (아무도 안 삼, 고립!)

A가 이길 경우:
- 50 YES × $1 = $50
- 200 NO × $0 = $0
제작자 시작 $200, 종료 $50
손실: $150 ❌

왜 교차 시장 매도가 도움이 안 되는가

패배하는 시장(B, C, D, E)에서 NO를 파는 것은 보상이 되지 않습니다:

B의 200 NO를 95¢에 매도 = $190 수취
하지만: A가 이기면, 구매자는 200 × $1 = $200를 받음

제작자는 $200 가치를 $190에 매도 = 손실

교차 시장 매도는 보상이 아니라 더 많은 손실을 추가합니다.

CTF가 이를 해결함

CTF 다중 결과는 완전한 세트 병합을 허용함
100 A + 100 B + 100 C + 100 D + 100 E → $100 USDC

상대방 불필요!
언제든지 병합을 통해 탈출 가능.
재고 고립 문제 없음.

LP를 위한 최악의 시나리오

시나리오 수수료 수입 재고 손실 총 손실
최상의 경우 $500 $100 +$500 수익
평균 $200 $350 -$150 (15%)
나쁜 경우 $75 $400 -$325 (32.5%)
최악의 경우 $75 $860 -$785 (78.5%)

1.5마켓 메이커 (MM)

MM이 수익을 내는 방법

1. 스프레드 (싸게 사서 비싸게 팔기)

MM 주문 게시:
YES 매수 @ 49¢
YES 매도 @ 51¢

양쪽이 체결될 때:
- 트레이더 A가 YES 매수 @ 51¢ → MM 51¢ 수취
- 트레이더 B가 YES 매도 @ 49¢ → MM 49¢ 지불

MM 수익: 51¢ - 49¢ = 주당 2¢
10,000주 거래 시: 수익 = 

2. 수수료 리베이트

Taker (주문 체결자): 2% 수수료 지불
Maker (주문 제공자): 0.5% 리베이트 수취

MM은 항상 주문을 제공함 → 모든 거래에서
리베이트 획득

3. 고빈도 조정

가격이 오르는 중?
→ 매수 주문 취소 (비싸게 사는 것 방지)
→ 매도 가격 인상 (더 비싸게 팔기)

아마추어 LP: 매시간 업데이트 → 손해 봄
프로 MM: 매초 업데이트 → 스프레드 포착

4. 시장 간 헤징

상관관계가 있는 시장:
- "Chiefs 슈퍼볼 우승" (YES @ 25¢)
- "Mahomes MVP 수상" (YES @ 30¢)

MM은 Chiefs YES 매도, Mahomes YES 매수 (헤지)
순 노출: ~0
하지만: 스프레드 수익은 유지!

MM 수익 공식

MM 수익 = 스프레드 수입
          + 수수료 리베이트
          + 차익거래 이익
          - 재고 손실
          - 운영 비용

Nostra에 MM을 유치하는 방법

방법 설명 플랫폼 비용
월간 수수료 지급 유동성 공급에 월 -10K 고정적, 예측 가능
수수료 리베이트 MM이 거래의 0.5% 획득 수익 감소
수익 공유 거래 수수료의 50% 가변적
토큰 인센티브 유동성에 대해 NOSTRA 토큰 지급 토큰 희석

핵심 통찰: Polymarket 모델

Polymarket은 공개 LP UI가 없습니다

유동성 출처:

  • 전문 MM (API를 통해, UI 아님)
  • Polymarket 내부 (숨겨짐, 무대 뒤에서)
  • 트레이더들의 지정가 주문

일반 사용자는 그저 거래할 뿐입니다. UI를 통해 "유동성을 공급"하지 않습니다.

유동성 미러링 (Bridge Market Maker)

전략적 우위: 글로벌 유동성 복제

Nostra는 글로벌 선두 기업(예: Polymarket)의 오더북을 실시간으로 미러링하는 "브릿지 마켓 메이커(Bridge MM)" 봇을 운영합니다.

  • 작동 원리: Polymarket에서 YES가 $0.60에 거래되면, 우리 봇도 Nostra에서 $0.60에 매도 주문을 냅니다.
  • 이점: 사용자는 첫날부터 유기적인 유동성 없이도 글로벌 수준의 깊이와 가격 효율성을 경험할 수 있습니다.
  • 결과: 사실상 전체 생태계의 유동성을 "공유"하는 효과를 가집니다.

1.6수수료 구조

제안된 수수료 구조

거래 수수료: 0%
상환 수수료 (순이익 기준 — 예: 상금에서 초기 투자금 차감): 2%
분배:
├── 플랫폼 수수료: 1%
└── 크리에이터 수수료: 1%

트레이드오프

수수료 수준 LP 수익률 거래 활동
높음 (3%+) 높음 낮음 (거래 비용 비쌈)
중간 (2%) 중간 중간
낮음 (0.5%) 낮음 높음 (거래 비용 저렴)

수수료가 손실을 커버할 수 있는가?

항상 그렇지는 않음

거래량이 적고 시장이 한 방향으로 급격히 움직일 경우:

  • 수수료 수입: 적음
  • 재고 손실: 큼
  • 순결과: 상당한 손실

수수료는 도움이 되지만 수익을 보장하지는 않습니다.

업계 벤치마크 (Industry Benchmarks)

플랫폼 수수료 모델 상세 내용
Polymarket (글로벌/크립토) 거래 수수료 없음 / 스프레드
Polymarket US (규제/출시 예정) 고정 거래 수수료
  • 거래 수수료: 0.01% (주당 $0.0001).
  • 비교: Kalshi보다 약 100배 저렴.
  • 출처
Kalshi (미국 규제 준수) 메이커-테이커 (Maker-Taker)
  • 테이커: 확률에 따라 가변적 (약 1.75% - 7%).
    공식: 0.07 × 가격 × (1-가격)
  • 메이커: 더 낮거나 리베이트 제공.
  • 출처
참고: 매수-매도 스프레드 (Bid-Ask Spread)

매수-매도 스프레드는 매수 가격(Ask)과 매도 가격(Bid)의 차이로 발생하는 암묵적인 거래 비용입니다.

  • 거래에 진입하자마자 즉시 청산하면 이 차이만큼 손실을 보게 됩니다.
  • 이 비용은 플랫폼이 아닌 마켓 메이커(MM)나 유동성 공급자가 가져갑니다.
  • Polymarket과 같은 수수료 0% 시장에서는 이것이 사용자가 부담하는 주요 비용입니다.

수수료 분배 모델

수수료 흐름
LP가 유동성 공급

트레이더가 거래 가능

트레이더가 수수료 지불

수수료가 LP에게 수익으로 전달

LP가 위험에 대해 보상받음

더 많은 LP 유입 → 더 많은 유동성

1.7AMM vs 오더북

근본적인 차이점

오더북

  • 구매자와 판매자가 직접 만남
  • 지정가 주문 (Limit Orders)
  • 스프레드가 좁음 (유동성이 충분할 때)
  • 전문가에게 친숙함
  • Nostra의 선택 (CLOB)

AMM (CPMM)

  • 풀(Pool)과 거래함
  • 알고리즘 가격 결정 (x*y=k)
  • 항상 유동성 존재 (가격에 상관없이)
  • 초보자에게 쉬움 (Uniswap 스타일)
  • 예측 시장에서는 자본 효율성 낮음

왜 오더북인가?

예측 시장에는 오더북이 더 낫습니다

예측 시장의 결과는 0 또는 1입니다. AMM은 가격이 0이나 1에 가까워질수록 유동성을 제공하기 위해 막대한 자본을 요구합니다 (LSR - Logarithmic Scoring Rule 등 복잡한 수학 필요).

오더북은 사용자가 원하는 가격에 정확히 주문을 낼 수 있어 가격 발견이 더 효율적입니다.

1.8공유 유동성 프로토콜

유동성 레이어로서의 Nostra

웹사이트, 그 이상

Nostra는 단순한 독립형 애플리케이션이 아닌 프로토콜(Protocol)로 설계되었습니다. 핵심 오더북은 블록체인 상에 존재하며, 누구나 접근 가능한 글로벌 유동성 레이어를 형성합니다.

파편화된 방식 (Web2 스타일)

  • 각 앱이 독자적인 고립된 유동성을 가짐
  • 앱 A의 사용자는 앱 B의 사용자와 거래할 수 없음
  • 유동성이 분산되고 얕음

공유된 방식 (Nostra 프로토콜)

  • 하나의 단일 글로벌 오더북
  • 여러 UI(Nostra 앱, 서드파티 앱, 지갑)가 동일한 유동성을 공유
  • 통합된 거래량으로 더 좁은 스프레드 달성

생태계 이점

공유 유동성 레이어를 구축함으로써 다음이 가능해집니다:

1.9플랫폼 경제학

수익 모델

1.10구현 고려사항

초기 런칭 전략

단계적 접근
  1. 소수 정예 시장: 유동성을 집중시키기 위해 소수의 고품질 시장만 운영
  2. 자체 유동성 공급: 초기에는 플랫폼이 직접 유동성 공급 (손실 감수)
  3. 인센티브 프로그램: 초기 트레이더 및 LP에게 보상 제공

1.11소수점 정밀도와 더스트(Dust)

고정소수점 연산이 예측 시장의 토큰 계산에 어떤 영향을 미치는지 이해합니다.

정밀도 문제

예시: 55¢에서 $10 구매
// 수학적 계산
$10 / $0.55 = 18.181818181818181818... (무한 반복)

// 18자리 소수점 정밀도 (블록체인 한계)
저장값: 18.181818181818181818 (잘림)

// 역으로 곱해서 검증
18.181818181818181818 × $0.55 = $9.99999999999999999990

// "더스트"
$10.00000000000000000000
-$9.99999999999999999990
─────────────────────────
 $0.00000000000000000010  ← 정밀도 손실 (~0.00000000000000001 센트)

더스트는 어디로 가는가?

CTFExchange에서 컨트랙트는 정수 나눗셈을 사용하며 항상 내림(round DOWN)합니다:

작업 더스트가 남는 곳
MINT (새 토큰 생성) CTFExchange의 내부 balances 매핑
COMPLEMENTARY (판매자와 매칭) 판매자가 약간 적게 받거나, CTFExchange가 나머지 보유
MERGE (토큰을 담보로 환매) CTFExchange가 소수점 담보 보유
내부 잔액 원장
// CTFExchange 컨트랙트 - 더스트가 여기에 누적됨
mapping(address => uint256) public balances;

$10로 18.181818181818181818 shares를 구매할 때:

  • 지불: $10.000000 USDC (CTFExchange로 전송됨)
  • 수령: 18181818181818181818 shares (18자리 소수점)
  • 더스트: ~$0.00000000000000000001가 CTFExchange에 남음

실질적 영향

거래당

  • 더스트 금액: ~$0.00000000000000000001
  • 개별 거래에는 무시할 수 있는 수준
  • "손실"이 아님 - 컨트랙트에 갇힐 뿐

시간이 지나면

  • 각 거래마다 누적됨
  • 수백만 건의 거래 = 총 몇 센트
  • 일부 프로토콜은 "더스트 수집" 기능 구현
핵심 인사이트

1/0.55, 1/0.33 등과 같은 무한 반복 소수에서는 유한한 소수점으로 완벽한 가역성이 불가능합니다. 이는 블록체인의 모든 고정소수점 연산 시스템에 내재된 특성입니다.

2부: 고급 시장 모델

Nostra Grouped Binary vs Polymarket NegRisk

2.1시장 모델 비교 개요

다중 결과 예측 시장을 위한 두 가지 주요 시장 모델 아키텍처를 이해합니다: Nostra의 현재 Grouped Binary 방식 vs Polymarket의 NegRisk 어댑터 솔루션.

특징 Grouped Binary (Nostra) Grouped Binary + NegRisk (Polymarket)
초기 확률 유연함 (50% 또는 100/N%) 유연함 (시장 결정)
YES 가격 합계 유연함 (연결 없음) ~100% (차익거래로 강제)
시장 연결 독립적 (연결 없음) 어댑터 레이어 (NegRisk)
재고 고립 있음 (심각한 문제) 없음 (전환 가능)
conditionId 다수 (결과당 하나) 다수 + negRiskMarketId
포지션 전환 불가능 어댑터로 가능
유동성 파편화 심각 (N개 시장) 통합
구현 복잡도 단순 6-10주
핵심 요점
  • Nostra 현재: Grouped Binary - 단순한 구현이지만 심각한 유동성 파편화와 재고 고립 문제
  • Polymarket: Grouped Binary + NegRisk - 동일한 기본 구조이지만, 어댑터 레이어로 재고와 유동성 문제 해결
  • 핵심 차이점: NegRisk 어댑터는 NO 토큰 동등성을 가능하게 하여, 독립적인 시장들을 통합 유동성 시스템으로 변환

2.2Grouped Binary 모델 (Nostra)

Grouped Binary 모델은 Nostra의 현재 구현입니다. 다중 결과 질문의 각 결과는 독립적인 바이너리 시장으로 취급되며 자체 YES/NO 토큰을 가집니다.

작동 방식

Grouped Binary 아키텍처

각 결과 = 별도의 conditionId를 가진 독립적인 바이너리 시장

시장 1
Spain
YES / NO
시장 2
France
YES / NO
시장 3
Brazil
YES / NO
시장 4
Argentina
YES / NO
시장 5
England
YES / NO

주요 특성

장점

  • 단순한 구현: 각 시장이 독립적이어서 생성과 관리가 쉬움
  • 친숙한 UX: 표준 YES/NO 베팅 인터페이스
  • 유연한 가격 설정: 초기 가격에 대한 기계적 제약 없음
  • 간단한 해결: 한 승자가 YES로 해결, 나머지는 NO로 해결

단점

  • 시장 연결 없음: 가격이 100%로 합산되지 않음
  • 재고 고립: Spain YES → France YES로 전환 불가
  • 차익거래 누출: 기계적 차익거래 강제 없음
  • 자본 비효율: 포지션을 바꾸려면 매도 후 재매수 필요

재고 고립 문제

예시 시나리오

당신은 Spain YES 토큰 100개를 개당 $0.25에 보유하고 있습니다. Spain이 탈락했습니다. 이제 France YES를 원합니다:

  1. Spain YES 매도: 가격이 $0.05로 폭락 → $5만 받음 ($20 손실)
  2. France YES 매수: 가격이 $0.40으로 상승 → 12.5개만 구매 가능

결과: 이중 슬리피지, 상당한 가치 손실. 당신의 포지션은 사실상 "고립"되었습니다.

Grouped Binary가 잘 작동하는 경우
  • 전환 수요가 적은 저거래량 시장
  • 결과가 적은 시장 (2-3개)
  • 포지션 변경이 드문 단기 시장
  • 단순성을 우선시하는 MVP/초기 단계 제품

2.3Nostra의 유동성 문제 상황

Nostra의 Grouped Binary 모델은 단순하지만, 다중 결과 마켓에서 심각한 유동성 문제가 발생합니다. 실제 시나리오를 통해 어떤 상황에서 문제가 생기는지 살펴보겠습니다.

📌 시나리오 설정: 2026 월드컵 우승팀 예측

Nostra 마켓 구성

Nostra에서 "2026 월드컵 우승팀" 마켓을 5개 팀으로 생성:

Spain
YES/NO
conditionId_1
Brazil
YES/NO
conditionId_2
France
YES/NO
conditionId_3
Argentina
YES/NO
conditionId_4
England
YES/NO
conditionId_5

핵심: 각 팀은 독립된 마켓이며, 서로 연결되어 있지 않습니다.

🔴 문제 상황 1: Stuck Inventory (포지션 전환 불가)

Alice의 상황

Alice는 Spain이 우승할 것으로 예상하고 투자했습니다:

// Alice의 초기 투자
구매: Spain YES 1,000개 @ 20¢
투자금: $200
예상 수익: Spain 우승 시 $1,000 (5배)

// 1주일 후: Spain이 조별리그에서 탈락!
Spain YES 가격: 20¢ →  (85% 하락)
Alice의 포지션 가치: $200 → $30

Alice는 이제 France가 우승할 것 같아서 포지션을 바꾸고 싶습니다:

❌ Nostra (현재)

// Step 1: Spain YES 매도
매도: 1,000개 @ 3¢
받는 금액: $30
슬리피지: -10% → 실제 $27

// Step 2: France YES 매수
France YES 가격: 25¢
구매 가능: $27 / 0.25 = 108개
슬리피지: +8% → 실제 100개

결과: 1,000개 → 100개 (90% 손실)

✅ NegRisk (Polymarket)

// Direct Conversion via Adapter
Spain YES → France YES
수학적 변환 (슬리피지 없음)

가치 기준 변환:
$30 가치 → $30 가치
France @ 25¢ = 120개

결과: 가치 보존, 20% 더 많은 토큰

🔴 문제 상황 2: 유동성 분산 (Liquidity Fragmentation)

Bob의 대량 주문

Bob은 $10,000를 Brazil YES에 투자하려 합니다:

// Nostra 오더북 상태 (Brazil YES)
총 마켓 유동성: $50,000 (5개 팀 전체)
Brazil 마켓 유동성: $10,000 (1/5)

오더북 깊이:
  15¢: 5,000 shares ($750)
  16¢: 8,000 shares ($1,280)
  17¢: 10,000 shares ($1,700)
  18¢: 15,000 shares ($2,700)
  19¢: 20,000 shares ($3,800)
─────────────────────────────
  총 깊이: ~$10,230

// Bob이 $10,000 시장가 주문 실행
$750  @ 15¢ = 5,000 shares
$1,280 @ 16¢ = 8,000 shares
$1,700 @ 17¢ = 10,000 shares
$2,700 @ 18¢ = 15,000 shares
$3,570 @ 19¢ = 18,789 shares
─────────────────────────────
총: 56,789 shares @ 평균 17.6¢

기대 가격 (15¢)으로 샀다면: 66,667 shares
슬리피지 손실: ~15% (9,878 shares)

🔴 문제 상황 3: 가격 불일치 (Price Inconsistency)

독립된 마켓이기 때문에 모든 YES 가격의 합이 100%가 되지 않을 수 있습니다:

YES 가격 실제 확률 문제
Spain 25¢ ~22% 합계: 112¢

12% 오버북
(Arbitrage 기회)
Brazil 23¢ ~20%
France 22¢ ~19%
Argentina 21¢ ~18%
England 21¢ ~18%
왜 이런 일이 발생하나?

Nostra: 각 마켓이 독립적 → 가격 조정하는 메커니즘 없음 → 수동 차익거래에 의존

Polymarket: NegRisk 어댑터 → NO 토큰 동등성 → 자동 차익거래로 ~100% 유지

🔴 문제 상황 4: LP 재고 리스크

Market Maker Charlie의 상황
// Charlie가 Spain 마켓에 유동성 제공
제공: YES 측 $5,000, NO 측 $5,000 (총 $10,000)

// 거래 발생: 사용자들이 Spain YES를 대량 매수
결과: Charlie는 Spain YES를 팔고 USDC를 받음
포지션: Spain NO $8,000 보유 (편향된 재고)

// Spain 탈락 후
Spain NO = $1 (승리!)
Charlie 수익: +$8,000

// 하지만 Spain이 우승했다면?
Spain NO = $0 (패배)
Charlie 손실: -$8,000

문제: 재고를 다른 팀으로 전환할 수 없음!
Charlie가 France NO로 헤지하고 싶어도:
1. Spain NO 매도 (슬리피지)
2. France NO 매수 (슬리피지)
= 이중 슬리피지로 헤지 비용 과다

📊 문제 요약: Nostra vs Polymarket

상황 Nostra (Grouped Binary) Polymarket (NegRisk)
포지션 전환
Spain → France
불가능
매도 → 매수 (이중 슬리피지)
가능
수학적 변환 (0% 슬리피지)
대량 주문
$10K 시장가
10-20% 슬리피지
분산된 유동성
1-3% 슬리피지
통합 유동성
가격 일관성
Σ YES = ?
90-120%
수동 차익거래 의존
~100%
자동 차익거래
LP 헤지
재고 리밸런싱
고비용
이중 거래 필요
저비용
직접 변환 가능
💡 핵심 인사이트
  • 2-3개 결과: Nostra의 Grouped Binary가 충분히 작동
  • 5개+ 결과: 유동성 분산이 심각해지며, 사용자 경험 저하
  • 해결책: Section 2.4의 NegRisk 어댑터가 이 모든 문제를 해결

2.4NegRisk 어댑터 (Polymarket 방식)

핵심 아이디어: 담보가 상호 배타적인 YES 토큰들로 직접 분할됩니다. 이를 통해 유동성이 집중됩니다.

핵심 공식 (Core Formula)

Sum(Price(YES)) = $1.00

Sum(Price(NO)) = $(N - 1).00

NegRisk는 각 결과를 위한 독립적인 바이너리 시장을 만드는 대신, 모든 결과를 하나로 연결합니다. $1의 담보(Collateral)가 모든 결과(Outcome)로 쪼개집니다.

  • Grouped Binary (기존): $1 담보 → 1 YES(Spain) + 1 NO(Spain)
  • NegRisk (개선): $1 담보 → 1 YES(Spain) + 1 YES(Brazil) + ... + 1 YES(England)

실전 예시: $10,000 유동성, 5개 국가

초기 설정
5개 국가: Spain, Brazil, France, Argentina, England

초기 가격: 각 20¢ YES / 80¢ NO (20% 확률)
마켓 메이커: 국가당 $2,000 공급 → 2,000 (YES+NO) 쌍씩
총 유동성: $10,000
5번의 거래 후 (대부분 Spain 매수)
국가 YES 잔량 NO 잔량 상태
Spain 500 2,000 1,500 NO 고립!
Brazil 1,600 2,000 400 과잉 NO
France 1,800 2,000 200 과잉 NO
Argentina 2,000 2,000 균형
England 2,000 2,000 균형

❌ Grouped Binary

// 거래 6: Spain YES $100 추가 매수
Spain YES 500개만 남음
가격 급등: 20¢ → 30¢ → 40¢
$100로 250개만 매수 가능 (500개가 아님!)

반면: 1,500 Spain NO는 쓸모없이 방치됨 💀

✅ NegRisk

// 마켓 메이커가 과잉 NO를 변환
5개 국가에서 각 200 NO 수집
= 200개의 완전한 NO 세트 (5개 토큰씩)
= 200 × $4 = $800 USDC로 환원!

→ 400개의 새 Spain YES+NO 쌍 발행

결과 비교

Grouped Binary

  • Spain YES 잔량: 500 (고갈)
  • 슬리피지: 높음 (+100%)
  • 과잉 NO: 영원히 고립됨

NegRisk

  • Spain YES 잔량: 1,300 (복구됨)
  • 슬리피지: 낮음 (정상)
  • 과잉 NO: USDC로 변환됨
왜 작동하는가?

핵심: NegRisk에서는 모든 NO 토큰을 결합하여 USDC로 환원할 수 있습니다 (그 중 하나는 반드시 승리하므로). 이것이 "고립된" 재고를 해제하여 마켓 메이커가 지속적으로 유동성을 가장 필요한 곳으로 재배치할 수 있게 합니다.

2.5NegRisk 아키텍처

오픈소스 참조

Polymarket의 NegRisk 구현은 오픈소스이며 ChainSecurity와 OpenZeppelin의 감사를 받았습니다.

GitHub: Polymarket/neg-risk-ctf-adapter →

포함: NegRiskAdapter, NegRiskOperator, NegRiskCtfExchange, WrappedCollateral, Vault, FeeModule

아키텍처 레이어

사용자 인터페이스
"내 스페인 YES를 프랑스 YES로 변환"
NegRisk 어댑터
splitPosition()
mergePositions()
convertPosition()

핵심: USDC ↔ NO 토큰 ↔ YES 토큰 변환

Grouped Binary 시장

스페인 YES/NO | 프랑스 YES/NO | 브라질 YES/NO | ...
모두 negRiskMarketId로 연결됨

Conditional Tokens Framework (CTF)

모든 토큰 작업의 기본 레이어

주요 컨트랙트

컨트랙트 목적 Nostra 보유?
NegRiskAdapter 핵심 변환 로직 (NO → YES) 아니오
NegRiskOperator 관리자 기능, 오라클 통합 아니오
WrappedCollateral 내부 회계용 Wrapped USDC 아니오
ConditionalTokens (CTF) 기본 토큰 프레임워크
MarketFactory 바이너리 시장 생성
CTFExchange 오더북 트레이딩

2.6구현 옵션

Nostra가 NegRisk를 구현하기 위해 필요한 것

예상 소요 시간

컴포넌트 시간 복잡도
스마트 컨트랙트 (1-3) 2-3주 높음 (보안 중요)
백엔드 API (4-5) 3-5일 중간
프론트엔드 UI (6) 3-5일 중간
테스트 및 감사 2-4주 매우 중요
총계 6-10주
대안: 차익거래 봇

NegRisk를 구현하기 전에, 정말 필요한지 고려해보세요. 현재의 차익거래 봇으로도 훨씬 간단한 구현으로 경제적 포지션 균형을 맞출 수 있습니다.

언제 NegRisk를 구현해야 할까요?

  • 변환 수요가 복잡성을 정당화할 만큼 거래량이 많을 때
  • 재고 고립에 대한 사용자 불만이 있을 때
  • Polymarket 수준의 기능에 대한 경쟁 압력이 있을 때

3부: 오라클 통합

탈중앙화된 시장 해결 전략

3.1오라클 전략 및 비교

Nostra는 암호화폐 가격부터 틈새 지역 이벤트까지 다양한 시장 유형을 처리하기 위해 멀티 오라클 전략을 채택합니다. 우리는 하이브리드 AI와 낙관적 오라클을 사용하는 Opinion Labs 및 UMA를 사용하는 Polymarket과 같은 업계 선두주자들을 벤치마킹합니다.

비교 분석: 세 가지 오라클 계층

오라클 유형 메커니즘 장점 단점 적합한 대상
수동 관리자 (Manual Admin) 신뢰할 수 있는 관리자 키로 결과 해결
  • 가장 빠름
  • 가장 저렴함 (가스비만 발생)
  • 유연함
  • 중앙화된 신뢰
  • 확장성 병목 현상
베타 출시, 테스트 시장, 비상 해결
체인링크 (Chainlink)
(Functions / Feeds)
탈중앙화 노드가 API/가격 데이터 가져옴
  • 무신뢰 & 자동화
  • 업계 표준
  • 즉시 정산
  • 디지털 소스 필요 (API/URL)
  • 비용 (LINK 토큰)
스포츠, 암호화폐 가격, 선거 결과 (API 존재 시)
UMA
(낙관적 오라클)
"이의 제기 전까지 진실" + 투표 배심원
  • 모든 임의의 이벤트
  • API 불필요 (사람 검증)
  • 암호경제학적 보안
  • 느림 (2시간+ 이의 제기 기간)
  • 복잡한 게임 이론
롱테일 이벤트, "의견" 기반 시장 (예: "AI가 지배할까?")
벤치마크: Opinion Labs 전략

Opinion Labs는 정교한 하이브리드 오라클 접근 방식을 사용합니다:

  • AI 오라클 (Opinion AI): 데이터를 수집/요약하고 결과를 제안하는 첫 번째 단계.
  • 낙관적 오라클 (UMA): 최종 보안 계층. AI가 틀리면 사람이 UMA를 통해 이의를 제기할 수 있음.

Nostra는 비정형 시장을 위해 이 "낙관적 검증" 패턴을 채택할 것입니다.

채택 로드맵: 단계별 진화

1. 수동 관리자 (베타 / V1)

목표: 시장 수요 및 UI/UX 검증.

방법: 관리자 키로 모든 시장 해결. 빠르고 무료지만 중앙화됨.

2. 하이브리드 통합 (V1.5)

목표: 높은 거래량 시장 자동화.

방법: 스포츠 및 암호화폐 시장에 체인링크 도입. 롱테일 이벤트는 관리자가 유지.

3. 탈중앙화 롱테일 (V2.0)

목표: 무허가 시장 생성.

방법: UMA (낙관적 오라클) 통합. 관리자 키는 "거부권"만 허용 (비상 브레이크).

4. 완전 탈중앙화 (DAO)

목표: 멈출 수 없는 프로토콜.

방법: 관리자 키 제거. 시장은 오직 체인링크, UMA 또는 DAO 거버넌스에 의해서만 해결됨.

3.2낙관적 오라클 (UMA) 통합

검증 가능한 온체인 데이터나 API를 사용할 수 없는 시장(예: "이 유튜버가 구독자 100만 명을 달성할까?" 또는 매우 주관적인 "의견" 시장)의 경우, 우리는 UMA의 낙관적 오라클(Optimistic Oracle)을 활용합니다. 이를 통해 인간이 암호경제학적 보증을 바탕으로 시장을 해결할 수 있습니다.

"낙관적" 메커니즘

진실의 흐름 (Flow of Truth)

  1. 주장 (Assert): 시장 생성자나 봇이 주장합니다: "결과 A가 승리했다."
  2. 이의 제기 기간 (Challenge Window): 2시간의 창이 열립니다.
  3. 이의 없음: 아무도 동의하지 않으면 주장이 진실이 됩니다. (낙관적 경로)
  4. 이의 제기 (Dispute): 누군가 이의를 제기하면(채권 스테이킹), UMA 토큰 보유자가 투표하여 결정합니다.

작동 원리

  • 거짓말 비용: 주장자는 채권(예: $100)을 걸어야 합니다. 거짓말을 하고 이의가 제기되면 이를 잃게 됩니다.
  • 유권자 인센티브: UMA 유권자는 프로토콜 가치를 유지하기 위해 올바르게 투표하도록 인센티브를 받습니다.

해결 호출 흐름 (Call Flow)

Nostra ↔ UMA ↔ 도전자(Challenger) 상호작용
1 진실 주장 (Assert)
Nostra 컨트랙트
2 모니터링
제3자 키퍼 (Permissionless)
3 이의 제기 (선택)
UMA 컨트랙트
4 정산 (Settle)
지급 / 해결

하이브리드 구현: Opinion AI + UMA

비정형 시장의 해결을 확장하기 위해, 우리는 Opinion Labs와 유사한 하이브리드 AI 접근 방식을 채택합니다. 이는 AI의 속도와 낙관적 오라클의 보안성을 결합한 것입니다.

작동 방식

  1. 수집 및 분석: 오프체인 AI 에이전트(LLM)가 활성 시장과 관련 실세계 데이터(뉴스, 소셜 여론)를 지속적으로 모니터링합니다.
  2. 결과 제안: AI가 결과를 판정하고 주장자(Asserter)로서 UMA에 트랜잭션을 제출합니다.
  3. 인간 검토 (감시견): AI가 맞다면 시장은 빠르게 해결됩니다. AI가 환각(오류)을 보이면, 인간 감시자가 이의를 제기하여 채권을 획득합니다.

장점

  • 확장성: AI는 24/7 수천 개의 롱테일 시장을 해결할 수 있습니다.
  • 비용 효율성: 수동 관리자 개입의 필요성을 줄여줍니다.
  • 안전성: UMA는 AI 오류에 대한 궁극적인 "킬 스위치" 역할을 합니다.

3.3OptimisticOracleV3 사양

OptimisticOracleV3는 주장(assertion) 수명 주기를 관리하는 핵심 컨트랙트입니다. 이는 이의가 제기되지 않는 한 진실로 간주되는 에스컬레이션 게임(escalation game)을 활용합니다.

핵심 함수 (Key Functions)

// Core OOv3 Interface
interface IOptimisticOracleV3 {
    /**
     * @notice 세계 상태에 대한 진실을 주장합니다.
     * @param claim 진술을 나타내는 인코딩된 데이터 또는 문자열 (예: "BTC > 50k at block 100").
     * @param asserter 정답일 경우 채권을 돌려받을 주소.
     * @param callbackRecipient 정산 시 알림을 받을 주소.
     * @return assertionId 이 주장의 고유 ID.
     */
    function assertTruthWithDefaults(
        bytes calldata claim,
        address asserter
    ) external returns (bytes32 assertionId);

    /**
     * @notice 주장을 정산합니다. 활동 기간(Liveness Period) 이후에만 호출 가능합니다.
     * @return bool 주장이 '진실'로 해결되었으면 true를 반환합니다.
     */
    function settleAndGetAssertionResult(bytes32 assertionId) external returns (bool);

    /**
     * @notice 상태 확인을 위한 View 함수.
     */
    function getAssertionResult(bytes32 assertionId) external view returns (bool);
}

Nostra 통합 로직

이의 제기 흐름 (Dispute Flow)

🔴 UMA 토큰의 역할

UMA 토큰은 DVM(데이터 검증 메커니즘) 작동에 필수적입니다:

  • 투표권 (Voting Rights): 토큰 보유자는 분쟁이 발생한 결과(예: "후보자 X가 이겼는가?")에 대해 투표합니다.
  • 경제적 보증 (Economic Guarantee): DVM을 매수하는 비용이 매수로 얻는 이익보다 커야 합니다 (매수 비용 > 매수 이익).
  • 바이백 및 소각 (Buyback & Burn): 사용되지 않은 보상이나 수수료는 UMA를 매입하고 소각하는 데 사용되어 인센티브를 일치시킵니다.
필수: "감시견" 봇 (Watchdog Bot)

낙관적 모델은 누군가 지켜보고 있을 때만 작동합니다. Nostra는 모든 활성 주장을 모니터링하는 감시견 봇을 운영(또는 장려)해야 합니다. 악의적인 사용자가 거짓 결과를 주장하면, 봇은 이를 감지하고 이의를 제기하여 시장 참여자를 보호해야 합니다.

3.5해결 아키텍처

현재 vs 제안된 흐름

현재: 관리자 해결

관리자 UI
POST /api/admin/resolve
서버 지갑 서명
reportPayouts() → 해결됨

관리자가 수동으로 승자 결정

제안: 체인링크 해결

시장 마감
Chainlink Automation 트리거
컨트랙트가 Price Feed 읽기
reportPayouts() → 해결됨

데이터 기반 자동 해결

3.6스마트 컨트랙트 통합

Functions 클라이언트 예시 (요청)

// FunctionsClient.sol (우리 마켓 컨트랙트가 상속)
import { FunctionsClient } from "@chainlink/.../FunctionsClient.sol";
import { FunctionsRequest } from "@chainlink/.../FunctionsRequest.sol";

contract NostraMarket is FunctionsClient {
    using FunctionsRequest for FunctionsRequest.Request;

    address router = 0x...; // 체인링크 라우터 (오라클 컨트랙트)
    bytes32 donId = 0x...;  // DON ID (네트워크 식별자)
    uint64 subscriptionId = 1234; // 내 구독 ID (결제 계정)

    // 이 함수가 체인링크 라우터 컨트랙트를 호출합니다
    function resolveMarket() external {
        
        // 1. 요청서 작성 (JavaScript 로직 포함)
        FunctionsRequest.Request memory req;
        req.initializeRequestForInlineJavaScript("const apiResponse = await Functions.makeHttpRequest(...)");

        // 2. 체인링크 라우터로 전송 (그림의 Step 1 화살표)
        bytes32 requestId = _sendRequest(
            req.encodeCBOR(),
            subscriptionId,
            gasLimit,
            donId
        );
        
        // 3. 요청 ID 저장 (나증에 검증용)
        pendingRequests[requestId] = true;
    }
}
            

Price Feed Resolver 예시

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

contract PriceFeedResolver {
    AggregatorV3Interface internal priceFeed;
    IConditionalTokens public ctf;

    struct PriceMarket {
        bytes32 questionId;
        uint256 threshold;      // 8자리 소수점 가격 임계값
        bool resolveAbove;      // true = 가격 > 임계값이면 YES 승리
        uint256 deadline;
        bool resolved;
    }

    mapping(bytes32 => PriceMarket) public markets;

    function resolveMarket(bytes32 questionId) external {
        PriceMarket storage market = markets[questionId];
        require("이미 해결됨");
        require(block.timestamp >= market.deadline, "너무 이름");

        // 체인링크에서 최신 가격 가져오기
        (, int256 price, , , ) = priceFeed.latestRoundData();

        // 승자 결정
        bool yesWins = market.resolveAbove
            ? price > int256(market.threshold)
            : price < int256(market.threshold);

        // CTF에 배당 보고
        uint256[] memory payouts = new uint256[](2);
        payouts[0] = yesWins ? 1 : 0;  // YES 결과
        payouts[1] = yesWins ? 0 : 1;  // NO 결과

        ctf.reportPayouts(questionId, payouts);
        market.resolved = true;
    }
}
            

Chainlink Functions 예시 (JavaScript)

// 이 코드는 Chainlink Functions DON에서 실행됩니다
const apiEndpoint = args[0];  // 예: "https://api.sportsdata.io/..."\
const jsonPath = args[1];     // 예: "Games[0].Winner"

const response = await Functions.makeHttpRequest({
  url: apiEndpoint,
  headers: { "Ocp-Apim-Subscription-Key": secrets.apiKey }
});

if (response.error) {
  throw Error("API 요청 실패");
}

// JSON 경로 탐색 및 결과 반환
const homeTeamWins = result === "HomeTeam" ? 1 : 0;
return Functions.encodeUint256(homeTeamWins);
            

네트워크 주소

BSC Testnet

LINK: 0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06
BTC/USD: 0x5741306c21795FdCBb9b265Ea0255F499DFe515C
ETH/USD: 0x143db3CEEfbdfe5631aDD3E50f7614B6ba708BA7
BNB/USD: 0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526

Polygon Amoy

Functions Router: 0xC22a79eBA640940ABB6dF0f7982cc119578E11De
BTC/USD: 0xe7656e23fE8077D438aEfbec2fAbDf2D8e070C4f
ETH/USD: 0xF0d50568e3A7e8259E16663972b11910F89BD8e7

3.7비용 및 보안 고려사항

월간 비용 추정 (시장 100개 기준)

컴포넌트 사용당 비용 월간 (100개 시장)
Data Feeds (읽기) 무료 /opt/homebrew/bin/zsh
Functions 요청 ~0.25 LINK 25 LINK (~)
Automation 확인 ~0.01 LINK 30 LINK (~)
Automation 실행 ~0.1 LINK 10 LINK (~)
합계 ~65 LINK (~)

보안 고려사항

신뢰 가정

  • Data Feeds: 높은 신뢰 (탈중앙화 노드)
  • Functions: 중간 (API에 의존)
  • API 소스: 제공자에 따라 다름

필수 확인 사항

  • 체인링크 응답 데이터 검증
  • Functions 오류 우아하게 처리
  • 수동 해결로의 폴백(fallback) 구현
  • 적절한 가스 한도 설정
  • 구독 잔액 모니터링

4부: 멀티 체인 전략

확장성 및 상호운용성

4.1배포 네트워크

전략적 우선순위

낮은 트랜잭션 수수료

예측 시장은 빈번한 상호작용(구매, 판매, 청구)을 필요로 합니다. 가스비는 $0.01 미만이어야 합니다.

높은 유동성

USDC 유동성이 존재하는 체인에 배포하면 사용자 온보딩 마찰을 줄일 수 있습니다.

EVM 호환성

기존 도구, 지갑(MetaMask), 체인링크 서비스를 지원하기 위해 필수적입니다.

빠른 거래 확정

트레이딩은 즉각적인 반응이 필수입니다. UX를 위해 2초 미만의 블록 타임(Polygon/BSC/Monad)이 선호됩니다.

왜 단일 체인 배포인가? (유동성 집중)

우리는 시장 컨트랙트를 여러 체인에 동시에 배포해서는 안 됩니다. 예측 시장은 유동성 깊이에 크게 의존합니다.

  • 파편화 (Fragmentation): Polygon과 BSC에 유동성을 분산하면 양쪽 모두 오더북이 얇아집니다.
  • 사용자 경험: 효율적인 주문 매칭을 위해 베터(Bettors)들은 한 곳에 모여야 합니다.
  • 운영: 우리는 "코어"를 하나의 체인에서 유지하고, 브릿지(CCIP)를 통해 다른 체인의 사용자가 참여하도록 합니다.

배치 처리에서 가스비의 중요성 (UX 핵심)

최적의 UX를 제공하기 위해, 우리 서버는 사용자 작업을 배치 처리(Batch Processing)할 가능성이 높습니다 (예: 50개의 주문을 하나의 트랜잭션으로 매칭). 이렇게 하면 사용자에게 즉각적인 확인과 가스비 없는 경험을 제공할 수 있지만, 가스비는 플랫폼의 직접적인 운영 비용이 됩니다.

시나리오 Polygon/BSC 비용 (~15원) Arbitrum/Op 비용 (~200원) 영향
1회 단일 거래 15원 ($0.01) 200원 ($0.15) 감당 가능
일일 배치 (10,000건) 15만 원 / 일 ($100) 200만 원 / 일 ($1,500) 치명적인 차이
월간 비용 450만 원 ($3,000) 6,000만 원 ($45,000) 사업 지속성 위험

결론: 만약 우리가 가스비를 대납하거나 배치 프로세서를 운영한다면, Arbitrum과 같은 L2는 현재 규모에서 너무 비쌉니다. 경제적 생존을 위해 Polygon 또는 BSC는 필수입니다.

비교 분석: L1 vs L2

카테고리 네트워크 가스비 (Gas Fee) 평균 블록 시간 파이널리티 (Finality) 장점 단점 결론
L1 / 사이드체인 BNB Smart Chain (BSC) 0.05 Gwei (약 15원) 450ms (0.45초) 확률적
(15 블록 × 0.45초 ≈ 7초)
  • 거대한 글로벌 사용자 기반
  • 낮은 수수료
  • 높은 유동성
  • Opinion Labs 사용 (메인넷)
다소 중앙화된 검증자 세트 최고의 선택
Polygon PoS ~ $0.001 (약 1.5원) ~ 2.1초 확률적
(~128 블록 × 2.1초 ≈ 5분)
  • 극도로 낮은 수수료
  • 성숙한 생태계
  • 뛰어난 EVM 호환성
재구성(Reorg) 위험 (현재는 드묾) 강력한 대안
이더리움 (L1) $2.00 - $50.00+ ~ 12초 안전: ~12분
(2 에폭)
  • 최고 수준의 보안
  • 가장 높은 유동성
  • 지나치게 비싼 비용
  • 고빈도 거래에 느림
정산 전용
솔라나 (Solana) ~ $0.00025 (약 0.3원) ~ 400ms 빠름
(~12초 확정)
  • 높은 처리량
  • 낮은 지연 시간
  • Rust 재작성 필요
  • 중단(Outage) 이력
호환 불가
Monad < $0.001 (약 1원 미만) 1.0초 즉시
(1 블록 × 1초 = 1초)
  • 10,000 TPS (병렬 EVM)
  • 1초 블록 타임 (즉시 체결)
  • 완벽한 EVM 호환
  • Opinion Labs 지원
  • 메인넷 검증 필요
  • Chainlink 미지원 (치명적)
  • 초기 유동성 부족
미래의 강자
Monero (XMR) 낮음 ~ 2분 느림
(10 블록 × 2분 ≈ 20분)
  • 완전한 익명성 (링 서명)
  • 검열 저항성
  • 스마트 컨트랙트 미지원
  • 느린 확정 속도
호환 불가
Zcash (ZEC) 낮음 ~ 75초 느림
(24 블록 × 75초 ≈ 30분)
  • 선택적 익명성 (zk-SNARKs)
  • 스마트 컨트랙트 미지원
  • UTXO 모델
호환 불가
레이어 2 Base < $0.01 (약 15원 미만) 즉시 (~2초)
  • Coinbase 통합 (쉬운 온보딩)
  • 빠르게 성장 중
  • EVM 등가성 (Equivalent)
  • Limitless Exchange 사용
새로운 생태계 대안
Arbitrum One ~ $0.10 (약 150원) 즉시 (~0.25초)
  • 가장 높은 L2 TVL
  • 깊은 USDC 유동성
  • PrismX / Rain 사용
Polygon/BSC보다 약간 높은 수수료 대안
zkSync Era ~ $0.05 (약 70원) 즉시 (~1초)
  • 네이티브 계정 추상화 (AA)
  • 스마트 컨트랙트 지원
  • ZK 보안 (Zero-Knowledge)
생태계 파편화 좋은 대안
Lighter 낮음 즉시
  • 오더북 최적화
  • 검증된 속도
  • 앱 특화 체인 (App-Specific)
  • 사용자 컨트랙트 배포 불가
호환 불가

주요 권장 사항: BNB 스마트 체인 (BSC)

BSC가 승자인 이유
  • 압도적인 속도: 최근 450ms 블록 타임 업그레이드로 BSC는 ~7초의 파이널리티를 제공합니다. 이는 Polygon PoS(~2-5분)보다 훨씬 빠르며 중앙화 거래소에 가까운 쾌적한 거래 경험을 제공합니다.
  • 바이낸스 거래소와의 연계: BSC에서 네이티브로 구축하는 것은 바이낸스 상장 잠재력에 있어 전략적 이점을 제공합니다. BNB 생태계에 거래량과 유용성을 제공하는 프로젝트는 지원 및 상장 기회에서 우선순위를 갖는 경우가 많습니다.
  • 검증된 유동성: BSC는 지속적으로 높은 유동성과 활성 사용자 수를 유지하며, 이는 초기 예측 시장 활성화에 필수적입니다.
  • 성장과 경쟁력: BNB 체인은 능동적으로 진화하고 있으며, 최근 발표된 수수료 인하와 속도 업그레이드를 통해 Base 및 Solana와 직접 경쟁하며 고빈도 거래에 최적화된 환경을 유지하고 있습니다.

Polygon은 낮은 수수료 덕분에 여전히 실행 가능한 백업이지만, BSC의 압도적인 퍼포먼스와 전략적 생태계 연계는 Nostra를 위한 최적의 런치패드가 됩니다.

기술 노트: 코드 변경 없음 (EVM 이식성)

Polygon과 BSC 모두 EVM (이더리움 가상 머신)과 완벽하게 호환되므로, 코드 분기에 대한 위험이 없습니다.

  • 단일 코드베이스: 어느 네트워크를 선택하든 100% 동일한 Solidity 스마트 컨트랙트를 사용합니다.
  • 구성(Config)만 변경: 유일한 차이점은 배포 매개변수(예: USDC 주소, 체인링크 오라클 주소)뿐이며, 이는 코드가 아닌 설정 파일로 관리됩니다.
  • 유연성: 엔지니어링 오버헤드 없이 언제든지 네트워크를 전환하거나 나중에 다른 곳에 배포할 수 있습니다.

4.2브릿징 전략 (CCIP)

왜 브릿지인가?

유동성 파편화 문제

사용자들은 이더리움 메인넷, Optimism, Arbitrum 등에 자금을 가지고 있습니다. 복잡한 서드파티 브릿지를 사용하여 특정 체인으로 수동으로 브릿징하도록 강요하고 싶지 않습니다.

해결책: 체인링크 CCIP (상호운용성 프로토콜)

CCIP를 사용하면 지원되는 어느 체인에서든 입금을 받고 이를 우리의 특정 시장 구현으로 라우팅할 수 있습니다.

크로스 체인 베팅 흐름
[이더리움 메인넷의 사용자]

USDC + "브라질에 베팅" 메시지를 CCIP로 전송

체인링크 노드 네트워크 (보안 전송)

[Base의 Nostra 컨트랙트]
USDC 수신 → 사용자를 위해 YES 토큰 발행

통합 아키텍처

소스 체인 (사용자)

  • 라우터 컨트랙트: 사용자가 상호작용하는 곳
  • 함수: `ccipSend(destinationChainSelector, message)`
  • 토큰: 프로그래밍 가능한 토큰 전송이 여기서 토큰을 잠그고 목적지에서 해제

목적지 체인 (Nostra)

  • CCIP 수신자: 우리 컨트랙트가 `_ccipReceive` 구현
  • 로직:
    1. 전송자 검증
    2. "브라질에 베팅" 메시지 디코딩
    3. 수신된 USDC로 포지션 구매
    4. 사용자 주소에 크레딧 기록 (매핑)

CCIP의 이점

Part 5: 기술적 구현 (Technical Implementation)

시스템 아키텍처 및 워크플로우

5.1시장 생성 프로세스 (내부 동작 원리)

"가스비 없는" 생성자 경험

Nostra는 시장 생성자가 블록체인과 직접 상호작용하는 복잡성을 추상화합니다. 사용자가 "배치 생성 시작 (Start Batch Creation)" 버튼을 클릭하면, 서버가 모든 온체인 작업을 비동기적으로 처리합니다.

배치 생성 워크플로우
[사용자 클라이언트]
JSON 설정 전송 (이름, 결과, 날짜)

[API 서버]
DB에 "PENDING" 상태의 BatchJob 생성

[배치 프로세서 서비스]
(백그라운드에서 서버 지갑으로 실행)

1. 블록체인 생성 루프: 각 바이너리 마켓을 MarketFactory에 배포
2. 데이터베이스 동기화: Condition ID 및 Token ID 기록
3. 유동성 민팅: USDC 민팅 → Yes/No 포지션으로 분할 (Split)
4. 자동 시딩 (Auto-Seeding): 오더북에 초기 매수/매도 주문 배치

[웹소켓]
클라이언트에 "COMPLETED" 상태 푸시

단계별 실행 내역

단계 동작 상태 메시지
1. 초기화 프로세서가 작업을 가져옴 "Job started processing"
2. createBinaryMarket 각 결과에 대해 스마트 컨트랙트 호출 "Creating market X/Y: [Name]"
3. 영속성 그룹/마켓 정보를 PostgreSQL에 저장 "Saving to database..."
4. 유동성 담보 민팅 및 `splitPosition` 호출 "Minting collateral for market inventory..."
5. 시딩 초기 지정가 주문 배치 "Seeding initial liquidity..."

상세 토큰 흐름: 유동성 및 시딩 (Liquidity & Seeding)

시장이 즉시 거래 가능하도록 보장하기 위해, 서버 지갑(Server Wallet)이 초기 유동성 공급자 역할을 수행합니다. 이는 다음과 같은 구체적인 토큰 전송 순서를 포함합니다:

4단계: 유동성 공급 (Liquidity Provision)

  • 출처 (Source): 서버 지갑 (운영자)
  • 동작: CTF 컨트랙트의 splitPosition() 호출
  • 전송 (In): USDC (담보)를 CTF 컨트랙트로 전송합니다.
  • 수신 (Out): 새로 발행된 포지션 토큰 (YES/NO 주식)을 서버 지갑이 수령합니다.

5단계: 오더북 시딩 (Seeding)

  • 출처 (Source): 서버 지갑 (운영자)
  • 동작: API를 통해 지정가 매도 주문(ASK) 배치
  • 로직: 서버 지갑은 보유한 YES/NO 토큰을 특정 가격(예: $0.50)에 매도하겠다고 제안합니다.
  • 결과: 서버 지갑이 이미 재고를 "사전 발행(pre-mint)" 했으므로 사용자는 즉시 구매할 수 있습니다.

5.2청구 프로세스 (이중 확인)

왜 두 번의 트랜잭션이 필요한가요?

사용자들은 종종 당첨금 청구 시 지갑 확인이 두 번 필요한 이유를 묻습니다. 이는 조건부 토큰 프레임워크 (CTF)Nostra 거래소 컨트랙트 간의 아키텍처적 분리 때문입니다.

트랜잭션 1: 상환 (Redemption)

contract.redeemPositions(...)
  • From: CTF 코어 컨트랙트
  • To: 사용자 지갑
  • 동작: 당첨 포지션 토큰을 소각하고 담보(USDC)를 사용자 지갑으로 직접 해제합니다.

트랜잭션 2: 자동 입금 (Auto-Deposit)

exchange.deposit(...)
  • From: 사용자 지갑
  • To: CTF 거래소 컨트랙트
  • 동작: 청구된 USDC를 거래소 잔액으로 다시 이동시켜 즉시 새로운 거래에 사용할 수 있게 합니다.

왜 자동으로 입금되지 않나요?

자주 묻는 질문 중 하나는 "왜 상환(Redemption) 단계에서 자금을 거래소로 자동 전송할 수 없는가?"입니다.

UX 트레이드오프

우리는 지속적인 거래를 최우선으로 합니다. 자동 입금을 통해 사용자가 당첨금을 재사용하기 위해 별도의 "입금" 페이지로 이동할 필요가 없게 합니다. 두 번째 확인은 자금이 다음 베팅을 위해 즉시 준비되도록 보장합니다.