https://cexplorer.io/article/understanding-block-minting-in-cardano
카르다노 네트워크에서는 주어진 슬롯에 무작위로 추첨되고 등록 인증서가 블록체인에 저장된 노드만 블록을 생성할 수 있습니다. 새로 제안된 블록이 복권에 당첨된 노드에 의해 생성되었으며 그렇게 할 권한이 있는지 검증 가능해야 합니다. 새로운 블록이 생성되는 방식과 검증되는 방식에 대해 알아보세요.
블록 검증은 왜 필요한가요?
모든 공용 블록체인 네트워크에는 분산화 및 보안 요구 사항이 적용됩니다. 블록 생산의 맥락에서 이는 블록 생산자를 선택하기 위한 무작위 추첨과 블록 검증을 위한 메커니즘이 확립되어야 함을 의미합니다.
또한, 블록체인 네트워크는 개방형이므로 누구나 자발적이고 완전하게 익명으로 가입하여 블록 생산을 시작할 수 있습니다. 의도적으로 네트워크를 공격하려는 엔터티에 의해 수행될 수도 있습니다. 따라서 네트워크 작동 규칙(프로토콜)을 정의하는 것이 필요합니다. 네트워크의 대다수 노드가 (프로토콜의) 규칙에 따라 작동하는 한, 네트워크가 공격을 제거하고 정기적으로 새로운 유효한 블록을 블록체인에 추가하는 것은 쉽습니다.
대부분의 최신 블록체인은 주어진 기간 동안 한 노드가 블록을 생성하고 다른 모든 노드가 이 블록을 확인하는 방식으로 작동합니다. 제안된 블록은 승인되거나(유효한 경우) 폐기될 수 있습니다. 특정 기간에 더 많은 블록이 나타나면 어떤 블록을 블록체인의 끝에 추가해야 하는지(마지막 블록이 됨)를 결정하는 규칙이 있어야 합니다. 규칙은 여러 개의 새 블록 추가에 따라 달라질 수 있습니다(더 긴 체인 규칙).
블록 검증은 일반적으로 복권에 당첨된 노드에 의해 블록이 생성되었다는 구체적인 암호화 증거를 검증하는 것으로 구성됩니다. 블록 헤더의 추가 데이터를 확인할 수 있습니다. 예를 들어, 블록의 진위성과 무결성을 확인합니다.
각 블록은 헤더와 본문(컨텐츠)으로 구성됩니다. 블록의 내용도 검증됩니다. 즉, 거래가 검증됩니다. 블록은 유효한 헤더를 가질 수 있지만 블록의 내용이 유효하지 않으면 블록도 유효할 수 없습니다. 이 글은 블록 생산에 중점을 두고 있기 때문에 블록 콘텐츠에는 관심이 없습니다. 블록 헤더의 데이터만 필요합니다.
광범위한 독립 노드 집합이 블록을 추가할 수 있고 공격자가 어떤 방식으로든 이 프로세스를 방해할 수 없다면 블록체인은 분산화되고 안전한 것으로 간주될 수 있습니다. 정직한 노드는 정기적으로 네트워크 합의에 도달할 수 있습니다.
Cardano가 시간을 나누는 방법
Cardano는 시간을 1초 동안 지속되는 슬롯과 5일 동안 지속되는 에포크(epoch)로 나눕니다. 한 시대는 432,000개의 슬롯 동안 지속됩니다.
시대 간 전환 시 소위 스냅샷이 생성됩니다.
스냅샷은 Cardano 합의(즉, 블록 생성)에 적극적으로 참여하는 노드에 의해 생성됩니다. 스냅샷은 각 에포크가 끝날 때 생성되며 네트워크의 지분 분배 및 위임 상태를 기록합니다.
스테이커는 에포크 기간 동안 언제든지 위임할 수 있으므로 개별 풀의 지분과 그 수(새로운 스테이크 풀 등록)는 지속적으로 변경될 수 있습니다. 변경 사항을 반영하는 상태를 라이브 스테이크라고 합니다. 네트워크 합의에 참여하는 노드는 활성 지분이라고 불리는 스냅샷 중에 촬영된 상태로 작업합니다. 스냅샷은 시스템에 보안, 안정성 및 예측 가능성을 제공합니다.
아래 이미지에서는 시대 간 전환 중에 촬영된 스냅샷(활성 스테이크 후보)을 볼 수 있습니다. 20초 간격으로 나누어진 슬롯을 확인하세요. Cardano의 무작위성은 대략 20개 슬롯마다 새 블록이 생성되도록 설정됩니다. 때로는 블록 사이의 시간 간격(슬롯 수)이 더 짧을 수도 있고, 더 길어질 수도 있습니다.
각 노드의 개인 복권은 다른 슬롯과 독립적으로 각 슬롯에서 발생합니다. 노드(또는 그 이상의 노드)가 블록을 생성할 권리를 얻었음을 알게 되면 소위 슬롯 리더가 됩니다. 그림에서 노란색 직사각형으로 표시되어 있습니다. 자세한 내용은 나중에 다시 설명하겠습니다.
또 다른 세부 사항을 설명하기 위해 시대로 돌아가 보겠습니다. 아래 이미지에서는 에포크 N+3이 진행 중입니다(녹색 직사각형). N+2 시대와 N+3 시대 사이의 전환 사이에 마지막 스냅샷이 촬영되었지만 활성 스테이크로 사용되지는 않습니다. 이전 에포크 N+2가 시작될 때 촬영된 스냅샷이 활성 스테이크로 사용됩니다. 이 스냅샷은 에포크 N+1(파란색 직사각형)의 상태를 반영합니다.
이전 에폭이 시작될 때 촬영된 스냅샷의 지분 분배 및 위임 상태는 현재 에폭에서 활성 지분으로 사용됩니다. 즉, 이전 스냅샷이 활성 스테이크로 사용됩니다.
이 규칙의 주된 이유 중 하나는 블록체인의 블록(콘텐츠 포함)이 변경되지 않음을 보장하기 위해 이전 스냅샷을 찍은 후(5일) 충분한 시간이 지났기 때문입니다.
블록 생성 및 검증을 위한 노드 준비
무작위 복권과 블록 발행은 Cardano의 암호화를 기반으로 합니다. 검증 가능한 무작위 함수 암호화 프리미티브는 무작위 복권에 사용됩니다. 블록에 서명하고 블록체인 기록의 불변성을 보장하기 위한 키 진화 서명 방식입니다.
이 기사에서는 암호화 세부 사항을 다루지 않고 블록 생성 및 검증의 실제 사용에 대해서만 다루겠습니다. 풀 운영자가 풀 등록 및 블록 생산자 노드 운영에 필요한 인증서를 생성할 수 있도록 여러 키 쌍을 생성해야 한다는 것을 아는 것만으로도 충분합니다.
모든 풀 운영자는 다음 키 쌍을 생성해야 합니다.
스테이크 풀 키 쌍(콜드 키)
KES(키 진화 서명) 키 쌍(단축키)
VRF(Verification Random Function) 키 쌍(단축키)
스테이크 주소 키 쌍(콜드 키)
각 키 쌍은 소유자(즉, 풀 운영자)가 비밀로 유지해야 하는 개인 키(서명 키)로 구성됩니다. 또한 공개키(인증키)를 공개할 수 있습니다. 이미지에서 서명 키는 빨간색으로 표시되고 확인 키는 녹색으로 표시됩니다.
모든 풀 노드는 개인 복권에 서명 VRF 키를 사용하고 새로 생성된 블록에 서명하기 위해 서명 KES 키를 사용합니다.
아래 그림에서는 풀 운영에 필요한 모든 키를 생성한 풀 운영자를 볼 수 있습니다. 그는 서명 VRF 및 KES 키를 노드의 핫 스토리지에 삽입했습니다. 풀 식별(ID)에는 검증 스테이크 풀 키가 사용됩니다. 서명 스테이크 주소 키는 보상 계정에서 보상을 인출하는 역할을 합니다.
검증이 가능하려면 네트워크의 모든 노드에서 검증 VRF 및 KES 키를 사용할 수 있어야 합니다. 또한 키가 특정 풀 운영자와 올바르게 연결되어 있어야 합니다. 이는 ID(스테이크 풀 키)를 통해 달성됩니다. 인증서는 키를 배포하는 데 사용됩니다.
모든 풀 운영자는 풀을 등록하고 무엇보다도 확인 VRF 키를 풀에 삽입해야 합니다. 또한 운영 키 인증서를 생성하고 여기에 확인 KES 키(운영 키라고도 함)를 삽입해야 합니다. 모든 인증서는 Cardano 거래를 통해 배포되며 블록체인에 저장됩니다.
아래 그림에서는 풀 등록 인증서와 운영 키 인증서를 생성하고 여기에 필요한 공개 키를 삽입한 풀 운영자를 볼 수 있습니다. 두 인증서 모두 서명 스테이크 풀 키로 서명되어야 한다는 점을 추가해 보겠습니다.
ADA 보유자는 한 쌍의 인증서, 스테이크 주소 등록 인증서 및 위임 인증서를 통해 자신의 지분을 선택한 풀에 위임합니다. 이러한 인증서는 블록체인에도 저장됩니다. 위임된 ADA 코인은 풀의 총 지분을 증가시킵니다.
아래 이미지에서는 스테이크 위임에 필요한 인증서를 생성한 사용자를 확인할 수 있습니다. 스테이크 풀 키(ID)는 위임 인증서에 포함되어 있습니다.
아래 이미지에서는 스테이커와 풀 운영자가 에포크 동안 트랜잭션을 통해 블록체인에 인증서를 제출하는 방법을 확인할 수 있습니다. 인증서는 개별 블록(모든 확인 키 포함)에 계속 저장됩니다. 이미지는 설명 목적으로만 사용됩니다. 블록에는 여러 인증서가 포함될 수 있습니다. 또한 특정 시대에 대한 네트워크의 지분 분배 및 위임 상태를 반영하는 스냅샷도 볼 수 있습니다.
노드가 네트워크의 다른 풀에서 제안한 블록을 검증할 준비가 되려면 필요한 모든 정보가 포함된 로컬 상태를 유지해야 합니다. 노드는 블록체인에서 불필요한 정보를 검색하지 않고도 들어오는 블록을 빠르게 확인할 수 있어야 합니다.
노드는 일련의 활성 스테이크 주소를 추적합니다. 추적된 데이터에는 각 스테이크 주소 등록 인증서의 스테이크 자격 증명(스크립트 키 또는 해시)이 포함되어 있습니다. 노드는 수신 블록의 트랜잭션 검증을 기반으로 세트를 업데이트합니다. 노드는 보상 계정(등록된 모든 스테이크 주소의 일부)에서 스테이킹 보상을 인출하는 트랜잭션을 확인할 수 있습니다.
노드는 검증 스테이크 풀 키(보다 정확하게는 키의 해시)를 기반으로 색인을 생성하는 일련의 활성 스테이크 풀을 추적합니다. 또한 노드는 인증서의 일련 번호를 나타내는 카운터를 포함하여 운영 키 인증서와 관련된 정보를 추적합니다. 가장 높은 카운터 번호를 가진 인증서만 유효합니다(더 낮은 카운터 번호를 가진 모든 이전 인증서는 유효하지 않습니다).
노드는 활성 위임 인증서(검증 스테이크 풀 키(ID)의 해시에 위임된 모든 스테이크 주소)를 추적합니다.
리더 슬롯 복권을 플레이하고 시대별 스테이킹 보상을 계산하려면 노드는 풀에 얼마나 많은 지분이 위임되는지 알아야 합니다. 이는 각 개별 검증 스테이크 풀 키(역시 키의 해시)에 위임된 모든 스테이크 주소의 합계입니다.
아래 이미지에서는 블록(및 트랜잭션) 검증을 위해 유지하는 데 필요한 모든 정보와 함께 로컬 상태를 유지하는 풀 노드를 볼 수 있습니다. 노드는 등록된 모든 풀에 대해 알고 있습니다. 이는 스테이크 풀 키의 해시와 총 스테이크를 알고 있습니다. 또한 모든 활성 KES(작동) 및 VRF 키에 대해서도 알고 있습니다.
일부 세트는 지속적으로 업데이트되며(예: 새로 추가된 블록마다 UTxO 세트가 변경됨) 다른 세트는 이전 스냅샷(활성 스테이크)을 참조합니다. 모든 노드가 블록 생산과 관련하여 동일한 상태로 작동하도록 보장하기 위해 라이브 스테이크를 사용할 수 없습니다.
아래 그림은 시대의 스냅샷이 어떻게 지역 상태를 구축하는 기초가 되는지 보여줍니다. 모든 인증서(및 스테이크 주소 위임)는 빠른 블록 검증에 사용할 수 있도록 세트로 구성됩니다.
이제 노드가 새로운 블록을 생성하고 다른 풀에서 제안한 블록을 검증하는 데 필요한 것이 무엇인지 알게 되었습니다.
블록 발행
이전 몇 개의 슬롯에서 슬롯 리더가 선출되지 않았다고 상상해 보세요. 현재 슬롯에 대한 새로운 복권 라운드가 이제 각 풀에서 비공개로 실행됩니다. 풀 운영자만 사용할 수 있고 다른 사람은 사용할 수 없는(키가 손상되지 않은 경우) 서명 VRF 키를 사용해야 하기 때문에 이는 개인 복권입니다.
노드가 슬롯 리더가 되는지 확인하려면 VRF 기능을 사용해야 합니다. VRF 기능은 여러 매개변수를 입력으로 사용하여 VRF 출력을 생성합니다. VRF 기능에 대한 입력은 슬롯 ID(현재 슬롯), Nonce 및 서명 VRF 키(노드의 핫 스토리지에 저장됨)입니다.
nonce는 epoch nonce와 추가 엔트로피라는 두 값의 XOR로 계산됩니다. 에포크 논스는 이전 에포크에서 생성된 블록의 처음 2/3의 VRF 출력을 사용하여 생성된 해시입니다. 추가 엔트로피는 비어 있지 않은 nonce 필드가 있는 유효한 스테이크 풀 등록 인증서를 제출하는 사람이 주입할 수 있는 선택적 값입니다. 추가 엔트로피는 시스템의 무작위성과 보안을 높이거나 손상된 epoch nonce에서 복구하는 데 사용될 수 있습니다.
모든 노드의 VRF 기능은 현재 슬롯에 대한 무작위 출력(Y)과 증명(⍴)을 생성합니다. 노드는 VRF 출력을 총 지분에 따라 달라지는 임계값과 비교합니다. 출력이 임계값보다 낮으면 노드가 슬롯 리더로 선출되고 해당 슬롯에 블록을 생성할 수 있습니다.
아래 이미지에서는 네트워크의 모든 풀이 어떻게 주어진 슬롯에서 복권을 플레이하고 VRF 출력을 임계값과 비교했는지 확인할 수 있습니다. 노드 7이 슬롯 리더가 되었습니다.
대부분의 경우 한 슬롯에서는 하나의 슬롯 리더만 선출됩니다. 우리 시나리오에서도 그렇다고 가정해 봅시다. 슬롯 리더는 블록을 만들 수 있는 권한을 갖습니다. 노드는 블록 헤더를 구성하고 유효한 거래를 본문에 삽입해야 합니다.
노드는 다음 정보를 블록 헤더에 삽입합니다.
블록 번호는 체인에 있는 블록의 일련 번호입니다.
블록이 생성된 슬롯 번호(슬롯 ID)입니다.
이전 블록 해시는 원장에 있는 이전 블록 헤더의 해시입니다.
블록 발행자. 블록을 발행한 스테이크풀 운영자의 검증키입니다.
VRF 출력(Y) 및 증명(⍴).
블록 크기(바이트 단위)입니다.
블록 본문 해시. 이는 본문(트랜잭션 및 데이터)의 해시입니다.
운영 인증서입니다.
프로토콜 버전입니다. 블록 검증에 사용되는 프로토콜 매개변수의 버전입니다.
아래 이미지에서 블록을 볼 수 있습니다. 비율 크기에 속지 마십시오. 실제로 블록 헤더는 블록 본체보다 상당히 작습니다. 첫 번째 단계에서는 VRF 기능을 사용하여 지정된 노드가 슬롯 리더가 되었는지 확인합니다. 그렇다면 노드는 필요한 모든 데이터를 헤더 블록에 삽입하고 서명 KES 키(노드의 핫 스토리지에 저장됨)로 블록에 서명합니다.
서명된 블록은 Cardano 네트워크로 전송될 준비가 되었습니다. 블록은 릴레이 노드를 통해 전 세계의 다른 모든 Cardano 노드에 배포됩니다. 다른 노드들은 블록 헤더의 정보를 검증하는 것부터 시작하고, 괜찮다면 본문 검증을 진행합니다.
차단 확인
제안된 블록의 검증은 활성 세트에 필요한 모든 정보(암호화 자료 포함)가 준비되어 있으므로 노드에게는 매우 쉬운 문제입니다.
다음 조건이 충족되면 블록이 유효한 것으로 간주됩니다.
VRF 결과는 스테이크 풀 운영자가 특정 슬롯에서 블록을 발행할 수 있는 자격을 결정하는 임의의 값입니다. VRF 증명은 스테이크 풀 운영자가 VRF 키 쌍을 사용하여 VRF 결과를 생성했음을 보여주는 암호화 증명입니다. 둘 다 쉽게 확인할 수 있습니다.
들어오는 블록을 검증하려는 노드는 현재 에포크의 nonce를 알아야 합니다. 모든 정직한 노드는 동일한 nonce(이를 얻기 위해 동일한 프로세스를 사용함)를 사용하므로 문제가 되지 않습니다. 노드는 VRF 검증 알고리즘을 사용하여 VRF 결과와 증명이 공개 VRF 키(활성 세트에서 가져옴) 및 에포크 논스와 일치하는지 확인합니다. 또한 노드는 VRF 결과가 블록을 제안한 노드의 지분에 따라 달라지는 임계값보다 낮은지 확인합니다. 이러한 검사가 통과되면 노드는 블록 후보가 유효한 슬롯 리더에 의해 생성되었음을 수락합니다.
이 검증은 동일한 스테이크 풀 키(ID)를 가진 풀이 등록된 경우에만 성공할 수 있다는 점에 유의하는 것이 중요합니다. 이는 사용된 스냅샷(활성 스테이크)에 해당하는 에포크에서 늦어도 이루어져야 했습니다.
검증의 또 다른 부분은 KES 서명 확인입니다. 제안된 블록은 헤더에 검증 키 인증서를 포함해야 합니다. 노드에는 로컬 상태에서 사용 가능한 활성 작동 키 인증서 목록이 있다는 점을 기억하십시오.
블록 내 작동 키 인증서의 카운터는 해당 블록을 검증하는 노드의 활성 집합에 있는 작동 키 인증서의 카운터보다 작을 수 없습니다.
아래 이미지에서는 노드가 블록체인에 저장된 인증서를 기반으로 준비한 정보를 사용하여 새로 도착한 블록의 헤더를 검증하는 방법을 확인할 수 있습니다.
VRF 및 KES 키에 관한 일부 검증만 그림에 표시되어 있습니다. 물론 헤더의 모든 매개변수(예: 블록 일련번호, 블록 크기, 이전 블록에 대한 링크 등)를 확인해야 합니다.
결론
블록 발행은 슬롯 리더 외에는 누구도 주어진 슬롯에서 블록을 발행할 수 없도록 설계되었습니다. 이를 위해서는 노드가 인증서를 통해 블록체인에 등록되어 있어야 하며 총 지분이 충분히 커야 합니다. 또한, 주어진 KES 기간 동안 유효한 KES 키가 있어야 합니다(블록 서명을 위한 개인 키는 블록체인 기록을 보호하기 위해 정기적으로 변경됩니다). 블록 검증을 위한 모든 암호화 자료는 블록체인의 모든 참가자가 사용할 수 있습니다. 노드는 검증을 통과하지 못한 블록을 받아들이지 않습니다.