메인 콘텐츠로 건너뛰기
이 페이지는 OP Stack 결함 증명(fault proof) 시스템의 분쟁 게임(dispute game) 유형, 핵심 컨트랙트, 파라미터를 정리합니다. 시스템의 동작 방식은 결함 증명 설명과 FP 시스템 구성 요소를 참고하십시오.
컨트랙트 주소와 일부 파라미터 값은 체인별로 설정됩니다. 특정 체인의 값은 Superchain Registry에서 확인하거나 배포된 컨트랙트를 직접 조회하십시오. 이 페이지의 표준 값은 op-deployer/pkg/deployer/standard/standard.go에 정의된 대로 op-deployer가 새로운 표준 체인에 적용하는 기본값입니다.

분쟁 게임 유형

모든 분쟁 게임은 GameType과 함께 DisputeGameFactory를 통해 생성됩니다. GameType은 factory가 복제할 등록된 게임 구현을 선택하는 uint32 값입니다. 공식 목록은 GameTypes 라이브러리에 있습니다. 참고:
  • 게임 유형은 DisputeGameFactory 소유자가 해당 유형의 구현을 등록(setImplementation)한 후에만 체인에서 진행할 수 있습니다. 소유자는 해당 유형의 게임을 생성하는 데 필요한 bond도 설정합니다(setInitBond).
  • respected game type(시스템이 출금 및 anchor state 업데이트에 그 결과를 인정하는 게임 유형)은 AnchorStateRegistry에 저장되며, Guardian이 setRespectedGameType을 통해 변경할 수 있습니다.
  • op-deployer는 권한형 게임(유형 1)을 초기 게임 유형으로 하여 새로운 표준 체인을 배포합니다.

핵심 컨트랙트

모든 결함 증명 컨트랙트는 모노레포의 packages/contracts-bedrock/src 아래에 있습니다. 체인별 배포 주소는 Superchain Registry에 나열되어 있습니다.

자주 사용하는 조회 함수

표준 파라미터

아래 값은 op-deployer의 표준 체인 기본값입니다. 개별 체인은 이와 다를 수 있으므로, 항상 해당 체인의 배포된 구성을 확인하십시오.

이분 탐색 게임

타이밍과 최종성

Clock

결함 분쟁 게임의 각 측은 chess clock을 기준으로 게임을 진행합니다.
  • claim은 조부모 claim으로부터 clock을 상속합니다(깊이가 번갈아 바뀔 때마다 claim이 속한 팀도 번갈아 바뀝니다).
  • claim의 clock이 maxClockDuration초만큼 누적되면 더 이상 해당 claim에 대해 move를 할 수 없습니다.
  • move로 인해 응답자에게 남은 시간이 clock extension보다 적어지는 경우, 응답자가 최소한 extension 시간을 확보할 수 있도록 clock이 보충됩니다. extension은 일반적인 경우 clockExtension이며, 실행 트레이스 이분 탐색을 시작하는 move(깊이 splitDepth - 1, 명령어 트레이스를 생성할 시간을 확보하기 위함)에는 clockExtension * 2, VM step 직전의 move(깊이 maxGameDepth - 1, large-preimage proposal을 허용하기 위함)에는 clockExtension + challengePeriodSeconds입니다.

Bond

  • 게임을 생성하려면 해당 게임 유형의 초기화 bond가 필요합니다. 이 값은 DisputeGameFactory.initBonds(gameType)이며, factory 소유자가 체인별로 설정합니다.
  • 모든 move(attack 또는 defend)에는 정확히 getRequiredBond(position)만큼의 bond가 필요합니다. bond는 깊이에 따라 기하급수적으로 증가합니다. FaultDisputeGame.getRequiredBond의 공식은 깊이 0에서 400,000 gas, maxGameDepth에서 300,000,000 gas로 증가하는 gas 양에 200 gwei의 가정된 base fee를 적용하므로, 각 깊이는 바로 위 깊이보다 약 9.5% 더 많은 비용이 듭니다. 단일 move 비용은 깊이 0에서 0.08 ETH, 깊이 73에서 60 ETH입니다.
  • 게임을 최대 깊이까지 진행하는 비용은 가장 깊은 단일 bond보다 훨씬 큽니다. 경로상의 모든 move마다 bond를 예치해야 하기 때문입니다. 깊이 1부터 73까지 getRequiredBond를 합산하면 총 bond는 약 691 ETH(홀수 깊이에서 move하는 측이 약 361 ETH, 짝수 깊이에서 move하는 측이 약 330 ETH)이며, 이 총액의 대부분은 가장 깊은 move가 차지합니다. 깊이 70부터 73까지만 해도 약 210 ETH에 달합니다. 정확한 값은 FaultDisputeGame.getRequiredBond를 기준으로 합니다.
  • bond는 게임의 DelayedWETH 컨트랙트에 보관되며, 게임이 해결되고 최종 확정된 후, 그리고 DelayedWETH unlock 지연 시간이 지난 후에만 지급됩니다.
  • 분배 모드: 게임이 종료될 때 BondDistributionMode가 선택됩니다. 정상적인 게임(DisputeGameFactory가 생성했고, blacklist에 오르지 않았으며, retire되지 않은 게임)은 bond를 정상적으로 분배합니다. 성공적으로 반박된 모든 claim의 bond는 반박한 측에 지급되고, 반박되지 않은 claim은 환불됩니다. 정상적이지 않은 게임은 환불 모드로 전환되어 모든 bond를 원래 예치자에게 반환합니다.

게임 상태

Types.sol의 GameStatus enum:

다음 단계