지분 증명 이더리움의 키
이더리움은 공개키-개인 키 암호학을 사용하여 사용자 자산을 보호합니다. 공개키는 이더리움 주소의 기반으로 사용됩니다. 즉, 일반 대중에게 공개되며 고유 식별자로 사용됩니다. 개인 키(또는 '비밀' 키)는 계정 소유자만 접근할 수 있어야 합니다. 개인 키는 트랜잭션과 데이터에 '서명하기' 위해 사용되며, 이를 통해 암호학적으로 해당 개인 키의 소유자가 특정 작업을 승인했음을 증명할 수 있습니다.
이더리움의 키는 타원 곡선 암호학 (opens in a new tab)을 사용하여 생성됩니다.
그러나 이더리움이 작업증명 (PoW)에서 지분 증명 (PoS)으로 전환되면서 새로운 유형의 키가 이더리움에 추가되었습니다. 기존 키는 여전히 이전과 완전히 동일하게 작동하며, 계정을 보호하는 타원 곡선 기반 키에는 아무런 변화가 없었습니다. 하지만 사용자가 ETH를 스테이킹하고 검증자를 실행하여 지분 증명에 참여하려면 새로운 유형의 키가 필요했습니다. 이러한 필요성은 수많은 검증자 간에 전달되는 많은 메시지와 관련된 확장성 문제에서 비롯되었으며, 네트워크가 합의에 도달하는 데 필요한 통신량을 줄이기 위해 쉽게 집계할 수 있는 암호학적 방법이 필요했습니다.
이 새로운 유형의 키는 Boneh-Lynn-Shacham (BLS) 서명 체계 (opens in a new tab)를 사용합니다. BLS는 서명의 매우 효율적인 집계를 가능하게 할 뿐만 아니라 집계된 개별 검증자 키의 역공학을 허용하여 검증자 간의 작업을 관리하는 데 이상적입니다.
두 가지 유형의 검증자 키
지분 증명으로 전환하기 전, 이더리움 사용자는 자금에 접근하기 위해 단일 타원 곡선 기반 개인 키만 가지고 있었습니다. 지분 증명이 도입되면서 솔로 스테이커가 되고자 하는 사용자는 검증자 키와 인출 키도 필요하게 되었습니다.
검증자 키
검증자 서명 키는 두 가지 요소로 구성됩니다.
- 검증자 개인 키
- 검증자 공개키
검증자 개인 키의 목적은 블록 제안 및 증명과 같은 온체인 작업에 서명하기 위함입니다. 이 때문에 이 키들은 핫 월렛에 보관되어야 합니다.
이러한 유연성은 검증자 서명 키를 한 기기에서 다른 기기로 매우 빠르게 이동할 수 있다는 장점이 있지만, 키를 분실하거나 도난당한 경우 악의적인 공격자가 다음과 같은 몇 가지 방식으로 악의적으로 행동할 수 있습니다.
- 다음과 같은 방법으로 검증자가 슬래싱되도록 만듭니다.
- 제안자로서 동일한 슬롯에 대해 두 개의 다른 비콘 블록에 서명하기
- 증명자로서 다른 증명을 "둘러싸는(surrounds)" 증명에 서명하기
- 증명자로서 동일한 대상을 갖는 두 개의 다른 증명에 서명하기
- 자발적 종료를 강제하여 검증자의 스테이킹을 중단시키고, 인출 키 소유자에게 해당 ETH 잔액에 대한 접근 권한을 부여합니다.
사용자가 스테이킹 예치금 컨트랙트에 ETH를 예치할 때 트랜잭션 데이터에 검증자 공개키가 포함됩니다. 이는 예치 데이터(deposit data)로 알려져 있으며, 이더리움이 검증자를 식별할 수 있게 해줍니다.
인출 자격 증명
모든 검증자는 인출 자격 증명이라는 속성을 가지고 있습니다. 이 32바이트 필드의 첫 번째 바이트는 계정 유형을 식별합니다. 0x00은 원래의 BLS(샤펠라 이전, 인출 불가) 자격 증명을 나타내고, 0x01은 실행 주소를 가리키는 레거시 자격 증명을 나타내며, 0x02는 최신 복리(compounding) 자격 증명 유형을 나타냅니다.
0x00 BLS 키를 가진 검증자는 초과 잔액 지급을 활성화하거나 스테이킹에서 전액 인출을 수행하기 위해 이 자격 증명이 실행 주소를 가리키도록 업데이트해야 합니다. 이는 초기 키 생성 시 예치 데이터에 실행 주소를 제공하거나, 나중에 인출 키를 사용하여 BLSToExecutionChange 메시지에 서명하고 브로드캐스트함으로써 수행할 수 있습니다.
인출 키
초기 예치 시 설정하지 않은 경우, 인출 자격 증명이 실행 주소를 가리키도록 업데이트하려면 인출 키가 필요합니다. 이를 통해 초과 잔액 지급 처리가 시작될 수 있으며, 사용자가 스테이킹한 ETH를 전액 인출할 수도 있습니다.
검증자 키와 마찬가지로 인출 키도 두 가지 구성 요소로 이루어져 있습니다.
- 인출 개인 키
- 인출 공개키
인출 자격 증명을 0x01 유형으로 업데이트하기 전에 이 키를 분실하면 검증자 잔액에 대한 접근 권한을 잃게 됩니다. 증명 및 블록 서명에는 검증자의 개인 키가 필요하므로 검증자는 여전히 이러한 작업을 수행할 수 있지만, 인출 키를 분실한 경우 인센티브가 거의 또는 전혀 없습니다.
검증자 키를 이더리움 계정 키와 분리하면 단일 사용자가 여러 검증자를 실행할 수 있습니다.
참고: 현재 스테이킹 임무를 종료하고 검증자의 잔액을 인출하려면 검증자 키로 자발적 종료 메시지(VEM) (opens in a new tab)에 서명해야 합니다. 그러나 EIP-7002 (opens in a new tab)는 향후 사용자가 인출 키로 종료 메시지에 서명하여 검증자의 종료를 트리거하고 잔액을 인출할 수 있도록 하는 제안입니다. 이는 ETH를 서비스형 스테이킹(staking-as-a-service) 제공자에게 위임하는 스테이커가 자금에 대한 통제권을 유지할 수 있게 함으로써 신뢰 가정을 줄여줄 것입니다.
시드 구문에서 키 파생하기
스테이킹된 32 ETH마다 완전히 독립적인 2개의 새로운 키 세트가 필요하다면, 특히 여러 검증자를 실행하는 사용자의 경우 키 관리가 금방 다루기 힘들어질 것입니다. 대신, 단일 공통 비밀(secret)에서 여러 검증자 키를 파생할 수 있으며, 이 단일 비밀을 저장하면 여러 검증자 키에 접근할 수 있습니다.
니모닉(Mnemonic) (opens in a new tab)과 경로는 사용자가 지갑에 접근할 때 (opens in a new tab) 자주 접하는 주요 기능입니다. 니모닉은 개인 키의 초기 시드 역할을 하는 일련의 단어입니다. 추가 데이터와 결합될 때 니모닉은 '마스터 키'로 알려진 해시를 생성합니다. 이는 트리의 루트(root)로 생각할 수 있습니다. 그런 다음 계층적 경로를 사용하여 이 루트에서 가지(branch)를 파생할 수 있으므로, 자식 노드는 부모 노드의 해시와 트리 내 인덱스의 조합으로 존재할 수 있습니다. 니모닉 기반 키 생성에 대한 BIP-32 (opens in a new tab) 및 BIP-19 (opens in a new tab) 표준에 대해 읽어보세요.
이러한 경로는 하드웨어 지갑을 사용해 본 사용자에게 익숙한 다음과 같은 구조를 가집니다.
m/44'/60'/0'/0`
이 경로의 슬래시는 다음과 같이 개인 키의 구성 요소를 구분합니다.
master_key / purpose / coin_type / account / change / address_index
이러한 로직을 통해 사용자는 단일 니모닉 구문에 가능한 한 많은 검증자를 연결할 수 있습니다. 트리의 루트는 공통으로 사용하고 가지에서 구분을 할 수 있기 때문입니다. 사용자는 니모닉 구문에서 원하는 수만큼 키를 파생할 수 있습니다.
[m / 0]
/
/
[m] - [m / 1]
\
\
[m / 2]
각 가지는 /로 구분되므로 m/2는 마스터 키에서 시작하여 가지 2를 따라간다는 의미입니다. 아래의 도식에서는 단일 니모닉 구문을 사용하여 3개의 인출 키를 저장하며, 각 인출 키에는 2개의 검증자가 연결되어 있습니다.

