ZooBC 위키
노드 운영

릴리스와 업데이트

ZooBC는 체인을 바꾸지 않고 소프트웨어를 바꿉니다. 새 버전은 체인 자체에 공지되고, 각 노드는 소유자가 통제하는 업데이터를 통해 이를 설치하며, 새 합의 규칙은 생산자의 3분의 2가 이미 그 규칙을 실행하고 있을 때에만 켜집니다. 누구도 노드에 소프트웨어를 밀어 넣을 수 없으며, 새 버전 때문에 새 체인이 필요한 일은 없습니다.

릴리스 레지스트리

체인의 제네시스에 지정된 단 하나의 키인 릴리스 권한자가 RegisterRelease(유형 32)로 각 릴리스를 등록합니다. 여기에는 버전 문자열, 32바이트 매니페스트 해시(릴리스 파일들의 지문), 릴리스 주소가 들어갑니다. 릴리스는 아키텍처별, 체인별로 등록되며, 버전 문자열이 둘 다를 나타냅니다. 버전 문자열은 한 번만 등록할 수 있으므로 수정판은 새 버전이 필요하고, 철회된 버전은 결코 다시 돌아올 수 없습니다. 권한자는 릴리스를 철회할 수도 있고(유형 35), 자기 역할을 다른 키에 넘길 수도 있습니다. 역할 이전은 제안(유형 33)과 수락(유형 34)의 두 단계로 이루어집니다.

등록된 좌석들은 이 키를 견제합니다.

  • 거부권. 등록 좌석의 3분의 2가 어떤 버전에 대해 "거부"를 증언하면, 그 버전은 권한자가 철회한 것과 똑같이 철회됩니다. 자동 업데이트 노드는 그 버전을 건너뛰고 설치 프로그램은 이를 거부합니다. 정지된 좌석은 집계에서 빠지므로, 활성 좌석이 11개이면 거부에는 8개가 필요합니다. 각 투표는 노드 키로 서명하는 수수료 없는 증언이며, 운영자가 직접 행사합니다. 자동으로 투표하는 것은 없습니다.
  • 교체. 새 릴리스 권한자를 지명하는 투표는 가장 오래된 투표가 일주일(40,320블록)이 지난 뒤에야 집계되므로, 현재 보유자는 이를 미리 볼 수 있습니다. 3분의 2에 이르면 역할은 투표로 지명된 주소로 넘어갑니다.

등록이나 철회는 권고일 뿐입니다. 이는 소유자가 자동 업데이트를 선택한 노드만 안내하며, 자기가 고른 바이너리를 실행하는 운영자는 영향을 받지 않습니다. 누구나 내려받은 릴리스를 레지스트리와 대조해 확인할 수 있습니다(다운로드한 파일 확인).

업데이터

ZooBC 설치 프로그램은 노드 안이 아니라 노드 옆에서 실행되는 작은 업데이터를 추가합니다. 업데이터는 컴퓨터가 부팅되고 15분 뒤에 처음 실행되고, 그 뒤로는 약 10분(±2분)마다 실행됩니다. 실행될 때마다 로컬 노드에 /api/v1/release/list를 요청하고, 자기 체인과 컴퓨터 유형(amd64 또는 arm64)에 맞는 등록되고 철회되지 않은 릴리스 가운데 실행 중인 버전보다 새로운 최신 릴리스를 찾습니다.

업데이터는 그 릴리스의 시기가 되었을 때만 설치합니다. 릴리스의 등록 높이에 업데이트 지연과 이 노드 자신의 슬롯을 더한 시점입니다. 그때 릴리스를 내려받아 서명과 매니페스트 해시를 체인과 대조하고, 실행 중인 버전 옆에 설치한 뒤 노드를 재시작하고 상태 점검을 실행합니다. 점검에 실패하면 이전 버전으로 되돌리며, 실패한 업데이트는 12시간 뒤에 다시 시도합니다.

체인의 릴리스 레지스트리, 지연과 자기 슬롯을 기다리는 업데이터, 서명과 해시 검사, 이전 버전 옆에 설치하고 실패 시 되돌리기, 그리고 소유자의 on, off, chain 스위치
체인의 릴리스 레지스트리, 지연과 자기 슬롯을 기다리는 업데이터, 서명과 해시 검사, 이전 버전 옆에 설치하고 실패 시 되돌리기, 그리고 소유자의 on, off, chain 스위치
  • 지연은 mainnet에서 기본값 2일(11,520블록)입니다. 각 노드가 직접 정하며, 릴리스 권한자는 이를 줄일 수 없습니다. 잘못된 릴리스가 퍼지기 전에 철회할 시간을 줍니다.
  • 슬롯은 노드들을 키 순으로 정렬해 시작 시각을 분산시키므로, 기본적으로 한 블록에서 업데이트를 시작하는 노드는 최대 2개입니다. 체인이 한꺼번에 많은 생산자를 잃는 일은 없습니다.
  • 소유자의 스위치인 auto_update는 on(기본값), off, chain 중 하나입니다. chain이면 업데이터는 소유자가 지갑에서 체인에 서명해 둔 설정을 따르므로, 소유자는 서버에 로그인하지 않고도 업데이트를 켜거나 끌 수 있습니다.

모든 운영자는 더 새로운 릴리스가 있으면 알림을 받습니다. 업데이터는 꺼져 있을 때도 새 릴리스와 그 준비 게이트의 상태를 알려 주고, 노드는 매일 로그에 경고를 쓰며, 노드의 /node/info 경로가 이를 보고하고, 웹 지갑은 배너를 띄우며, 익스플로러는 각 노드의 버전을 보여 줍니다.

준비 게이트

새 합의 규칙은 릴리스에 0보다 큰 묶음 id를 가진 묶음으로 담겨 나옵니다. 모든 블록은 생산자의 소프트웨어 버전을 담고 있으며, 준비 게이트가 그것을 읽습니다. 묶음의 규칙은 다음 조건을 모두 충족하는 첫 높이에서, 모든 노드에서 동시에 켜집니다.

  • 묶음의 예정 높이 이상이고, 릴리스 등록 이후 최소 5,760블록(하루)이 지났습니다.
  • 신호 윈도우(720블록과 노드당 5블록 중 큰 값) 안에서, 등록 좌석의 3분의 2 이상(올림, 정지된 좌석 제외)이 각각 묶음 id 이상의 버전으로 블록을 만들었습니다.
  • 릴리스가 철회되지 않았습니다. 철회는 대기 중인 묶음을 멈춥니다.

그 높이부터는 더 오래된 버전의 블록이 거부됩니다. 업데이트하지 않은 노드에게는 유예가 없습니다. 첫 거부된 차례부터 차례를 놓치고, 아무것도 벌지 못하며, 점수를 잃습니다(놓친 차례, 정지, 퇴출). 그래서 운영자들은 모든 새 릴리스에 대해 경고를 받습니다.

블록이 아니라 생산자를 세므로, 나머지와 단절된 소수는 혼자서 3분의 2에 이를 수 없습니다. 어떤 키도 전환을 강제할 수 없습니다. 릴리스 권한자는 활성화 메시지에 서명하지 않으며, 생산자들이 움직이지 않은 동안에는 높이만으로 결정되는 일도 없습니다. 이 게이트에는 알려진 한계가 있습니다. 마감 기한이 없으므로 좌석의 3분의 1을 조금 넘는 수가 업그레이드를 붙잡아 둘 수 있으며, 잘못된 릴리스를 잡아내지도 못합니다. 그것은 지연과 거부권의 몫입니다.

새 버전을 실행하는 생산자의 계기가 좌석의 3분의 2에 이르고, 릴리스 등록 후 최소 하루가 지나면 게이트가 열립니다. 아직 이전 버전인 노드의 블록은 거부됩니다
새 버전을 실행하는 생산자의 계기가 좌석의 3분의 2에 이르고, 릴리스 등록 후 최소 하루가 지나면 게이트가 열립니다. 아직 이전 버전인 노드의 블록은 거부됩니다

버전 0.5.8로 출시된 체인은 121개의 합의 규칙이 모두 블록 0부터 켜져 있고 묶음으로 된 규칙이 없으므로, 게이트는 그 이후의 릴리스에서 처음 의미를 갖습니다. 또한 노드는 바이너리가 규칙의 활성화를 체인 기록과 다르게 두면 시작을 거부하며, 릴리스는 알려진 스파인 블록에 묶는 릴리스 핀을 함께 담을 수 있습니다.

같이 보기