목적 및 범위
StableNet은 기본 스테이블코인의 민팅 및 소각 관리를 위한 2단계 거버넌스 시스템을 구현합니다. 이 아키텍처는 승인(누가 민터가 될 수 있는지)과 실행(민트/소각 작업 수행)을 명확히 분리합니다:- GovMasterMinter: 민터 엔티티를 승인하고 관리합니다
- GovMinter: 집단 투표를 통해 민트/소각 작업을 실행합니다
2단계 민팅 아키텍처
민팅 거버넌스는 유연성과 보안을 동시에 만족시키기 위해 계층적 승인 모델을 사용합니다. 이 아키텍처는 고정 주소의 두 시스템 컨트랙트와NativeCoinAdapter의 저장소 슬롯을 통해 구현됩니다:
주요 설계 원칙:
| Layer | Contract Address | Members | Operations |
|---|---|---|---|
| Authorization | 0x0000...1002 | Master minter members | configureMinter(), removeMinter() |
| Execution | 0x0000...1003 | Minter members | mint(), burn() (quorum approval required) |
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 구조를 통해 제네시스에서 초기화됩니다:
| Parameter | Type | Purpose | Example Value | Genesis Location |
|---|---|---|---|---|
members | address list | Master minter 거버넌스 멤버 | "0xaa5f...4697" | params.GovMasterMinter.Params["members"] |
quorum | uint | 제안 승인에 필요한 최소 투표 수 | "1" | params.GovMasterMinter.Params["quorum"] |
expiry | uint | 제안 만료 시간 (초) | "604800" | params.GovMasterMinter.Params["expiry"] |
memberVersion | uint | 멤버십 버전 | "1" | params.GovMasterMinter.Params["memberVersion"] |
fiatToken | address | NativeCoinAdapter 주소 | "0x0000...1000" | params.GovMasterMinter.Params["fiatToken"] |
minters | address list | 초기 승인 민터 목록 | "0x0000...1003" | params.GovMasterMinter.Params["minters"] |
maxMinterAllowance | uint256 | 민터당 최대 allowance | "10000000000000000000000000000" | params.GovMasterMinter.Params["maxMinterAllowance"] |
maxProposals | uint | 동시 활성 제안 수 상한 | "3" | params.GovMasterMinter.Params["maxProposals"] |
초기화 시퀀스
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에 상수로 선언되어 있습니다:
| Operation | Slot | Key Derivation | Value Type | ||
|---|---|---|---|---|---|
| Read master minter | 0x0 | Direct slot access | address | ||
| Check minter | 0x1 | `keccak256(address | slot)` | bool | |
| Read allowance | 0x2 | `keccak256(address | slot)` | uint256 |
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 구조를 통해 제네시스에서 구성됩니다:
| Parameter | Type | Purpose | Example Value | Genesis Location |
|---|---|---|---|---|
members | address list | 민터 운영 멤버 | "0xaa5f...4697" | params.GovMinter.Params["members"] |
quorum | uint | 민트/소각 실행 최소 승인 수 | "1" | params.GovMinter.Params["quorum"] |
expiry | uint | 제안 만료 시간 | "604800" | params.GovMinter.Params["expiry"] |
memberVersion | uint | 멤버 버전 | "1" | params.GovMinter.Params["memberVersion"] |
fiatToken | address | NativeCoinAdapter 주소 | "0x0000...1000" | params.GovMinter.Params["fiatToken"] |
maxProposals | uint | 동시 활성 제안 수 | "3" | params.GovMinter.Params["maxProposals"] |
초기화 전제 조건
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이상 승인 - 실행: 만료 전 실행
- 만료: 쿼럼 미달 시 자동 폐기
쿼럼 요구사항
| Network Size | Recommended Quorum | Rationale |
|---|---|---|
| 1 member | 1 | 개발·테스트 |
| 2–4 members | 2 | 단순 과반 |
| 5+ members | ⌈(n/2) + 1⌉ | BFT 관점 안전성 |
멤버 버전 관리
memberVersion은 멤버 변경 시 증가하며, 이전 버전에서 생성된 제안의 실행을 차단하여 재생 공격을 방지합니다.
제안 제한
maxProposals는 동시 제안 수를 제한하여 거버넌스 DoS를 방지합니다.
시스템 컨트랙트와의 통합
| Relationship | Storage/Code Location | Purpose |
|---|---|---|
| GovMasterMinter → Slot 0x0 | statedb.GetState(nca, 0x0) | Master minter 검증 |
| GovMinter → Slot 0x1 | _minters[address] | 민터 승인 확인 |
| GovMinter → Slot 0x2 | _minterAllowed[address] | allowance 확인 |
| NativeCoinAdapter → Precompile | Native balance update | 잔액 수정 |
| Genesis → Storage | InjectGovMasterMinter() | 초기 상태 설정 |
요약
2단계 민팅 거버넌스 아키텍처는 다음을 보장합니다:| Feature | Benefit |
|---|---|
| 승인·실행 분리 | 권한 집중 방지 |
| 다중 승인 | 단일 주체 오남용 차단 |
| 확장성 | 다양한 민터 유형 수용 |
| 투명성 | 모든 작업 온체인 기록 |
| 보안성 | allowance 기반 발행 한도 통제 |

