본문 바로가기

블록체인온체인데이터 공부노트

[web3.0.py를 활용한 블록체인 온체인데이터 분석] 1. 데이터 수집

(작성중입니다..)

분단위의 이더리움 트랜잭션 수 데이터를 수집하기 위해서는 생성된 블록의 마지막 블록의 번호(분단위로)를 알아야함

이더스캔 api 중에 timestamp 단위로 블록번호를 알 수 있는 api 가 무료!!

https://docs.etherscan.io/api-endpoints/blocks#get-block-number-by-timestamp

 

오늘 날짜의 타임스탬프(2022-10-26 00:00:00 utc+ 9)-1664550000- 으로 request해보면

* 모든 타임스탬프는 utc + 9 기준임

from requests import get

etherscan_api = "이더스캔에서 발급받은 api_key"
targettime = 1664550000 # 2022-10-01 00:00:00
# targettime = 1664550060 # 2022-10-01 00:01:00
blocknum_url = f'https://api.etherscan.io/api?module=block&action=getblocknobytime&timestamp={targettime}&closest=before&apikey={etherscan_api}'

response = get(blocknum_url)
data = response.json()
print(data)

 

1분차이의 block번호를 살펴보기 위해 1분차이의 타임스탬프 결과값 비교

2022-10-01 00:00:00 블록번호 15646907

2022-10-01 00:01:00  블록번호 15646912

 

즉, 12시부터 12시 1분까지 발생한 완료된 트랜잭션 수를 살펴보기 위해

15646907번 부터 15646908, 15646909, 15646910, 15646911 블록을 들여다봐야함!

Web3.0.py 라이브러리를 활용해서 15646907블록을 들여다 보면

eth.get_block을 사용함

 

from web3 import Web3

block = web3.eth.get_block(15646907, True) ## True는 모든 트랜잭션
print(block['transactions'])

결과는 아래 사진과 같음

해당 블록의 트랜잭션 데이터를 dictionary 형태로 받아옴

문제는 해당 시간에 생성된 각각의 트랜잭션들이 전부 성공적으로 완료되는것이 아니라 이중 몇개는 실패할 수 도 있음(가스비 부족 등의 이유로)

eth.getTransactionReceipt를 사용해서 트랜잭션이 성공적으로 완료되었는지 확인!

eth.getTransactionReceipt는 입력값으로 해당 트랜잭션의 해쉬값이 들어감

가장 위에 있는 트랜잭션의 해쉬를 입력값으로 요청해보면

tx_receipt = web3.eth.getTransactionReceipt('0x2f9502fed6036e0cf7192e250665e4299cca30b87db7c65dff711d983c52e9df')
print(tx_receipt)

결과는 아래 사진과 같음! 여기서 status 값(사진에서 드래그된 부분)이 1이 의미하는것이 성공적으로 완료된 트랜잭션이라는 뜻

정리하자면, 분단위의 완료된 트랜잭션 횟수 데이터를 수집하기위해서

 

(1) 이더스캔api로 분단위로 생성된 블록 번호의 범위값을 가져온다 

(2) eth.get_block함수로 각 블록내의 모든 트랜잭션 hash값을 가져온다

(3) eth.getTransactionReceipt 함수에 가져온 hash값을 넣는다

(4) status를 확인해 성공적으로 완료된 트랜잭션인지 확인하고 카운팅한다

 

라고 생각하고 web3.0.py docs를 살펴보고 있는데...

https://web3py.readthedocs.io/en/latest/web3.eth.html?highlight=getblock#web3.eth.Eth.getBlock 

eth.get_block_transaction_count 이라는 함수가 있다!?

그래서 혹시 성공적으로 완료된 트랜잭션을 count하는 함수가 있는지 찾아보다가 

eth.get_uncle_count 라는 함수를 보았음

uncle_count는 또 무엇인가?...

찾아보니 uncle block이라는 개념이 있음..

해쉬넷에서 검색해본 엉클블록은 아래와 같음

*http://wiki.hash.kr/index.php/%EC%97%89%ED%81%B4%EB%B8%94%EB%A1%9D

 

채굴자가 비슷한 시간에 블록을 채굴했을때, 난이도가 높은 블록을 선택하고, 나머지 블록들은 버리는데, 이 버려지는 블록을 스테일 블록(stale block)이라고 하는데 이더리움에서는 이를 엉클블록(uncle block)이라고 하는것 같음

*더 정확하게 알기 위해서는 dag, 논스 라는 개념에 대해 추가적으로 공부해야할 것 같음. 그리고 합의 알고리즘의 변화에 따른 차이(1.0 작업증명(PoW), 2.0 지분증명(PoS))도 있을것 같음. 아무래도 합의하는거니까?..

 

엉클블록에 있는 트랜잭션은 일일 트랜잭션 횟수에 포함을 시켜야 하는것인가?

아니면 개념적으로 엉클블록 내의 트랜잭션들은 완료될 수 가 없는것인가?

우선 엉클블록에 대해 다시 ...

 

 

 

 

*잘못된 내용이 있다면 언제든 지적해주세요! 조언도 환영입니다!