Maroo에서 EAS로 신원 검증하기
스키마 등록, attestation 발급, 표준 EVM JSON-RPC를 통한 검증까지 전체 흐름을 단계별로 따라가 봅니다.
학습 목표
- ✓마루 EAS Schema Registry에 스키마 등록 방법
- ✓온체인 attestation 발급 방법
- ✓표준 EVM 도구 (cast / viem / eas-sdk)로 attestation 다시 조회하는 방법
사전 요구사항
- OKRW가 있는 Maroo 테스트넷 계정
- 기본적인 Solidity/Ethers.js 지식
필요 도구
Hardhat (or Foundry)Node.js 20+Foundry's cast (optional, for shell verification)
이 튜토리얼에서는 KYC 발급자가 사용자에게 'IsVerified' attestation을 발급하는 상황을 시뮬레이션합니다. 그런 다음 표준 EVM JSON-RPC로 attestation을 다시 읽습니다. 프론트엔드 dApp이나 백엔드 서비스가 사용자의 상태를 검증할 때 사용하는 것과 동일한 경로입니다. 마루의 EAS는 Solidity 컨트랙트 preinstall이므로 어떤 EVM 도구(viem, ethers, cast, eas-sdk)로도 직접 읽을 수 있습니다.
1
1. 스키마 정의
먼저 스키마를 등록해야 합니다. 이 튜토리얼의 스키마는 간단한
bool isVerified입니다. 스크립트를 사용하여 글로벌 EAS 스키마 레지스트리에 이를 등록합니다. scripts/register.js javascript
const { SchemaRegistry } = require("@ethereum-attestation-service/eas-sdk");
// ... 프로바이더/사이너 설정 ...
const schemaRegistry = new SchemaRegistry(SCHEMA_REGISTRY_ADDRESS);
const schema = "bool isVerified";
const resolverAddress = "0x0000000000000000000000000000000000000000"; // 리졸버 없음
const revocable = true;
const tx = await schemaRegistry.register({ schema, resolverAddress, revocable });
const uid = await tx.wait();
console.log("Schema UID:", uid); 2
2. 증명 생성
이제 발급자 역할을 수행합니다. 특정 수신자 주소가 검증되었음을 증명합니다.
scripts/attest.js javascript
const { EAS, SchemaEncoder } = require("@ethereum-attestation-service/eas-sdk");
const eas = new EAS(EAS_CONTRACT_ADDRESS);
eas.connect(signer);
const schemaEncoder = new SchemaEncoder("bool isVerified");
const encodedData = schemaEncoder.encodeData([{ name: "isVerified", value: true, type: "bool" }]);
const tx = await eas.attest({
schema: SCHEMA_UID,
data: {
recipient: "0xRecipientAddress...",
expirationTime: 0,
revocable: true,
data: encodedData,
},
});
const newAttestationUID = await tx.wait();
console.log("Attestation UID:", newAttestationUID); 3
3. JSON-RPC를 통한 검증
EAS 컨트랙트의
getAttestation(uid)로 attestation을 다시 읽습니다. 쉘에서는 cast로, 앱 코드에서는 viem/ethers로 호출합니다. 둘 다 동일한 EVM view를 호출합니다. terminal bash
cast call $EAS_CONTRACT \
"getAttestation(bytes32)" \
$ATTESTATION_UID \
--rpc-url $MAROO_RPC viem typescript
const att = await publicClient.readContract({
address: EAS_CONTRACT,
abi: easAbi,
functionName: "getAttestation",
args: [attestationUID],
});
const valid =
att.revocationTime === 0n &&
(att.expirationTime === 0n || att.expirationTime > BigInt(Math.floor(Date.now()/1000))); 팁: `revocationTime`(0이어야 함)과 `expirationTime`(0 = 만료 없음, 또는 미래 시각)을 확인합니다. PCL의 `EAS_POLICY`가 AnteHandler 경로에서 실행하는 것과 정확히 동일한 검사입니다.
마무리
표준 eas-sdk로 attestation을 발급하고 표준 EVM 도구로 검증했습니다. 특수 CLI는 필요하지 않습니다. 마루의 EAS는 다른 EVM 체인의 EAS와 동일하게 동작합니다. 역방향 조회(예: "이 사용자가 스키마 X로 보유한 attestation은?")는
querying-eas-data 가이드와 Indexer 메서드 문서에서 다룹니다.