호패DOCS
데모 열기
문서 목차컨트랙트 & 배포
Reference

컨트랙트 & 배포

HopaeRegistry는 GIWA 프리디플로이 EAS 위의 어테스테이션 레지스트리입니다. 레지스트리 자체가 EAS 어테스터라서 발급 키를 교체해도 어테스테이션 계보가 유지됩니다.

GIWA Sepolia 배포 (Verified)

항목
chainId91342
RPChttps://sepolia-rpc.giwa.io
HopaeRegistry0x3C05Bc238b74d99ad9d8c0345d0f64BD249234d2
GatedKRW (데모)0xb14FA681cEBaC8b3e9e9B16883D7Dd20Da015cf1
AgeVerifier (UltraHonk)0x8f19d3Ba7ff20e00a8FEc2b7798e8891C959367D
HopaeZkGate0x94668C93536c601C4F782d2b6862Eb8b29E8f3AF
EAS (프리디플로이)0x4200000000000000000000000000000000000021
SchemaRegistry (프리디플로이)0x4200000000000000000000000000000000000020
스키마 (v2 · ZK-ready)uint16 kind, uint8 level, bytes32 evidenceHash, bytes32 claimsRoot, bytes32 auditRef
스키마 UID0x88d4f0e02d258b0a25d048d36ba3b6a4c406dc50f4fc4ee0888735e1deea7f3e
배포 블록31939096

네 컨트랙트 모두 Blockscout에서 소스 Verified 상태입니다. 코드와 모든 발급·폐기·ZK 검증 트랜잭션을 익스플로러에서 직접 확인할 수 있습니다.

HopaeRegistry

검증 (누구나 · view)

함수설명
isVerified(subject, kind, minLevel) → booldApp에 필요한 유일한 read. 폐기·만료 시 즉시 false, level ≥ minLevel 확인.
isKycVerified(subject) → boolisVerified(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는 커밋된 생년월일을 공개하지 않고 성년임을 증명하고, AgeVerifierHopaeZkGate가 온체인에서 검증합니다. 게이트가 폐기·만료를 레지스트리에서 직접 확인하므로 폐기 즉시 모든 증명이 무효화됩니다. 검증 인터페이스는 v1과 동일해서 dApp 통합 코드는 바뀌지 않습니다.