이더리움 지분증명(1) - 검증자 참여

이한길·2023년 9월 9일
0

이더리움

목록 보기
3/6

0. 검증자

class Validator(Container):
    pubkey: BLSPubkey
    withdrawal_credentials: Bytes32  # Commitment to pubkey for withdrawals
    effective_balance: Gwei  # Balance at stake
    slashed: boolean
    # Status epochs
    activation_eligibility_epoch: Epoch  # When criteria for activation were met
    activation_epoch: Epoch
    exit_epoch: Epoch
    withdrawable_epoch: Epoch  # When validator can withdraw funds

검증자: 이더리움에서 검증자는 지분증명에 참여하여 블록을 제안하고 검증해 보상을 얻는 풀 노드를 말한다.

  • 각 에포크 Ei={Si,0,Si,1,...,Si,31}E_i=\{S_{i,0},S_{i,1},...,S_{i,31}\} 시점에서 활성화된 검증자 집합 Vi\mathcal{V}_i은 해당 에포크의 각 슬롯 Si,jS_{i,j}마다 하나씩 총 32개의 부분집합 Vi,jV_{i,j}으로 랜덤하게 분할된다.

    Vi={Vi,0,Vi,2,...,Vi,31}\mathcal{V}_i=\{V_{i,0},V_{i,2},...,V_{i,31}\}

  • 검증자 위원회(Committee of Validators): 각 슬롯 Si,jS_{i,j}에 할당된 검증자 부분집합 Vi,jV_{i,j}은 다시 m개(최대 64)의 위원회 Ci,j,kC_{i,j,k}로 분할되어 m개의 샤드체인에 각자 할당된다.

    Vi,j={Ci,j,0,Ci,j,1,...,Ci,j,m}V_{i,j}=\{C_{i,j,0},C_{i,j,1},...,C_{i,j,m}\}, (m<64)(m<64)

  • 각 위원회 Ci,j,kC_{i,j,k}는 n명(최대 211=20482^{11}=2048)의 검증자 vi,j,k,lv_{i,j,k,l}들로 이루어진다.

    Ci,j,k={vi,j,k,0,vi,j,k,1,...,vi,j,k,n}C_{i,j,k}=\{v_{i,j,k,0},v_{i,j,k,1},...,v_{i,j,k,n}\}, (n<2048)(n<2048)

제안자(Proposer): 이더리움에서 블록을 생성하여 네트워크를 통해 전파될 다음 블록을 제안하는 검증자를 제안자라고 한다.

  • 모든 슬롯에서 한 명의 검증자가 RANDAO를 통해 의사-무작위로 블록 제안자로 선정된다.
  • 현재 슬롯에 대한 블록 제안자는 이더리움 블록체인에 추가될 새로운 다음 블록을 생성하여 네트워크의 다른 노드로 전송하는 역할을 담당한다. 또한 글로벌 상태를 업데이트한다.

증명자(Attester): 이더리움에서 제안된 블록의 유효성을 증명하는 검증자를 증명자라고 한다.
각 에포크 동안 각 검증자는 증명을 합니다

1. 검증자 키 생성

BLS(Boneh-Lynn-Shacham) 서명: 서명의 매우 효율적인 집계를 가능하게 할 뿐만 아니라 집계된 개별 검증자 키의 역엔지니어링도 가능하게 하며 검증자 간의 작업을 관리하는 데 이상적인 서명방식.

검증자 키(Validator Key): BLS

  • 검증자 개인키(Validator Private Key): 블록 제안 및 증명과 같은 온체인 작업에 서명하는 키.

  • 검증자 공개키(Validator Public Key): 사용자가 스테이킹 입금 컨트랙트에 이더를 입금할 때 식별자로서 입금 데이터에 포함되는 키.

출금 키(Withdrawal Key): 오프라인 BLS 출금 키를 처음 입금할 때 설정하지 않은 경우, 출금 자격 증명이 실행 주소를 가리키도록 업데이트해야 한다. 이렇게 하면 초과 잔액 지급이 처리되기 시작하고 사용자가 스테이킹한 이더를 완전히 출금할 수 있다.

  • 출금 개인키(Withdrawal Private Key): 블록 제안 및 증명과 같은 온체인 작업에 서명하는 키.

  • 출금 공개키(Withdrawal Public Key): 사용자가 스테이킹 입금 컨트랙트에 이더를 입금할 때 식별자로서 입금 데이터에 포함되는 키.

  • 출금자격증명(Withdrawal Credentials): 출금자격을 증명하는 출금 키의 해시값.

누구든 네트워크의 이더만 있다면 검증자 ID를 만들 수 있고, 블록 생성 권한 또한 자신의 ID에 연결된 지분의 양으로 결정된다.

2. 이더 스테이킹

입금 컨트랙트(deposit contract):

  • 입금함수: 32 이상의 이더를 첨부하여 컨트랙트에 입금하는 함수 deposit(pubkey,withdrawal_credentials,signature,deposit_data_root)

  • 입금트리(Deposit Tree): 입금함수를 호출하면 입금데이터가 추가되는 컨트랙트의 구조체 트리.

  • 입금메세지(Deposit Message):

class DepositMessage(Container):
    pubkey: BLSPubkey
    withdrawal_credentials: Bytes32
    amount: Gwei
  • 입금데이터(Deposit Data): 서명된 입금메세지. 검증자 클라이언트에서 생성?
class DepositData(Container):
    pubkey: BLSPubkey
    withdrawal_credentials: Bytes32
    amount: Gwei
    signature: BLSSignature  # Signing over DepositMessage

검증자로 참여하려면 풀 노드는 네트워크에 32 이더를 예치해야 한다. 또한 실행 클라이언트, 합의 클라이언트에 추가적으로 검증자 클라이언트의 자신의 노드에 연결된 검증자 소프트웨어를 실행해야 한다.
예치한 이더 지분에 비례해 블록 생성 권한을 부여받는다?

모든 검증자는 입금 시 검증자 인덱스(ValidatorIndex)가 지정된다.

3. 활성화 대기

노드가 스테이킹을 완료하면 검증자 활성화 대기열에 들어가게 된다. 대기열은 새로운 검증자의 비율을 제한하기 위해 존재한다.

profile
블록체인, 통계학, 수학, 인공지능 공부하고 있습니다

0개의 댓글