저자: 라칫 스리바스타바, Avail 빌더, 번역: 골든 파이낸스 샤오저우
모나드는 EVM과 호환되는 L1 체인이지만, 이더의 핵심 기둥을 중심으로 몇 가지 주요 사항을 다시 생각했습니다. 따라서 모나드는 초당 최대 10,000건의 트랜잭션을 처리할 수 있습니다. 모나드는 최근 개발넷을 공개했습니다.
파이프라이닝과 비동기식 I/O라는 두 가지 개념을 적용했습니다. 파이프라이닝은 작업을 병렬로 처리할 수 있는 일련의 작은 작업으로 나누어 병렬성을 달성하는 기술입니다. 반면 비동기 입출력은 통신이 이루어지는 즉시 CPU가 동시에 실행할 수 있는 입출력 처리의 한 형태입니다.
일반적인 경우 선형 통신 오버헤드를 사용하고 타임아웃의 경우 이차적 통신 오버헤드를 사용하는 일종의 낙관적 응답 형태의 파이프라인 2단계 BFT 알고리즘인 MonadBFT는 어떤 점이 다를까요?
다음에서는 모든 노드가 동일한 지분을 가지고 있다고 가정합니다.
--모나드BFT는 합의에 도달하기 위해 노드의 2/3가 필요합니다.
--리더는 "QC" 또는 "TC"와 함께 새 블록을 전송합니다(임계값 서명은 여러 참가자에게 디지털 서명 생성 기능을 할당하는 암호화 기법입니다. 한 당사자가 전체 그룹을 대신하여 서명할 수 없으며, 당사자의 하위 집합("임계값")이 서명을 생성하기 위해 협력해야 합니다).
--검증자는 블록을 검증하고 예 또는 아니오 응답을 리더에게 보내면, 리더는 임계값 서명을 통해 예와 아니오 투표를 합산하여 QC(쿼럼 인증서)를 도출합니다.
--검증에 실패하면 검증자는 서명된 시간 초과 메시지를 모든 노드에 브로드캐스트합니다. 이 메시지에는 검증자가 관찰한 가장 높은 QC가 포함됩니다. 검증자 수에서 2/3 이상의 타임아웃 요청이 누적되면 TC(타임아웃 인증서)가 생성되어 다음 리더에게 전송됩니다.
--각 검증자는 k+1번째 라운드의 QC를 받은 후 제안된 블록의 k번째 라운드에서 블록을 최종 확정합니다. 라운드에서 제안된 블록을 확정합니다.
--리더가 k+1 라운드에서 악의적으로 행동했다고 가정하면, k+2 라운드에서는 적어도 한 명의 검증자가 k+1 라운드에 대한 TC를 생성하고, k+2 라운드의 리더는 CHECK를 수행하고 해당 라운드의 TC를 생성합니다.
지연된 실행
이더리움에서 실행은 합의의 전제조건이므로 노드들이 합의에 도달할 때 블록의 트랜잭션 목록과 해당 트랜잭션 목록이 실행된 후 모든 상태를 요약하는 머클 루트에 동의하는 것입니다. 따라서 리더는 제안을 공유하기 전에 제안된 블록의 모든 트랜잭션을 실행해야 하며, 검증 노드는 응답에 투표하기 전에 해당 트랜잭션을 실행해야 합니다.
위에서 트랜잭션의 순서가 공식화된 후에 진정한 상태가 완전히 결정된다는 것을 알 수 있습니다. 실제 상태를 밝히기 위해서는 실행이 필요하지만, 실제 상태는 이미 결정되어 있습니다. 모나드는 합의에 도달하기 전에 노드를 실행할 필요성을 제거함으로써 이러한 통찰력을 활용합니다. 노드 프로토콜은 공식적인 트랜잭션 순서에만 관심이 있으며, 각 노드는 N+1 블록에서 합의에 도달하기 시작하는 동안 N 블록에서 독립적으로 트랜잭션을 실행합니다.
이더의 접근 방식은 합의를 사용하여 매우 엄격한 방식으로 상태 머신 복제를 시행합니다: 노드가 합의에 도달하면 절대 다수의 노드가 공식적인 순서와 그 순서의 결과인 상태에 동의한다는 것을 알 수 있으며, 모나드는 이 엄격함을 약간 완화합니다.
- 모나드의 궁극적인 확실성은 단일 슬롯(1초)
- 트랜잭션 실행의 결과(성공 또는 실패? 이후 잔액은 얼마인가?) 의 최종 결정은 일반적으로 전체 노드에서 1초 미만으로 지연됩니다.
- 풀 노드를 실행하지 않고 트랜잭션 결과를 안전하게 쿼리하고 싶은 사람은 누구나 라이트 클라이언트를 실행하여 머클 증명을 사용해 풀 노드 잔액을 쿼리할 수 있습니다. 이 경우 쿼리는 머클 루트 지연 시간만큼 지연됩니다.
전송 비용
네트워크에서 블록 형태로 네트워크 트랜잭션을 수행하는 데는 비용이 발생합니다. 이 수수료는 체결 비용과는 별개입니다. 예비 잔액은 전송 비용을 지불하는 데 사용됩니다. 반면 실행 잔액은 트랜잭션 실행 비용을 지불하는 데 사용됩니다.
병렬 실행
모나드는 낙관적 실행을 사용합니다. 이는 모나드가 블록의 이전 트랜잭션 배치가 완료되기 전에 트랜잭션 실행을 시작한다는 의미입니다. 때때로 (항상 그런 것은 아니지만) 이로 인해 실행 오류가 발생할 수 있습니다.
모든 트랜잭션이 이전 트랜잭션에 의존하는 경우, 낙관적 실행은 트랜잭션 2를 실행하는 데 사용된 입력 데이터를 추적하고 이를 트랜잭션 1의 출력 데이터와 비교함으로써 이 문제를 해결할 수 있습니다.
두 데이터가 일치하지 않아 트랜잭션 2가 잘못된 데이터로 실행된 것을 감지하면 올바른 데이터로 다시 실행해야 합니다. Monad가 트랜잭션을 병렬로 실행할 때, 각 트랜잭션의 상태 업데이트는 순차적으로 "병합"됩니다.
MonadDb
MonadDb는 블록체인 상태를 저장하기 위한 사용자 정의 데이터베이스입니다. 대부분의 이더리움 클라이언트는 B-Tree(예: LMDB) 또는 LSM-Tree(예: LevelDB 및 RocksDB) 데이터 구조로 배포된 키-값 데이터베이스를 사용합니다.
MonadDb는 디스크와 메모리에 Patricia 트리 데이터 구조를 배포하며, Monad는 여러 트랜잭션을 병렬로 실행합니다. 트랜잭션이 디스크에서 상태를 읽어야 하는 경우, 작업이 완료될 때까지 기다리지 않고 읽기 작업을 시작한 다음 그 동안 다른 트랜잭션 처리를 시작해야 합니다.