728x90
온체인분석!! 지난포스팅에이어서
이더리움 네트워크의 가스비용이 어떻게 변하는지를,
ETH 온체인 분석을 통해 알아보겠습니다!!
그전에!!
gas vs. gasPrice 는 무엇일까요?
이더리움 트랜잭션 정보에서 볼 수 있는 gas와 gasPrice는 서로 다른 개념이지만 밀접하게 연관되어 있습니다.
단히 말하자면, 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
'블록체인 > On Chain Analysis' 카테고리의 다른 글
[On-Chain 데이터분석] ETH 블록 내 Smart Contract 갯수 확인 (feat python, web3) (0) | 2024.02.23 |
---|---|
[On-Chain 데이터분석] ETH 블록 내 모든 transaction 확인하기(python, web3 ,eth, 온체인분석) (0) | 2024.02.21 |
댓글