Cardano 합의 이해하기

https://cexplorer.io/article/understanding-the-cardano-consensus
image
각 Cardano 노드는 자체 버전의 원장을 유지합니다. 이를 위해서는 노드가 다른 노드와의 연결과 새로운 블록을 수락할지 여부를 결정할 수 있는 능력이 필요합니다. 원장의 끝에 새 블록이 어떻게 추가되는지, 원장의 불변성이 어떻게 보호되는지 직접 확인해보세요.

Cardano에 합의 메커니즘이 필요한 이유는 무엇입니까?
모든 분산 블록체인 네트워크에는 모든 정직한 노드가 동일한 버전의 원장을 유지하도록 보장하는 합의 메커니즘이 필요합니다. 각 노드는 자율적으로 작동하며 어떤 버전의 원장이 올바른지 결정하는 중앙 기관이 네트워크에 있어서는 안 됩니다. 권위는 규칙으로 대체된다고 할 수 있다. 참가자는 자신의 노드에 클라이언트를 설치하여 규칙을 수락합니다.

따라서 합의 메커니즘은 중앙 기관에 의존하지 않고 노드가 서로 조정하고 협력할 수 있도록 하는 일련의 규칙과 프로세스입니다. 또한 악의적인 행위자가 원장을 조작하거나 사기 거래를 생성하는 것을 방지하여 네트워크에 보안과 신뢰성을 제공합니다.

대부분의 참가자가 동일한 Cardano 클라이언트 버전을 설치한 경우 정확히 동일한 규칙을 수락합니다. 규칙은 완전하고 결정적이므로 모든 사람이 동일한 버전의 원장을 유지 관리합니다.

사기 참가자는 자신의 노드에서 규칙을 변경하려고 합니다. 그런 다음 그들은 정직한 참가자를 속이려고 합니다. 그러나 대부분의 ADA 코인이 정직한 참가자의 편이라면 그들의 규칙을 따릅니다.

분산 네트워크에서 블록 전파는 지연되는 경향이 있으므로 특정 시점에 원장 버전이 약간 다를 수 있지만 마지막 몇 블록만 다를 수 있습니다. 그러나 원장 내역은 모든 노드에서 동일합니다.

합의 규칙은 그 정의가 GitHub의 소스 코드에 있는 모든 사람에게 무료로 제공되므로 투명합니다.

레이어 이해
각 Cardano 노드는 Cardano 클라이언트에 정의된 합의 규칙에 따라 자체 버전의 원장을 유지합니다. 우리는 합의가 무엇에 달려 있는지, 그리고 원장이 정확히 어디에 있는지 보여줄 것입니다.

Cardano는 상위 레이어가 하위 레이어에 종속되는 3개의 레이어로 생각할 수 있습니다.

아래 그림은 합의 계층이 네트워크 계층에 의존한다는 것을 보여줍니다. 원장 계층은 합의 계층에 따라 다릅니다. 이러한 방식으로 개별 레이어의 기능이 분리됩니다. 따라서 서로 독립적으로 업그레이드할 수 있습니다.
image
네트워크 계층은 Cardano 네트워크의 모든 분산 노드 간의 P2P 연결을 유지합니다. 각 노드는 여러 개의 이웃 노드와 연결됩니다. 이 계층은 인터넷을 통해 트랜잭션과 블록을 배포하는 역할을 합니다.

보안을 강화하기 위해 Cardano 네트워크는 두 가지 유형의 노드를 사용합니다. 릴레이 노드와 원장을 유지하는 노드를 합의 노드(또는 블록 생산자 노드)라고 부르겠습니다. 합의 노드는 하나 이상의 릴레이 노드에 연결됩니다. 운영자가 릴레이와 합의 노드 간의 연결을 올바르게 설정한 경우 공격자는 릴레이 노드를 통해 합의 노드에 접근할 수 없습니다.
image
합의 레이어는 Ouroboros PoS 합의가 실행되는 곳입니다. 이 계층에서는 들어오는 블록이 검증되고 승인 여부가 결정됩니다. 포크가 발생하면 승리하는 체인이 선택됩니다. 블록 생산자 노드인 경우 여기에서 새 블록이 생성됩니다. 이 계층에서 노드는 의사 결정에 필요한 로컬 상태를 유지합니다. 예를 들어 활성 풀 목록, 활성 위임 인증서 목록, 모든 풀의 활성 지분 등입니다.

원장 레이어는 원장의 상태를 유지하고 새 블록이 승인될 때마다 정기적으로 업데이트합니다.

합의 계층은 원장 상태(예: 활성 UTxO 세트)를 알 필요가 없습니다. PoS 합의는 작동을 위해 블록 헤더의 일부 필드만 확인하면 됩니다. 새로 수신된 블록은 승인되어 원장 상태를 업데이트하거나 거부됩니다.

원장
Cardano 원장은 해시로 연결된 일련의 블록으로 구성됩니다. 해시는 각 블록의 내용을 나타내는 고유 식별자입니다. 이에 대해서는 나중에 더 자세히 이야기하겠습니다. 먼저 블록이 어떻게 생겼는지 살펴보겠습니다.

각 블록에는 헤더와 본문이 포함되어 있습니다. 헤더에는 슬롯 번호, 에포크 번호, 프로토콜 버전, 블록 생산자 ID, 이전 블록의 해시와 같은 메타데이터가 포함됩니다. 본문에는 원장 상태에 영향을 미치는 실제 거래 및 기타 정보가 포함됩니다.
image
Cardano 노드가 PoS 합의를 통해 새 블록을 수락하면 블록 본문이 원장 상태를 업데이트합니다. 이를 블록체인 끝에 새 블록을 추가하는 것으로 생각할 수 있으며, 기본적으로 여기에 포함된 모든 트랜잭션도 허용합니다. 다음 텍스트에서는 원장의 불변성에 중점을 둘 것입니다.

위에서 블록은 해시를 통해 연결된다고 말했습니다. 해시는 암호화(수학적) 기능을 사용하여 블록의 데이터에서 파생되는 고유한 고정 길이 식별자입니다. 전체 블록, 즉 헤더와 본문은 고유한 256비트 출력을 생성하는 암호화 기능의 입력으로 사용됩니다. Cardano에서 사용하는 해시 함수를 Blake2b라고 합니다.

해싱이 작동하는 방식은 동일한 입력을 가져와 동일한 암호화 기능에 적용하면 항상 동일한 출력을 생성한다는 것입니다. 입력(블록 내)에 대한 정보를 단 한 비트라도 변경한다면 함수의 출력은 완전히 달라집니다.

이전 블록의 해시는 블록체인의 무결성과 연속성을 보장하므로 블록 헤더의 중요한 부분입니다. 블록체인에 새로운 블록이 추가될 때마다 원장의 기록, 즉 콘텐츠를 포함한 이전 블록을 변경하는 것이 더욱 어려워집니다.

현재 블록의 헤더에 이전 블록의 해시를 포함함으로써 Cardano는 네트워크에서 최초로 생성된 블록인 Genesis 블록까지 추적할 수 있는 블록 체인을 생성합니다.

Cardano PoS 합의는 노드가 수신한 블록 헤더의 데이터를 확인합니다. 노드는 블록을 수락할지 여부를 결정해야 합니다. 합의가 확인하는 블록 헤더의 필드 중 하나는 이전 블록의 해시입니다.

합의는 블록체인의 무결성과 연속성을 보장해야 합니다. 연속성이 깨질 경우 합의는 블록을 허용할 수 없습니다. 예를 들어, 이전 블록의 해시가 존재하지 않거나 너무 오래된 블록을 참조하는 경우 이런 일이 발생합니다.

새로 생성된 블록에는 생성된 시퀀스 번호(블록 번호)와 슬롯 ID가 있습니다. 검증을 수행하는 노드가 블록을 수락하여 원장의 연속성과 무결성이 유지되는지 여부를 합의 규칙에 따라 결정하는 것은 매우 쉽습니다.

아래 이미지에서는 시간이 슬롯별로 구분되어 있는 것을 볼 수 있습니다. ID가 1000, 1020, 1040, 1060인 슬롯에서 정확히 20초 후에 새 블록이 생성되었습니다. 블록 헤더에서 일부 필드만 포함하는 4개의 블록을 볼 수 있습니다. 녹색 화살표는 슬롯 ID, 즉 슬롯 리더가 새 블록을 생성한 슬롯을 나타냅니다. 슬롯 리더는 블록에 블록 번호 15, 16, 17 및 18을 할당했습니다. 빨간색 화살표는 블록 사이의 링크, 즉 이전 블록의 해시를 표시합니다.


예를 들어, 원장에서 블록 번호 16이 있는 블록을 제거하는 것은 불가능합니다. 이렇게 하면 연속성이 중단될 수 있습니다. 블록 번호 17의 블록은 해시가 이미지에서 문자 Q로 표시되는 블록(Q는 블록 번호 16의 블록 해시)을 가리켜야 하며 다른 블록은 가리켜서는 안 됩니다.

블록의 해시는 자체 데이터뿐만 아니라 이전 블록의 해시에도 의존합니다. 따라서 공격자가 기록에서 블록의 데이터를 변경하면 해당 블록의 해시가 변경되므로 다음 블록의 해시도 변경해야 합니다. 이렇게 하면 공격자의 블록 버전이 나머지 네트워크에서 허용되지 않는 블록체인에 포크가 생성됩니다.

이 상황은 다음 그림에 나와 있습니다. 공격자는 블록 번호 16으로 블록의 본문을 변경했습니다. 그러나 그렇게 함으로써 그는 블록의 해시도 변경했으며 현재 값은 X입니다. 따라서 공격자는 블록 번호 17과 18의 블록도 변경해야 합니다. 그의 노드에 포크가 생성되었습니다. 공격자는 네트워크의 사기성 체인을 다른 노드에 배포하려고 시도할 수 있습니다. 그러나 다른 노드는 블록 헤더의 다른 필드를 확인한 후 사기성 체인을 거부합니다.
image
다음으로, 네트워크가 포크를 처리하는 방법을 보여드리겠습니다.

의견 일치
Cardano 네트워크의 블록체인 포크는 공격이 시도될 때뿐만 아니라 다양한 일반적인 이유로 발생합니다. 우리 기사에서는 새로운 블록이 생성되고 검증되는 방법을 자세히 설명했습니다. 또한 블록 검증을 위해 노드가 유지 관리하는 로컬 상태에 대해 자세히 알아봅니다. 이제 우리는 Cardano가 포크를 처리하는 방법에 중점을 둘 것입니다.

그러나 먼저 블록의 최종성에 관해 언급할 필요가 있습니다.

Cardano는 Nakamoto 스타일의 지분 증명 합의 방식을 사용합니다. 나카모토 합의는 소위 확률론적 최종성을 달성할 수 있습니다. 확률적 최종성은 네트워크 참여자에 대한 일부 가정 하에서 블록의 최종성 확률만 추정할 수 있음을 의미합니다. 이는 가장 최근에 추가된 블록뿐만 아니라 이전 블록에도 적용됩니다.

마지막 블록의 경우 최종성에 대한 확실성이 가장 낮습니다(그래서 오히려 불확실성). 블록이 오래될수록 해당 블록이 최종적이라는 확신이 커집니다.

최종 합의에 도달한다는 것은 미래의 어느 시점에 모든 노드가 특정 블록 세트의 불변성에 동의한다는 것을 의미합니다. 최종 합의에 도달하는 데는 오랜 시간이 걸릴 수 있습니다. 게다가 시간이 얼마나 걸릴지 미리 판단하는 것도 불가능합니다.

새로 생성된 블록은 네트워크의 모든 노드에서 승인될 수 있지만(검증을 통과한 경우) 다른 풀(블록 생산자)이 블록이 최종인지 여부를 결정합니다. 마지막 블록의 최종성은 일반 노드에 의해 투표되지 않고 무작위로 선택된 블록 생산자 노드에 의해서만 투표됩니다. 이 노드는 해당 블록 뒤에 자체 블록을 연결하기로 결정하여 마지막 블록의 최종성을 강화합니다.

추가된 각 블록은 모든 이전 블록의 최종성에 대한 추가 투표입니다.

아래 이미지에는 5개의 블록이 있습니다. 각 블록은 서로 다른 슬롯 리더(블록 생산자)에 의해 생성되었습니다. 블록 1이 최종일 가능성이 가장 높습니다(그러나 아직 절대적 확실성은 없습니다). 4명의 슬롯 리더가 이에 투표했고 아직 포크가 발생하지 않았기 때문입니다. 반대로, 블록 6에서는 확실성이 가장 낮습니다. 블록 5 이후에 포크가 발생할 가능성은 여전히 있습니다. 블록 생산자 외에는 아직 블록 6에 투표한 사람이 없습니다.


Cardano 네트워크의 포크는 다양한 이유로 발생합니다. 한 슬롯에서 두 슬롯 리더가 독립적으로 새 블록을 생성하도록 선출될 수 있습니다(서로에 대해 알지 못합니다). 두 개의 슬롯 리더가 서로 가까운 슬롯에서 선출되는 일이 발생할 수 있습니다. 두 번째 슬롯 리더는 이전 리더로부터 블록을 받을 필요가 없었으므로 마지막 블록을 따르지 않고 이전 블록을 따랐습니다. 그러면 포크가 생성됩니다.

아래 이미지에서는 블록 5 이후 Cardano 네트워크에서 블록체인 포크가 어떻게 발생했는지 확인할 수 있습니다. 슬롯 1058에서는 슬롯 리더인 Alice가 선출되었고, 슬롯 1060에서는 슬롯 리더인 Bob이 선출되었습니다. Alice는 블록 5 이후에 새 블록 6을 만들었습니다. 슬롯 리더 Bob은 나중에 선출되었으며 시간 내에 Alice로부터 블록 6을 받지 못했기 때문에 블록 5 뒤에도 새 블록을 첨부했습니다. 따라서 블록 번호 6이 있는 블록이 2개가 있었습니다.


앞서 설명했듯이 합의 규칙은 완전하고 결정적이어야 합니다. 프로토콜은 이러한 상황의 출현을 예상하고 이를 쉽게 처리할 수 있습니다. 프로토콜은 다음 체인 선택 규칙을 사용합니다.

가장 긴 체인 규칙.
두 대체 체인의 블록 수가 동일한 경우 마지막 블록에서 VRF 출력이 낮은 체인이 선호됩니다.
블록 헤더에는 노드가 확인하는 여러 필드가 포함되어 있습니다. 합의 계층은 무엇보다도 VRF 증명 및 VRF 출력을 확인하여 노드가 실제로 슬롯 리더로 선택되었고 블록을 발행할 권리가 있는지 확인합니다. 또한 KES 서명이 검증됩니다.

아래 이미지에서 위와 유사한 시나리오를 볼 수 있습니다. VRF 출력과 슬롯 리더 이름을 추가했습니다. Alice는 슬롯 1058에서 블록 6을 채굴했고 그녀의 VRF 출력은 39578입니다. Bob은 나중에 슬롯 1060에서 블록 6을 채굴했으며 그의 VRF 출력은 28887입니다. 둘 다 블록 5 뒤에 블록 6을 연결하여 포크를 생성했습니다.

두 블록 6의 최종성은 낮고 매우 불확실합니다. 하나만 블록체인에 남을 수 있고 다른 블록은 고아가 될 수 있기 때문입니다. 그림에서 슬롯 1080에 블록을 생성한 또 다른 슬롯 리더 Carol을 볼 수 있습니다. 그녀의 작업은 체인 선택을 위한 두 번째 규칙을 적용했기 때문에 간단했습니다.

Bob의 블록은 VRF 출력이 더 낮았으므로 Carol은 그의 블록을 선택했습니다. Alice의 블록은 모든 거래를 포함하여 고아 상태로 유지됩니다. 합의된 결정은 원장 레이어에 반영됩니다.


사기성 체인을 푸시하려고 할 때도 포크가 발생할 수 있습니다. 공격자는 원장의 기록 깊은 곳에 있는 블록의 내용을 변경하거나 블록의 일부를 완전히 폐기하려고 시도할 수 있습니다.

공격자가 자신의 노드에 로컬로 사기성 체인을 생성하는 것은 쉽지만 네트워크의 다른 노드에 사기성 체인을 적용하는 것은 본질적으로 불가능하다는 점에 유의하는 것이 중요합니다.

슬롯 리더는 풀의 총 지분, 즉 ADA 코인의 분포를 기준으로 선출됩니다. 선출된 슬롯 리더만이 유효한 VRF 증명과 VRF 출력을 블록 헤더에 삽입하고 서명 KES 키로 블록에 서명할 수 있습니다.

사기성 체인을 시행하는 것은 본질적으로 51% 공격을 시도하려는 시도입니다. 이를 위해 공격자는 스테이킹에 사용되는 코인 양의 절반 이상이 필요합니다. 공격자는 공격에 필요한 모든 ADA 코인을 직접 소유할 수는 없지만 위임된 코인을 남용할 수 있습니다.

결론
합의는 본질적으로 원장 상태를 결정하는 규칙 집합입니다. KES(Key-Evolving Signature) 방식과 VRF(Verible Random Function) 암호화는 슬롯 리더에 투표하고 원장을 덮어쓰지 않도록 보호하는 데 사용됩니다. 기사에서는 명시적으로 언급되지 않았지만, 블록 서명에 사용된 KES 키는 정기적으로 삭제되는데, 이는 공격자가 Cardano 원장 기록을 덮어쓰려는 시도에 또 다른 중요한 장애물입니다.

각 노드는 자율적으로 작동하며 자체 원장 버전과 로컬 상태를 유지합니다. 따라서 스테이크가 어떻게 점진적으로 변경되었는지 알고, 모든 슬롯 리더를 알고, 블록 서명을 확인할 수 있으며, 현재(로컬) 상태를 알 수 있습니다. 공격자는 이 모든 것에 맞서 싸웁니다.