[블록체인 PICK] Web3.py를 이용해 Ethereum 블록 크롤링

in #kr6 years ago

Web3.py를 이용해 Ethereum 블록 크롤링

블픽1.JPG

이더리움을 활용하기 위해서 대다수가 javascript 기반의 라이브러리인 web3js를 선택하지만 오늘은 파이썬의 web3.py를 이용한 이더리움 블록의 정보를 활용할수 있는 방법을 알아보겠습니다.

블픽2.JPG

왜 완성도 높은 web3js를 놔두고 굳이 Python의 라이브러리인 web3py를 사용하는 이유는 토큰의 프리세일 페이지를 Django 기반으로 만들었기에 같은 플랫폼 안에서 동작되면 좋겠다는 생각이 들었기 때문입니다.

Web3py 설치

현재의 프로젝트에 web3.py를 사용하기 위해 아래와 같은 명령어를 입력하여 설치합니다. (가급적이면 패키지 관리를 위해 virtualenv 설치하면 좋습니다.)

블픽3.JPG

설치가 완료되고 나면 임의의 파일 하나를 생성하여 최신의 블록 정보 가져오는 명령어를 실행합니다. True 값은 모든 트랜잭션을 보여주는 옵션입니다.

블픽4.JPG

이 명령어를 실행된 결과를 파이썬은 자동으로 Dict 형태로 리턴해 줍니다.

블픽5.JPG

이 결과에서 보셔야 할 부분은 transactions 이 부분입니다.
트랜잭션들은 다음과 같은 필드로 구성됩니다.

● nonce: EOA에 발급되는 트랜잭션 일련번호를 나타냅니다.
● gas price: 가스의 가격입니다.
● gas limit: 가스의 최대 사용량입니다.
● from: 발신자 주소입니다.
● to: 수신자 주소입니다.
● value: 수신자에게 보내는 이더(ether) 개수입니다.
● data: 가변길이의 바이너리 데이터(payload)입니다.
● v, r, s: ECDSA 서명 구성 요소 입니다.

블픽6.JPG

간단하게 이더리움의 블록 정보로 해당 블록의 거래내역을 가져오는 로직을 살펴보았습니다.

위와 같은 방법을 이용하여 현재부터 주기적으로 데이터를 가져오려고 한다면:

블록이 생성되는 시간 안에 위와 같이 블록 탐색이 끝날 수 있게 좁은 범위를 자주 탐색하도록 만듭니다. (20초 ~ 1분)
마지막 블록 넘버를 저장하여 마지막 블록으로부터 현재까지의 블록 범위를 구성합니다.

블픽7.JPG

이 transactionRecipt 함수는 트랜잭션이 잘 수행되어있는지를 볼 수 있는 체크하는 함수입니다. (이더리움의 영수증)
거래 영수증 항목들입니다.

● blaockHash: 거래를 어떤 블록에 저장했는지 나타냅니다.
● blockNumber: 거래를 몇 번째 블록에 저장했는지 나타냅니다.
● contractAddress: 컨트랙트에 참여한 트랜잭션이라면 컨트랙트가 나타납니다.
● cumulativeGasUsed: 트랜잭션에서 사용한 가스 사용량입니다.
● from: 거래 발신자의 주소가 있습니다. 20바이트(160비트) 값입니다.
● gasUsed: 사용한 가스 사용량입니다.
● logsBloom: 블록 안에서 출력하는 로그 데이터를 블룸필터 형태로 저장한 것입니다
● logs: 거래에서 생성된 로그들입니다.
● root: 상태 트리를 바꾼 후의 상태 루트 값입니다.
● to: 거래 수신자의 주소가 있습니다.
● transactionHash: 32바이트의 거래 해시값을 나타냅니다.

영수증의 데이터에서는 Gas가 부족해서 발생한 취소는 판별이 힘듭니다.

이 내역에서는 status가 중요합니다. 이 내역이 성공적으로 처리가 되었다면 1이 반환됩니다.

***2017년 10월 비잔티움 포크전에는 status 필드가 추가 되기전이어서 logs를 보면서 확인했어야 합니다.

이렇게 블록안의 성공한 트랜잭션들의 데이터를 가져오는 실습과 트랜젝션데이터의 내용들을 살펴 보았습니다.


블픽8.JPG


원문 확인하기 >> https://bit.ly/2Bq6t12

Coin Marketplace

STEEM 0.19
TRX 0.15
JST 0.029
BTC 63665.23
ETH 2621.19
USDT 1.00
SBD 2.77