ZooBC 위키
보안과 아키텍처

참여 증명이 방어하는 위협

참여 증명은 강한 공격자를 상정하고 설계되었습니다. 원하는 만큼 노드와 계정을 운영할 수 있고, 네트워크의 모든 메시지를 보며, 로직의 어떤 결함이든 악용하고, 돈이 넉넉한 공격자입니다. 가정하는 것은 공격자가 서명을 위조할 수 없고, 해시 충돌을 찾을 수 없으며, 모든 토큰을 사들일 수 없다는 것뿐입니다. 이런 공격자에 맞서 참여 증명은 네 가지, 즉 도둑질, 검열, 이력 재작성, 체인 방해를 막는 것을 목표로 합니다. 이 문서는 주요 공격과 그에 대응하는 규칙을 하나씩 살펴봅니다.

블록 생산 매수

작업 증명에서는 권한이 하드웨어를, 지분 증명에서는 코인을 따릅니다. 둘 다 빠르게 살 수 있습니다. 참여 증명에서는 정지되지 않은 모든 등록 좌석이 잔액이나 하드웨어와 상관없이 다음 블록에 추첨될 기회가 같습니다(추첨 참조). 코인과 기계만으로는 아무것도 살 수 없습니다. 권한에는 좌석이 필요합니다.

좌석은 오직 대기열을 통해, 프로토콜이 정한 속도로만 옵니다. 첫 신규 노드는 제네시스 7일 뒤에 합류합니다. 그 뒤 각 입회가 다음까지의 대기 시간을 정합니다. 그 신규 노드 이전에 집계된 좌석 수로 600일을 나눈 값이며, 7일에서 90일 사이로 유지됩니다. 제네시스 좌석은 최대 11개로 집계되고, 정지된 좌석은 집계되지 않습니다. 좌석이 11개이면 대기 시간은 약 54.5일이므로, 두 번째 신규 노드는 61.5일째 무렵에 도착합니다. 대기열은 스테이크에 기다린 시간을 곱한 값으로 정렬되므로, 공격자는 정직한 신청자들보다 더 많이 걸어야 하기도 합니다.

시빌 신원

시빌 공격자는 영향력을 얻으려고 많은 신원을 만듭니다. 참여 증명에서 신원은 레지스트리 좌석이며, 각 좌석에는 실제 비용이 있습니다.

  • 돈. 최소한 대기열 최소치 이상의 잠긴 스테이크입니다. 대기열 최소치는 100 ZBC에서 시작하며(좌석들이 원자 단위 하나에서 250 ZBC 사이로 투표할 수 있고, 들어갈 때는 대기 중인 스테이크 중앙값의 절반이 이를 끌어올릴 수 있습니다), 그중 10 %가 위험에 놓입니다.
  • 시간. 스테이크 × 기다린 시간으로 정렬된 대기열의 자리와, 속도가 정해진 입회입니다. 신규 노드 사이에 몇 주나 몇 달이 걸립니다.
  • 일. 새 좌석은 참여 점수 20 %에서 시작하며, 성숙할 때까지 아무것도 벌지 못합니다. 입회 후 4 점수 단위와 자기 블록 하나가 필요하며, 노드 2,880개 미만에서 2일입니다. 그다음에는 계속 자기 차례에 블록을 만들고 중계해야 합니다.

침묵하는 좌석은 누락 상태로 간주되어 아무것도 벌지 못하고 점수를 잃으며, 0이 되면 퇴출되어 잠근 금액의 10 %가 롱제비티 풀로 갑니다. 누락 상태나 정지 상태에서 떠나거나 대기열을 떠날 때도 같은 10 %를 잃습니다. 정상 상태로 떠나면 7일의 쿨다운 뒤에 잠근 금액 전부가 돌아옵니다. 놓친 차례, 정지, 퇴출과 레지스트리에서 나가기를 참조하십시오.

신원당 비용의 세 열. 돈: 대기열 최소치(100 ZBC부터) 이상의 스테이크, 10 %가 위험. 시간: 스테이크 × 대기 시간 순의 대기열, 주기마다 입회 하나. 일: 20 %에서 시작, 성숙할 때까지 수입 없음, 침묵하면 0에서 퇴출.
신원당 비용의 세 열. 돈: 대기열 최소치(100 ZBC부터) 이상의 스테이크, 10 %가 위험. 시간: 스테이크 × 대기 시간 순의 대기열, 주기마다 입회 하나. 일: 20 %에서 시작, 성숙할 때까지 수입 없음, 침묵하면 0에서 퇴출.

좌석의 과반

공격자가 실제로 좌석의 절반 넘게 통제한다고 합시다. 그러면 대부분의 블록을 만들고 가장 무거운 분기를 쌓을 수 있으며, 이는 가장 무거운 체인을 따르는 어떤 설계에서든 과반으로 살 수 있는 것입니다. 공격자는 다음을 할 수 있습니다.

  • 트랜잭션을 자기 블록에서 빼놓아 지연시키거나 검열합니다.
  • 더 무거운 분기를 쌓아 롤백 한도 안의 최근 블록을 바꿔치기합니다.

그러나 아무것도 위조할 수는 없습니다. 모든 노드가 모든 블록을 검사합니다. 각 트랜잭션의 서명, 각 블록의 시드 증명, 각 영수증, 각 코인베이스 금액입니다. 과반이라도 키를 가지지 않은 계정의 ZBC를 쓸 수 없고, 고정된 코인베이스 일정보다 많이 자기에게 지급할 수 없으며, 720블록(3시간)보다 오래된 이력이나 마지막 스파인 체크포인트 아래의 이력을 다시 쓸 수 없습니다(최종성과 롤백 참조). 건너뛴 차례 뒤에 만든 블록은 가중치도 덜하며, 놀고 있는 좌석은 수입과 점수를 잃습니다.

두 열. 할 수 있음: 트랜잭션 검열·지연, 최근 720블록 안의 블록 교체. 할 수 없음: 서명 위조, 남의 코인 사용, 추가 코인 발행, 스파인 체크포인트 아래로 내려가기. 최근 720블록이 표시되고 더 뒤에 스파인 체크포인트가 있는 체인: 오래된 이력은 그대로 남습니다.
두 열. 할 수 있음: 트랜잭션 검열·지연, 최근 720블록 안의 블록 교체. 할 수 없음: 서명 위조, 남의 코인 사용, 추가 코인 발행, 스파인 체크포인트 아래로 내려가기. 최근 720블록이 표시되고 더 뒤에 스파인 체크포인트가 있는 체인: 오래된 이력은 그대로 남습니다.

시드 조작

모든 추첨을 이끄는 시드는 검증 가능한 난수 함수의 출력이므로, 생산자는 여러 값 중에서 이를 고를 수 없습니다. 생산자의 유일한 수단은 블록을 내지 않는 것이며, 이는 놓친 차례, 수입, 점수를 대가로 치르고 시드를 다음에 추첨된 노드에게 넘길 뿐입니다(블록 시드 (VRF) 참조).

먼 과거부터 이력 다시 쓰기

장거리 공격은 예를 들어 오래전에 레지스트리를 떠난 노드들의 옛 키로 먼 과거부터 다른 이력을 쌓습니다. 다음 방어 수단은 각각 혼자서 이를 막습니다.

  • 실행 중인 노드는 결코 720블록보다 많이 롤백하지 않습니다.
  • 어떤 노드도 스파인 체인에서 공동 서명된 마지막 체크포인트 아래로 재구성하지 않습니다.
  • 새 노드는 스파인을 따릅니다. 스파인 블록에는 좌석의 3분의 2가 필요하고, 스파인은 어떤 노드 키가 합류하고 떠났는지 기록하므로, 오래전에 떠난 키는 그 서명자 목록에 없습니다.
  • 새 노드가 설치하는 릴리스는 릴리스 핀을 담을 수 있으므로, 위조된 스파인 이력은 시작할 때 거부됩니다.

키는 만료되지 않으며, 아무도 분기를 손으로 검토하지 않습니다.

이클립스

이클립스 공격에서 공격자는 자기 피어들로 노드를 에워싸 노드가 공격자의 체인만 보게 합니다. 등록 노드에 대해서는 이것이 어렵습니다. 배정된 피어(mainnet에서 12개)는 기간 블록의 시드로 추첨되고 40블록(약 10분)마다 다시 추첨되므로, 공격자가 이를 고를 수 없습니다(영수증과 네트워크 토폴로지 참조). 피어들은 체인의 제네시스 해시도 명시하는 서명된 핸드셰이크로 자기 노드 키를 증명합니다. 그리고 정직한 피어 하나면 충분합니다. 포크 선택은 무게로 이루어지므로, 더 무거운 분기를 알려 주는 연결 하나만 있으면 노드는 그 분기를 가져와 블록 단위로 검사할 수 있습니다. 최상단 블록이 오래된 노드는 등록 피어 표본의 3분의 2가 보고하는 최상단 블록을 따릅니다.

피어 트래픽은 암호화 없이 평문 gRPC로 오갑니다. 보호는 비밀 유지가 아니라 서명과 검증에서 나옵니다.

그 밖의 공격

  • 블록의 이중 서명은 EquivocationReport로 증명되어 놓친 차례로 부과됩니다(이중 서명 (equivocation) 참조).
  • 서명된 트랜잭션을 다른 ZooBC 체인에서 재전송하는 것은 실패합니다. 모든 서명이 체인의 제네시스 해시를 포함하기 때문입니다(체인 결속 서명 참조).
  • 위조된 스냅샷은 공동 서명된 스파인에 지정된 해시와, 등록 피어들과 대조한 표본으로 잡아냅니다(스냅샷과 빠른 동기화 참조).

같이 보기