본문 바로가기

반응형

블록체인/이더리움

(8)
보안취약점 external call 솔리디티 스마트 컨트랙트에서 external call 을 할 때 (예를 들면 safeMint 함수) 호출한 외부 함수에서 나의 함수를 재호출하는 위험이 있다. 이를 방지하기 위해 우선적으로는 require 문에서 권한 또는 정보의 유효성을 체크할 수 있다. 다만 함수 내에서 실행하는 로직에 의해 require 문 만족 여부가 바뀌는 경우가 있을 수 있다. 따라서 함수 내에서 변경하고자 하는 값이 있다면 external call 을 요청하기 전에 모두 실행해야 한다. 결론: external call 의 위치 함수의 끝에 작성하도록 한다.
트랜잭션 hash 를 가장 빨리 받는 방법 웹에서 지갑 어플리케이션을 통해 트랜잭션을 발생했다고 치자 (제발 그냥 그랬다고 치자) 트랜잭션이 정상적으로 종료되고 나발이고 내가 발생시킨 트랜잭션 hash 값을 최대한 빨리 화면에 뿌려주고 싶다. 어떡할래? web3.eth.sendTransaction().on() 등의 async 함수를 await 할 경우, async 함수를 강제 종료시키는 방법은 없다. (자바스크립트 언어의 특성) 방법은 내가 호출하고자 하는 web3 async 함수를 Promise 객체 안에 담는 것이다. addBlockChain: async(u, n, c, e) => { const web3 = new Web3(App.web3Provider); const signed = await web3.eth.accounts.signTrans..
msg.sender vs _msgSender() 솔리디티 코딩을 하다보면 어떤 contract 에서는 컨트랙트 호출자로 msg.sender 를 사용하고 어디에는 _msgSender() 함수를 사용한다. 외국 빡빡이 말에 의하면 컨트랙트 간에 인터널 트랜잭션을 사용할 때 전달자가 (relayer) 가 아닌 초기 호출자에 대한 정보를 받아오기 위함이다. 그렇다면 아래 코드는 왜쓰는걸까? require(tx.origin == _msgSender(), "Caller cannot be a contract."); 해당 함수는 컨트랙 어드레스가 호출하지 못하게하여 미연의 악용을 방지한다.
오픈씨는 왜 WETH 를 사용할까? 궁금하면 0xAee0dA182193e152c103e2d9Ae8792454f22bcE8 10klay 전송 후 댓글 오답: 수수료 때문에 정답: ETH 는 ERC20 이 아니기 때문에 다음 질문 어떤 거래는 WETH, 어떤 거래는 ETH 로 이뤄진다. 왜? 10klay 전송 후 댓글
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 까지 증가시키는 로직은 사실상 불가능하다 라는 전재를 ..