Maroo에서 EAS로 신원 검증하기

intermediate integration 30 min

스키마 등록, 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 메서드 문서에서 다룹니다.
소스: maroo
ESC
검색어를 입력하세요