목적 및 범위
StableNet은 기본 스테이블코인의 민팅 및 소각 관리를 위한 2단계 거버넌스 시스템을 구현합니다. 이 아키텍처는 승인(누가 민터가 될 수 있는지)과 실행(민트/소각 작업 수행)을 명확히 분리합니다:- GovMasterMinter: 민터 엔티티를 승인하고 관리합니다
- GovMinter: 집단 투표를 통해 민트/소각 작업을 실행합니다
2단계 민팅 아키텍처
민팅 거버넌스는 유연성과 보안을 동시에 만족시키기 위해 계층적 승인 모델을 사용합니다. 이 아키텍처는 고정 주소의 두 시스템 컨트랙트와NativeCoinAdapter의 저장소 슬롯을 통해 구현됩니다:
주요 설계 원칙:
이 분리는
NativeCoinAdapter 컨트랙트의 접근 제어 수정자에 의해 강제됩니다:
onlyMasterMinter:msg.sender == masterMinter조건을 검증합니다 (슬롯 0x0)onlyMinters:_minters[msg.sender] == true조건을 검증합니다 (슬롯 0x1)- Allowance 확인:
_minterAllowed[msg.sender] >= amount조건을 검증합니다 (슬롯 0x2)
GovMasterMinter 컨트랙트
컨트랙트 식별 및 배포
GovMasterMinter는 제네시스에서 시스템 컨트랙트로 배포됩니다:- 주소:
0x0000000000000000000000000000000000001002 - 배포 방식: 제네시스 블록 직접 주입 (소유자 없음)
- 업그레이드 방식: 하드 포크를 통해서만 교체 가능
- 버전: 제네시스 구성에 명시됨 (예:
"v1")
책임
GovMasterMinter는 민팅 작업을 위한 승인 레이어 역할을 합니다:- 민터 등록: 특정 주소를 민터로 승인
- 민터 제거: 기존 민터의 권한 철회
- Allowance 관리: 민터당 최대 민팅/소각 허용량 설정
- 확장성 확보: 향후 브리지 기반 민터, 시스템 민터 등 다양한 타입의 민터 승인 가능
masterMinter 개념을 온체인 거버넌스 모델로 일반화한 것입니다.
제네시스 매개변수
GovMasterMinter는params.ChainConfig.Anzeon.SystemContracts.GovMasterMinter 구조를 통해 제네시스에서 초기화됩니다:
초기화 시퀀스
core.SetupGenesisBlock()이core.InjectContracts()를 호출합니다InjectContracts()가systemcontracts.InjectGovMasterMinter()를 호출합니다InjectGovMasterMinter()는NativeCoinAdapter저장소를 직접 초기화합니다:- 슬롯 0x0:
masterMinter = 0x0000...1002 - 슬롯 0x1: 각 민터 주소에 대해
_minters[address] = true - 슬롯 0x2: 각 민터 주소에 대해
_minterAllowed[address] = maxMinterAllowance
- 슬롯 0x0:
저장소 레이아웃
GovMasterMinter는 자체 저장소가 아니라NativeCoinAdapter의 저장소 슬롯을 통해 상태를 관리합니다. 슬롯 정의는 systemcontracts/coin_adapter.go에 상수로 선언되어 있습니다:
매핑 슬롯 계산은 Solidity 저장소 레이아웃 규칙을 그대로 따릅니다.
NativeCoinAdapter와의 상호 작용
GovMasterMinter는NativeCoinAdapter의 권한 관리 함수만 호출할 수 있습니다. 이 함수들은 onlyMasterMinter 수정자로 보호됩니다.
함수 시그니처:
configureMinter(address minter, uint256 minterAllowedAmount) external onlyMasterMinterremoveMinter(address minter) external onlyMasterMinter
- 거버넌스 제안이 쿼럼을 충족하면 실행 단계에서 트랜잭션 생성
msg.sender는 GovMasterMinter 컨트랙트 주소NativeCoinAdapter가 슬롯 0x0의masterMinter와msg.sender를 비교- 일치 시 저장소 슬롯 0x1, 0x2가 갱신되고 이벤트 발생
GovMinter 컨트랙트
컨트랙트 식별 및 배포
GovMinter는 제네시스에서 시스템 컨트랙트로 배포됩니다:- 주소:
0x0000000000000000000000000000000000001003 - 배포 방식: 제네시스 블록 직접 주입
- 업그레이드 방식: 하드 포크만 허용
- 버전: 제네시스 구성에 지정됨
책임
GovMinter는 민팅 작업의 실행 레이어입니다:- 민트 실행: 네이티브 스테이블코인 발행
- 소각 실행: 네이티브 스테이블코인 소각
- 오라클 역할: 오프체인 법정화폐 예치/인출 검증
- 멤버 거버넌스: 자체 멤버 추가·제거
- 다중 승인 조정: 민트/소각 제안의 집단 승인 관리
제네시스 매개변수
GovMinter는params.ChainConfig.Anzeon.SystemContracts.GovMinter 구조를 통해 제네시스에서 구성됩니다:
초기화 전제 조건
GovMinter는 실행되기 전에 반드시 민터로 승인되어야 합니다:- GovMasterMinter의
minters목록에 GovMinter 주소 포함 - GovMasterMinter가 GovMinter에 대한 allowance 설정
- 제네시스 중
InjectGovMasterMinter()가 이를NativeCoinAdapter슬롯 0x1, 0x2에 기록
mint() / burn() 호출은 onlyMinters 단계에서 거부됩니다.
민트 및 소각 워크플로우
민트 및 소각은 잔액 변경 전에 다음 검증 체인을 통과해야 합니다: 접근 제어 검증 체인:- 민터 승인 확인:
_minters[msg.sender] == true - Allowance 확인:
_minterAllowed[msg.sender] >= amount - 잔액 수정: 네이티브 코인 프리컴파일을 통해
StateDB잔액 직접 수정 - Allowance 차감:
_minterAllowed[msg.sender] -= amount
mint(address to, uint256 amount) external onlyMintersburn(uint256 amount) external onlyMinters
멤버 자체 거버넌스
GovMinter는 자체 멤버십을 관리할 수 있습니다. 이는 운영 유연성을 제공하지만, GovMasterMinter가 민터 승인을 철회할 경우 GovMinter 전체의 실행 권한은 즉시 무효화됩니다.거버넌스 메커니즘
GovMasterMinter와 GovMinter는 공통의 GovBase 패턴을 공유합니다.투표 프로세스
제안 라이프사이클:- 생성: 멤버가 제안 생성
- 투표: 승인 또는 거절 투표
- 쿼럼 도달:
quorum이상 승인 - 실행: 만료 전 실행
- 만료: 쿼럼 미달 시 자동 폐기
쿼럼 요구사항
프로덕션 환경에서는 과반 또는 2/3 이상 쿼럼 구성이 권장됩니다.
멤버 버전 관리
memberVersion은 멤버 변경 시 증가하며, 이전 버전에서 생성된 제안의 실행을 차단하여 재생 공격을 방지합니다.
제안 제한
maxProposals는 동시 제안 수를 제한하여 거버넌스 DoS를 방지합니다.
시스템 컨트랙트와의 통합
요약
2단계 민팅 거버넌스 아키텍처는 다음을 보장합니다:
이 설계는 StableNet이 1:1 법정화폐 페그를 유지하면서도, 프로토콜 수준의 탈중앙화와 운영 통제를 동시에 달성하도록 합니다.

