목적 및 범위
이 문서는 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 상태 철회
저장소 모델
GovCouncil은GovBase를 확장하면서, Council 전용 상태를 저장하기 위한 추가 슬롯을 정의합니다.저장소 레이아웃은
systemcontracts/gov_council.go에 구현되어 있으며, 개념적으로 다음과 같이 구성됩니다.
- 슬롯
0x00–0x31: 공통GovBase저장소
(멤버 목록, 정족수, 제안 데이터, 실행 상태, 재진입 보호 등) - 슬롯
0x32–0x35: GovCouncil 전용 저장소0x32:_currentBlacklistvalues 슬롯(AddressSet)0x33:_currentBlacklistpositions 매핑 슬롯0x34:_currentAuthorizedAccountsvalues 슬롯(AddressSet)0x35:_currentAuthorizedAccountspositions 매핑 슬롯
- 슬롯
0x36:__accountManager주소(AccountManager네이티브 프리컴파일)
AddressSet 인코딩
blacklist와 authorizedAccounts는 모두 공통 라이브러리인 AddressSetLib에서 정의한 AddressSet 구조를 사용합니다.
- 각 AddressSet은 두 개의 슬롯으로 구성됩니다.
- values 슬롯: 주소 배열의 길이를 base 슬롯에 저장하며, 실제 요소는
keccak256(valuesSlot) + index위치에 저장 - positions 슬롯:
address → index+1매핑을 저장하며, 값이0이면 집합에 포함되지 않음을 의미
- values 슬롯: 주소 배열의 길이를 base 슬롯에 저장하며, 실제 요소는
IsBlacklisted,IsAuthorizedAccount호출 시 O(1)에 가까운 멤버십 검사GetAllBlacklisted,GetAllAuthorizedAccounts를 통한 전체 집합 열거- 초기화 단계에서 0 주소 검증 및 중복 제거를 통한 안정적인 초기 상태 보장
제네시스 초기화 파라미터
GovCouncil은 제네시스에서initializeGovCouncil 로직을 통해 다음 파라미터로 초기화됩니다.
| Parameter | Type | Description |
|---|---|---|
members | address list | Council 거버넌스 멤버 목록(GovBase) |
quorum | uint | 제안 실행에 필요한 최소 승인 수(GovBase) |
expiry | uint | 제안 만료 시간(초 단위, GovBase) |
memberVersion | uint | 멤버 리스트 버전(GovBase) |
blacklist | address list | 초기 블랙리스트 주소 목록 |
authorizedAccounts | address 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반환
- 주소가 Authorized 계정이면
GetAuthorizedAccountCount,GetAuthorizedAccountAddress,GetAllAuthorizedAccounts- Authorized 계정 집합 열거
AccountManager 프리컴파일과 EVM은 이 정보를 사용하여 다음과 같은 정책을 적용할 수 있습니다.
- 블랙리스트 계정이 송신자인 트랜잭션을 상태 변경 전에 거부
- 블랙리스트 계정을 대상으로 하는 전송 또는 호출 차단
- 특정 관리 기능이나 특수 트랜잭션을 Authorized 계정으로만 제한
제안 및 투표 모델
GovCouncil은GovBase로부터 제안 라이프사이클 및 정족수 기반 투표 모델을 그대로 상속합니다.따라서 Council 거버넌스의 동작 패턴은 다른 Gov* 컨트랙트와 동일합니다.
- Members: 제안을 생성하고 투표할 수 있는 Council 멤버 집합
- Quorum: 제안 실행 전에 요구되는 최소 승인 수
- Expiry: 제안 유효 기간. 만료된 제안은 실행 불가
- Member Versioning: 멤버 변경 시
memberVersion증가로 이전 제안 자동 무효화
- 멤버가 블랙리스트 또는 Authorized 집합 변경에 대한 제안을 생성합니다.
- 다른 멤버들이 제안을 검토하고 승인 또는 거절에 투표합니다.
- 승인 수가 정족수에 도달하고 제안이 만료되지 않았다면 실행 가능 상태가 됩니다.
- 제안이 실행되면 AddressSet이 갱신되고 관련 이벤트가 발생합니다.
상위 수준 동작은 GovBase를 사용하는 모든 거버넌스 컨트랙트와 동일합니다.
운영 시 고려사항
GovCouncil을 구성하고 운영할 때 다음 사항을 고려해야 합니다.-
초기 블랙리스트 및 Authorized 계정
- 제네시스에서
systemContracts.govCouncil.params.*를 통해 초기 목록을 설정할 수 있습니다. - 첫 블록부터 즉시 효력이 발생하므로, 배포 전 충분한 검토가 필요합니다.
- 제네시스에서
-
정족수와 멤버 수의 균형
- 정족수가 너무 낮으면 정책 변경이 과도하게 쉬워질 수 있고,
너무 높으면 긴급 블랙리스트 대응이 지연될 수 있습니다. - 네트워크 성격에 맞는 균형 잡힌 설정이 필요합니다.
- 정족수가 너무 낮으면 정책 변경이 과도하게 쉬워질 수 있고,
-
모니터링
- 오프체인 서비스는
GetAllBlacklisted,GetAllAuthorizedAccounts를 주기적으로 조회하여 변경 사항을 추적할 수 있습니다. - 지갑이나 익스플로러는 계정 상세 화면에서 블랙리스트 또는 Authorized 여부를 표시할 수 있습니다.
- 오프체인 서비스는
-
트랜잭션 처리와의 연계
- 트랜잭션 검증 및 상태 전환 단계에서 AccountManager 또는 GovCouncil 헬퍼를 통해 다음 정책을 적용할 수 있습니다.
- 블랙리스트 계정의 트랜잭션 거부
- 블랙리스트 계정을 대상으로 하는 호출 차단
- 특정 관리 기능을 Authorized 계정으로 제한
- 트랜잭션 검증 및 상태 전환 단계에서 AccountManager 또는 GovCouncil 헬퍼를 통해 다음 정책을 적용할 수 있습니다.
GovValidator, GovMasterMinter, GovMinter와 함께 GovCouncil은 StableNet의 **정책 레이어(policy layer)**를 구성합니다.즉, 어떤 계정이 제한되거나 특권을 가지는지, 이러한 결정이 네트워크 전반에 어떻게 일관되게 적용되는지를 정의하는 핵심 구성 요소입니다.

