EIP-3675: Upgrade consensus to Proof-of-Stake
지분 증명을 도입하는 이더리움 메인넷의 합의 메커니즘 업그레이드에 대한 사양입니다.
이 EIP는 작업 증명(PoW)을 더 이상 사용하지 않으며, 비콘 체인에 의해 구동되는 새로운 지분 증명 합의 메커니즘(PoS)으로 대체합니다.
새로운 합의 메커니즘의 부트스트랩에 대한 정보는 EIP-2982에 문서화되어 있습니다. 비콘 체인의 전체 사양은 ethereum/consensus-specs 저장소에서 확인하실 수 있습니다.
이 문서는 합의 방식 업그레이드에 의해 도입된 블록의 구조, 블록 처리, 포크 선택 규칙, 그리고 네트워크 인터페이스의 변경 세트를 명세하고 있습니다.
pow_block.total_difficulty
)는 TERMINAL_TOTAL_DIFFICULTY
값보다 크거나 같아야합니다.pow_block.parent_block.total_difficulty
)는 TERMINAL_TOTAL_DIFFICULTY
값보다 작아야합니다.특정 조건을 만족하는 PoW 블록이 여러개 있을 수 있습니다. 이는 PoW에서 PoS로 바뀌는 그 시점에도 여러 블록이 동시에 만들어질 수 있다는 것을 의미합니다.
예를 들면, 블록 A와 블록 B가 동시에 특정 조건을 만족할 수 있습니다. 이 두 블록은 같은 ‘이전 블록’을 기반으로 하지만, 다른 내용을 가질 수 있습니다. 이런 상황에서는 네트워크 참여자들이 더 긴 체인을 선택하는 규칙을 따라 하나의 블록을 선택하게 됩니다. 결국, 더 많은 작업이 이루어진 ‘정식’체인이 선택되게 됩니다.
TERMINAL_TOTAL_DIFFICULTY
: Ethereum이 새로운 PoS 방식으로 바뀌게 되는 특정 ‘난이도’ 값입니다. Ethereum 메인넷에서는 이 값을 반드시 58750000000000000000000
로 설정해야합니다.TRANSITION_BLOCK
: ‘정식 체인’에서 가장 처음으로 나타나는 PoS 블록을 의미합니다. 다시 말하면 모든 PoS 블록 중에서 가장 낮은 블록 번호를 가진 블록을 말합니다.TRASITION_BLOCK
이라고 부릅니다.POS_FORKCHOICE_UPDATED
: Proof-of-Stake(PoS) 방식에서 ‘포크 선택’의 상태가 바뀔 때 발생하는 이벤트를 말합니다.FORK_NEXT_VALUE
: 다가오는 합의(consensus) 업그레이드를 위해 FORK_NEXT
파라미터로 설정된 블록 번호를 나타냅니다.FORK_NEXT_VALUE
로 지정하게 됩니다. 이 값는 네트워크가 그 블록 번호에 도달하면 업그레이드를 시작하게 됩니다.TERMINAL_BLOCK_HASH
: 설정된 경우, 즉 0x0000000000000000000000000000000000000000000000000000으로 스텁되지 않은 경우 터미널 PoW 블록의 해시를 지정합니다.0x0000000000000000000000000000000000000000000000000000000000000000
로 설정되어 있다면, 그것은 아직 해당 해시 값이 설정되지 않았음을 의미합니다.TERMINAL_BLOCK_NUMBER
: TERMINAL_BLOCK_HASH가 설정된 경우 터미널 PoW 블록의 번호를 지정합니다.POS_
접두사가 붙은 이벤트들을 PoS 이벤트라고 합니다. 이 이벤트들은 새로운 PoS 메커니즘에 의해 생성됩니다.PoS Event에 대한 추가 정보
POS_FORKCHOICE_UPDATED
: Event는 canonical 체인의 Head와 가장 최근에 finalized된 블록에 대한 참조를 포함합니다. 시스템에서 첫 번째 블록이 발생하기 전에, 이 이벤트에 의해 제공된 확정 블록 해시는 0x0000000000000000000000000000000000000000000000000000000000000000
으로 초기화됩니다.그런데 시스템에서 첫 번째 확정 블록이 발생하기 전에는, 이 이벤트에 의해 제공되는 확정 블록의 해시 값은 '0x0000000000000000000000000000000000000000000000000000000000000000'으로 초기화됩니다. 이 값은 임시로 사용되는 값으로, 실제 확정 블록의 해시 값이 아닙니다.
간단히 말하면, POS_FORKCHOICE_UPDATED 이벤트는 현재 체인의 최신 블록과 최근에 확정된 블록에 대한 정보를 제공합니다. 그리고 첫 확정 블록이 아직 발생하지 않았다면, 임시 해시 값으로 초기화됩니다.
FIRST_FINALIZED_BLOCK
: POS_FORKCHOICE_UPDATE
에 의해 지정되며, 스텁과 다른 해시를 가진 첫번째 최종 블록을 나타냅니다.0x0000000000000000000000000000000000000000000000000000000000000000
과 다르다는 것입니다. 간단히 말하면 FIRST_FINALIZED_BLOCK
은 PoS **체인에서 첫 번째로 확정된 블록을 의미하며, 이 블록은 POS_FORKCHOICE_UPDATED
** Event에 의해 특별히 지정됩니다. 그리고 이 블록의 해시 값은 임시 값이 아닌 실제 블록의 고유한 해시 값을 가집니다.Client software는 Ethereum 네트워크와 상호 작용하는 프로그램입니다. 이 소프트웨어를 구성할 때, 몇가지 중요한 매개변수를 포함시켜야합니다.
이 매개변수들은:
TERMINAL_TOTAL_DIFFICULTY
: PoW에서 PoS로 전환을 시작하는 데 필요한 총 난이도 값FORK_NEXT_VALUE
: 다가오는 합의 업그레이드를 위한 블록 번호TERMINAL_BLOCK_HASH
: 마지막 PoW 블록의 해시 값TERMINAL_BLOCK_NUMBER
: 마지막 PoW 블록의 번호이러한 매개변수들은 Client Software의 바이너리 배포버전에 반드시 포함되어야합니다.
추가적인 참고사항으로는 만약 TERMINAL_BLOCK_HASH가 임시 해시 값 0x0000000000000000000000000000000000000000000000000000000000000000
으로 설정되어 있다면, TERMINAL_BLOCK_HASH
와 TERMINAL_BLOCK_NUMBER
매개 변수는 효력이 없게 됩니다.
PoW 블록 처리에 관한 내용입니다.
Ethereum이 PoW에서 PoS로 전환될 때, 마지막으로 인정한 PoW 블록 이후에는 어떠한 PoW 블록도 네트워크에 추가되어서는 안된다는 의미입니다.
Name | Value |
---|---|
MAX_EXTRA_DATA_BYTES | 32 |
Ethereum Block Header에 포함될 수 있는 Extra data의 최대 바이트 크기를 나타냅니다.
extra data는 블록을 생성한 마이너에 의해 추가될 수 있는 추가 정보를 포함하는 필드입니다.
Field | Constant value | Comment |
---|---|---|
ommersHash | 0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347 | = Keccak256(RLP([])) |
difficulty | 0 | |
mixHash | 0x0000000000000000000000000000000000000000000000000000000000000000 | |
nonce | 0x0000000000000000 | |
ommers | [] | RLP([]) = 0xc0 |
TRANSITION_BLOCK
부터 블록의 extraData 필드의 유효성 검사가 변경됩니다. 블록의 extraData 길이는 MAX_EXTRA_DATA_BYTES
바이트보다 작거나 같아야합니다.
참고
- 여기서 명시되지 않은 블록 필드의 로직과 유효성 조건은 변경되지 않아야합니다. 또한 전체 블록 형식도 변경되지 않아야 합니다.
- 후속 EIP는 추가 기능을 제공하기 위해 위에서 지정된 상수 값을 재정의할 수 있습니다. 예를 들어, ERP-4399를 참조하십시오
TRANSITION_BLOCK
부터 블록 유효성 검사 조건은 반드시 다음과 같이 변경해야합니다.
difficulty
값에 대한 검증을 제거합니다. 이전에는 특정 공식에 따라 블록의 difficulty
값을 검증했지만, 이제는 그렇지 않습니다.Ethash는 Ethereum의 PoW 알고리즘입니다.
참고:
새로운 규칙 중 하나가 실패하면 해당 블록은 무효화되어야 합니다.
위의 목록에서 지정되지 않은 유효성 규칙은 변경되지 않아야합니다.
위의 조건을 만족하는 것 외에도 TRANSITION_BLOCK
은 terminal PoW block의 자식 블록이어야합니다. 여기서 terminal PoW block은 PoW 방식에서 생성된 마지막 블록을 의미합니다. 즉 TRANSITION_BLOCK의 부모들은 terminal PoW block의 조건을 만족해야 합니다.
Ethereum 네트워크가 PoW에서 PoS로 전환을 시작할 때, 그 시작점이 되는 TRANSITION_BLOCK은 PoW 방식에서 생성된 마지막 블록의 바로 다음 블록이어야 한다는 것을 의미합니다.
TRANSITION_BLOCK
부터 Block 및 ommer(uncle) 보상에 대한 변경 사항을 설명합니다.
블록체인에서 마이너나 검증자는 블록을 생성하거나 검증하는 작업에 대한 보상을 받습니다. Ethereum에서도 마이너는 블록을 생성하거나 ommer(uncle) 블록을 포함시키는 것에 대한 보상을 받습니다.
TRANSITION_BLOCK 부터 Block 및 ommer(uncle) 보상이 폐기되거나 중단됩니다. 이는 Ethereum이 PoW에서 PoS로 전환됨에 따라 블록 생성에 대한 보상 방식이 변경되기 때문입니다.
구체적으로 다음과 같은 조치가 취해져야합니다.
참고: 블록의 수혜자 계정에 영향을 주는 트랜잭션 수수료 메커니즘은 그대로 유지되어야합니다. 이는 블록 보상이 폐기되더라도, 마이너나 검증자가 트랜잭션을 처리하는 것에 대한 수수료는 계속 받게 됨을 의미합니다.
"수혜자 계정"은 Ethereum에서 블록을 생성하거나 특정 작업을 수행한 마이너나 검증자에게 보상을 지급하기 위한 대상 계정을 의미합니다. 블록을 생성할 때, 마이너는 자신의 주소를 블록의 "수혜자" 또는 "beneficiary"로 설정합니다. 그런 다음, 블록이 성공적으로 네트워크에 추가되면, 이 "수혜자 계정"은 블록 보상과 해당 블록에 포함된 모든 트랜잭션 수수료를 받게 됩니다.
Fork choice rule은 블록체인 네트워크에서 여러 가능한 체인 중 어떤 체인을 “정식” 또는 “canonical” 체인으로 간주할 것인지 결정하는 규칙입니다.
- Longest Chain (가장 긴 체인):
- 이 규칙은 가장 많은 블록을 포함하는 체인, 즉 가장 긴 체인을 메인 체인으로 선택하는 것을 기반으로 합니다.
- Proof-of-Work (PoW) 기반의 초기 블록체인 시스템에서 사용되는 기본적인 포크 선택 규칙입니다.
- "가장 긴 체인" 규칙은 단순히 체인의 길이, 즉 체인에 포함된 블록의 수를 기준으로 합니다.
- Heaviest Chain (가장 무거운 체인):
- 체인의 "무게"는 그 체인에 포함된 블록들에 소비된 전체 컴퓨팅 파워를 기반으로 합니다.
- 따라서 "가장 무거운 체인"은 가장 많은 작업 증명이 된 체인을 의미합니다.
- 이 규칙은 블록의 수뿐만 아니라 각 블록에 소비된 작업의 양도 고려합니다.
TERMINAL_BLOCK_HASH
매개변수가 설정된 경우, 해당 매개변수는 PoW heaviest 체인 규칙에 다음과 같은 영향을 미칩니다.
TERMINAL_BLOCK_HASH
매개변수로 정의된 해시를 가진 블록을 포함해야합니다. 이 블록은 TERMINAL_BLOCK_NUMBER
매개변수로 정의된 해시를 가진 블록을 포함해야합니다.참고: 이 규칙은 client software 구현에 이미 존재하는 hash 화이트 리스트 차단 기능과 유사합니다.
첫 번째 POS_FORKCHOICE_UPDATED
event 부터 Fork choice rule은 다음과 같이 변경되어야합니다.
새로운 PoS LMD-GHOST fork choice rule은 다음과 같이 명시됩니다.
Ethereum 네트워크에서는 여러 가능한 체인 중 어떤 체인을 "정식" 또는 "캐노니컬(canonical)" 체인으로 간주할 것인지 결정하는 규칙이 필요합니다. LMD-GHOST는 이러한 결정을 내리는 새로운 규칙입니다.
FIRST_FINALIZED_BLOCK
부터 시작하여, 이벤트에 의해 지목된 블록을 최근 확정된 블록으로 설정합니다.“원자적으로”라는 용어는 이러한 변경 사항이 모두 한 번에 적용되거나 모두 적용되지 않아얗마을 의미합니다.
참고
- 이 규칙은 엄격하게 준수되어야합니다.
- 새로운 블록이 메인 체인의 헤드로 설정되려면 특정 이벤트(POS_FORKCHOICE_UPDATED)가 동반되어야합니다.
Ethereum 네트워크는 여러 버전의 프로토콜이 동시에 실행될 수 있기 때문에, 노드들이 서로 어떤 버전의 프로토콜을 사용하고 있는지 알아야합니다. 이를 위해 “Fork identifier”라는 것을 사용합니다.
EIP-2124 Fork identifer를 적용하는 노드는 FORK_NEXT
라는 매개변수를 FORK_NEXT_VALUE 값으로 설정해야 합니다. 이렇게 함으로써 다른 노드들에게 “나는 이 EIP를 적용한 버전을 사용하고 있다”라고 알릴 수 있습니다.
devp2p는 Ethereum 노드들이 서로 통신하기 위한 프로토콜입니다. 노드들은 블록 정보, 트랜잭션 등의 데이터를 교환하기 위해 여러 종류의 메시지를 주고 받습니다.
그런데, 이 EIP의 적용으로 인해 일부 메시지 유형은 더 이상 사용되지 않게 됩니다.
NewBlockHashes (0x01)
NewBlock (0x07)
**FIRST_FINALIZED_BLOCK**
을 받은 후부터 네트워크는 다음과 같은 들어오는 메시지를 무시해야합니다.NewBlockHashes (0x01)
NewBlock (0x07)
FIRST_FINALIZED_BLOCK
바로 다음에 오는 finalized block을 받은 후부터 네트워크는 다음 메시지에 대한 핸들러를 제거해야합니다.NewBlockHashes (0x01)
NewBlock (0x07)
참고: 이 섹션에 영향을 받지 않은 메시지 처리 로직은 그대로 유지되어야합니다.
이 EIP에서 제시된 변경사항들은 기존의 작업 증명(Proof-of-Work, PoW) 합의 알고리즘을 이미 운영 중인 비콘 체인에 의해 대표되는 새로운 지분 증명(Proof-of-Stake, PoS) 합의 알고리즘으로 안전하게 교체하기 위한 최소한의 필요한 변경사항들을 목표로 합니다.
이 EIP는 Ethereum 네트워크의 현재 합의 알고리즘을 실시간으로 교체하는 복잡성을 최소화하기 위해 설계되었습니다. 이러한 작업의 안전성과 생산까지의 시간 모두 고려되었습니다. 또한, 최소한의 변경사항만을 도입함으로써 대부분의 스마트 컨트랙트와 서비스가 전환 도중 및 전환 후에도 의도한 대로 계속 작동되도록 보장하며, 거의 또는 전혀 개입할 필요가 없게됩니다.
See EIP-3675: Upgrade consensus to Proof-of-Stake
See EIP-3675: Upgrade consensus to Proof-of-Stake
See **Halt the importing of PoW blocks**
EIP-3675: Upgrade consensus to Proof-of-Stake
예를 들어 PoW에서 PoS로 전환될 때 difficulty와 같은 값은 더 이상 필요하지 않게 됩니다. 이런 필드들을 특정 고정값으로 설정하여 더 이상 변경되지 않도록 할 수 있습니다.
BLOCKHASH
연산을 통해 반환된 값과 비교하여 검증합니다.스마트 계약 중 일부는 이 Merkle 증명을 사용하여 특정 트랜잭션이 블록 내에 포함되어 있는지 확인합니다. 만약 블록의 형식이 변경된다면, 이런 스마트 계약의 동작에 문제가 발생할 수 있습니다. 따라서, 필드를 상수로 변경하여 이런 문제를 방지하려는 것입니다.
difficulty
with `0작업 증명을 더 이상 사용하지 않게 되면 difficulty
라는 개념이 더 이상 존재하지 않으며 블록 헤더 난이도 필드를 0
상수로 대체하는 것이 의미론적으로 옳습니다.
작업 증명 메커니즘의 fork choice rule은 업그레이드 완전히 무의미해지며 새로운 지분 증명 합의 메커니즘의 해당 규칙으로 대체됩니다.
POS_CONSENSUS_VALIDATED
이 EIP의 이전 초안 버전에서는 블록의 유효성 검사 조건으로 추가적인 POS Event인 POS_CONSENSUS_VALIDATED가 필요했습니다. 이 Event는 블록을 블록 트리에 완전히 통합할 것인지, 아니면 블록 트리에서 해당 블록을 제거할 것인지에 대한 신호를 주었습니다.
그러나 이 Event는 두 가지 주요한 이유로 제거되었습니다.
POS_FORKCHOICE_UPDATED
를 전송하지 않았기 때문입니다. 결국, 블록 트리의 다른 분기에서 PoS finality event가 발생한 후에 이러한 블록들은 제거될 수 있었습니다.POS_CONSENSUS_VALIDATED == TRUE
이벤트와 POS_CONSENSUS_VALIDATED == FALSE
이벤트가 동시에 전송될 수 있었으며 이는 (1)에서 안전하게 최적화를 수행하는 능력을 완전히 무효화하였습니다.이 부분은 Ethereum 네트워크의 포크 관련 정보를 어떻게 처리할 것인지에 대한 설명입니다. 특히, 다음 포크 블록 번호를 미리 알 수 없는 경우에 대비하여 별도의 값(FORK_NEXT_VALUE)을 사용하여 처리하는 방법을 설명합니다.
FORK_NEXT
의 값은 주어진 노드가 알고 있는 다음 포크의 블록 번호를 나타냅니다. 만약 노드가 다음 포크에 대한 정보를 모르면, 이 값은 0이 됩니다.TRANSITION_BLOCK
의 번호는 전환 트리거 조건의 동적 특성 때문에 미리 알 수 없습니다. 따라서 블록 번호가 사전에 알려지지 않기 때문에 노드들은 FORK_NEXT
에 이 번호를 사용할 수 없습니다. 이 사실을 고려하여 명시적으로 설정된 FORK_NEXT_VALUE
가 대신 사용됩니다.새로운 비콘 체인 네트워크의 Block gossip 방식을 사용하게되어 기존의 Block gossip 방식이 더 이상 안전하지 않게 되어 폐기됩니다.
Block gossip: 블록 정보를 네트워크의 다른 노드들에게 전파하는 것을 말합니다.
extraData
합의 방식이 바뀌면서 긴 extraData 필드가 더 이상 필요하지 않기 때문에 길이를 32bytes로 제한하려는 제안입니다.
extraData
field: Ethereum 블록 헤더에 포함된 정보 중 하나로, 추가적인 데이터를 저장할 수 있는 공간입니다.extraData
필드의 최대 길이는 32
bytes로 정의되어 있습니다.extraData
필드의 값이 32
bytes로 제한됩니다.extraData
필드의 길이가 32
bytes보다 길게 설정될 수 있습니다.extraData
필드는 더 이상 필요하지 않습니다. 따라서, 이 EIP에서는 extraData
필드의 길이를 32
bytes로 제한하도록 제안하고 있습니다.이번 EIP는 EVM에 명시적인 변경 사항을 도입하지는 않지만, 기존 스마트 컨트랙트의 로직에 영향을 줄 수 있는 몇 가지 부분이 있습니다.
이 EIP가 적용된 후에는 DIFFICULTY
연산이 항상 0
을 반환하고 DIFFICULTY
필드를 0 상수로 대체하여 더 이상 사용되지 않습니다.
참고: 비콘 체인에 의해 축적된 무작위성을 반환하도록 DIFFICULTY 시맨틱을 변경하는 것은 고려중이며, 별도의 EIP에서 도입될 예정입니다.
BLOCKHASH 작업의 출력으로 얻은 의사 난수는 이 EIP가 적용되고 (블록해시의 가변성을 감소시키는) 작업 증명 메커니즘이 지분 증명으로 대체된 이후에는 더욱 안전하지 않게 됩니다.
Test Cases 섹션은 제안된 변경사항이 실제로 Ethereum 네트워크에 적용될 때 어떻게 동작해야 하는지에 대한 테스트 시나리오를 제시하고 있습니다.
ommersHash != Keccak256(RLP([]))
이 조건은 블록에 "ommer" 블록이 포함되어서는 안된다는 것을 나타냅니다.
difficulty != 0
이 조건은 블록의
difficulty
값이 0이 아니어야 한다는 것을 나타냅니다.
nonce != 0x0000000000000000
이 조건은 블록의
nonce
값이 0x0000000000000000 (즉, 0)이 아니어야 한다는 것을 나타냅니다
len(extraData) > MAX_EXTRA_DATA_BYTES
이 조건은
extraData
의 길이가MAX_EXTRA_DATA_BYTES
보다 길면 안된다는 것을 나타냅니다.
TRANSITION_BLOCK
부터는 블록 보상이 beneficiary
계정에 추가되지 않습니다.TRANSITION_BLOCK
부터 시작하여, 클라이언트 소프트웨어는 새로운 블록 유효성 규칙을 적용합니다. 이는 PoW에서 PoS로의 전환을 나타내며, 이 시점부터 블록의 유효성을 검사하는 규칙이 변경됩니다POS_FORKCHOICE_UPDATED
이벤트를 받은 후, 클라이언트 소프트웨어는 포크 선택 규칙을 PoS LMD-GHOST로 전환합니다. 이는 클라이언트가 어떤 블록 체인을 메인 체인으로 간주할지 결정하는 방식을 변경하는 것을 의미합니다.TRANSITION_BLOCK
은 "terminal PoW block"의 자식 블록이어야 합니다. 즉, PoS로의 전환을 시작하는 블록은 마지막으로 PoW로 생성된 블록 바로 다음에 와야 합니다.FIRST_FINALIZED_BLOCK
을 받은 후, 네트워크 메시지인 NewBlockHashes (0x01)
와 NewBlock (0x07)
은 무시됩니다. 이는 PoS 전환 후에는 이전 방식의 블록 전파 메시지를 더 이상 사용하지 않는다는 것을 의미합니다.EIP-2982의 보안 고려 사항 섹션을 참조하세요.
이 부분은 Ethereum 네트워크가 PoW에서 PoS로 전환하기 위한 과정이 일반적인 하드포크보다 훨씬 복잡하다는 것을 설명하고 있습니다.
이 전환 과정은 일반적인 하드포크보다 더 복잡한 버전입니다. 이 과정은 단순한 하드포크의 일반적인 블록 높이 지점 조건 대신 여러 연속적인 단계를 거칩니다. 이 업그레이드 과정의 복잡성은 합의 메커니즘 내의 실행 계층이 아닌 기본 합의 메커니즘을 대상으로 하는 하드 포크에서 비롯됩니다. 설계는 가능한 한 단순성을 추구하지만, 이 전환 과정에서 safety와 liveness를 우선적으로 고려했습니다.
미리 정의된 블록 번호를 하드포크에 사용하는 것은 전환 도중 PoS 포크 선택이 우선 순위를 가지기 때문에 안전하지 않습니다.
“미리 정의된 블록 번호를 하드포크에 사용하는 것”은 Ethereum 네트워크가 특정 블록 번호에 도달하면 자동으로 합의 메커니즘을 변경하도록 설정하는 것을 말합니다. 블록 번호만을 기반으로 합의 메커니즘을 변경한다면, 악의적인 공격자가 이를 악용하여 네트워크를 혼란스럽게 만들 수 있습니다. 공격자는 PoW와 PoS 간의 전환 시점을 악용하여 블록체인을 분기시킬 수 있고, 이로 인해 네트워크의 안정성이 위협 받을 수 있습니다.
공격자는 해시 파워의 소수를 사용하여 블록 높이 요구 사항을 만족시키는 악의적인 체인 포크를 구축할 수 있습니다. 그런 다음 이 적대적인 포크에서의 PoW 블록 위에 첫 번째 PoS 블록이 악의적으로 제안될 수 있으며, 이 블록이 헤드가 되어 전환의 보안을 손상시킬 수 있습니다.
이러한 공격 시나리오로부터 네트워크를 보호하기 위해, 체인에 의해 누적된 total difficulty가 업그레이드를 트리거하는 데 사용됩니다.
따라서 체인의 총 난이도를 기반으로 업그레이드를 결정하는 방식을 채택하여 이러한 위험을 방지하려고 합니다.
이 부분은 네트워크 분할로 인해 일부 참가자들이 마지막 PoW 블록을 관찰하지 못하는 상황을 고려하여, 전환 과정 중에 발생할 수 있는 문제점과 그에 대한 해결 방안을 설명하고 있습니다.
FIRST_FINALIZED_BLOCK
이 아직 수신되지 않았어야합니다.Ethereum이 PoW에서 PoS로 전환하는 과정에서 발생할 수 있는 문제와 그에 대한 해결 방법을 설명합니다.
TERMINAL_TOTAL_DIFFICULTY
에 도달하기 전에 오프라인 상태가 되고, 네트워크가 이 임계값에 도달하는 동안 오프라인 상태를 유지한다고 가정해봅니다.Ethereum 네트워크는
TERMINAL_TOTAL_DIFFICULTY
라는 특정 난이도 값을 도달하려고 합니다. 이 값에 도달하면 PoW에서 PoS로 전환됩니다.
그런데 문제는 클라이언트 소프트웨어의 일부(비콘 체인 네트워크에 연결된 부분)가 임계값에 도달하기 전에 인터넷 연결이 끊기는 등의 이유로 오프라인 상태가 된다는 것입니다. 그리고 이 오프라인 상태가 계속 유지됩니다.
클라이언트가 마지막 PoW 블록의 post-state(후속 상태)를 가지고 있지 않을 수 있습니다. 이 상태는 이미 삭제(가지치기) 되었기 떄문입니다.
응용 프로그램, 사용자 또는 서비스가 잘못된 포크(계속 생성되는 PoW 체인)의 데이터를 사용할 수 있습니다. 이렇게 잘못된 포크의 데이터를 사용하게 되면 응용 프로그램, 사용자 또는 서비스 측에서 보안 문제가 발생할 수 있습니다.
클라이언트가 오프라인 상태로 인해 PoS 체인으로 제대로 전환하지 못하면, 클라이언트는 필요한 데이터를 잃어버리거나 잘못된 체인의 데이터를 사용하게 되어 다양한 문제가 발생할 수 있습니다.
Safety: 시스템이 잘못된 것을 하지 않는 것(예: 잘못된 데이터 제공)
Liveness: 시스템이 올바른 것을 계속 수행하는 것(예: 요청에 응답)
Liveness failure: liveness 속성이 손상되었음을 의미한다. 즉, 시스템이 멈추거나, 응답을 하지 않거나, 예상대로 작동하지 않을 때 발생한다.
블록체인에서 liveness failure는 새로운 블록이 생성되지 않거나 네트워크가 트랜잭션을 처리하지 않는 상태를 의미할 수 있다.
Ethereum의 합의 메커니즘을 PoW에서 PoS로 전환하는 과정에서 발생할 수 있는 비상 상황과 그에 따른 대응 방안에 대해 설명합니다.
매개변수를 업데이트 하여 안전하게 가속화할 수 있습니다.
- 네트워크 해싱 레이트 감소는
TERMINAL_TOTAL_DIFFICULTY
값을 조정하여 업그레이드 시점을 가까운 시간으로 조정함으로써 안전하게 가속화할 수 있습니다.FORK_NEXT_VALUE
도 그에 따라 조정됩니다.
더 심각한 공격 시나리오의 경우, 더 광범위한 조치가 필요합니다.
TERMINAL_BLOCK_HASH
를 특정 블록의 해시로 설정하여 해당 블록을 마지막 PoW 블록으로 지정합니다.TERMINAL_BLOCK_NUMBER
는TERMINAL_BLOCK_HASH
에 의해 지정된 블록의 번호로 설정됩니다.TERMINAL_TOTAL_DIFFICULTY
는TERMINAL_BLOCK_HASH
에 의해 지정된 블록의 Total difficulty 값으로 설정됩니다.FORK_NEXT_VALUE
도 그에 따라 조정됩니다.
참고: 두 번째 경우의 가속화는 Ethereum 메인넷에서 중대한 활동 중단을 초래할 수 있기 때문에 가장 극단적인 시나리오에 대한 것으로 간주합니다.
PoW 네트워크에서는 체인의 유효성을 증명하기 위해 모든 블록의 기록을 유지하는 것이 중요하지만, PoS 네트워크에서는 약한 주관성 체크포인트를 사용하여 이러한 전체 기록을 검증할 필요가 없습니다. PoS는 이 체크포인트를 기반으로 동기화를 수행하며, 이 체크포인트 이전의 블록은 더 이상 필요하지 않습니다.
weak subjectivity checkpoints에 대한 명세는
ethereum/consensus-specs
저장소에서 찾을 수 있습니다.