컨트랙트 & 배포
HopaeRegistry는 GIWA 프리디플로이 EAS 위의 어테스테이션 레지스트리입니다. 레지스트리 자체가 EAS 어테스터라서 발급 키를 교체해도 어테스테이션 계보가 유지됩니다.
GIWA Sepolia 배포 (Verified)
| 항목 | 값 |
|---|---|
| chainId | 91342 |
| RPC | https://sepolia-rpc.giwa.io |
| HopaeRegistry | 0x3C05Bc238b74d99ad9d8c0345d0f64BD249234d2 ↗ |
| GatedKRW (데모) | 0xb14FA681cEBaC8b3e9e9B16883D7Dd20Da015cf1 ↗ |
| AgeVerifier (UltraHonk) | 0x8f19d3Ba7ff20e00a8FEc2b7798e8891C959367D ↗ |
| HopaeZkGate | 0x94668C93536c601C4F782d2b6862Eb8b29E8f3AF ↗ |
| EAS (프리디플로이) | 0x4200000000000000000000000000000000000021 |
| SchemaRegistry (프리디플로이) | 0x4200000000000000000000000000000000000020 |
| 스키마 (v2 · ZK-ready) | uint16 kind, uint8 level, bytes32 evidenceHash, bytes32 claimsRoot, bytes32 auditRef |
| 스키마 UID | 0x88d4f0e02d258b0a25d048d36ba3b6a4c406dc50f4fc4ee0888735e1deea7f3e |
| 배포 블록 | 31939096 |
네 컨트랙트 모두 Blockscout에서 소스 Verified 상태입니다. 코드와 모든 발급·폐기·ZK 검증 트랜잭션을 익스플로러에서 직접 확인할 수 있습니다.
HopaeRegistry
검증 (누구나 · view)
| 함수 | 설명 |
|---|---|
isVerified(subject, kind, minLevel) → bool | dApp에 필요한 유일한 read. 폐기·만료 시 즉시 false, level ≥ minLevel 확인. |
isKycVerified(subject) → bool | isVerified(subject, KYC, 1) 단축형. |
attestationOf(subject, kind) → bytes32 | 현재 어테스테이션의 EAS UID (없으면 0). |
claimsRootOf(subject, kind) → bytes32 | (v2) 살아있는 어테스테이션의 클레임 커밋 루트. 폐기·만료면 0. |
발급·폐기 (issuer 전용)
| 함수 | 설명 |
|---|---|
issue(subject, kind, level, evidenceHash, claimsRoot, auditRef, expirationTime) → uid | 발급·재발급. 증적 해시 필수. 살아있는 구 어테스테이션은 EAS에서 선폐기 후 신규 발급. |
revoke(subject, kind, reasonHash) | 폐기. 사유 해시 필수. |
revokeByUid(uid, reasonHash) | 이 레지스트리가 발급한 임의 UID를 직접 폐기. |
관리 (owner 전용)
| 함수 | 설명 |
|---|---|
setIssuer(issuer, enabled) | 발급 키 등록·해제. |
transferOwnership(newOwner) / acceptOwnership() | 2단계 소유권 이전 (Ownable2Step). |
이벤트
| 이벤트 | 발생 시점 |
|---|---|
Issued(subject, kind, level, uid, evidenceHash, claimsRoot) | 발급·재발급 성공. |
Revoked(subject, kind, uid, reasonHash) | 폐기. |
Superseded(subject, kind, oldUid, newUid) | 재발급으로 구 어테스테이션이 EAS에서 선폐기됨. |
IssuerSet(issuer, enabled) | 발급 키 변경. |
주요 에러
| 에러 | 의미 |
|---|---|
EvidenceRequired | 증적·사유 해시 없이 발급·폐기 시도. |
NotIssuer / NotOwner | 권한 없는 호출. |
NoAttestation(subject, kind) | 폐기 대상 어테스테이션 없음. |
ClaimsRootRequired / AuditRefRequired | (v2) ZK 커밋먼트 없이 발급 시도. |
GatedKRW (게이트 레퍼런스)
인증 지갑끼리만 전송되는 데모 ERC-20입니다. 토큰 내부에 화이트리스트를 두는 대신 공유 레지스트리를 view 호출 하나로 조회합니다.
GatedKRW.sol — 게이트의 전부solidity
modifier onlyVerified(address from, address to) {
if (!hopae.isKycVerified(from)) revert NotKycVerified(from);
if (!hopae.isKycVerified(to)) revert NotKycVerified(to);
_;
}
function faucet() external { // 인증 지갑만 — 1,000,000 gKRW
if (!hopae.isKycVerified(msg.sender)) revert NotKycVerified(msg.sender);
…
}레지스트리에서 폐기가 일어나면 이 토큰의 전송은 즉시 revert되기 시작합니다. 토큰 쪽 코드는 그대로입니다. 기존 잔고도 그대로이며, 게이트 통과만 차단됩니다.
스키마 v2와 ZK 술어 검증
현재 배포는 스키마 v2입니다. 발급 시 검증 필드들의 커밋먼트 루트(
claimsRoot)와 감사봉투 해시(auditRef)가 함께 기록됩니다. 검증 방법은 프라이버시와 ZK 문서에 있습니다.첫 술어 회로 age_over는 커밋된 생년월일을 공개하지 않고 성년임을 증명하고, AgeVerifier와 HopaeZkGate가 온체인에서 검증합니다. 게이트가 폐기·만료를 레지스트리에서 직접 확인하므로 폐기 즉시 모든 증명이 무효화됩니다. 검증 인터페이스는 v1과 동일해서 dApp 통합 코드는 바뀌지 않습니다.