본문 바로가기
블록체인/On Chain Analysis

[On-Chain 데이터분석] 이더리움 네트워크의 가스비 트렌드 확인 (feat python, web3)

by 일등박사 2024. 2. 21.
728x90

2024.02.21 - [블록체인/On Chain Analysis] - [On-Chain 데이터분석] ETH 블록 내 모든 transaction 확인하기(python, web3 ,eth, 온체인분석)

 

[On-Chain 데이터분석] ETH 블록 내 모든 transaction 확인하기(python, web3 ,eth, 온체인분석)

온체인데이터분석!! 블록체인의 특징중 하나가 모든 거래내역(원장)이 공개된다는점인데요! 이에 이 공개된 원장을 기반으로 분석을 하는 것을 온체인 데이터 분석이라고 합니다! 이런분석을

drfirst.tistory.com

 

2024.02.23 - [블록체인/On Chain Analysis] - [On-Chain 데이터분석] ETH 블록 내 Smart Contract 갯수 확인 (feat python, web3)

 

 


온체인분석!! 지난포스팅에이어서

이더리움 네트워크의 가스비용이 어떻게 변하는지를,

ETH 온체인 분석을 통해 알아보겠습니다!!

 

그전에!!

 

gas vs. gasPrice 는 무엇일까요?

이더리움 트랜잭션 정보에서 볼 수 있는 gasgasPrice는 서로 다른 개념이지만 밀접하게 연관되어 있습니다.

단히 말하자면, gas는 수행해야 할 작업량이고, gasPrice는 그 작업에 얼마나 많은 비용을 지출할 의사가 있는지입니다.

 

1. gas: 계산 비용, 매번 산정 방식이 같음. 

  • 트랜잭션을 처리하는 데 필요한 연산량을 나타냅니다.
  • 코드의 복잡성, 데이터 크기, 수행되는 작업 등에 따라 필요한 gas 양이 결정됩니다.
  • 기본적으로 21,000 gas가 필요하지만 트랜잭션 내용에 따라 더 많이 필요할 수도 있습니다.
  • 가스는 무형 자산이며 직접적인 가치가 없습니다.

2. gasPrice: gas를 eth로 환산하는 환율!! 매번 변동됨

  • 트랜잭션 처리를 위해 지불할 willingness to pay (기꺼이 지불할 의사)를 나타냅니다.
  • **가스 1단위당 지불하려는 wei (ETH의 최소 단위)**를 의미합니다.
  • gasPrice가 높을수록 마이너가 트랜잭션을 빠르게 처리할 가능성이 높지만 수수료도 더 많이 지불해야 합니다.
  • gasPrice는 실시간으로 변동하며 네트워크 혼잡도에 따라 결정됩니다.

3.  gasPrice와 gas의 예시 : eth로 환산하는 방법

  • 21,000 gas 필요한 트랜잭션에서 gasPrice가 100 gwei라면 총 수수료는 21,000 gas * 100 gwei = 2,100,000 wei = 0.0021 ETH가 됩니다.
  • 네트워크가 혼잡하면 다른 사용자들이 더 높은 gasPrice를 지불하여 우선 처리를 요구할 수 있습니다. 이 상황에서 트랜잭션이 빠르게 처리되기를 원한다면 gasPrice를 높여야 합니다.

gasPrice 분석 python 코드

1. 기존 코드들 불러오기 

  - 지난 포스팅에서 알아본 패키지 및 함수들을 불러옵니다.

$# 패키지 임포트
from web3 import Web3
import requests
import json
from decimal import Decimal
import pandas as pd
import datetime
from pytz import timezone, utc

ETH_ADR = "https://rpc.ankr.com/eth"

## timestamp 전환
def from_timestamp_to_seoul(timestamp):
     # Assuming timestamp is in UTC
    gmt_minus_9_tz = timezone('Asia/Seoul')
    target_format = "%Y%m%d-%H%M%S"

    utc_datetime = datetime.datetime.utcfromtimestamp(timestamp)
    seoul_datetime = utc_datetime.astimezone(gmt_minus_9_tz)
    formatted_date = seoul_datetime.strftime(target_format)

    return formatted_date

def is_contract_address(address):
    """
    주어진 주소가 스마트 계약인지 여부를 확인하는 함수
    :param address: 확인할 주소
    :return: True(스마트 계약), False(지갑)
    """
    # 주소가 이더리움 주소 형식인지 확인
    if not Web3.is_address(address):
        return False
#         raise ValueError("Invalid Ethereum address")
    
    # 주소에 대한 코드를 가져옴
    code = web3.eth.get_code(address)
    
    # 스마트 계약 주소의 코드 길이는 2보다 큼 (Paying contract는 1일수도 있음)
    return len(code) > 2

def is_contract_address(address):
    """
    주어진 주소가 스마트 계약인지 여부를 확인하는 함수
    :param address: 확인할 주소
    :return: True(스마트 계약), False(지갑)
    """
    # 주소가 이더리움 주소 형식인지 확인
    if not Web3.is_address(address):
        return False
#         raise ValueError("Invalid Ethereum address")
    
    # 주소에 대한 코드를 가져옴
    code = web3.eth.get_code(address)
    
    # 스마트 계약 주소의 코드 길이는 2보다 큼 (Paying contract는 1일수도 있음)
    return len(code) > 2


### USING Web3 ,객체 선언
web3 = Web3(Web3.HTTPProvider(ETH_ADR))

 

 

2. gasPrice 온체인 데이터 호출!!  

 > loop를 돌며 최근 3000개의 블록 ,모든 거래내역을 불러옵니다!!

df_final = pd.DataFrame()
for block_number in range(web3.eth.block_number-3000,web3.eth.block_number-1):
    block_time = from_timestamp_to_seoul(block.timestamp)
    print(block_number, ' / ' ,block_time )
    key_l = []
    from_l = []
    to_l = []
    value_l = []
    gas_price_l = []
    smartcontract_yn_l = []

    block = web3.eth.get_block(block_number)

    # Print block details
    print("Block Number:", block['number'])
    print("Block Hash:", block['hash'])
    print("Transactions in this block:")
    for tx_hash in block['transactions']:
        tx = web3.eth.get_transaction(tx_hash)
        key_l.append(tx['hash'])
        from_l.append(tx['from'])
        to_l.append(tx['to'])
        value_l.append(web3.from_wei(tx['value'], 'ether'))
        gas_price_l.append(web3.from_wei(tx['gasPrice'], 'gwei'))
        smartcontract_yn_l.append(is_contract_address(tx['to']))
#         print("Transaction Hash:", tx['hash'])
#         print("From:", tx['from'])
#         print("To:", tx['to'])
#         print("Value:", web3.from_wei(tx['value'], 'ether'), "ETH")
#         print("Gas Used:", tx['gas'])
#         print("Gas Price:", web3.from_wei(tx['gasPrice'], 'gwei'), "Gwei")
#         if is_contract_address(tx['to']):
#             print("<<<<<<<<<<<<<SMART CONTRACT >>>>>>>>>>>>>")
#         else:
#             print("<<<<<<<<<<<<<SEND TOKEN >>>>>>>>>>>>>")
    df = pd.DataFrame()
    df['key'] = key_l
    df['block_time'] = block_time
    df['from'] = from_l
    df['to'] = to_l
    df['value'] = value_l 
    df['gas_price'] = gas_price_l 
    df['smartcontract_yn'] = smartcontract_yn_l
    df

    df_final = df_final.append(df).reset_index(drop=True)

 

 

3. 온체인 데이터 분석!!

 > 불러온 데이터를 바탕으로, 데이터 분석을 해보아요!!!

df_final['gas_price_re'] = df_final['gas_price'].apply(lambda x : np.round(float(x),2))
df_gas = df_final[['block_time','gas_price_re']].drop_duplicates().reset_index(drop=True)
df_gas

df_gas.groupby('block_time')['gas_price_re'].mean().plot()

 

 

시간에 따라 가스비가 어떻게 변하는지 확인이 가능하네요~~

 

 

조금더 많이!!

3천개의 블록으로 분석해본 결과는 아래와 같습니다~!^^

df_final = pd.DataFrame()
for block_number in range(web3.eth.block_number-3000,web3.eth.block_number-1):
    block_time = from_timestamp_to_seoul(block.timestamp)
    print(block_number, ' / ' ,block_time )
    key_l = []
    from_l = []
    to_l = []
    value_l = []
    gas_price_l = []
    smartcontract_yn_l = []

    block = web3.eth.get_block(block_number)

    # Print block details
    print("Block Number:", block['number'])
    print("Block Hash:", block['hash'])
    print("Transactions in this block:")
    for tx_hash in block['transactions']:
        tx = web3.eth.get_transaction(tx_hash)
        key_l.append(tx['hash'])
        from_l.append(tx['from'])
        to_l.append(tx['to'])
        value_l.append(web3.from_wei(tx['value'], 'ether'))
        gas_price_l.append(web3.from_wei(tx['gasPrice'], 'gwei'))
        smartcontract_yn_l.append(is_contract_address(tx['to']))

    df = pd.DataFrame()
    df['key'] = key_l
    df['block_time'] = block_time
    df['from'] = from_l
    df['to'] = to_l
    df['value'] = value_l 
    df['gas_price'] = gas_price_l 
    df['smartcontract_yn'] = smartcontract_yn_l
    df

    df_final = df_final.append(df).reset_index(drop=True)

 

 

위 그래프의 단뒤는 gwei로서!! 

가스비용이 비쌀때는 0.0000006 ETH, 살때는 0.000000027 수준으로 22배정도 차이가 났습니다!,,

 

가스비요으,, 잘 알아보면서 사용하세요!~^^

728x90

댓글