CS/3-2 블록체인

[블록체인] 12. Ethereum - Proof-of-Work vs Proof-of-Stake

이지이즤 2022. 12. 8. 02:18

 

이더리움 아이디어는 2013에 나왔지만 2015년에 시작됨.
이더리움 초창기는 PoW -> The Merge 업그레이드 후 PoS로 switch (계획:2020, 실제:2022.09)

 

Ethereum Blocks

이더리움의 블록은 block header와 state 정보, transactions, receipts로 구성됨.
이더리움의 목적이 범용 프로그래밍 플랫폼이기 때문에 비트코인보다 block header가 복잡함.

노란색 = data

* parentHash: 블록체인의 이전 블록을 연결하는 포인터 (≒ 비트코인의 previous hash)
* nonce : 비트코인의 nonce와 같은 역할
* mixHash : 이더리움에서는 nonce와 mixHash를 합쳐서 해당 블록이 퍼즐을 제대로 풀었는지(채굴 성공했는지) 검증함.
* timestamp : 블록이 만들어진 시점
* ommersHash
 : ommer = uncle과 aunt에 해당하는 중성적 의미.(근데 주로 uncle을 사용함)

비트코인은 블록을 10분에 하나씩 채굴하지만 이더리움은 블록이 12초마다 하나씩 만들어짐.
채굴 주기가 매우 짧아서 채굴 경쟁이 굉장히 치열하기때문에, main에 포함되지 못한 블록을 만든
miner들이 억울함 -> 채굴 경쟁에 뛰어들 유인책 필요 -> uncle 블록 채굴자일부 보상해줌.

* beneficiary : 비트코인에서 coinbase transaction의 output주소에 해당
* logsBloom : log file 기록용
* difficulty : 비트코인과 마찬가지로 이더리움도 채굴 난도 조절 가능
* number : 1씩 증가함. genesis block은 number가 zero.
* (block) gas limit : transaction들의 gas limit을 합친 것
* (block) gas Used : transaction들의 실행 결과 총 사용된 gas

merkle patricia tree 형태로 다음을 저장함.

* stateRoot : 이더리움은 state transition machine(상태가 바뀜)임. 상태를 저장.
* transactionsRoot : 해당 블록에 포함된 transaction 저장
* receiptsRoot : receipt(트랜잭션들의 실행 결과; hash값, 사용한 gas 등)를 저장.

 

Ethereum’s Proof-of-Work


Ethash는 이더리움의 PoW 채굴 알고리즘임.
지금은 PoW가 PoS로 완전히 switch되었음.

 

How a block gets finalized?

* finalized 
 : canonical chain에 포함되었다! 다수에게 인정받고 확정되었음을 의미함.
=> new block인 경우에는 mining 과정을, existing block인 경우에는 validating block 과정을 뜻함. 

finalize 과정

1) validate(or, if mining, determine) uncles
 : block header의 각각의 uncle도 valid해야하며 최근 6세대 uncle까지만 포함 허용함.

2) validate(or, if mining, determine) transactions
: 블록에 포함된 transaction들을 다 실행시켜보며 검증함. 
 gasUsed == cumulative gas used by the transactions
in the block인지 확인.

3) apply rewards(only if mining)
: 채굴자에게 보상으로 block reward가 주어지며 추가로 uncle 개수만큼 하나당 1/32 block reward가 주어짐.
 uncle block 채굴자에게도 1/32 block reward가 주어짐.

4) verify(or, if mining, compute a valid) state and nonce
: nonce를 사용해서 검증함.
 트랜잭션들을 전부 실행시켜보고, (트랜잭션의 실행 결과) == (채굴자가 알려준 상황)인지 확인하고
 nonce값을 통해 채굴자가 Ethash 재대로 풀었는지 확인하는 과정을 거침.
 확인과정이 완벽하게 끝난 이후에서야 reward가 진행됨.
-> 마지막 트랜잭션을 실행시킨 결과에다가, block reward가 채굴자에게 전달되는 부분이 포함된게 이 블록의 마지막 최종 상태임

 


Mining

채굴 공장 등의 PoW 문제점이 보여서 asic 저항성을 가져야겠다는 아이디어가 나옴.
-> 이더리움 해시 알고리즘(Ethash)의 특징 중 하나는 memory hard 라는 것!!
비트코인의 SHA-256계산에서는 별로 중요하지 않았던 메모리 access부분을 강제로 집어넣음.

mixHash와 nonce를 합치면 해당 블록이 충분한 계산 과정을 거쳤는지 증명 가능.
(비트코인에서는 블록의 nonce를 이용해서, 해당 블록이 nonce를 통해 hash계산을 한 결과가
target number보다 작아지는지를 금방 확인함.)

hash puzzle을 푸는 데 필요한 과정

* seed, cache, dataset : 미리 계산하거나 예측할 수 없는 랜덤한 데이터 덩어리

매 블록마다 해당 지점까지 block header를 스캐하여 새롭게 seed가 계산됨.
seed를 이용해서 16MB에 해당하는 랜덤 cache를 계산함.
cache를 이용해서 2GB정도의 DAG dataset을 만들어냄.
dataset은 30000block(=epoch)마다 매번 업데이트 되면서 조금씩 커짐.

miningDAG dataset수시로 access하여 랜덤으로 일부분을 가져와서 hashing함.
(랜덤으로 가져오는 일부분은 어떤 부분을 가져올지 아무도 알 수 없음)

이처럼 이더리움은 큰 사이즈의 데이터 덩어리(DAG dataset)를 필요로 함으로써 
memory hard(메모리에 의존)하도록 만들어놓은 hash 알고리즘을 사용함.

이더리움 알고리즘은 ASIC-friendly를 어렵게 함. (ASIC 저항성)
DAG dataset을 모두pre-fetch하고 저장해서 사용하기에는 bus bandwidth의 영향을 받을 수 밖에 없음.
bus bandwidth가 크면 클수록 mining을 빨리 할 수 있는데 dataset size가 2GB로 충분히 크기때문에
memory bandwidth의 영향을 받을 수 밖에 없고
memory bandwidth가 ASIC개발에 bottleneck이 됨.
하지만 결국 누군가 이더리움 채굴 전용머신 개발 성공해서 ASIC-friendly를 어렵게 하려는 목표 실패함..

 

Mining as a Security mechanism

이더리움은 비트코인과 마찬가지로, mining을 통해서 security를 제공하려고 했었음.
hash puzzle을 푼 miner가 자신이 푼 결과를 제시히면 그것을 검증함으로써 이 miner가 충분한 계산을 거쳐왔는지 확인.

비트코인과 마찬가지로 hash puzzle을 푸는 데 어떠한 shortcut도 없음.
mining 장비에 따라서 채굴에 걸리는 시간이 들쭉날쭉함.
채굴 시간(nonce 구하는 데 걸리는 시간)을 평균 15초로 맞추기 위해 비트코인처럼 난도 조절을 함.

결과적으로 하나의 canonical blockchain을 만듦!
PoW는 다수가 인정한 particular blockchain은 앞으로도 canonical blockchain으로 남아있을 것을 보장함.

비트코인은 longest, 이더리움은 heaviest가 canonical blockchain 기준임.
(블록에서 얼만큼의 computation이 있었는지를 무게로 따짐. 가장 무게가 많이 실린 branch가 canonical임.
canonical을 뒤집으려면 공격자는 더 많은 computation을 투자해야하므로 굉장히 어려움.)

 

Mining as a Wealth Distribution mechanism

mining은 (ether)를 재분배하는 역할도 함.
; miner가 시간과 노력(computation과 storage)을 투자하여 채굴에 성공하면 그에대한 보상을 받음.

* miner가 받는 것
- winning block에 대한 static block reward
- 내가 채굴한 블록에 포함시킨 트랜잭션들의 cost of gas (트랜잭션 실행에 소비한 비용에 대한 보상)
- uncle을 포함시킨 것에 대한 extra reward 
- uncle을 채굴한 채굴자도 small reward 받음

=> PoW가 ether를 적절하게 배분해줌.
이더리움도 block reward를 제공할 때, 기존에 존재하지 않았던 ether를 새롭게 만들어서 줌.
비트코인은 총 채굴량이 2100만개로 제한되어있지만 이더리움은 그렇지 않음.
(Ethereum foundation에서 없어지는 이더리움과 새로 생겨나는 이더리움을 적절하게 종합해서
얼마정도를 생성할지 결정함. 이더리움은 탈중앙화가 상당히 약하다고 할 수 있음.)

 

Ethash

Ethash는 memory-hard임.
적합한 nonce값을 찾는 것이 목적인데, 그러려면 memory와 bandwidth가 필요함.

single computer로 메모리를 parallel하게 사용해서 여러 nonce를 한꺼번에 테스트를 해보는 것이 매우 어려움.
ASIC을 이용해서 전문 채굴자들이 채굴 확률을 높이는 것을 어렵게 해서 centralization을 줄이는 것이 목적이었음.

 

 


GHOST & CASPER

* GHOST : Greedy Heaviest Observed SubTree
* CASPER : 이더리움의 PoS 알고리즘 이름

 

Ethereum GHOST (2013)

* Canonical chain 선택 기준
 - Bitcoin : longest
 - GHOST : heaviest (관찰된 서브트리중에 가장 무거운 것을 그리디한 방식으로 선택)

-> Why do we need Ethereum GHOST?
: 평균적으로 비트코인은 10분에 1블록을 채굴하고 이더리움은 12초에 1블록을 채굴함.
 짧은 시간에 훨씬 더 많은 블록들이 생겨남. 경쟁이 치열함.
 문제를 푼 많은 채굴자 중에 한명만 선택하는 게 아니라 나머지 채굴자(uncle block)에 대한 배려도 필요함.
 uncle block을 배려하지 않는다면 이더리움 채굴자의 수가 상당히 줄어들 것임.
 참고로 비트코인은 orphan block에 대한 배려 없음.


* 기존에 빠른 confirmation time을 갖는 블록체인들의 문제점
 - 높은 uncle(stale)비율로 인한 보안성 저하
 - 중앙집중화 (stale block 보상 안해주게되면 소수만 남게되어 centralization)

=> uncle을 배려하자. (uncle을 만들기위해 했던 computation을 인정해주자.)
 : 무게(computation)가 더 무거운(많은 계산) branch를 main으로 보자!

- 어느 체인이 가장 긴 것인지 계산할 때 stale block도 포함시킴으로써 네트워크 보안 손실 문제 해결
- stale block에 대해서도 블록 보상을 제공해서 중앙화 문제 해결

 

Longest Chain Selection by GHOST

공격자의 목표는 현재 다수에게 인정받는 main chain을 뒤집는 것임. (그래야 double-spend attck같은거 할 수 있음)
GHOST mainchain을 공격자가 뒤집으려면 heaviest보다 더 많은 computation을 공격자가 가지고 있어야 함. (어렵)

 

 


Proof-of-Work vs Proof-of-Stake


Proof-of-Work

- “one CPU, one vote” (지금은 이 철학 깨졌음. 일반 범용 컴퓨터로 채굴 거의 불가능.)
- 누가 채굴 성공하는지는 미리 알 수 없고 운에 달려있음(randomness). 랜덤-> 조작x -> 공정, 신뢰
  nonce를 guess하려면 brute force해야함.

Proof-of-Stake

- “one coin, one vote”
- validator(검증자; 비트코인의 miner역할)는 computational power와는 무관하고 wealth에 비례하는 확률로 무작위 선택됨.
- randomness는 protocol로 부터 나옴.
랜덤하게 선정된 하나의 validator가 한 블록을 propose하기 때문에 경쟁에 소비되는 에너지가 없음.

* wealth
 :  얼마나 많은 currency를 staking(예치, 돈 집어넣기; deposit)했는지

이더리움의 validator가 되려면 현재 기준으로 32ether(대략 6400만원)필요함. 
validator를 위한 smart contract에 32ether를 예치하면 validator가 될 자격이 생김.(랜덤 선택됨)
즉, Ethereum block을 propose할 가능성이 생김. 

 

Ethereum’s Proof-of-Stake: Why?


Better energy efficiency

에너지 소비량이 줄어듦
이더리움 PoS에서는 block을 propose하는 게 딱 한 노드임. (경쟁 없음)
validator 선정 과정만 공정함을 보장해주면 됨.

Lower barriers to entry, reduced hardware requirements

비트코인 채굴 성공할 확률은 굉장히 희박해서 진입을 안하지만
이더리움은 다른 사람과 경쟁해서 우위를 보여야하는 것이 아니라, 6400만원정도만 예치를 하면 validator가 될 확률이 있기 때문에 진입장벽이 비교적 낮음
hash계산을 해야하는 것도 아니므로 새로운 하드웨어 장비를 사야하는 것도 아님.

reduced centralized risk

진입장벽이 낮으므로, 비트코인의 막강한 채굴 공장같은 중앙화 위험을 줄임.

Less ETH issuance is required to incentivize participation

비트코인은 transaction fee <<< block reward임. 
즉, 블록을 채굴한 보상으로 새롭게 만들어지는 비트코인이 꽤 많음. 

이더리움도  PoW시기에는 위와 비슷했지만,
지금은 그렇게까지 많은  ether를 새롭게 발행해서 block reward로 제공할 필요가 없음.
validator가 뭔가를 잘해서/열심히해서 뽑힌게 아니라, 운이 좋아서 뽑힌 것 뿐이기 때문.

Economic penalties for misbehavior makes 51% style attacks more costly compared to PoW

PoS를 통해서는 경제적인 패널티 부여 가능하므로 공격자의 공격 의도를 꺾을 수 있음.

전 세계 공통점 : 돈.
사람들은 이익을 얻을 수 있다면 이기적으로 행동함. 가진 돈을 잃을 가능성이 있다면 정직하게 행동함.
비트코인에서는 공격 실패해도 공격자에게 어떠한 손해도 없지만, 이더리움(PoS)에서는 공격 발각시 예치금 깎임.
6400만원을 smart contract코드에 예치해놓고 시작(마음대로 꺼내갈 수 없음)하며,
validator가 해야될 일을 하지못했거나 속임수를 쓴 경우 예치금이 깎임.(쓸 수 없는 주소로 보내버림)
공격 발각 후 깎여나갈 돈 보다 더 많은 돈을 벌 가능성이 있을 때만 공격하게 됨.(validator의 강력 유인책)

real chain에서 이더리움의 보안 및 견고성은 아직 완전히 테스트되진 않았음.

 

Ethereum’s Proof-of-Stake: Basics


Casper FFT(Friendly Finality Gadget)

친절한 finality 장치. proposed by Vitalik Buterin. (어떤 경우에 finality를 어떻게 달성하는지를 설명한 알고리즘)

* finality
: 확정된 block를 의미함. finality에 도달하면 revoke할 수 없음.

Key player: validators

validator는 블록에 들어갈 트랜잭션들을 처리하고, (proposer로 뽑히면) 그 결과를 가지고 블록을 만들어서 블록을 제안함.
비트코인의 miner와 마찬가지로 해당 블록체인 플랫폼을 secure하게 유지하는 데 큰 역할을 함.

validator를 위한 smart contract주소로 32ether이상을 deposit(staking)하면 누구든 validator가 될 수 있음.
큐에 들어가서 기다리다가 validator로 활동 시작 가능.

매 slot마다 하나의 validator가 block proposer로 랜덤하게 선정됨.
매 slot마다 다수의 validator가 committee로 랜덤하게 선정되고 그들의 투표 finality결정에 중요한 역할을 함.(proposed된 블록의 validity 결정에 사용)

Slots and Epochs

* slot
 : 한 slot(12초)에 하나의 block이 생김.

* epoch
 : 32개의 slot으로 이루어진 정해놓은 기간(6.4분)

* checkpoint
  : 각 epoch의 첫번째 slot의 block. (candidates for source/target)
   투표할 때 어떤 checkpoint가 source이고 어떤 checkpoint가 target일지 투표함.

 

Ethereum’s Proof-of-Stake: How it works?


H
ow do committees work?

protocol이 랜덤하게 128명 이상의 validator로 구성된 committe를 구성하고 slot에 할당함.
epoch마다 32개의 committee가 존재함.

what do validators in a committee do?

committee의 vaidator중 하나가 block proposer로 선정이 되면, canonical chain이라고 생각하는 곳에 연결될 블록을 생성함.
epoch에서 특정 slot에 할당된 각 committe는 투표(= vote, attestation)를 함.
-> 해당 slot에 만들어진 block에 대해 찬성하는지 (proposer가 제시한 block에 대한 hash, height에 대한 투표),
-> source, target의 checkpoint에 해당하는 block에 대해서 두개의 checkpoint에 동의하는지

* source : last justified checkpoint block
* target : the most recent checkpoint 

How do validators selected?

RANDAO(랜덤 탈중앙화 자율 조직)라는 프로그램을 통해 epoch마다 validator 선정.(validator 뒤섞어서 매번 다른 committee를 이루어 담합이 어렵게 함)

validator가 되기 위해서는 ether를 deposit(staking)해야하는데, 만약 32ether 이상 가지고있다면 32단위로 나눌 수 있음. 예를들어 64ether가 있다면 32, 32를 넣고 두 validator를 내 관할 하에 둘 수 도 있고(validator 선정 확률 높이기),
64를 한번에 넣고 64에 대한 vote 권한을 한 validator가 가지게 할 수 도 있음(투표 power 높이기).

how are validators penalized for bad behavior?

- slashing
 : slot당 하나의 블록을 propose해야되는데 multiple block을 propose하여 발각되면 해당 validator가 deposit(staking)한 ether를 차감함. (ether를 많이 예치했을수록 패널티도 커짐)
  당시에 나쁜 행동을 한 validator의 수가 많다면 slashing을 더 엄격하게 함.(공모했을 가능성이 크기때문에 더 큰 처벌)

- going offline
 : validator도 P2P network상의 노드일 뿐이므로 P2P network에 들어오고 나가는 것에 대한 어떠한 제한도 없음.
 그런데 validator로써 해야하는 역할을 소홀히 하면(ex. 아예 network에서 offline으로 빠져나가기, online상에 있음에도 아무런 일도 안하기) 패널티를 줌. (slash보다는 패널티 작음) 

- inactivity leak
 : 4epoch를 넘어서는 동안에 finality에 도착하지 못하면(투표가 갈림; 공격자가 존재했을 가능성 있음),
 majority에 투표하지않은(공격자는 supermajority에 도달하지 않도록 소수에 투표함) 모든 validator를 처벌함.

how is finality determined?

* finality
: 확정된 block를 의미함. finality에 도달하면 더이상 변경/취소/삭제 할 수 없음.
  (≒ 비트코인에서의 6 comfirmation)

finality를 만드는 validator가 정해져있으므로(누구나 와서 mining 경쟁해서 한명이 선택되는 게 아니라 propose 측면에서 경쟁이 전혀 없기 때문에) finality를 만드는 데에 훨씬 더 신중해야함.

finality는 checkpoint(epoch의 첫번째 slot의 block)에서 결정됨.
즉, 32슬롯 당 하나씩 confirm. (매번 confirm하면 합의 도달 어려음)

validator는 valid하다고 생각하는 {source, target} pair에 대해 투표함.
checkpoint가 2/3(of the totak staked ETH) vote를 얻으면 justified됨.

=> 1/2이 아니라 2/3인 이유?
: 블록체인에서 이익을 얻으려는 공격자가 존재한다고 했을 때,
 공격자의 거짓말을 고려한다면 합의를 이루기 위해서는 2/3의 투표가 필요함. (BFT 개념이 사용됨)

* 비잔틴 장군 문제(Byzantine General's Problem)
: 로마와 로마에 대적하는 나라가 전쟁을 하려고 하는데, 로마에 대적하는 나라에 여러 장군들이 있었고
그 중 일부는 로마에 협력하는 스파이(비잔틴)가 있다고 가정. 그럼에도 불구하고 로마에 협력하지 않는 정직한 장군들이 다수라면 여전히 이 장군들 사이에 의견 일치를 볼 수 있음.

* BFT(Byzantine Fault Tolerance) 
: 장군들을 process로 보면 분산시스템(dirtributed system)과도 연관됨.
비잔틴 노드의 거짓말을 고려하였을 때도 이 분산시스템이 제대로된 합의를 이끌어내려면 2/3의 투표가 필요함.


투표(target으로 supermajority인 2/3 vote 받음) -> justified(source로 2/3 vote 받음) -> finalized(finality)
child checkpoint가 justified되면 finalized되고 모든 이전 epoch들이 finalized됨.


공격자가 (stake된 전체 ether의) 1/3 이상 voting할 수 있다면 finality를 막을 수 있음. -> inactivity leak penalty
ex) 정직한 노드의 투표 결과가 갈려서 A(1/3), B(1/3)인 경우에 공격자가 한쪽에 투표해서 supermajority를 달성하는 게 아니라, A와 B에 double vote 하는 경우 finality를 막을 수 있게 됨.

 

 


Ethereum Casper

validator가 되려면 ether를 Casper smart contract에 deposit하면 됨. (Casper incentive logic이 smart contract에 있음)
deposit을 통해서 책임감 있는 행동을 유도함. 
deposit을 많이 하면 propose될 확률이 커지기 때문에 reward 받을 가능성도 커지지만 slashing도 엄격해짐.

 

Ethereum Casper FFG in Detail

 

Vote (for Link(Edge))

 

Justification 

 

Finalization

 

 

Casper FFG Rules

validator가 아래 두가지 규칙을 잘 지켜야 공격자가 finality를 뒤집거나 finality가 안생기고 멈춰있는 상황이 발생하지 않음.
(공격자는 아래 규칙들의 위반을 시도함. -> 공격자를 밝혀내기 위해 기명투표함. vote에 서명을 붙임.)

1. Double Vote를 하지 못함.
   즉, 똑같은 height(genesis로 부터 떨어진 거리)의 target block을 vote하지 못함.
   (같은 slot에 들어갈 두 블록 -> canonical chain의 똑같은 위치에 2개의 블록이 생기는 것은 허용할 수 없음)


2. Surround Vote를 하지 못함.
   height(S1) < height(S2) < height(T2) < height(T1) 이렇게 되면 새롭게 finalize되는 블록 없이 정체될 수 있음.

 

 

=> 위의 두가지 규칙을 잘 지키면 Safety Liveness 성질이 성립함.

Safety

안정성
; 데드락이 발생하지 않게 하는 것, 오류상황에 빠지지 않음이 보장되는 성질.

Accountable Safety
: 누군가가 규칙 위반을 했을 때, 규칙위반자가 누구인지 찾아서 벌을 줄 수 있음.
  문제가 발생했다면(두개의 conflicting block이 finalized) 규칙 위반자가 1/3이상 존재한다는 의미임.
  vote를 할 때 서명을 하기 때문에 서명을 통해 규칙위반자를 찾을 수 있음. -> slashig 처벌함.

 

Liveness

살아있다(진도가 나간다)
; 블록체인에 블록이 계속 연결될 것이다, 공격자의 공격이 실패할 것이다, 
  하는 일이 중단되지 않고, 규칙을 지킨다면 계속해서 동작하는 성질.

Plausible Liveness
: 새로운 block이 계속 붙여짐으로써 canonical chain이 연장되는 것을 보장해야함.
  규칙을 위반하지 않고 vote를 하는 경우에는 새롭게 연결될 block이 반드시 있음.