본문 바로가기

블록체인/이더리움

이더리움 화이트리스트 추출 방법

반응형

NFT 민팅 하다보면 화이트리스트 스냅샷을 찍게 된다.

 

방법 1. https://tethrr.io/ 스냅샷 서비스를 이용한다.

장점: 이메일과 컨트랙트 주소만 입력하면 이메일로 홀더 목록을 전달해준다.

단점: 특정 시점을 지정할 수 없다. 정확한 화이트리스트 목록을 못 가져올 수 있다. 

언제 쓰면 좋은가? 손쉽게 사용하고 홀더들로부터 화리 수정 요청을 받을 경우

 

방법 2. 스마트 컨트랙트에 홀더 리스트를 관리하는 배열을 만든다.

장점: 쿼리 한번으로 홀더 목록을 가져올 수 있다.

단점: Openzeppelin 에서 제공하는 라이브러리가 없어서 직접 개발해야 하고, 배열을 관리하는 로직으로 gas 비용이 늘어난다.

 

방법 3. 트랜잭션 중에 transfer 이벤트 목록을 가져와 홀더를 추적한다.

장점: 블록 기준으로 조회하기 때문에 정확하다. 특정 시점을 기준으로 조회할 수 있다.

단점: 조회하고자 하는 스마트 컨트랙트가 오래됐을 수록 가져와야하는 블록이 많아져 성능이 오래걸린다. 코딩을 해야 한다.

const CONTRACT_ACCOUNT = "0xE9e3F9cfc1A64DFca53614a0182CFAD56c10624F";
const CONTRACT_START = 6645906;
const INFURA_KEY = "55397e793412497fb349e0ff77f154f2";

const Web3 = require('web3'); // Use web3@1.0.0-beta.36+ https://github.com/ethereum/web3.js/issues/1916
const web3 = new Web3(new Web3.providers.HttpProvider('https://mainnet.infura.io/v3/' + INFURA_KEY));
const erc721 = require("@0xcert/ethereum-erc721/build/erc721.json").ERC721;
const contract = new web3.eth.Contract(erc721.abi, CONTRACT_ACCOUNT);
var idToOwner = {};

contract.getPastEvents('Transfer', {fromBlock: CONTRACT_START, toBlock: CONTRACT_START+60000}).then(events => {
  events.forEach(event => {
    idToOwner[event.returnValues._tokenId] = event.returnValues._to
  });
  console.log(idToOwner);
});

https://ethereum.stackexchange.com/questions/61565/list-holders-and-tokens-for-an-erc-721-contract

반응형