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

View this thread on: d.buzz | hive.blog | peakd.com | ecency.com
·@bithumb-official·
0.000 HBD
[블록체인 PICK] Web3.py를 이용해 Ethereum 블록 크롤링
<center>**Web3.py를 이용해 Ethereum 블록 크롤링**</center>

<center>![블픽1.JPG](https://cdn.steemitimages.com/DQmbkkUFKdj2Xit2YYb1eDpCWPXHK5CX2i87micYy18rFxb/%EB%B8%94%ED%94%BD1.JPG)</center>

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

<center>![블픽2.JPG](https://cdn.steemitimages.com/DQmXfPt84g9wWxHoNTrhyCVc5ek3ERawZ11Ru3wzMF3N2B5/%EB%B8%94%ED%94%BD2.JPG)</center>

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

**Web3py 설치**

현재의 프로젝트에 web3.py를 사용하기 위해 아래와 같은 명령어를 입력하여 설치합니다. (가급적이면 패키지 관리를 위해 [virtualenv](https://web3py.readthedocs.io/en/stable/troubleshooting.html#setup-environment) 설치하면 좋습니다.)

![블픽3.JPG](https://cdn.steemitimages.com/DQmbeNAmxNYdJ9cXfymyFzrgMLX7tzPdWGiQQfKbWy5ZbcE/%EB%B8%94%ED%94%BD3.JPG)

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

<center>![블픽4.JPG](https://cdn.steemitimages.com/DQmPFMVDQXcgNjJoUmpgtrcXMBqLVkmpexdAgAp9cBCtc6f/%EB%B8%94%ED%94%BD4.JPG)</center>

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

<center>![블픽5.JPG](https://cdn.steemitimages.com/DQmeLvR2j7jxrsQkPzZziDaQfvVBxzTxkVkmQvFpfaKTxGk/%EB%B8%94%ED%94%BD5.JPG)</center>

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

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


<center>![블픽6.JPG](https://cdn.steemitimages.com/DQma2GGxvHvxiRw8nNs27brx2vzCXhbYVyQtd2e7todtcDs/%EB%B8%94%ED%94%BD6.JPG)</center>

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

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

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

<center>![블픽7.JPG](https://cdn.steemitimages.com/DQmZZYAaNUm1ipbpEKW8LWZr6ZBccXWuLgevmmwqHNLPc5P/%EB%B8%94%ED%94%BD7.JPG)</center>

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

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

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

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

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

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

<br>

<center>![블픽8.JPG](https://cdn.steemitimages.com/DQmNdbbnRb6PqfsUjD6fWf4hUoX9ia2gEbXScg1baTWJLAu/%EB%B8%94%ED%94%BD8.JPG)</center>

<br>

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