testnet
GitHub EN

PCL을 사용하여 규제 준수 ERC20 토큰 만들기

intermediate integration 45 min

마루에 ERC20 토큰을 배포하고 PCL을 사용하여 온체인 증명을 통해 KYC 기반 전송 제한을 시행하는 전체 과정 가이드입니다.

학습 목표

  • 마루용 Hardhat 프로젝트 설정 방법.
  • 이더리움 증명 서비스(EAS)를 사용하여 KYC 증명 발급 방법.
  • 이러한 증명을 확인하도록 전역 PCL 정책 구성 방법.
  • 표준 ERC20 컨트랙트 배포 방법.
  • PCL이 증명되지 않은 계정의 전송을 올바르게 차단하는지 확인하는 방법.

사전 요구사항

  • 실행 중인 로컬 마루 테스트넷.
  • Solidity 및 ERC20 토큰에 대한 기본 지식.
  • 로컬 테스트넷에 자금이 있는 계정.

필요 도구

HardhatNode.js 18+marood CLIMetaMask
이 튜토리얼에서는 KYC 인증된 사용자 간의 전송만 허용하는 증권형 토큰을 구축합니다. 우리는 비표준적인 커스텀 Solidity 코드를 작성하는 대신, 마루의 PCL 모듈을 활용하여 프로토콜 수준에서 규칙을 시행함으로써 이를 달성할 것입니다. 이 접근 방식은 스마트 컨트랙트를 단순하고 표준적으로 유지하면서 컴플라이언스는 체인 자체에서 처리하도록 합니다.
1

1단계: EAS 설정 및 증명 발급

먼저, 증명을 발급할 '신원 확인자'가 필요합니다. 로컬 테스트넷에는 EAS 컨트랙트가 이미 배포되어 있습니다. 스크립트를 사용하여 간단한 KYC 스키마를 정의하고 테스트 계정 중 하나에 증명을 발급할 것입니다.

scripts/issueAttestation.js 스크립트를 생성합니다.
scripts/issueAttestation.js javascript
const { EAS, SchemaEncoder } = require("@ethereum-attestation-service/eas-sdk");
const { ethers } = require("hardhat");

const EAS_CONTRACT_ADDRESS = "0x..."; // 테스트넷 배포에서 주소 확인

async function main() {
  const [deployer, kycUser, nonKycUser] = await ethers.getSigners();
  const eas = new EAS(EAS_CONTRACT_ADDRESS);
  await eas.connect(deployer);

  const schemaEncoder = new SchemaEncoder("bool kycVerified");
  const schemaUID = await eas.registerSchema(schemaEncoder.encode());

  console.log("새 스키마 UID:", schemaUID);

  const encodedData = schemaEncoder.encodeData([{ name: "kycVerified", value: true, type: "bool" }]);
  const tx = await eas.attest({
    schema: schemaUID,
    data: {
      recipient: kycUser.address,
      expirationTime: 0,
      revocable: true,
      data: encodedData,
    },
  });

  const newAttestationUID = await tx.wait();
  console.log("새 증명 UID:", newAttestationUID);
}

main().catch(console.error);
팁: 테스트넷에 배포된 EAS 및 Indexer 컨트랙트의 주소가 필요합니다. 이는 일반적으로 제네시스 파일이나 배포 아티팩트에서 찾을 수 있습니다.
2

2단계: 전역 PCL 정책 구성

이제 PolicyAdmin 역할을 하여 방금 생성한 증명을 요구하는 전역 정책을 설정합니다. 이는 거버넌스 제안을 통해 이루어집니다.
eas-policy-params.json json
{
  "eas_contract": "0x...",
  "index_contract": "0x...",
  "schema_uid": "1단계에서_얻은_스키마_UID"
}
terminal bash
PARAMS_B64=$(base64 -w 0 eas-policy-params.json)
proposal.json json
{
  "messages": [
    {
      "@type": "/maroo.pcl.v1.MsgSetGlobalPolicy",
      "authority": "정책_관리자_주소",
      "policies": [
        {
          "template_id": "EAS_POLICY",
          "parameters": "$PARAMS_B64"
        }
      ]
    }
  ],
  "title": "전역 KYC 확인 활성화",
  "summary": "EAS 증명을 통해 모든 전송에 KYC 적용",
  "deposit": "1000000000000000000000aokrw"
}
terminal bash
marood tx gov submit-proposal proposal.json --from policy_admin_key
# ...제안 통과를 위해 투표
3

3단계: ERC20 토큰 배포 및 테스트

전역 정책이 활성화되었으므로 이제 완전히 표준적인 ERC20 토큰을 배포할 수 있습니다. 이를 위해 OpenZeppelin 컨트랙트를 사용합니다.
scripts/deploy.js javascript
const { ethers } = require("hardhat");

async function main() {
  const MyToken = await ethers.getContractFactory("MyToken"); // 표준 OZ ERC20
  const token = await MyToken.deploy();
  await token.deployed();
  console.log("토큰 배포 주소:", token.address);
}

main();

마무리

마루에서 성공적으로 규제 준수 토큰을 구현했습니다. Solidity 컨트랙트에는 어떠한 커스텀 로직도 작성하지 않았다는 점에 주목하세요. 컴플라이언스 규칙은 체인의 PCL 모듈에 의해 외부에서 적용되었으며, 이는 애플리케이션 로직과 규제 시행을 분리하는 강력함을 보여줍니다.
소스: maroo
ESC
검색어를 입력하세요