본문 바로가기

반응형

블록체인

(20)
getPastEvents 함수의 방대한 결과값을 순차적으로 처리하는 방법 Error: Returned error: query returned more than 10000 results Infura API 를 통해 조회시 결과가 10000개 이상이면 에러가 발생한다. 대표적으로 getPastEvents 함수로 토큰의 모든 트랜스퍼 이벤트를 조회할 때 발생한다. 아래 링크에서는 이 에러를 우회하기 위해 결과값이 10000개 이상일 때 이분 탐색을 제시한다. Infura returns strange error: `query returned more than 10000 results` The purpose of the function below is to track USDT that is transferred to and from Yearn and Fulcrum. When I cal..
이더리움 화이트리스트 추출 방법 NFT 민팅 하다보면 화이트리스트 스냅샷을 찍게 된다. 방법 1. https://tethrr.io/ 스냅샷 서비스를 이용한다. 장점: 이메일과 컨트랙트 주소만 입력하면 이메일로 홀더 목록을 전달해준다. 단점: 특정 시점을 지정할 수 없다. 정확한 화이트리스트 목록을 못 가져올 수 있다. 언제 쓰면 좋은가? 손쉽게 사용하고 홀더들로부터 화리 수정 요청을 받을 경우 방법 2. 스마트 컨트랙트에 홀더 리스트를 관리하는 배열을 만든다. 장점: 쿼리 한번으로 홀더 목록을 가져올 수 있다. 단점: Openzeppelin 에서 제공하는 라이브러리가 없어서 직접 개발해야 하고, 배열을 관리하는 로직으로 gas 비용이 늘어난다. 방법 3. 트랜잭션 중에 transfer 이벤트 목록을 가져와 홀더를 추적한다. 장점: 블록..
이더스캔에서 ERC721 토큰을 추적하는 방식 ERC721 컨트랙트의 transfer 함수를 수행하면 이더스캔에서 관련된 트랜잭션과 토큰의 이동 내역을 확인할 수 있다. 이더스캔은 emit 된 이벤트을 참조하여 트랜스퍼 트랜잭션을 수집한다. 만약 나만의 transfer 함수에서 토큰 이동 없이 이벤트만 emit 하여도 이더스캔에서는 이를 감지한다. 그러나 실제 토큰의 이동은 없기 때문에 EOA 자산으로는 확인할 수 없다. 추가로 Opensea 또한 이더스캔의 이런 수집 내용을 API 를 통해 참조하는 것 같다. 내가 만든 솔리디티 코드를 통해 Etherscan 또는 Opensea 에 영향을 줄 수 있기 때문에 충분한 테스트를 거쳐야 한다.
솔리디티의 Safe Math 기능과 Counters 객체 솔리디티에서는 오버플로우/언더플로우에 의한 공격 사례가 발생했다. 이를 막기 위해서 Safe Math 기능이 ^0.8.0 버전부터 기본적으로 적용되어 수에 대한 증가/감소에 검사 로직이 추가되었다. 다만 Safe Math 로직을 수행하는 것도 gas 가 소요되는 부분이다. Openzeppelin 라이브러리 Counters 객체는 수를 증가시킬 때 Safe Math 를 사용하지 않는다. Counters 객체를 사용하면 오버플로우에 대한 로직은 없고, 수는 default 시작 값은 0 이다. 그리고 수를 증가시키는 로직은 unchecked 태그 내에서 수행하여 Safe Math 기능을 명시적으로 disable 한다. 이는 EVM 에서 0 부터 2^256 까지 증가시키는 로직은 사실상 불가능하다 라는 전재를 ..