메인 콘텐츠로 건너뛰기

목적 및 범위

이 문서는 StableNet 거버넌스 아키텍처에서 GovCouncil 시스템 컨트랙트의 역할을 설명합니다.
GovCouncil은 네트워크 전역에 적용되는 블랙리스트Authorized 계정 집합을 관리하며, 온체인 AccountManager 네이티브 프리컴파일과 연동하여 계정 단위의 제약을 일관되게 강제합니다.
모든 시스템 컨트랙트와 주소에 대한 개요는 시스템 컨트랙트 개요를 참고하세요.
블랙리스트 및 Authorized 계정이 트랜잭션 처리와 상태 전환에 미치는 영향은 다음 문서를 참고하세요.

컨트랙트 개요

GovCouncil은 다음 고정 주소에 배포됩니다.
  • GovCouncil: 0x0000000000000000000000000000000000001004
이 컨트랙트는 다른 거버넌스 컨트랙트(GovValidator, GovMasterMinter, GovMinter)와 동일하게 공통 베이스 컨트랙트인 GovBase를 상속하며, 여기에 Council 도메인에 특화된 상태와 액션을 추가합니다.
  • 네트워크 전역 블랙리스트(blacklist) 집합 관리
  • 우선 처리가 허용된 Authorized 계정 집합 관리
  • 위 두 집합을 AccountManager 네이티브 프리컴파일과 연결하여, EVM 실행 및 프리컴파일 단계에서 빠르고 일관된 조회가 가능하도록 지원
정리하면 다음과 같습니다.
  • GovBase는 멤버십 관리, 정족수 계산, 제안 라이프사이클, 실행 보호 로직을 제공합니다.
  • GovCouncil은 블랙리스트 및 Authorized 계정을 변경하는 도메인 전용 거버넌스 액션을 정의합니다.
  • AccountManager와 EVM은 GovCouncil이 유지하는 집합을 조회하여 Anzeon 고유 정책을 실제 트랜잭션 처리 과정에 적용합니다.

거버넌스 책임

GovCouncil의 주요 책임은 다음과 같습니다.
  • 특정 계정이 트랜잭션을 송신하거나 수신하는 것을 제한해야 하는 경우, 해당 계정을 블랙리스트에 추가 또는 제거
  • 네이티브 관리 기능이나 우선 처리 트랜잭션을 수행할 수 있도록 허용된 Authorized 계정 집합 정의 및 갱신
  • 위 모든 변경 사항이 GovBase가 제공하는 정족수 기반 제안·투표 모델을 통해서만 반영되도록 강제

예시 거버넌스 작업

구체적인 Solidity 액션 타입은 GovCouncil 컨트랙트에 정의되어 있지만, 개념적으로 다음과 같은 작업을 포함합니다.
  • 블랙리스트 추가: 하나 이상의 주소를 블랙리스트 집합에 포함
  • 블랙리스트 제거: 기존 블랙리스트 주소를 집합에서 제거
  • Authorized 계정 추가: 특정 계정에 Authorized 상태 부여
  • Authorized 계정 제거: 계정의 Authorized 상태 철회
모든 작업은 제안(proposal)으로 생성되며, Council 멤버들의 정족수 승인 없이는 온체인 상태에 반영될 수 없습니다.

저장소 모델

GovCouncil은 GovBase를 확장하면서, Council 전용 상태를 저장하기 위한 추가 슬롯을 정의합니다.
저장소 레이아웃은 systemcontracts/gov_council.go에 구현되어 있으며, 개념적으로 다음과 같이 구성됩니다.
  • 슬롯 0x00–0x31: 공통 GovBase 저장소
    (멤버 목록, 정족수, 제안 데이터, 실행 상태, 재진입 보호 등)
  • 슬롯 0x32–0x35: GovCouncil 전용 저장소
    • 0x32: _currentBlacklist values 슬롯(AddressSet)
    • 0x33: _currentBlacklist positions 매핑 슬롯
    • 0x34: _currentAuthorizedAccounts values 슬롯(AddressSet)
    • 0x35: _currentAuthorizedAccounts positions 매핑 슬롯
  • 슬롯 0x36: __accountManager 주소(AccountManager 네이티브 프리컴파일)

AddressSet 인코딩

blacklistauthorizedAccounts는 모두 공통 라이브러리인 AddressSetLib에서 정의한 AddressSet 구조를 사용합니다.
  • 각 AddressSet은 두 개의 슬롯으로 구성됩니다.
    • values 슬롯: 주소 배열의 길이를 base 슬롯에 저장하며, 실제 요소는 keccak256(valuesSlot) + index 위치에 저장
    • positions 슬롯: address → index+1 매핑을 저장하며, 값이 0이면 집합에 포함되지 않음을 의미
이 구조를 통해 다음이 가능합니다.
  • IsBlacklisted, IsAuthorizedAccount 호출 시 O(1)에 가까운 멤버십 검사
  • GetAllBlacklisted, GetAllAuthorizedAccounts를 통한 전체 집합 열거
  • 초기화 단계에서 0 주소 검증 및 중복 제거를 통한 안정적인 초기 상태 보장

제네시스 초기화 파라미터

GovCouncil은 제네시스에서 initializeGovCouncil 로직을 통해 다음 파라미터로 초기화됩니다.
ParameterTypeDescription
membersaddress listCouncil 거버넌스 멤버 목록(GovBase)
quorumuint제안 실행에 필요한 최소 승인 수(GovBase)
expiryuint제안 만료 시간(초 단위, GovBase)
memberVersionuint멤버 리스트 버전(GovBase)
blacklistaddress list초기 블랙리스트 주소 목록
authorizedAccountsaddress list초기 Authorized 계정 주소 목록
초기화 과정에서는 다음이 수행됩니다.
  • 0 주소 포함 여부 검증
  • 중복 주소 제거
  • blacklist, authorizedAccounts를 AddressSet 형식으로 슬롯 0x32–0x35에 인코딩
  • AccountManager 프리컴파일 주소를 슬롯 0x36에 기록하여 계정 관리 레이어와 연결

AccountManager 및 EVM과의 통합

GovCouncil은 트랜잭션 실행 중 직접 블랙리스트나 Authorized 여부를 검사하지 않습니다.
대신, 해당 집합에 대한 단일 진실 소스(source of truth) 역할을 수행합니다.
다른 컴포넌트는 gov_council.go에 정의된 헬퍼 함수를 통해 GovCouncil 상태를 조회합니다.
  • IsBlacklisted(govCouncilAddress, state, addr)
    • 주소가 블랙리스트에 포함되어 있으면 true 반환
  • GetBlacklistCount, GetBlacklistedAddress, GetAllBlacklisted
    • 블랙리스트 전체 열거 및 모니터링 용도
  • IsAuthorizedAccount(govCouncilAddress, state, addr)
    • 주소가 Authorized 계정이면 true 반환
  • GetAuthorizedAccountCount, GetAuthorizedAccountAddress, GetAllAuthorizedAccounts
    • Authorized 계정 집합 열거
AccountManager 프리컴파일과 EVM은 이 정보를 사용하여 다음과 같은 정책을 적용할 수 있습니다.
  • 블랙리스트 계정이 송신자인 트랜잭션을 상태 변경 전에 거부
  • 블랙리스트 계정을 대상으로 하는 전송 또는 호출 차단
  • 특정 관리 기능이나 특수 트랜잭션을 Authorized 계정으로만 제한

제안 및 투표 모델

GovCouncil은 GovBase로부터 제안 라이프사이클 및 정족수 기반 투표 모델을 그대로 상속합니다.
따라서 Council 거버넌스의 동작 패턴은 다른 Gov* 컨트랙트와 동일합니다.
  • Members: 제안을 생성하고 투표할 수 있는 Council 멤버 집합
  • Quorum: 제안 실행 전에 요구되는 최소 승인 수
  • Expiry: 제안 유효 기간. 만료된 제안은 실행 불가
  • Member Versioning: 멤버 변경 시 memberVersion 증가로 이전 제안 자동 무효화
개념적인 제안 흐름은 다음과 같습니다.
  1. 멤버가 블랙리스트 또는 Authorized 집합 변경에 대한 제안을 생성합니다.
  2. 다른 멤버들이 제안을 검토하고 승인 또는 거절에 투표합니다.
  3. 승인 수가 정족수에 도달하고 제안이 만료되지 않았다면 실행 가능 상태가 됩니다.
  4. 제안이 실행되면 AddressSet이 갱신되고 관련 이벤트가 발생합니다.
구체적인 액션 타입과 이벤트 정의는 Solidity GovCouncil 구현에 포함되어 있지만,
상위 수준 동작은 GovBase를 사용하는 모든 거버넌스 컨트랙트와 동일합니다.

운영 시 고려사항

GovCouncil을 구성하고 운영할 때 다음 사항을 고려해야 합니다.
  • 초기 블랙리스트 및 Authorized 계정
    • 제네시스에서 systemContracts.govCouncil.params.*를 통해 초기 목록을 설정할 수 있습니다.
    • 첫 블록부터 즉시 효력이 발생하므로, 배포 전 충분한 검토가 필요합니다.
  • 정족수와 멤버 수의 균형
    • 정족수가 너무 낮으면 정책 변경이 과도하게 쉬워질 수 있고,
      너무 높으면 긴급 블랙리스트 대응이 지연될 수 있습니다.
    • 네트워크 성격에 맞는 균형 잡힌 설정이 필요합니다.
  • 모니터링
    • 오프체인 서비스는 GetAllBlacklisted, GetAllAuthorizedAccounts를 주기적으로 조회하여 변경 사항을 추적할 수 있습니다.
    • 지갑이나 익스플로러는 계정 상세 화면에서 블랙리스트 또는 Authorized 여부를 표시할 수 있습니다.
  • 트랜잭션 처리와의 연계
    • 트랜잭션 검증 및 상태 전환 단계에서 AccountManager 또는 GovCouncil 헬퍼를 통해 다음 정책을 적용할 수 있습니다.
      • 블랙리스트 계정의 트랜잭션 거부
      • 블랙리스트 계정을 대상으로 하는 호출 차단
      • 특정 관리 기능을 Authorized 계정으로 제한
GovValidator, GovMasterMinter, GovMinter와 함께 GovCouncil은 StableNet의 **정책 레이어(policy layer)**를 구성합니다.
즉, 어떤 계정이 제한되거나 특권을 가지는지, 이러한 결정이 네트워크 전반에 어떻게 일관되게 적용되는지를 정의하는 핵심 구성 요소입니다.