시리즈: 파이썬 개발자가 블록체인을 파헤치다
이번 편은 실전 수익 계산부터 채굴 풀의 TCP 통신까지 다룹니다.
일일 채굴량(ETH) = (내 해시레이트 / 네트워크 해시레이트) × 블록보상 × 일일 블록 수
일일 수익(원) = 일일 채굴량 × ETH 가격
일일 순이익 = 일일 수익 - 전기비용 - 감가상각 - 풀 수수료 # 파라미터
my_hashrate = 500e6 # 500 MH/s (RTX 3080 × 5)
network_hashrate = 900e12 # 900 TH/s
block_reward = 2 # ETH
block_time = 13 # 초
eth_price = 2_000_000 # 원
# 계산
daily_blocks = 86400 / block_time # 6,646개
my_share = my_hashrate / network_hashrate # 0.000056%
daily_eth = my_share * block_reward * daily_blocks # 0.0073 ETH
daily_revenue = daily_eth * eth_price # 14,600원
# 전기비용
power_draw = 1100 # W (220W × 5)
kwh_per_day = power_draw * 24 / 1000 # 26.4 kWh
elec_cost = kwh_per_day * 130 # 3,432원 (130원/kWh)
daily_profit = daily_revenue - elec_cost # 11,168원
monthly_profit = daily_profit * 30 # 335,040원
breakeven_months = 5_000_000 / monthly_profit # ≈ 15개월 수익에 가장 큰 영향을 미치는 변수 순서:
| 순위 | 변수 | 비고 |
|---|---|---|
| 1 | ETH 가격 | 2배 오르면 수익 2배 |
| 2 | 네트워크 난이도 | 참여자 2배 → 수익 절반 |
| 3 | 전기요금 | 가정용/산업용/해외 최대 10배 차이 |
| 4 | GPU 전성비 | RTX 3070: 0.5 MH/W > RTX 3080: 0.45 MH/W |
| 5 | 풀 수수료 | 1~3% |
혼자 채굴하면 블록 발견까지 평균 268일을 기다려야 합니다.
import math
solo_block_time_days = 1 / (my_share * daily_blocks)
print(f"Solo 채굴 평균 대기: {solo_block_time_days:.0f}일")
# → 268일
# 분산도 계산 (지수 분포)
# 표준편차 = 평균 (포아송 과정)
# → 수익이 극도로 불규칙 풀에 참여하면 매일 안정적인 수익이 생기고, 분산이 거의 없어요. 기댓값은 같지만 현금흐름의 안정성이 완전히 달라집니다.
채굴기와 풀 서버는 Stratum 프로토콜(TCP + JSON-RPC) 로 통신해요.
// 채굴기 → 풀 서버
{
"id": 1,
"method": "mining.subscribe",
"params": ["ethminer/0.19.0"]
}
// 풀 서버 → 채굴기
{
"id": 1,
"result": ["0xdeadbeef", "0x00000001"]
// session_id extranonce
} // 채굴기 → 풀 서버
{
"id": 2,
"method": "mining.authorize",
"params": ["0xMyWallet.worker1", "x"]
// 지갑주소.워커이름 비밀번호(보통 무시)
} {
"method": "mining.notify",
"params": [
"bf", // job_id
"0x1234...abcd", // seed_hash (어떤 DAG를 쓸지 결정)
"0x5678...ef01", // header_hash (채굴 대상)
"0x00000000ffff...", // target
true // clean_jobs (이전 작업 무효화 여부)
]
} {
"id": 4,
"method": "mining.submit",
"params": [
"0xMyWallet.worker1",
"bf", // job_id
"0x00000001", // extranonce2
"0x504e86ed", // ntime
"0x5e8012a4" // 찾은 nonce!
]
}
// 풀 서버 응답
{"id": 4, "result": true} // 수락
{"id": 4, "result": false} // 거절 (stale 등) 풀은 채굴기에게 실제 네트워크보다 훨씬 쉬운 목표를 줍니다.
네트워크 목표: 0x00000000FFFFFFFF... (앞 8자리 0, 매우 어려움)
풀 목표: 0x0000FFFFFFFFFFFF... (앞 4자리 0, 쉬움) 채굴기가 풀 목표를 달성한 결과를 제출하면 Share로 인정돼요.
def process_share(header, nonce, mix_hash, pool_target, network_target):
result = hashimoto_light(header, nonce) # DAG 없이 cache로 검증
if result > pool_target:
return "REJECT: invalid share"
# Share 기여도 기록
record_contribution(worker_id, pool_target)
if result <= network_target:
# 실제 블록 발견!
submit_to_network(header, nonce, mix_hash)
distribute_reward()
return "BLOCK_FOUND"
return "ACCEPT: share counted" # Share 1개의 기댓값
share_value = block_reward / (network_target / pool_target)
# → 즉시 지급, 풀이 분산 리스크 부담
# → 수수료 높음 (2~3%) # 블록 발견 시
N = 100_000 # 최근 N개 share 기준
my_shares_in_window = count_my_shares(last_N_shares)
my_reward = (my_shares_in_window / N) * block_reward
# → 수수료 낮음 (0.5~1%), 풀 호핑 방지 풀은 채굴기마다 난이도를 자동 조정해요. 목표는 채굴기당 약 5~10초마다 Share 1개 제출입니다.
// 풀 → 채굴기: 난이도 조정 통보
{
"method": "mining.set_difficulty",
"params": [512]
} missed block 기록 → 신뢰도 하락 → 투표 이탈 가능| 개념 | 설명 |
|---|---|
| 수익성 공식 | (내 해시 / 전체 해시) × 보상 × 일일 블록 – 전기비용 |
| Stratum | 채굴기-풀 간 TCP JSON-RPC 통신 프로토콜 |
| Share | 풀 난이도를 만족한 해시 결과, 기여도 증명 |
| PPS | Share마다 즉시 지급, 안정적 |
| PPLNS | 블록 발견 시 비율 지급, 수수료 저렴 |
4편에서는 탈중앙화의 불편한 진실을 파헤칩니다. 충분한 자본이 있다면 블록체인을 통제할 수 있을까요? 그리고 양자컴퓨터가 등장하면 어떻게 될까요?
채굴 수익성을 직접 계산해보고 싶다면 minerstat.com 같은 사이트를 활용해보세요!
중고거래 안전결제, 다들 써보셨죠? AI 결제에도 이게 필요합니다. 문제는, 생각보다 훨씬 까다롭다는 거예요. 중고거래를 떠올려…
앞 편의 x402가 자판기였다면, 이번 두 방식은 '용돈 한도'와 '술집 외상장부'에 가깝습니다. 앞 편 복습:…