Zycord: 자기 증명 상태 전이의 P2P 네트워크
이 페이지는 기계가 번역했으며 검수를 거치지 않았습니다. 영문과 어긋나는 부분이 있다면 프로토콜이 말하는 바는 영문 쪽입니다. 영문 본문은 zycord.com/docs/whitepaper/에 있습니다.
Zycord: 자기 증명 상태 전이의 P2P 네트워크.
The Simstoshi
2026 — v2.0
GPG: E724 39CE DD85 11F9 D607 550B 87FD 60D5 EB4A 0B29
Zycord는 유일한 트랜잭션이 인증서 (certificate), 즉 프로그램과 그 프로그램이 읽은 상태 및 쓴 상태를 하나로 묶은 것인 원장이다. 유효성은 인증서 바이트의 순수 함수이므로, 어떤 기계든 상태도, 이력도, 신뢰도 없이 그것을 병렬로 검증한다. 원장을 상대로는 아무것도 실행되지 않는다. 체인은 인증서를 정렬하고, 선언된 읽기가 여전히 성립하는 인증서는 각각 적용하고 나머지는 건너뛰는 결정론적 폴드 (fold)로 그것들을 확정한다. 건너뜀 (skip) 은 가격이 매겨진 사건이며, 그 인증서를 위해 예치한 자에게 청구되고 결코 제3자에게 청구되지 않는다. 컨트랙트는 저장 슬롯마다 접근이 정확한지, 가드되는지, 교환 가능한지를 선언하므로, 결제·발행·팁은 결코 경합하지 않는다. 로직에 정확한 읽기가 필요한 컨트랙트는 시퀀서를 선택한다. 시퀀서는 그 컨트랙트의 트래픽을 직렬화하고, 사용자가 서명한 인텐트를 실행하며, 그것을 밀리초 단위로 확인하고, 결과를 인증서로 게시하는 오프체인 서비스다. 시퀀서가 필요 없는 강제 경로는 어떤 사용자든 어떤 컨트랙트를 상대로든 여전히 거래할 수 있음을 보장한다. 수수료는 두 시장으로 나뉜다. 하나는 희소한 순차적 상태 변경을 위한 시장이고, 다른 하나는 코어가 합류할 때마다 커지는 병렬 검증을 위한 시장이다. 모든 노드는 모든 것을 저렴하게, 병렬로 검증하며, 유일한 순차 루프는 메모리 위의 루프다. 체인은 작업증명으로 출시되어 한정된 램프를 거쳐 지분증명으로 넘어가며, 그곳에서는 해시를 채굴하던 계산이 대신 인증서를 검증한다. 검증 규칙은 바뀌지 않는다. 모든 노드에 의한 완전 검증 너머에 있는 것은 명세가 아니라 방향으로 제시된다.
이 논문은 완결되어 있으며 그 자체로 충분하다. 이 논문은 v1.0 [0]을 대체하며, 그 관계는 §15에서 서술한다. 출시, 발행, 에라, 그리고 전체 파라미터 표는 동반 문서 Zycord: 출시, 에라, 파라미터에 있다.
버전. 아래 본문은 축약 없는 이 논문의 v2.0이며, 이 페이지에서는 그 뒤에
동반 문서(역시 v2.0)가 이어진다. 둘 다 PDF로 제공되며,
각각 프로젝트 키
E724 39CE DD85 11F9 D607 550B 87FD 60D5 EB4A 0B29로 만든 분리 서명이 함께 있다:
논문
(서명)과
동반 문서
(서명). 모든 버전은
doi:10.5281/zenodo.22167489 아래에 보관되며, 이는 최신 버전으로 연결된다.
대체된 v1.0은 doi:10.5281/zenodo.22167490이다.
동반 문서는 별도의
doi:10.5281/zenodo.23383987 아래에 보관된다.
백서는 논증이다. 프로토콜이 아니다. 이 본문과 규범적 표면이 어긋나는 곳에서는 규범적 표면이 이기며 그 불일치는 버그다. 프로토콜은 파라미터 파일과 골든 벡터이고, 피어 계층의 요구 사항은 와이어 명세에 있다. 레퍼런스 노드가 이 모든 것을 어떻게 구현하는지 설명하는 엔지니어링 동반 문서는 아키텍처다.
1. 서론#
블록체인 노드는 서로 공통점이 없는 세 가지 일을 한다. 데이터를 전파하고, 계산을 검증하며, 상태를 변경한다. 데이터는 대역폭에 따라 확장된다. 검증은 코어 수에 따라 확장되며, 트랜잭션을 독립적으로 검사할 수 있다면 민망할 만큼 병렬적이다. 상태 변경만이 진정으로 순차적인 자원이다. 어딘가에는 쓰기의 권위 있는 단일 이력이 존재해야 한다.
Zycord는 이 셋을 분리한다. 트랜잭션은 자신의 입력과 출력을 지니는 인증서가 되므로, 그것을 검증하는 일은 그 바이트의 순수 함수이며 결코 원장을 건드리지 않는다. 체인의 일은 인증서를 정렬하고 그 위에서 결정론적 폴드를 실행하는 것으로 줄어든다. 폴드는 인증서당 정확히 한 번 상태를 건드리는 비교와 덧셈의 루프다. 충돌은 블록을 무효로 만들지 않는다. 충돌은 개별 인증서를 건너뛰게 할 뿐이며, 모든 건너뜀은 그 위험을 받아들인 당사자에게 청구된다. 동시성은 실행 시점에 발견되는 것이 아니라, 컨트랙트 작성자가 슬롯 하나하나 선언한다. 그 계보는 실행-정렬-검증 [3], 결정론적 정렬 [4], 낙관적 병렬 실행 [5], 그리고 전파와 정렬의 분리 [6] 다.
유효성 검사는 어떤 블록이 존재하기도 전에, 인증서당 한 번, 병렬로 실행된다. 폴드는 블록당 한 번, 순서대로 실행되며, 결코 실행하지 않는다.
이 설계는 실행 파일을 공유할 수는 있어도 결코 혼동되어서는 안 되는 두 세계 위에 서 있다:
| 합의 (체인) | 구성 (오프체인) | |
|---|---|---|
| 행위자 | 채굴자와 모든 풀 노드 | 시퀀서, 지갑, 모든 참여자 |
| 역할 | 정렬, 검증, 확정 | 컨트랙트 실행, 인증서 구성 |
| 규칙 | 고정됨. 검증만 수행 | 설계상 자유로움. 시장이 정함 |
합의 규칙은 검증만 한다. 그 목적은 어떤 사용자도 자신이 승인하지 않은 자금을 잃지 않고, 누구도 자신이 통제하지 않는 잔액에서 인출하지 못하며, 어떤 공격자도 네트워크를 고갈시키거나 막거나 늦출 수 없게 하는 것이다. 시퀀서가 어떻게 운영되는지, 시퀀서끼리 어떻게 소통하는지, 무엇을 청구하는지는 합의 밖의 일이다. 체인 위에 있는 것은 결제 정산이다. 시퀀서의 대가는 사용자가 서명한 인텐트 (intent) 안에 실려 이동하며, 인증서가 적용될 때에만 지급된다.
이어지는 절들은 인증서 (§2), 폴드 (§3), 타입이 지정된 상태 접근 (§4), 네이티브 자산 (§5), 가상 머신 (§6), 시퀀서 (§7), 강제 경로 (§8), 두 개의 수수료 시장 (§9), 네트워크 (§10), 지분증명 (§11), 완전 검증 너머의 길 (§12), 수용된 위험 (§13), 적합성 (§14), 그리고 v1.0과의 관계 (§15) 를 정의한다.
2. 상태 전이 인증서#
인증서는 유일한 트랜잭션 타입이다. 인증서는 SSZ로 인코딩되며, 이는 단 하나의 정규 바이트 인코딩을 준다. 디코딩이 정규 형식을 강제하므로, 디코딩된 인증서는 구성상 구조적으로 유효한 것이며 이후의 어떤 규칙도 형태를 다시 검사하지 않는다.
| 필드 | 의미 |
|---|---|
| ChainID | 인증서가 대상으로 하는 네트워크 |
| Seq | 예치자 자신의 순서 카운터. fill과 강제 인증서에서는 0 |
| Program | 타입 바이트와 본문: 네이티브 연산, 머신 호출, 인텐트 fill, 강제 인텐트, 등록 |
| 읽기 | 선언된 입력: (slot, access, operand), 슬롯 순으로 정렬, 중복 없음 |
| 쓰기 | 선언된 출력: (slot, op, value), 슬롯 순으로 정렬, 델타는 미리 합산됨 |
| Sigs | (public key, Ed25519 signature), 키 순으로 정렬 |
| Deposit | 인증서에 대해 책임지는 셀 (cell), 예약된 금액, 그리고 잔돈 슬롯 |
| TTL | 인증서가 확정될 수 있는 마지막 높이 |
| FeeBid | 두 gas 시장 각각에서의 최대값과 우선순위 |
두 다이제스트가 두 질문에 답한다. 인증서 id는 서명 목록을 비운 인증서의 해시다. 그것은 인증서가 승인하는 것을 지칭한다. 실체 해시는 서명을 포함한 인코딩 전체를 덮는다. 그것은 하나의 바이트 집합을 지칭한다. 서명이 id 밖에 머무는 이유는 서명이 무작위화되어 있기 때문이다. 모든 논스는 같은 본문에 대한 또 하나의 유효한 서명을 낳으며, 서명을 덮는 id는 하나의 승인에 무한히 많은 과금 가능한 정체성을 부여하게 된다. id는 확인 집합 (seen set), 폴드 순서, 그리고 모든 중복 제거의 키가 된다. fill과 강제 인증서는 자신의 인텐트의 해시를 id로 취한다 (§7, §8). fill의 입찰은 그 시퀀서의 서명으로 봉인된다. 실체 (exemplar) 해시는 블록의 인증서 루트가 확약하는 대상이므로, 블록 id는 그 블록이 싣는 바이트를 결정한다. 수수료 입찰은 id 안에 있으며 서명된다. id 밖에 있는 입찰은 전송 중 누구든 고쳐 쓸 수 있는 입찰이다. 모든 서명은 체인 id와 파라미터 집합의 합의 루트를 묶는 메시지에 서명하므로, 인증서는 다른 네트워크에서 재생될 수 없다.
유효성은 무상태다. 인증서는 그 바이트만으로 다음이 성립할 때 유효한 것이다:
- 정규 형식으로 디코딩되고, 이 체인을 지칭하며, 모든 목록이 그 한도 안에 있다;
- 모든 서명이 엄격한 Ed25519(정규 인코딩, 비틀림 없는 키) 아래에서 검증되며, 서명 집합은 충분할 뿐 아니라 최소이기도 하다;
- 선언된 읽기에 대해 프로그램을 재실행하면 선언된 쓰기가 정확히 산출된다;
- 승인이 필요한 모든 쓰기는 승인을 갖추고 있으며, 예치 셀 (deposit cell) 은 무조건 서명을 지닌다;
- 예치금은 사용자 주소의 네이티브 잔액 셀이며 인증서의 최악의 경우를 감당한다;
- 인증서는 자기 일관적이다. 어떤 쓰기도 같은 슬롯의 읽기와 모순되지 않고, 인출된 일회성 주소 중 사용됨으로 표시되지 않고 빠져나가는 것이 없으며, 사용된 주소에는 어떤 값도 쓰이지 않는다;
- 어떤 프로토콜 셀 (cell) 에도 쓰지 않는다;
- 인증서가 지칭하는 모든 주소는 정의된 버전 바이트를 지닌다;
- 시퀀서 키가 0이 아닌 컨트랙트에서는, 강제 인증서 (§8) 를 제외하고, 정확한 읽기 경로가 그 키의 서명을 지닌다 (§7);
- 메타데이터 쓰기는 자신이 덮어쓰는 모든 셀에 대해, 인증서가 구성될 때 그 셀이 지니던 값으로 정확한 읽기를 선언한다.
어떤 기계든 이것을 검사한다. 스레드 풀, 다른 컴퓨터, GPU에서, 데이터베이스 없이, 동기화 없이. 서명 검사는 서로 독립적이므로 인증서들에 걸쳐 일괄 처리될 수 있다. 이것이 다른 모든 것이 딛고 선 성질이다.
유효성만으로는 실행에 충분하지 않다. 두 개의 유효한 인증서가 같은 슬롯에 대해 같은 입력값을 선언할 수 있고, 그중 많아야 하나만 효력을 가질 수 있다. 그래서 고전적인 트랜잭션 유효성 개념은 둘로 나뉜다. 유효한 (무상태, 병렬, 누구나 검사) 과 적용 가능한 (상태 의존, 순차, 원장에서의 위치로만 결정) 이다. 무효한 인증서는 결코 정직한 멤풀에 들어가지 않으며, 블록에 포함된 무효한 인증서는 그 블록을 무효로 만든다.
3. 폴드로서의 원장#
블록은 헤더, 인증서 실체 해시의 순서 있는 목록, 그리고 인증서 본문 자체로 이루어진다. 본문은 체인 데이터다. 블록은 그 본문이 가용할 때에만 유효한 것이다. 블록 생산자는 아무것도 실행하지 않는다. 생산자는 이미 검증된 것을 확인한 인증서들을 정렬하고, 작업증명 [13] 을 풀며 (또는 지분증명 아래에서는 자신이 추첨된 슬롯에 서명하며, §11), TTL 창 안에서 확인된 인증서 id의 집합을 지닌다. 같은 인증서를 두 번 포함하면 블록이 무효가 되기 때문이다.
체인의 상태는 정렬된 인증서들 위의 폴드다. 각 인증서에 대해 순서대로, 폴드는 예치금을 예약하고, 선언된 모든 읽기를 현재 상태와 대조하며, 검사된 산술로 쓰기를 준비한 뒤, 확정하거나 건너뛴다:
- APPLIED — 선언된 모든 읽기가 성립하므로, 쓰기가 반영되고 수수료는 실제 비용으로 정산된다.
- SKIPPED — 어떤 읽기가 더 이상 성립하지 않거나 (STALE), 어떤 델타가 범위 [0, 2²⁵⁶) 를 벗어나게 되거나 (OVERFLOW), 어떤 쓰기가 사용된 주소 아래에 떨어진다 (SPENT). 아무것도 쓰이지 않는다. 고정된 건너뜀 (skip) 수수료가 예치금에서 소각되고 나머지는 반환된다.
- FORCED_FAILED — 호출이 되돌려졌거나 한계를 어긴 강제 인증서 (§8). 그 지불자들에게서 인출되어 소각되고, 잔돈은 사용자에게 돌아가며, 그 밖에는 아무것도 쓰이지 않고, id는 확인됨으로 표시된다.
- DROPPED — 인증서에 아예 청구할 수 없어서 (예치 셀이 자금이 없거나 사용됨) 인증서는 실리고, 확인됨으로 표시되며, 청구되지 않는다. 그것은 생산자에게 아무것도 지급하지 않고 상한 공간을 소비하게 한다. 같은 상태의 fill은 대신 블록을 무효로 만든다 (아래). 그것을 폐기하면 아무도 지급받지 못한 채 사용자의 인텐트가 소비되기 때문이다.
정규 순서. 폴드는 블록의 인증서를 세 부류로 정렬하며 생산자에게 재량을 남기지 않는다. 먼저 fill (§7) 이 오며, 각각은 자신이 속한 모든 파이프라인이 준비되는 즉시 취해지고, 동률은 (sequencer key, contract, seq, id)로 가린다. 그다음 다른 모든 인증서가 (deposit address, Seq, id) 순으로 온다. 마지막으로 강제 인증서 (§8) 가 id 순으로 온다. 모든 노드는 동일한 블록 순서열로부터 동일한 상태를 도출한다.
쓰기는 어느 하나라도 반영되기 전에 검사된다. 권한이 소각된 주소로의 입금은 셀 (cell) 을 되살리는 대신 명시적으로 실패한다. 오버플로를 일으킬 델타는 인증서 전체를 실패시킨다. 영구적인 사용 레지스트리는 바로 이것을 위해 존재한다.
건너뜀 (skip) 은 실패가 아니라 의미론이다. 포함과 적용은 서로 다른 사건이다. 생산자는 결과적으로 낡은 것으로 드러난 인증서를 포함했다는 이유로 무효한 블록을 만들 수 없다. 그 인증서는 건너뛰어지고 예치자가 지불한다. 읽기를 고른 것은 예치자이므로, 그에 대해 책임지는 것도 예치자다.
하나의 서명에, 많아야 하나의 청구. 적용된 인증서든 건너뛰어진 인증서든 똑같이 확인됨으로 표시된다. 확인된 또는 만료된 인증서, 또는 어느 한 시장에서 블록의 기본 수수료보다 낮게 입찰한 인증서를 포함하면 블록이 무효가 되므로, 어떤 생산자도 다른 사람들의 인증서를 다시 포함하거나 고의로 지연시켜 그 예치금을 거둬들일 수 없다. TTL은 합의에 의해 상한이 정해지므로, 확인 집합 (seen set) 은 가지치기 가능한 상태로 유지된다.
청구할 대상이 없는 조건은 블록을 무효로 만든다. 어떤 실패에는 책임자가 없다. 시퀀서 카운터의 순서가 어긋났거나, 펜스 카운터 (§7) 가 움직였거나, 지불자가 이미 사용되었거나, 예치금을 예약할 수 없는 fill, 그리고 읽기가 성립하지 않는 강제 인증서가 그렇다. 그러한 인증서를 포함하면 블록이 무효가 되며 아무것도 청구되지 않는다. 자신이 보유한 상태로부터 블록을 구성한 생산자야말로 그것을 알 수 있었던 당사자다.
인증서당 정확히 한 번의 상태 접촉. 폴드는 뜨거운 키-값 작업 집합 위에서 비교와 덧셈과 쓰기를 수행한다. 코드 실행도, 서명 검증도, 재실행도, 타원 곡선 산술도 없다. 그 모두는 유효성 검사 도중에 병렬로 일어났다. 인증서 id도 그곳에서 계산되어 폴드로 전달된다.
버전이 아니라 값의 동일성. 적용 가능성은 버전 카운터가 아니라 선언된 읽기 값을 비교한다. 바뀌었다가 도로 돌아온 슬롯도 여전히 적용 가능한 상태이므로, 이 시스템은 버전 기반 동시성 제어보다 엄격히 더 드물게 건너뛴다.
폴드 자체의 프롤로그와 에필로그. 인증서들에 앞서, 에포크 경계에서 폴드는 비컨 셀을 쓴다 (§4). 인증서들 뒤에는 블록 보조금을 분할하고 coinbase 성숙 기간 링을 회전시키며 (동반 문서), 수수료 제어기 (§9) 를 위해 적용된 gas를 기록하고, 에포크 경계에서는 에포크 상태 루트를 계산하는데, 이는 헤더의 것과 같아야 한다. 폴드는 블록 무효성에 대해서만 오류를 반환한다. 인증서의 문제는 결과이지 결코 오류가 아니다.
4. 셀과 타입이 지정된 상태 접근#
셀 (cell)은 슬롯 (address, word)에 있는 값이다. 32바이트 빅엔디언의 256비트 부호 없는 정수다. 존재하지 않는 셀은 0으로 읽힌다. 셀들과 별도로 프로토콜은 사용된 주소 레지스트리를 유지하는데, 이는 서명 권한이 소각된 일회성 주소들의 영구 집합이다.
주소는 version ‖ blake3(tag ‖ version ‖ payload)[:31]이다. 단, 프로토콜 주소는 예외로, 버전 바이트 0x00 뒤에 0이 이어진다:
| 버전 | 종류 | 인출할 수 있는 주체 |
|---|---|---|
0x00 | 프로토콜 | 폴드만: 에포크 비컨, 기본 수수료 셀, 성숙 링, 트레저리 (treasury) 셀, 시퀀서 카운터, 지분 셀 |
0x01 | 일회성 사용자 | 소유자의 서명. 인출하는 인증서는 그 주소를 사용됨으로도 표시해야 한다. 그 뒤로는 그 주소 아래의 모든 읽기와 쓰기가 영원히 실패한다 |
0x02 | 영구 사용자 | 소유자의 서명, 재사용 가능 |
0x03 | 자산 | 자산의 불변 권한 셀 |
0x05 | 컨트랙트 | 키로는 아무도 할 수 없다. 어떤 키도 해시하여 컨트랙트 주소가 되지 않는다. 컨트랙트의 코드와 폴드 규칙이 결정한다 |
일회성 대 영구성은 두 개의 원장이 아니라, 주소의 한 비트로 드러나는 지갑 정책이다 [7]. 지갑은 기본적으로 들어오는 결제마다 새로운 일회성 주소를 쓰므로, 새로 파생된 주소로 지불하는 것이 경합 없는 빠른 경로이며, 사용된 셀 (cell) 은 그것을 사용한 블록이 되돌리기 지평 너머로 묻히고 나면 압축 가능하다. 계정을 원하는 사람은 영구 버전을 쓴다. 채굴 보상은 영구 주소에 속한다. 합의는 어느 종류든 지급 주소로 받아들이지만, 일회성 주소는 사용되는 순간 자신이 보유한 모든 보상을 소각하므로, 노드는 그런 이유로 일회성 주소를 거부한다.
병렬성은 타입이 지정된 접근에서 나온다. 정확한 읽기만 지원하는 폴드는 인기 있는 컨트랙트를 죄다 직렬화할 것이다. 하나의 풀을 건드리는 천 개의 인증서는 하나의 적용과 999개의 건너뜀을 낳을 것이다. 대신 읽기는 자신이 셀 (cell) 을 어떻게 제약하는지 선언하고, 쓰기는 자신이 셀에 무엇을 하는지 선언한다:
| 읽기 | 쓰기 |
|---|---|
| EXACT — 값이 고정되어 계산에 투입된다. 셀이 움직이면 낡은 것이 된다 | SET — 덮어쓰기 |
| GUARD_GE, GUARD_LE, GUARD_EQ — 셀에 대한 술어로, 계산에 아무것도 반환하지 않는다 | DELTA_ADD, DELTA_SUB — 정수 위에서 검사되는 부호 있는 변화 |
| MARK_SPENT — 일회성 주소를 소각 |
EXACT만이 낡은 것이 된다. 한 슬롯에 대한 가드된 인출과 입금은 몇 개든 교환 가능하다. 그것들은 어떤 순서로든 적용되며, 건너뜀 (skip) 은 잔액이 단지 바뀌었을 때가 아니라 가드가 실제로 실패할 때 (진짜 초과 인출) 에만 일어난다. 인증서마다 슬롯당 하나의 규율이다. 같은 슬롯에 set과 delta가 공존하지 않는다. 이 모델을 건전하게 유지하는 규칙은 가드된 값은 결코 계산으로 흘러 들어가지 않는다는 것이다. assert는 아무것도 반환하지 않고 delta는 아무것도 읽지 않으므로, 재실행은 선언된 정확한 읽기들의 순수 함수로 남는다. 이 하나의 규율이 송금, 공급 상한이 있는 발행, 허용량, 팁, 볼트 지분을 포괄하며, 이는 온체인 쓰기의 압도적 다수다. 그 계보는 에스크로 트랜잭션, 트랜잭셔널 부스팅, CRDT [8][9][10] 이다. Zycord는 교환 가능성을 노드 사이의 동시성 계약으로 만든다.
일회성 셀. 체인에 한 번도 나타난 적 없는 주소는 상태 ∅에 있다. 첫 쓰기는 그것을 저장됨으로 옮기고, 그 키로 서명되어 그것을 사용됨으로 표시하는 인증서는 그것을 영구히 사용됨으로 옮긴다. 사용을 기록하는 레지스트리 항목은 결코 압축되지 않는다. 그것이 주소가 되살아나는 것을 막는 장치다.
0은 부재다. 한 번도 쓰인 적 없는 슬롯과 0이 쓰인 슬롯은 같은 슬롯이다. 0을 쓰면 셀 (cell) 이 삭제된다. 이는 합의 요구 사항이다. 이것은 가드나 정확한 읽기가 슬롯이 존재하는지 묻지 않고도 0을 지목할 수 있게 해 주며, 상태 루트를 그것을 만들어 낸 이력이 아니라 상태의 함수로 유지해 준다.
에포크 비컨. 프로그램은 주변 값을 직접 읽어서는 안 된다. 프로토콜은 현재 에포크를 연 헤더의 높이를, 그리고 머신 에라부터는 그 시각도, 에포크당 한 번 예약된 셀에 쓰며, 프로그램은 그것을 다른 슬롯과 똑같이 읽는다. 이는 블록마다 낡아지는 문제 없이 시간 인식을 제공한다. 두 값 모두 에포크 내내 일정하며, 에포크는 mainnet에서 하루, 즉 작업증명 아래에서는 2,880블록, 지분증명 아래에서는 17,280블록이다 (§11).
5. 머신 없는 자산#
출시 에라는 컴퓨터보다 경제를 먼저 필요로 한다. Zycord는 블록 0부터 네이티브 자산을 인증서 연산으로 제공하며, 가상 머신은 관여하지 않는다:
- TRANSFER — 하나의 인증서 안에서, 그 읽기와 쓰기 한도 안에서
(asset, from, to, amount)이동을 최대 32개까지 수행하며, 각각은 가드balance ≥ Δ와 두 개의 델타를 짝지은 것이다. 순수 델타나 새로운 일회성 셀 (cell) 을 겨냥한 입금이 곧 팁이므로, 팁에는 별도의 옵코드가 필요 없다. 컨트랙트 주소에는 네이티브 코인으로만 입금할 수 있으며, 프리컴파일의 주소 (§6) 에는 결코 입금할 수 없다. 그곳에서는 아무것도 값을 꺼낼 수 없기 때문이다. - ISSUE — 한 번만 쓰는 셀 (cell) 에 공급 상한을 둔 자산 id를 생성한다.
- MINT — 가드됨:
minted + Δ ≤ cap. - RETIRE — 최대 64개의 일회성 주소를, 각각 그 소유자의 승인을 받고 인증서의 한도 안에서, 값을 옮기지 않고 소각한다. 읽기는 없으며, 각 셀 (cell) 을 사용됨으로 표시하는 순수한 쓰기다. 본래의 사용은 송금 안에서 자동으로 이루어진다. 퇴역은 압축과 프라이버시를 위한 원시 연산이다. 수취인은 일회성 주소가 제 역할을 다하면 그것을 지운다.
한 블록에 만 건의 팁을 받는 스트리머는 폴드에 만 번의 교환 가능한 덧셈만큼의 비용을 지운다. 충돌 0, 건너뜀 0, 시퀀서 없음, 머신 없음. 네이티브 코인의 공급 일정과 발행된 모든 자산의 상한은 여기에 있으며, §3의 검사된 산술로 강제된다.
결제는 이렇게 정산된다. 송신자의 지갑은 자신이 보유한 일회성 셀 (cell) 하나를 골라 그것에 가드를 선언하고, 인출하고, 사용됨으로 표시하고, 수취인의 새로운 일회성 주소에 입금하며, 잔돈은 자신의 새로운 일회성 주소로 보낸다. 같은 일회성 셀을 서로 다른 두 노드를 통해 사용하려고 경쟁하는 두 인증서는 둘 다 유효한 인증서다. 정확히 하나가 적용되고, 다른 하나는 건너뛰어져 그것이 지칭한 예치금에 청구된다.
6. 머신: cEVM#
Zycord는 하나의 가상 머신, cEVM을 돌린다. 이는 인증서에 맞게 적응시킨 Ethereum 가상 머신 [2] 의 방언이다. 이 선택은 의도적이다. 이 프로젝트의 새로움 예산은 상태, 동시성, 경제 모델에 쓰이며, 머신은 이 시스템에서 가장 익숙한 것이어야 한다. Solidity와 그 컴파일러, 감사인, 도구 일체가 그대로 넘어온다. 이 방언이 벗어나는 부분은 전부 제거 목록, 두 개의 재바인딩, 여섯 개의 추가, 네 개의 가격 재조정이다.
저장소는 발견되는 것이 아니라 선언된다. 인증서는 자신의 실행이 소비한 읽기와 생성한 쓰기를 지니며, 유효성 검사는 그것을 재실행 결과와 비교한다. 네 개의 옵코드 계열이 셀 (cell) 에 닿는다. 정확 규율의 SLOAD와 SSTORE, 그리고 교환 가능 규율의 assert 계열과 delta 계열이다. 호출된 프레임은 선언된 집합에 최대 16개의 항목만 추가할 수 있으므로, 피호출자가 호출자에게 필요한 한도를 소진할 수 없다. 이를 초과하게 될 항목은 그 프레임만 중단시키고 다른 프레임은 중단시키지 않는다.
추가된 것은 어떤 EVM 포크도 할당한 적 없는 바이트 위에 있다: SASSERTGE 0x21, SASSERTLE 0x22, SASSERTEQ 0x23, SDELTAADD 0x24, SDELTASUB 0x25, SETSEQ 0x26. 술어와 부호는 옵코드 안에 있으며, 결코 스택 위에 있지 않다. 가드는 아무것도 반환하지 않으므로 어떤 분기도 가드의 성립 여부에 의존할 수 없다. 델타의 순합은 정수 위에서 취해지며 결코 2²⁵⁶을 법으로 취하지 않는다. SETSEQ(key)는 실행 중인 컨텍스트의 컨트랙트의 시퀀서 셀 (cell) 을 설정하며 다른 어떤 컨트랙트의 것도 설정하지 않는다. 0이거나 형식이 잘못된 키는 인증서 전체를 무효로 만드는 도출 실패다.
재바인딩: NUMBER와 TIMESTAMP는 에포크 비컨 셀의 정확한 읽기로부터 답하므로, 둘 다 에포크 내내 일정하다. 기한에 block.timestamp를 쓰는 이식된 컨트랙트는 최대 24시간 낡은 시각을 기준으로 판단하고 있는 셈이다.
제거 (13): BLOCKHASH, COINBASE, PREVRANDAO, GASLIMIT, BLOBHASH [14], BLOBBASEFEE, SLOTNUM은 지시 대상이 없다. GASPRICE와 BASEFEE는 블록별 셀을 지칭하며 그 정확한 읽기는 구성상 낡은 것이다. BALANCE와 SELFBALANCE는 네이티브 잔액의 정확한 읽기를 강요하게 된다. ORIGIN에는 지칭할 송신자가 없다. SELFDESTRUCT는 코드 해시 셀 (cell) 이 0으로 돌아가게 허용하게 된다.
가격 재조정: SLOAD와 SSTORE는 웜 접근 비용으로 고정된다. 콜드 접근 할증은 모든 곳에서 삭제된다. KECCAK256은 이 머신 자체의 구현에 대해 측정하여 720 gas에 워드당 144를 더한 값으로 오르며, 이것이 요금을 올리는 유일한 가격 재조정이다. assert와 delta 옵코드는 SLOAD와 같은 웜 접근 금액이 든다.
프리컴파일은 다섯 개로 닫힌 집합이다: sha256, identity, modexp, ed25519_verify, blake3.
두 개의 계량기. 순차 gas는 선언된 읽기, 쓰기, 레지스트리 횟수로부터 도출되며 결코 머신이 측정하지 않는다. 병렬 계량기는 인터프리터가 세는 것으로, 인증서가 도출 단위로 선언한 예산에 대해 센다. 깊이 0에서 그 예산을 초과하면 인증서가 무효가 된다.
코드는 인증서 안에서 이동한다. 컨트랙트 코드는 한 번만 쓰는 코드 해시 셀 (cell) 에 있으므로 재배포란 없으며, 배포는 대상이 0인 호출이다. 런타임 이미지는 인증서 안에 실려 오고, 결코 주소만으로가 아니라 코드 해시 셀에 대해 선언된 정확한 읽기로 해석된다. blob은 최대 24,576바이트다.
컨트랙트의 기록은 다섯 개의 셀이다: 코드 해시, 배포자, 시퀀서 키, 관리자, 그리고 펜스 카운터 (§7). 관리자 셀 (cell) 은 주소를 담는다. 0은 배포자가 관리자임을 뜻하고, 32바이트의 0xff는 그 역할이 되돌릴 수 없이 포기되었음을 뜻한다. 관리자는 등록 인증서로 시퀀서 키를 설정하고, set-admin 인증서로 역할을 넘기거나 포기한다. 둘 다 배포자 셀과 관리자 셀의 정확한 읽기를 선언하므로, 교체되었거나 역할을 포기한 관리자의 인증서는 건너뛰어진다. 컨트랙트 코드는 결코 관리자를 설정하지 않는다. 컨트랙트 코드는 SETSEQ로 자신의 시퀀서를 옮기며, 팩토리가 생성한 컨트랙트가 시퀀서를 얻는 방법도 이것이다.
표준 라이브러리. 델타 우선으로 작성된 토큰, 팁 단지, 에스크로가, 그것들이 호출하는 델타 래퍼와 함께, 머신을 활성화하는 블록에서 알려진 주소에 미리 배포된다. 제거된 옵코드와 프리컴파일을 피하는 이식된 Ethereum 컨트랙트는 첫날부터 전부 정확(all-exact) 모드에서 올바르게 동작하며, 뜨거운 컨트랙트라면 시퀀서가 직렬화한다. 병렬성은 슬롯 단위의 선택 사항이며, 보통은 잔액 맵을 load/store에서 assert/delta로 옮기는 작은 diff다.
7. 시퀀서#
가드 델타는 결제의 경합을 해소한다. 남는 것은 뜨거운 상태 위의 정확한 읽기 로직, 즉 오더북이나 자동화된 시장 조성자이며, 그곳에서는 같은 셀 (cell) 을 대상으로 구성하는 두 정직한 사용자가 여전히 건너뜀 (skip) 을 낳고, 상태를 읽어 무엇을 쓸지 결정하는 컨트랙트는 임의의 순서로 적용될 수 없다. 프로토콜의 답은 컨트랙트가 자신의 직렬화자를 선택하게 하는 것이다.
바인딩. 모든 컨트랙트의 기록 (§6) 은 시퀀서 키를 담는다. 키가 0이 아닌 컨트랙트는 시퀀싱된 컨트랙트다. 인증서는 그 키의 서명이 있을 때에만 그 컨트랙트의 셀을 정확하게 읽거나, 동등성으로 가드하거나, 설정할 수 있다. 키가 0인 컨트랙트는 개방된 컨트랙트다. 누구든 자신의 인증서로 그 정확 경로를 이용할 수 있으며, 그 컨트랙트는 오직 자신의 코드로만 보호된다. 키는 배포 시 배포자가, 이후에는 관리자가, 또는 컨트랙트 자신의 코드가 SETSEQ를 통해 설정하며, 거버넌스가 관리자 없이 시퀀서를 교체하는 방법이 이것이다. 바인딩은 어떤 키든 지칭할 수 있다. 아무도 서비스하지 않는 키는 합의 오류가 아니며, 그 컨트랙트는 누군가 그 키를 서비스하거나 강제 경로 (§8) 가 그것을 바꿀 때까지 그저 사용할 수 없을 뿐이다. 가드된 델타는 교환 가능하며 결코 관문에 막히지 않으므로, 시퀀싱된 토큰도 여전히 누구에게서든 모든 송금을 받는다.
디렉터리. 시퀀서는 자신의 서비스가 응답하는 곳을 디렉터리 인증서로 공지한다. 그 키와, 출력 가능한 ASCII로 된 1에서 256바이트의 문자열 (보통 URL) 을 영구 주소에서 공지한다. 항목은 갱신되지 않으면 공지한 인증서의 TTL로부터 90일 뒤에 만료되며, 철회 인증서는 그것을 즉시 제거한다. 합의는 그 문자열을 저장할 뿐 결코 해석하지 않는다. 디렉터리는 승인이 아니라 발견이다. 지갑은 누구에게 요청할지 알기 위해 그것을 읽는다.
인텐트. 사용자는 시퀀싱된 컨트랙트를 대상으로 인증서를 구성하지 않는다. 사용자는 인텐트 (intent)에 서명한다. 인텐트는 대상과 calldata, 병렬 예산, 논스, NotBefore부터 TTL까지의 창 (TTL − NotBefore는 최대 8블록), 시퀀서의 영구 주소, 결과에 대한 한계의 집합, 시퀀서에게 지불해야 할 대가, 공동 시퀀서들에게 지불해야 할 대가, 그 모두를 충당하는 일회성 지불자, 그리고 잔돈 출력으로 이루어진다. 한계는 호출이 쓰는 셀 (cell) 에 대한 술어 final-at-least, final-at-most, delta-at-least, delta-at-most 중 하나이며, 적어도 하나의 한계는 호출이 쓴 슬롯을 지칭해야 한다. 인텐트는 사용자의 승인 전부다. 시퀀서는 그것이 무엇을 하는지는 바꿀 수 없고, 언제 하는지만 바꿀 수 있다.
Fill. 시퀀서는 인텐트를 자신이 보는 상태, 즉 체인 끝에 자신이 이미 구성한 모든 fill을 더한 상태 위에서 실행하고, 그 결과를 fill로 게시한다. fill은 프로그램이 그 인텐트 (intent) 이고, 예치금이 시퀀서 자신의 영구 잔액에서 나오며, id가 인텐트의 해시인 인증서다. 그러므로 한 인텐트의 두 fill은 id를 공유하고 그중 하나만 청구될 수 있다. 시퀀서는 활성에 대해서만 신뢰되며 결코 안전성에 대해서는 신뢰되지 않는다. 시퀀서가 입력에 대해 거짓을 말하면 그 fill은 정규 폴드에 대해 그저 건너뛰어지고, 그 거짓의 대가는 사용자의 자금이 아니라 시퀀서의 예치금이 치른다.
영수증. 시퀀서는 서명된 인텐트 (intent) 에 블록이 존재하기 훨씬 전에, 밀리초 단위로 응답한다. 시퀀서는 인텐트를 실행하고, fill에 서명하며, 그 fill을, 또는 인텐트 id와 파이프라인 seq와 결과를 지칭하는 서명된 영수증 (receipt) 을 지갑에 돌려준다. 이것은 사전 확인이다. 그것은 체인의 약속이 아니라 시퀀서의 약속이며, fill이 적용될 때 최종이 된다. 모든 영수증이 서명되므로 부정행위는 증거가 된다. 한 키에서 나온 두 영수증이 하나의 seq를 서로 다른 인텐트에 주거나, 하나의 인텐트에 서로 다른 결과를 준다면, 그것은 누구든 바이트로부터 검사할 수 있는 증명이다. 합의는 그것을 처벌하지 않는다. 시장이 처벌한다. 영수증 형식, 가격, 신원, 평판은 오프체인에 있으며 설계상 자유롭다. 그러므로 사용자는 더 저렴한 시퀀서, 공개적으로 신원이 밝혀진 시퀀서, 또는 익명의 시퀀서 중에서 고르고, 이중 서명을 하다 걸린 시퀀서를 떠난다.
파이프라인. 체인은 모든 쌍 (sequencer key, contract)에 대해 마지막으로 적용된 seq를 보관한다. fill은 자신이 속한 모든 파이프라인에 대해 seq를 선언하며, 카운터가 seq − 1에 있을 때에만 들어갈 수 있다. 카운터는 fill이 적용될 때에만 전진한다. 그러므로 건너뛰어진 fill은 자신의 카운터를 그 자리에 남겨 둔다. 그 뒤에 구성된 fill들은 들어갈 수 없으며, 시퀀서는 같은 번호부터 다시 구성한다. 하나의 seq에 두 fill이 있다면, 폴드 순서상 첫 번째가 들어가고 두 번째는 들어갈 수 없다. 시퀀서의 파이프라인은 생산자가 어떤 순서로 받았든 시퀀서가 서명한 순서대로 확정되며, 여러 시퀀서의 파이프라인을 섞는 생산자에게는 결과에 대한 선택권이 없다.
펜스 카운터. 모든 컨트랙트는 자신의 기록에 카운터 fid를 보관한다. fill은 자신이 정확하게 읽거나 설정하는 모든 컨트랙트의 fid를 선언하며, 불일치는 그 fill이 들어갈 수 없음을 뜻한다. 카운터는 적용되는 강제 인증서 (§8) 가 그 컨트랙트의 셀을 설정할 때, 그리고 그 컨트랙트의 시퀀서 셀이 쓰일 때 하나씩 전진한다. 읽기나 델타는 그것을 전진시키지 않는다. 읽기는 아무것도 바꾸지 않으며, 델타는 fill이 가드하거나 델타로 바꾸는 무엇과도 교환 가능하기 때문이다. 다른 이들이 델타로 움직이는 셀을 정확하게 읽는 fill은 여느 인증서처럼 그 읽기에 대해 책임지며, 셀이 움직였다면 그 시퀀서가 건너뜀 (skip) 비용을 지불한다. 이것이 강제 경로와 시퀀서 변경이, 아무에게도 청구하지 않고, 자신이 우회한 상태 위에 구성된 모든 fill을 무효로 만드는 방식이다. 시퀀서는 펜스가 움직인 것을 보고, 다시 구성해 다시 게시하며, 지연 시간만 잃는다.
공동 시퀀싱. 서로 다른 시퀀서에 바인딩된 컨트랙트들을 가로지르는 호출은, 자신이 정확 경로를 건드리는 모든 시퀀서의 서명을 지닌 하나의 fill로 체인에 도달한다. 서명은 인증서의 한도인 16개 안에서 이루어지며, 각각은 블록의 서명 상한과 병렬 gas에 산입되고, 각각은 자신의 파이프라인에서 seq를 가지며, 각각은 인텐트 (intent) 가 그에게 지정한 대가를 받는다. 조정, 즉 누가 주도하는지, 예약이 어떻게 이루어지는지, 각자가 무엇을 청구하는지는 오프체인에 있으며 설계상 자유롭다. 체인은 구성상 원자적인 하나의 인증서를 본다. 결코 게시되지 않은 공동 fill은 자신이 속한 파이프라인만 막는다. 그 창이 지나가면 각 서명자는 자신이 서명한 번호를 재사용한다.
건너뜀은 누가 지불하는가. fill이 들어갔는데 어떤 읽기가 낡았거나 어떤 쓰기가 오버플로하면, 아무것도 쓰이지 않고 아무도 대가를 받지 않으며, 잘못한 자가 건너뜀 (skip) 수수료를 지불한다. 인증서 순서상 처음 실패한 읽기나 쓰기가 결정하며, 그 컨트랙트가 fill의 정확 경로에 있고 체인의 기록이 일치한다면 청구서는 그 컨트랙트에 대해 자신을 선언한 시퀀서에게 간다. 그 밖의 모든 경우에는 주도자, 즉 fill이 지칭하는 예치금의 주인인 시퀀서에게 간다. 나열된 각 시퀀서에게서는 바로 이것을 위해 fill의 위치에서 준비금이 떼어진다. 사용자는 결코 건너뜀에 대해 지불하지 않는다. 각 시퀀서에 대한 사용자의 대가는 fill이 적용될 때에만 정산된다.
시퀀서란 무엇인가. 애플리케이션 팀이 운영하는 평범한 서버로, 단일 프로세스든 롤업이든 연합이든 원하는 어떤 장치든 쓸 수 있다. 시퀀서는 자기 애플리케이션의 주문 흐름을 가장 먼저 보며, 그러므로 그 애플리케이션의 추출 가능한 가치가 생기는 자연스러운 장소다. 이 설계는 이를 명시적으로 드러내고, 그 가치가 블록 생산자들에게 새어 나가는 대신 애플리케이션이 그것을 포착하게 하며, 강제 경로는 이것이 함축하는 권력을 제한한다. 무거운 컨트랙트, 즉 암호 연산, 게임의 전체 로직, 하나의 컨트랙트 안의 시스템 전체가 실현 가능해진다. 무거운 실행은 구성 시점에 오프체인에서 일어나고 체인은 그것을 병렬로 검증하기 때문이다. 구성은 경쟁 시장이다. 더 저렴하거나 더 신뢰할 만한 시퀀서가 사용자를 끌어들이며, 구성을 제공하는 모든 노드가 용량을 더한다.
8. 강제 경로: 포함이 곧 적용이다#
문이 시퀀서뿐인 컨트랙트는 그 시퀀서가 검열하거나, 과다 청구하거나, 사라지면 감옥이다. 그러므로 모든 사용자에게는 누구의 허락도 필요 없는 느린 경로가 있다.
사용자는 오픈 인텐트에 서명한다. 이는 §7의 인텐트와 정확히 같되, 시퀀서도 공동 시퀀서도 지칭하지 않고, 사용자 자신의 일회성 지불자가 자금을 대는 인텐트 (intent) 이며, 사용자는 그것을 네트워크에 중계한다. 그것은 인증서가 아니라 인텐트로서 멤풀을 이동한다. 전체 상태를 보유하고 블록의 모든 일반 인증서를 이미 정산한 블록 생산자는 블록 끝 상태를 계산하고, 자신이 고른 오픈 인텐트들을 그 상태에 대해 인텐트 id 순으로 실행하며, 그 결과인 강제 인증서들을 블록의 마지막 인증서로 덧붙인다. 강제 인증서의 id는, fill의 것과 마찬가지로, 그 인텐트의 해시다. 포함이 곧 적용이다. 대기열도, 임대도, 할당량도, 기한도 없다. 선언된 읽기가 그것이 배치된 상태에 대해 성립하지 않는 강제 인증서는 블록에 아예 들어갈 수 없다. 그것을 구성한 것은 생산자이므로, 그것을 알 수 있었던 당사자는 생산자다.
구성상 제한됨. 블록은 최대 16개의 강제 인증서를 싣고, 각각은 최대 4,000 도출 단위의 병렬 예산 (머신 gas 200,000) 을 선언한다. 컨트랙트가 제공하는 모든 출구, 즉 인출, 취소, 퇴역, 송금은 그 예산 안에 들어가야 한다. 컨트랙트 작성자를 위한 규칙은 인출이 강제 예산 안에 들어간다는 것이다. 가득 찼을 때 강제 경로는 제네시스 블록 시점 병렬 상한의 3분의 1을 차지하고, 일반 트래픽이 나머지를 가진다.
실패하는 호출도 여전히 반영된다. 호출이 되돌려지거나, 한계를 어기거나, gas가 바닥난 강제 인증서는 실패한 형태 FORCED_FAILED로 들어간다. 그 지불자들에게서 인출되어 소각되고, 잔돈은 사용자에게 돌아가며, id는 확인됨으로 표시되고, 그 밖에는 아무것도 쓰이지 않는다. 유효성 검사는 선언된 읽기에 대해 호출을 재실행했을 때 실제로 실패하는 경우에만 실패한 형태를 받아들인다. 이것이 이 경로를 남용에 강하게 만드는 점이다. 성공할 수 없는 오픈 인텐트를 중계하는 공격자는 그 하나하나에 대해 지불하며, 인텐트 (intent) 가 건전한 사용자는 그것 때문에 굶주릴 수 없다. 생산자는 자신이 포함한 것에 대해 대가를 받고 잉여를 선호하기 때문이다.
펜스. 적용되어 어떤 컨트랙트의 셀 (cell) 을 설정하는 강제 인증서는 그 컨트랙트의 펜스 카운터 (§7) 를 전진시키므로, 그것이 바꾼 상태 위에 구성된 모든 fill은 들어갈 수 없다. 시퀀싱된 컨트랙트를 정확하게든 가드를 통해서든 읽기만 하거나, 그 안에서 델타만 이동시키는 강제 인증서는 펜스를 그대로 두며, 실패한 형태로 반영되는 강제 인증서도 마찬가지다. 대기 중인 fill들은 여전히 들어가며, 강제 인증서가 움직인 셀을 정확하게 읽은 fill만 건너뛰어진다 (§7). 시퀀서는 지연 시간을 잃을 뿐 그 이상은 잃지 않으며, 뜨거운 컨트랙트에 블록마다 하나의 트랜잭션을 강제하는 사용자는 매번 강제 경로의 가격을 지불한다.
대가. 인텐트 (intent) 의 대가는 블록의 기본 수수료 기준으로 인증서의 수수료를 충당한다. 기본 수수료 부분은 소각되고 나머지는 생산자의 팁에 합쳐진다. 생산자는 시퀀서가 받았을 것을 받는다.
어떤 상태도 고아가 되지 않는다. 시퀀서가 사라진 컨트랙트는 시퀀서가 필요 없는 델타 메서드를 통해, 그리고 강제 경로를 통해 살아 있다. 강제 경로를 통해 사용자는 인출하며, 컨트랙트 자신의 코드나 관리자는 SETSEQ나 등록을 호출해 그것을 새로운 시퀀서에 바인딩할 수 있다. 검열은 뒤집힌다. 검열은 잃어버린 수수료와 그것을 우회하는 사용자들이라는 형태로 검열자에게 비용을 지우며, 네트워크에는 아무 비용도 지우지 않는다. 어떤 운영자도 안전성의 하중을 지지 않는다.
9. 두 시장: 순차 gas와 병렬 gas#
체인은 확장성 등급이 서로 다른 세 자원, 즉 데이터, 검증, 변경을 소비하며, 그것들을 한 시장에서 가격 매긴다는 것은 서명 검사가 저장 쓰기와 경매에서 경쟁한다는 뜻이다. Zycord는 수수료를 서로 독립적인 두 시장으로 나누며, 각 시장은 합의 상태에 보관되는 자체 목표치, 상한, 기본 수수료를 가진다:
| 시장 | 계량 대상 | 제네시스 블록 가격 |
|---|---|---|
| 순차 gas | 폴드 작업: 읽기, 쓰기, 사용 레지스트리 삽입, 확인 집합 삽입 | 읽기당 100, 쓰기당 200, 레지스트리 삽입당 500, 확인 삽입당 100 |
| 병렬 gas | 검증 작업: 서명, 바이트, 도출 단위 | 서명당 200, 바이트당 2, 도출 단위당 50 |
순차 gas는 희소 자원인 상태 변경, 즉 모든 노드가 순서대로 돌리는 유일한 루프의 가격을 매긴다. 병렬 gas는 네트워크에 합류하는 모든 코어와 GPU와 함께 커지는 검증의 가격을 매기며, 그 상한은 높고 저렴하게 설정된다. 그 결과는 불변식으로 진술된 설계 목표다. 무거운 암호 연산은 경제적 구성에 의해 네트워크에 영향을 주지 않는다. 큰 증명을 검증하지만 슬롯 두 개만 쓰는 인증서는 거의 모든 비용을 저렴한 시장에서 지불한다.
두 시장 모두 EIP-1559의 형태를 띠며 [12], 각자의 단위를 쓴다. 기본 수수료는 소각되고 우선 수수료는 생산자에게 지급되는데, 적용되는 인증서에 한해, 오직 그것에만 그렇다. 건너뛰어진 인증서의 수수료는 전액 소각되며 아무에게도 지급되지 않는다. 이것이 경제 모델의 하중을 지는 규칙이다. 건너뜀 (skip) 이 팁을 준다면, 블록의 내용을 고르는 당사자가 다른 사람들의 실패를 배치해 준 대가를 받게 될 것이다. 소각이 그것을 뒤집는다. 건너뜀은 상한 공간을 소비하고 아무것도 내놓지 않으므로, 수익을 최대화하는 생산자는 곧 적용을 최대화하고 있는 것이며 건너뜀을 유발하는 데 적극적으로 반대하게 된다.
적용된 gas만이 기본 수수료를 움직인다. 블록마다 세 가지 양이 집계된다. 포함된 gas (결과와 무관하게 모든 인증서) 는 상한을 제한하고, 적용된 gas (적용된 것만) 는 기본 수수료를 움직이며, 블록 바이트는 바이트 상한을 제한한다. 건너뜀 (skip) 은 체인을 사용하려다 실패한 시도이지 체인에 대한 수요의 증거가 아니다. 포함된 gas가 수수료를 움직인다면, 방해 공격자가 고정된 건너뜀 수수료로 자기 충돌하는 인증서를 블록에 채워 넣어 일정한 비용으로 모든 사람을 가격으로 밀어낼 수 있을 것이다.
순차 상한은 탄력적이다. 순차 목표치 T는 상수가 아니라 블록 0부터의 합의 상태이며, 에포크 제어기가 그것을 움직인다:
- 블록 안에서 소프트 상한은 2T이고 하드 한도는 4T다. 둘 사이로 분출하는 생산자는 자기 수익, 즉 보조금의 일부와 블록의 수수료 중 이차 비례하는 몫을 잃으며, 결코 다른 누구의 몫도 잃지 않는다.
- 에포크 사이에서 T는 수요를 따른다. 에포크 내 적용된 gas의 하위 중앙값의 두 배를 T − T/1024와 T + T/512 사이로 고정하고, 하한은 제네시스 블록 값, 상한은 제네시스 블록 시점의 용량 (동반 문서) 으로 한다. 건전성 관문이 네트워크가 건전하지 않다고 말하면, 즉 인용된 경쟁 헤더가 에포크 블록의 2%를 넘으면 성장은 보류된다.
- 인증서 수, 서명 수, 바이트 한도는 제네시스 블록 값에서 정적 용량 (인증서 2²⁵개, 8 MB) 까지 T에 비례한다.
건너뛰어진 인증서는 수수료를 소각하고 아무것도 기록하지 않으므로, 상한을 올리는 유일한 방법은 적용을 얻어 내는 것, 즉 지속적이고 충돌하지 않으며 기본 수수료를 소각하는 사용이다. 성장을 강제하려는 공격자는 다른 모든 이에게 자연스러운 채택이 드는 비용과 정확히 같은 비용을 치른다. 병렬 시장은 이런 주의가 전혀 필요 없다. 그 목표치와 상한은 순차 목표치와 상한의 상수배인 3×, 즉 3T와 6T에 고정되며 그 성장을 물려받는다. 그 계보는 Monero의 페널티 중앙값 [15] 과 적응형 한도 연구 [16] 다.
구성 마진. 같은 병렬 시장이 형성 작업에 대해 시퀀서에게 대가를 지급한다. 많은 트랜잭션을 하나의 인증서로 묶는 시퀀서는 그 인증서에 대해 한 번의 병렬 입찰을 지불하고, 인텐트 (intent) 안에서 사용자들에게 트랜잭션당 청구한다.
10. 네트워크#
본문은 체인 데이터다. 블록이 유효한 블록이 되려면 그 인증서 본문을 가져올 수 있어야 하므로, 상태는 언제나 체인만으로 재구성 가능하며 시퀀서를 포함한 어떤 운영자도 결코 데이터 수탁자가 아니다. 인증서는 읽기와 쓰기를 함께 지니므로 고전적인 트랜잭션보다 크다. 그 완화책은 구조적이다. fill은 내부 쓰기를 잘라 내고, 사용된 일회성 셀은 되돌리기 지평 너머로 묻히고 나면 압축되며, 노드는 피어에게 공지하는 하한 아래의 본문을 가지치기할 수 있다.
전송. TCP, 그 위에 자체 서명 인증서 안의 Ed25519 피어 신원을 쓰는 TLS 1.3. 채널은 키에 묶이며, 그 이상은 주장하지 않는다. 모든 메시지는 길이와 타입으로 이루어진 5바이트 프레임이며, 길이는 어떤 할당보다도 먼저 그 타입 자체의 상한과 대조된다. 더 새로운 빌드가 추가한 타입은 연결을 닫는 대신 작은 한도 아래에서 읽고 버린다.
| 타입 | 역할 |
|---|---|
hello | 프로토콜 버전, 네트워크 id (모든 파라미터에 확약하는 제네시스 블록 id), 높이, 작업량, 수신 주소, 기능, 본문 하한 |
certificate | 가십 |
block-announce | 헤더와 순서 있는 실체 해시들 |
get-block / block / block-unavailable | 4 MiB 청크로 나뉜 본문, 또는 그것이 제공되지 않는 이유 |
get-headers / headers | 헤더 우선 동기화 |
get-peers / peers | 주소 교환 |
service-card | 기능별 서비스 공지 |
open-intent | 강제 경로를 위한 오픈 인텐트 (intent). 그 기능을 공지하는 피어에게 전달된다 |
중계는 해시 우선이다. 인증서는 독립적으로 가십되며, 도착 즉시 무상태로, 병렬로 유효성 검사를 받는다. 중계 노드는 스팸을 거르는 비용을 제한하는 데 상태가 필요 없다. 무상태 유효성은 바이트로부터 검사 가능하며, 상태를 보유한 노드는 예치금이 감당할 수 없는 인증서도 거부한다. 중계는 id가 아니라 실체를 다룬다. 서명이 실패한 인증서는 그 실체 (exemplar) 를 잃게 할 뿐이며, id에 대해서는 아무것도 기록되지 않는다. 같은 승인의 나중 실체는 올바를 수 있기 때문이다. 블록은 멤풀에 대한 헤더와 해시 목록으로 중계되므로 [11], 전파 지연은 블록 내용에 비례하지 않으며, 수신자는 어떤 본문을 가져오기 전에 헤더의 작업량을 검증한다.
동기화는 검증된 작업량으로 선택한다. 따라잡는 중인 노드는 가장 큰 높이를 주장하는 피어보다 헤더가 실제로 가장 많은 작업량을 증명한 피어를 선호한다. 헤더는 본문을 가져오기 전에 체인으로서 검증된다. 경쟁하는 분기는 되돌리기 지평 안에서 연결되고 그것이 대체하는 체인보다 더 많은 작업량을 (지분증명 아래에서는 더 많은 슬롯을, §11) 지닐 때에만 채택된다. 릴리스에 내장되고 블록이 적어도 한 에포크 이상 오래되었을 때에만 받아들여지는 고정 체크포인트는, 출시 에라의 이력 재작성 방어책으로서, 아무리 무거운 체인이라도 그것과 모순되면 거부한다. 운영자는 플래그로 고정점을 추가할 수 있다.
피어는 신원별로 점수가 매겨진다. 무효한 메시지는 20, 프로토콜 위반은 50, 제공되지 않은 본문은 10, 과도한 요청은 5를 잃고, 유용한 메시지는 1을 얻으며, 피어는 −100에서 차단된다. 비용이 큰 검사, 즉 키 에포크와 작업증명 평가는 피어별로 예산이 정해지고 블록이 유용한 것으로 드러나면 환급되므로, 공격자는 아무 데로도 이어지지 않는 공지에 대해 노드가 작업을 갈아 넣게 만들 수 없다.
인용. 헤더는 부모의 높이에 있는 최근의 경쟁 헤더를 최대 네 개까지 대가 없이 인용할 수 있다. 인용에는 실제 작업증명이 필요한 반면, 그 신호를 억누르려면 거의 모든 생산자가 그것을 누락해야 한다. 인용된 포크 비율은 수수료 제어기 (§9) 가 읽는 건전성 신호다.
노드 인터페이스. 읽기는 HTTP로 제공되며 기본적으로 localhost에 바인딩된다. 인증서, 오픈 인텐트, 서명된 서비스 카드의 제출이 유일한 쓰기다. 읽기는 클라이언트별로 속도가 제한되며, 운영자 자신의 도구를 면제하기 위한 신뢰 토큰이 있다. 일반적인 CPU 채굴기가 쓰는 방언의 Stratum 엔드포인트를 통해 노드는 외부 소프트웨어로 채굴할 수 있다.
11. 지분증명#
이 절은 블록 생산이 작업증명에서 지분으로 넘어가는 에라의 합의를 명세한다. §2부터 §10까지의 규칙은 이 절이 달리 말하는 곳을 제외하고 그대로 성립한다. 일정과 모든 값은 동반 문서에 있다. 미정으로 표시된 상수는 그 에라의 릴리스가 고정한다.
무엇이 바뀌는가. 두 가지다. 작업증명이 해시에 대한 대가로 파는, 다음 블록을 생산할 권리는 지분에 따라 추첨된다. 그리고 블록 간격은 30초에서 5초로 줄어든다. 그 밖의 모든 것은 그대로다. §2의 모든 유효성 규칙은 모든 노드가, 모든 인증서에 대해, 바이트로부터 검사한다. 폴드는 같다. 두 gas 시장도 같다. 블록 안의 무효한 인증서는 그 블록을 무효로 만든다. §10의 인용 규칙은 유지되며, 인용된 헤더의 작업량 대신 그 헤더의 슬롯 서명을 쓴다. 이 에라가 여는 표면은 지분증명의 표면이며, 그 밖의 어떤 것도 아니다.
계산이 가는 곳. 작업증명 채굴자는 해시에 계산을 쓰며, 해시는 보안을 사 줄 뿐 그 밖에는 아무것도 사 주지 않는다. 이 에라의 생산자는 같은 계산을 검증에 쓴다. 서명을 검사하고, 프로그램을 재실행하고, 인증서를 도출하는 일을, 그것들을 정렬하기 전에 병렬로 한다. 네트워크가 대가를 치르는 일이 네트워크에 필요한 일이 된다. 평범한 컴퓨터는 블록당 수천 개의 인증서를 검증하며, 코어가 더 많은 생산자는 거래량이 늘어도 따라간다. 병렬 검증은 상한을 순차 루프가 소비하는 양보다 훨씬 위에 둔다. 그 너머에 있는 것은 §12에 있다.
지분. 참여자는 네이티브 연산 BOND로 네이티브 코인을 본딩하며, 이 연산은 잔액을 영구 주소에서 그 주소에 묶인 지분 셀로 옮긴다. 지분 셀은 프로토콜 셀이다. 시퀀서 카운터에서와 마찬가지로, 인증서는 이동을 승인하고 폴드가 쓰기를 수행한다. 그 주소의 키가 블록에 서명하는 키다. 지분은 본딩된 지 한 에포크 뒤에 활성화되므로, 지분을 연달아 만들었다가 버릴 수 없다. UNBOND는 되돌리기 지평보다 긴 지연 뒤에 잔액을 돌려준다. 최솟값은 동반 문서가 정한다. 키 하나에 지분 하나.
추첨. 블록은 고정된 간격의 슬롯을 차지한다. 각 슬롯에 대해, 생산자는 에포크가 열릴 때 활성인 지분들의 집합에서, 지분에 비례하는 확률로, 체인이 이전 에포크 동안 고정해 비컨 셀 (§4) 에 써 둔 시드로부터 추첨된다. 그 시드는 그것을 고정하는 블록들의 생산자가 편향시킬 수 있는 것이어서는 안 된다. 헤더는 작업증명 대신 슬롯과 추첨된 생산자의 서명을 지닌다. 다른 키로 서명되었거나 자신의 슬롯 밖에 있는 헤더는 무효다. 블록이 없는 슬롯은 비어 있는 채로 남으며, 다음에 추첨된 생산자는 자신이 아는 마지막 블록 위에 구성한다. 추첨은 에포크가 열리기 전에 고정된 상태의 함수이므로, 모든 노드가 혼자서 그것을 도출하며, 블록 자체 외에는 어떤 합의 메시지도 교환되지 않는다. 그 계보는 Ouroboros의 슬롯 리더 추첨 [17] 과 Solana의 에포크별 리더 일정 [21] 이다. Praos가 그러듯 [18] 검증 가능한 무작위 함수 [31] 뒤에 리더를 숨기는 것은, 알려진 생산자에 대한 서비스 거부가 문제가 될 경우의 대안이다.
체인 선택. §10이 검증된 작업량으로 선택하는 곳에서, 이 에라는 길이로 선택한다. 유효한 체인들 가운데 가장 많은 슬롯을 차지하는 체인 [17], 그리고 길이가 같은 두 체인 사이에서는 포크 이후 첫 블록이 더 이른 슬롯에 있는 체인이다. §10의 되돌리기 지평과 고정 체크포인트는 남으며, 이후 본딩 해제된 키로 다시 쓰는 것에 대한 방어책이다. 네트워크에 합류하는 노드는 자신의 릴리스가 고정하는 이력을 받아들이며, 그것과 모순되는 더 긴 체인은 인정되지 않는다.
보상. 블록 보조금과 우선 수수료는 채굴자에게 가던 것처럼, 같은 성숙 링을 거쳐 추첨된 생산자에게 간다. 소각된 부분은 소각된 채로 남는다. 참여자의 기대 수익은 그 지분에 비례하며, 그것을 거두는 비용은 자신이 포함하는 인증서의 검증이다. 무효한 블록은 거부되며 그것에 서명한 자에게 아무것도 지급하지 않는다.
이중 서명. 합의에서 처벌되는 잘못은 단 하나다. 하나의 키가 한 슬롯에 대해 서명한 두 헤더다. 무효한 인증서처럼 그것은 누구든 바이트로부터 검사할 수 있는 단일 메시지 증명이다. 신고 인증서가 두 헤더를 담는다. 폴드는 서명자 자신의 본딩을 소각하고, 그 키를 활성 집합에서 제거하며, 신고자에게 미정인 비율을 지급한다. 신고는 그 지분의 출금이 완료될 때까지 받아들여진다. 합의에서 그 밖의 어떤 행위도 처벌되지 않으며, 생산자의 어떤 행위도 다른 누구의 코인에도 닿지 않는다. 그 선례는 Ethereum 비컨 체인의 제안자 슬래싱 [19] 이다.
풀. 풀은 위임을 받아들이는 지분이다. 어떤 영구 주소든 본딩할 수 있고, 네이티브 연산 DELEGATE로 자신의 본딩을 풀의 키로 향하게 할 수 있다. 위임만 하는 본딩은 생산하는 본딩보다 최솟값이 작다. 잔액은 결코 위임자를 떠나지 않으며, 위임자는 같은 출금 지연 아래에서 그것을 다른 곳으로 돌리거나 본딩 해제한다. 추첨에서 풀의 가중치는 자신의 본딩에 그 풀에 위임된 것을 더한 값이다. 풀이 생산하는 블록의 보상은 블록별 경로 밖에서 에포크마다 한 번 폴드가 나누며, 풀이 등록할 때 선언한 마진에 따라 풀에, 그리고 지분에 비례해 그 위임자들에게 나뉜다. 이중 서명 시 풀 자신의 본딩은 소각되고 그 위임분은 위임자들에게 돌아간다. 풀 안에서 검증을 어떻게 나누는지는 풀의 일이다. 각 구성원은 자신이 받은 몫을 검증하고, 하나의 인증서가 둘 이상의 구성원에게 갈 수도 있으며, 운영자는 답을 취합해 블록을 조립하고 추첨된 키로 서명한다. 이 모두는 구성이며, 합의 밖에 있고 설계상 자유롭다 (§1). 체인이 보는 것은 위임 표, 하나의 키로 서명된 헤더, 그리고 모든 전체 노드가 그 인증서를 다시 검증하는 블록이다. 작은 노드는 자신이 가진 코어를 기여하고, 코인만 가진 보유자는 지분을 기여한다. 그 계보는 Cardano의 지분 풀 [20] 이며, 그것 역시 위임자를 결코 슬래싱하지 않는다.
램프. 이 에라는 세 단계로 들어오며, 각 단계는 합의 규칙이다.
- 본딩. BOND, UNBOND, DELEGATE가 받아들여진다. 작업증명은 계속해서 모든 블록을 생산하고 생산자 몫 전체를 받는다.
- 램프, 90 에포크에 걸쳐. 모든 블록은 여전히 채굴되며, 작업증명 프리이미지 밖의 헤더 안에 그 높이에 대해 추첨된 지분의 서명을 지닌다. 블록 id가 그것을 덮으므로, 서명된 블록과 그 서명 없는 사본은 두 개의 블록이며, 작업량이 같으면 서명된 쪽이 이긴다. 체인 선택은 여전히 작업량에 따르며, 한 높이에서의 두 서명은 이중 서명이 아니다. 보조금의 생산자 몫은 채굴자와 스테이커 사이에 나뉜다. 카운터 k는 1에서 시작해 관문을 통과하는 에포크마다 하나씩 늘어나며, 스테이커는 k/180을 가져가므로, 작업은 전환까지 적어도 절반을 유지한다. 서명 없이 실린 블록도 유효한 블록이지만 누구에게도 지급하지 않는다. 그 블록의 보조금 생산자 몫과 우선 수수료는 소각되므로, 채굴자는 스테이커를 빼서 얻는 것이 없고, 스테이커는 불참해서 얻는 것이 없다. 에포크는 그 블록의 90% 이상이 서명을 지니고, 위임분을 포함한 활성 지분이 공급량의 10% 이상을 보유했을 때 관문을 통과한다. 램프는 활성 지분이 30 에포크 동안 공급량의 10%에 이르면, 또는 늦어도 동반 문서가 정한 에포크에, 그때 존재하는 지분이 얼마든 그것으로 시작한다. 지분이 실제 생산에서 90 에포크 동안 열 블록 중 아홉 블록에 서명하기 전에는 어떤 블록도 지분만으로 생산되지 않는다. 그 선례는 채굴된 블록이 지분 투표를 지니고 보조금이 둘 사이에 나뉘는 Decred의 하이브리드 [22], 그리고 지분이 블록 생산을 넘겨받기 전 거의 2년 동안 자체 체인을 운영한 the Merge [23] 다.
- 전환. 관문을 통과한 90번째 에포크 다음 에포크의 첫 블록이 슬롯 0이다. 작업증명이 끝나고, 간격은 5초가 되며, 에포크는 17,280 슬롯이 된다. 한 에포크가 보조금으로 지급하는 양은 바뀌지 않는다. 각 블록은 6분의 1을 지급하며, 빈 슬롯은 아무것도 지급하지 않는다. 블록당 상한 (§9) 은 그 하한 및 최대치와 함께, 그리고 강제 경로 개수 (§8) 는 6으로 나뉘어 내림되며, 그래서 전환 순간에 하루당 용량이 같고, 에포크 제어기는 거기서부터 이어 간다. 시간을 측정하는, 블록 수로 센 모든 상수 (성숙 기간, 최대 TTL, 인텐트 창, 되돌리기 지평, 중앙값 시각 창, 디렉터리 항목의 수명) 는 6배가 되며, 전환 이전에 설정된 성숙 기간이나 TTL은 전환 블록에서 변환된다.
최종성. 작업증명에서처럼 블록은 깊이로 최종이 된다. 금융 서비스는 10분을 기다려야 한다. 즉 120블록이며, 작업증명에서는 20블록이었다. 한 에포크보다 오래된 블록은 체크포인트로 고정될 수 있다.
| 상수 | 값 |
|---|---|
| 슬롯 간격 | 5 s |
| 전환 이후의 에포크 | 17,280 슬롯 (하루) |
| 램프 길이 | 관문을 통과하는 90 에포크. 스테이커의 비율 k/180 |
| 램프 관문 | 그 에포크 블록의 90%가 서명됨. 활성 지분 ≥ 공급량의 10% |
| 본딩과 참여 사이의 지연 | 1 에포크 |
| 출금 지연 | 미정. 되돌리기 지평보다 김 |
| 소각된 본딩 중 신고자에게 지급되는 비율 | 미정. 50% 미만 |
| 추첨 함수와 시드 출처 | 미정 |
| 최소 풀 마진 | 미정 |
| 최소 위임 | 미정. 최소 본딩 미만 |
12. 완전 검증 너머#
작업증명 에라와 지분증명 에라에서는 모든 노드가 모든 인증서를 검증한다. 계산은 한계가 아니다. 검증은 병렬적이며, §9의 상한은 에라 경계에서 인증서 목록의 구조적 폭인 블록당 2²⁵까지 다시 고정된다. 그 벽 이전에 한계가 되는 것은 데이터다. 모든 본문을 받는 대역폭, 그리고 모든 본문과 사용 레지스트리의 모든 항목을 보관하는 저장 공간이다. 이 절은 그 너머로 가는 길에 대해 알려진 것을 말하고, 그것을 일일 거래량이 평범한 노드가 검증하는 양에 다가갈 때 필요에 따라 활성화되는 이후의 에라에 맡긴다. 이것은 명세가 아니라 방향이다. 그 문제들에는 서로 다른 트레이드오프를 가진 여러 해법이 있고, 네트워크는 오랫동안 그중 어느 것 없이도 마주칠 모든 수요를 감당하며, 먼 미래를 위해 세부까지 준비하는 것은 그 길을 걸을 누군가를 위해 길을 표시해 두는 것 이상의 가치가 없다. 앞에 오는 것은 아무것도 바뀌지 않는다. 바이트의 함수로서의 유효성, 폴드, 타입이 지정된 접근, 두 시장, 시퀀서, 강제 경로는 그대로 남는다. 바뀌는 것은 오직 각 인증서를 누가 검증하는가뿐이다.
인증서가 허용하는 것. 재실행 체인들, 즉 Ethereum, Solana, 그리고 그것들에서 파생된 체인들에서는 모든 검증자가 모든 트랜잭션을 전역 상태에 대해 실행하고, 검증은 상태의 한계를 물려받으며, 역사적인 답은 더 큰 기계, 다시 말해 더 적은 노드였다. Solana [21] 에서처럼 선언된 접근 목록을 갖춘 노드 내부의 병렬 실행은 각 기계를 더 빠르게 만들지만, 누가 그런 기계를 필요로 하는지는 바꾸지 않는다. Cardano는 더 가까이 다가갔다. 확장 UTXO 모델에서 검증은 결정론적이고 국소적이지만 [24], 스크립트는 모든 노드에서 실행되고 공유 상태는 경합하며, 이 모델은 직렬화를 체인이 인식하지 않는 오프체인의 배처에게 떠넘김으로써 그것을 해결한다. 롤업은 낙관적이든 유효성 기반이든 [25][26] 실행을 기반 체인 밖으로 빼내고 기반 체인에는 검증을 남겼다. 그것이 올바른 분업이지만, 그 대가는 두 번째 계층, 브리지, 강제 경로가 지연 뒤에서 기다리는 단일 시퀀서, 그리고 종류에 따라 일주일의 대화형 분쟁 또는 실행보다 몇 자릿수 더 비싼 증명자다. Zycord 인증서는 기반 체인이 그 자체의 바이트로부터 검사하고 결코 자신의 상태에 대해 실행하지 않는 롤업 배치이며, 그 때문에 두 번째 계층이 필요 없다. 상태가 하나이므로 브리지가 없다. 무효한 인증서가 단일 메시지로 된 자기 자신의 사기 증명이므로 분쟁이 없다. 검증에 드는 비용이 실행에 드는 비용과 같으므로 증명자가 없다. 시퀀서는 컨트랙트별로 있고, 강제 경로는 다음 블록에 반영되며, 서로 다른 시퀀서 아래의 두 컨트랙트는 하나의 원자적 인증서 안에서 합성된다 (§7). 두 롤업이라면 브리지가 필요한 곳에서다. 그리고 성장에 대한 답이 샤딩인 곳, 즉 Ethereum의 원래 궤적, Near [27], 파라체인 [28] 에서는 상태를 분할하고 분할 사이의 원자성을 잃지만, Zycord의 분할은, 그것이 올 때, 상태가 아니라 검증을 분할한다. 상태는 하나로 남고, 폴드는 하나로 남으며, 모든 인증서는 원자적으로 남는다. 유효성이 바이트의 함수일 때 누가 인증서를 검증하는지는 자유로운 선택이기 때문이다.
표본 검증. 본딩된 지분이 있으면, 인증서를 검증할 책임은 모든 지분에 떨어지는 대신 지분의 부분집합에 추첨으로 배정될 수 있다. 인증서는 자신의 위원회의 증명 (attestation) 과 함께 블록에 들어간다. 어떤 노드든 무엇이든 자유롭게 검증할 수 있는 상태로 남는다. 무효한 인증서는 상태도, 대화형 게임도 없는 단일 메시지인 자기 자신의 사기 증명으로 남는다 [29]. 그리고 그 에라가 더하는 것은 증명한 자에 대한 슬래싱이다. 위원회의 크기, 증명의 형태, 이의 제기 창, 그리고 무효화된 인증서 위에 적용된 것에 무슨 일이 일어나는지는 그 에라의 명세이며, 미정으로 남는다. 효과는 곡선을 뒤집는 것이다. 각 노드가 더 작은 몫을 검증하므로 용량은 합류하는 노드마다 커지고, 위원회는 집합과 함께 커진다.
검증 원뿔. 인증서를 받는 사람은 그것을 신뢰하기 위해 체인 전체가 필요하지 않다. 읽기는 선언되므로, 그 인증서가 의존하는 인증서들의 집합은 체인으로부터 열거할 수 있다. 읽힌 모든 셀에 대해, 마지막 에포크 상태 루트 이후 그 셀을 쓴 인증서들, 그리고 그것들의 인증서들을 재귀적으로. 바이트로부터 다시 검증되고 헤더가 확약하는 에포크 루트 (§3) 에 고정된 그 원뿔은, 받는 사람에게 중요한 것에 대한 완전한 검증이며, 회로도 특별한 증명도 없이, 네트워크 시간으로 몇 초 만에 이루어진다. 입금을 받는 거래소는 네트워크가 아니라 그 입금의 원뿔을 검증한다. 표본 검증 아래에서 남는 것은 재구성과 이의 제기 창이 지나기를 기다리는 일이며, 이는 거래소가 오늘날 이미 하고 있는 일이다. 에포크 루트에서 어떤 셀이 주어진 값을 가졌다는 증명이 이것이 요구하는 단 하나의 새로운 객체이며, 그 형태는 미정이다. 그 계보는 간소화된 결제 검증 [1] 이다.
저장 공간. 네트워크가 이미 하는 일: 사용된 일회성 셀은 되돌리기 지평 너머에서 압축되고 (§4), 노드는 자신이 공지하는 하한 아래의 본문을 가지치기한다 (§10). 연구 과제로 남는 것: 일회성 주소가 만료되고 레지스트리가 닫히는, 에포크별 사용 레지스트리. 레지스트리 대신의 누산기 [30]. 그리고 일부 노드에 의한 오래된 본문의 보관으로, 이때 에포크 루트는 보관된 것이 사용된 것임을 보증한다.
대역폭. 두 가지 길이 있다. 첫째는 설계가 이미 가진 토폴로지, 즉 지갑, 시퀀서, 생산자다. fill은 네트워크를 범람시킬 필요가 없다. fill은 시퀀서에서 생산자들에게 가고, 나머지 모두는 해시를 받으며, 이는 중계가 이미 블록에 대해 하는 방식이다 (§10). 둘째는 인증서의 머리를 본문과 분리하는 것이다. 머리는 폴드가 건드리는 것, 즉 id, 읽기, 쓰기, 예치금, 입찰이다. 본문은 검증이 소비하는 것, 즉 프로그램, calldata, 서명이다. 표본 검증 아래에서 생산자는 자신이 검증하도록 추첨된 인증서의 본문과 다른 모든 인증서의 머리만 필요하며, 그 대역폭은 몇 자릿수 줄어든다. 블록은 계속해서 실체 전체의 해시에 확약하고, 본문은 계속해서 체인 데이터이며, 그것을 검증한 자와 보관하는 자가 제공한다. 모든 노드가 본문을 보유하지는 않을 때 그 가용성을 어떻게 보장하는지는 그 에라가 존재하기 전에 답해야 하는 질문이다 [29].
13. 수용된 위험#
규칙에서 비롯되며 있는 그대로 수용되는 결과들이다. 각각은 제한되어 있거나, 그것을 선택한 당사자에게 떨어진다. 그중 어느 것도 누군가가 제3자의 네이티브 가치를 가져가게 허용하지 않는다.
- 시퀀서, 관리자, 시퀀서를 바꾸는 코드가 모두 사라진 컨트랙트는 강제 경로로만 떠날 수 있다. 느리고 더 비싸지만, 살아 있다.
- 빈 블록이 이어지면 두 기본 수수료는 하한인 1보다 높은 7에서 멈춘다. 8 미만에서는 하향 단계가 0으로 반올림되기 때문이다. 그 정지점을 옮기려면 에라 경계에서 파라미터 변경이 필요하다.
- 뜨거운 컨트랙트에서 약 한 블록 분량의, 비용을 지불하는 수수료 방해 공격. 생산자 자신의 강제 인증서를 사용자의 강제 인증서 주위에 배치하는 것으로, 이는 사용자의 한계로 제한된다. 그리고 블록당 하나의 강제 인증서로 시퀀서가 자신의 파이프라인을 다시 구성하게 만드는 것.
- 시퀀서 키가 0인 개방된 컨트랙트는 오직 자신의 코드로만 보호되며, 그것을 대상으로 하는 인증서의 작성자는 자신의 건너뜀을 스스로 지불한다. 읽기를 고른 것은 작성자이기 때문이다.
- 일회성 주소를 소각하는 인증서가 아닌 다른 누군가가 그 주소에 입금한 비네이티브 자산은 소각에 의해 동결된다. 소각은 네이티브 잔액과 그 인증서가 쓰는 셀만 이동시키기 때문이다. 주소를 소각하기 전에 그 주소의 자산 잔액을 확인하는 것은 프로토콜 규칙이 아니라 지갑 규칙이다.
- 델타만 이동시키는 인증서는 펜스를 전진시키지 않는다 (§7). 그 이전에 구성되어 그것이 움직인 셀을 정확하게 읽는 fill은 이후 블록에서 건너뛰어지며, 시퀀서에게 청구된다. 시퀀서는 자신의 컨트랙트가 누구에게나 델타로 움직이도록 허용하는 셀을 정확하게 읽지 않음으로써 이를 피한다.
- 강제 경로 실행자에 대한 잔여 방해 공격. 지불자를 많이 가진 공격자는 어떤 인증서도 실을 수 없는 오픈 인텐트, 예를 들어 지불자의 잔액이 대가에 못 미치는 인텐트를 중계할 수 있다. 단지 되돌려지거나 한계를 어기는 호출은 여기에 속하지 않는다. 그런 호출은 실패한 형태로 반영되어 지불한다 (§8). 실을 수 없는 인텐트 (intent) 하나하나는 실행자에게 구성 한 번의 비용을 지운다. 그런 다음 그 사본은 축출되어 격리되며, 같은 지불자에 대한 대체물은 엄격히 더 많이 지불해야 한다.
- 공동 서명자는 어떤 셀 (cell) 도 잠그지 않는다. 그가 서명한 공동 fill은 그 fill이 실리거나 그 창이 지날 때까지 (§7) 자신의 파이프라인에서 자리를 차지한다. 제때 실리지 않은 공동 fill은 같은 셀에 대한 다른 fill들과 마주칠 수 있으며, 어느 쪽이든 폴드에 두 번째로 들어가는 쪽이 건너뛰어져 자신의 예치자에게 청구된다.
- 개방된 컨트랙트에서는 예치 주소가 먼저 정렬되는 인증서가 정확한 읽기를 둘러싼 경쟁에서 이기며, 주소는 값싸게 대량 생성해 고를 수 있다. 경합하는 정확한 상태를 가진 컨트랙트는 시퀀서를 선택하며, 그 파이프라인이 순서를 정한다.
- 개방된 컨트랙트의 정확 경로에 대한 일반 호출은 그 컨트랙트의 시퀀서 셀 (cell) 을 정확한 0으로 선언한다. 인증서가 반영되기 전에 컨트랙트가 키를 얻으면 그 읽기는 낡은 것이 되고 호출은 건너뛰어져 호출자에게 청구된다. 지갑은 그러한 호출을 구성하기 전에 경고한다.
- 건너뜀 (skip) 수수료는 고정되어 있으므로, 기본 수수료가 높을 때 건너뜀은 적용보다 비용이 적게 든다. 하나의 인증서를 여러 변형으로 시도하는 것은 값싸며, 모든 노드는 그 각각을 검증한다.
- 높은 처리량에서의 대역폭과 저장 공간은 해결된 문제가 아니라 공표된 미해결 문제다. 본문은 체인 데이터이고, 모든 노드는 모든 바이트를 지니며, 머신 호출은 자신이 실행하는 코드를 지니고, 사용 레지스트리는 일회성 사용마다 항목이 하나씩 늘어난다. 그 길은 §12에 있다.
- 지분증명 (§11) 아래에서 체인의 보안은 통상적인 지분증명의 보안이다. 그 비용은 위임분을 포함한 추첨 가중치의 과반을 모으는 데 드는 비용이다. 램프는 그 기한에 존재하는 지분이 얼마든 그것으로 시작하며, 관문은 살아 있는 지분이 공급량의 10분의 1을 보유하지 않은 채 전환이 완료되지 못하게 막는 장치다. 지분의 10분의 1이 불참하면 그것은 일시 정지된다. 풀의 이중 서명은, 그 풀에 무엇이 위임되었든, 풀 자신의 본딩만 대가로 치른다. 위임자는 이를 알고 풀을 고른다. 이후 본딩 해제된 키로 하는 장거리 재작성은 오직 고정 체크포인트 (§10) 로만 막히며, 합류하는 노드는 그것을 체인에서 도출하는 것이 아니라 자신의 릴리스로부터 받아들인다.
14. 적합성#
규칙은 아키텍처 명세이고, 골든 벡터는 프로토콜이며, 그중 어느 둘이 어긋나는 곳에서는 더 정밀한 쪽이 이기고 그 불일치는 버그다. 프로토콜은 공개된 spec/ 디렉터리에 있다. 파라미터 파일, 체인 id 장부, 고정 체크포인트, 미리 배포된 라이브러리의 이미지, 그리고 세 개의 벡터 말뭉치다:
- 폴드 (fold) 벡터:
(pre-state, block) → (post-state | invalid, outcomes, fees). 무효 벡터는 그것이 어기는 단 하나의 규칙을 기록한다; - 도출 벡터:
(program, declared reads and writes, deposit) → (reads, writes, artifact, parallel gas), 또는 머신에 도달하기 전에 인증서를 거부하는 규칙; - 난이도 벡터:
(parameters, headers) → next target, 후보 헤더에 대한 판정과 함께. 지분증명 아래에서는(stake set, seed, slot) → drawn key.
벡터는 생성되며 결코 손으로 편집되지 않는다. 재생성은 레퍼런스 폴드를 구동하고, 그 결과를 레퍼런스 폴드로 재생한 다음, 확정된 JSON을 첫 번째와 코드를 전혀 공유하지 않는 의도적으로 단순한 두 번째 폴드로 재생한다. 두 번째 폴드가 동의하지 않는 재생성은 실패한다. 기존 벡터를 바꾸는 재생성은 합의 변경이며 합의 변경으로서 검토된다. 구현은 제네시스 블록 id를 재현하고 벡터를 통과할 때 적합하다. 그러면 그것은 포크가 아니라 피어다.
15. v1.0과의 관계#
이 논문은 v1.0 [0]을 전부 대체한다. 둘이 다른 곳에서는 이 논문이 프로토콜이며, v1.0을 이 논문과 나란히 읽어서는 안 된다. 논지는 변하지 않았다. 자기 증명 인증서, 결코 실행하지 않는 폴드, 타입이 지정된 상태 접근, 그리고 두 개의 수수료 시장이다. 아래의 변경 사항은 설계를 구현하는 과정에서 발견되었으며, 각각은 합의 표면과 오류의 부류들을 제거했다.
| v1.0 | 이 논문 |
|---|---|
| §5, 보험이 적용된 인증서와 인수인 | 모든 인증서는 자신에 대해 책임지는 예치 셀을 지칭한다 (§2, §3). 컨트랙트는 서명된 인텐트와 시퀀서 fill을 통해 서비스된다 (§7). |
| §6, 시퀀서 공동 서명과 임대 | 인텐트, fill, 영수증, 파이프라인, 펜스 카운터, 그리고 공동 시퀀싱 (§7). |
| §7, 임대와 지연을 수반하는 강제 대기열 | 강제 경로: 생산자가 블록 끝에서 오픈 인텐트를 실행하며, 포함이 곧 적용이다 (§8). |
| §9, 사기 증명과 표본 추출 | 지분증명 (§11). 완전 검증 너머의 길, 방향으로서 (§12). |
| §10, cEVM 개요 | 완전한 방언 (§6). |
| §12, 기밀 결제 | 이 명세의 일부가 아니다. 이후의 에라가 자체 명세 아래에서 그것을 다룰 수 있다. |
| §13–§14, 파라미터, 출시, 에라, 트레저리 (treasury), 발행 | 우선하는 문서인 동반 문서. |
| §15, 측정 | 다시 서술하지 않는다. 그것은 v1.0 레퍼런스 구현을 기술한다. |
16. 결론#
Zycord는 트랜잭션을 실행하는 대신 인증서를 정렬한다. 유효성은 누구든, 어디서든, 병렬로, 바이트만으로 검사한다. 상태는 비교하고 더하기만 하는 폴드로 전진한다. 충돌은 건너뛰어지고, 가격이 매겨지며, 그것을 선택한 당사자에게 청구된다. 동시성은 발견되는 것이 아니라 선언된다. 애플리케이션은 활성에 대해서만 신뢰되고 결코 안전성에 대해서는 신뢰되지 않는 시퀀서에 의해 밀리초 단위로 확인된다. 강제 경로가 모든 컨트랙트를 도달 가능하게 유지한다. 그리고 코인이 분배되고 나면 해시 대신 검증에 계산을 쓰는 합의가 있다. 검증은 네트워크가 소유하지 않은 하드웨어와 함께 밖으로 확장된다. 확정은 순차적으로 남되, 거의 공짜다.
참고 문헌#
[0] The Simstoshi. Zycord: A Peer-to-Peer Network of Self-Certifying State Transitions, v1.0. 2026. 이 논문으로 대체됨.
[1] S. Nakamoto. Bitcoin: A Peer-to-Peer Electronic Cash System. 2008.
[2] V. Buterin. Ethereum: A Next-Generation Smart Contract and Decentralized Application Platform. 2013.
[3] E. Androulaki et al. Hyperledger Fabric: A Distributed Operating System for Permissioned Blockchains. EuroSys 2018.
[4] A. Thomson et al. Calvin: Fast Distributed Transactions for Partitioned Database Systems. SIGMOD 2012.
[5] R. Gelashvili et al. Block-STM: Scaling Blockchain Execution by Turning Ordering Curse to a Performance Blessing. 2022.
[6] G. Danezis et al. Narwhal and Tusk: A DAG-based Mempool and Efficient BFT Consensus. EuroSys 2022.
[7] J. Zahnentferner. Chimeric Ledgers: Translating and Unifying UTXO-based and Account-based Cryptocurrencies. IACR ePrint 2018/262.
[8] P. E. O'Neil. The Escrow Transactional Method. ACM TODS, 1986.
[9] M. Herlihy, E. Koskinen. Transactional Boosting: A Methodology for Highly-Concurrent Transactional Objects. PPoPP 2008.
[10] M. Shapiro et al. Conflict-free Replicated Data Types. SSS 2011.
[11] M. Corallo. BIP 152: Compact Block Relay. 2016.
[12] EIP-1559: Fee Market Change for the ETH 1.0 Chain. Ethereum Improvement Proposals, 2019.
[13] tevador et al. RandomX: Proof-of-Work Algorithm Optimized for General-Purpose CPUs. 2019.
[14] EIP-4844: Shard Blob Transactions. Ethereum Improvement Proposals, 2022.
[15] Monero: Dynamic Block Weight and Penalty. Monero Research Lab 문서.
[16] bitcoincashautist. CHIP-2023-04: Adaptive Blocksize Limit Algorithm for Bitcoin Cash. 2023.
[17] A. Kiayias, A. Russell, B. David, R. Oliynykov. Ouroboros: A Provably Secure Proof-of-Stake Blockchain Protocol. CRYPTO 2017.
[18] B. David, P. Gaži, A. Kiayias, A. Russell. Ouroboros Praos: An Adaptively-Secure, Semi-Synchronous Proof-of-Stake Blockchain. EUROCRYPT 2018.
[19] Ethereum Foundation. Ethereum Consensus Specifications: The Beacon Chain (제안자 슬래싱). 2020.
[20] L. Brünjes, A. Kiayias, E. Koutsoupias, A.-P. Stouka. Reward Sharing Schemes for Stake Pools. IEEE EuroS&P 2020.
[21] A. Yakovenko. Solana: A New Architecture for a High Performance Blockchain. 2017.
[22] Decred Documentation: Proof-of-Stake. docs.decred.org.
[23] Ethereum Foundation. The Merge. ethereum.org, 2022.
[24] M. M. T. Chakravarty, J. Chapman, K. MacKenzie, O. Melkonian, M. Peyton Jones, P. Wadler. The Extended UTXO Model. Financial Cryptography Workshops 2020.
[25] H. Kalodner, S. Goldfeder, X. Chen, S. M. Weinberg, E. W. Felten. Arbitrum: Scalable, Private Smart Contracts. USENIX Security 2018.
[26] V. Buterin. An Incomplete Guide to Rollups. 2021.
[27] A. Skidanov, I. Polosukhin. Nightshade: Near Protocol Sharding Design. 2019.
[28] G. Wood. Polkadot: Vision for a Heterogeneous Multi-Chain Framework. 2016.
[29] M. Al-Bassam, A. Sonnino, V. Buterin. Fraud and Data Availability Proofs: Maximising Light Client Security and Scaling Blockchains with Dishonest Majorities. 2018.
[30] D. Boneh, B. Bünz, B. Fisch. Batching Techniques for Accumulators with Applications to IOPs and Stateless Blockchains. CRYPTO 2019.
[31] S. Micali, M. Rabin, S. Vadhan. Verifiable Random Functions. FOCS 1999.
Zycord: 출시, 에라, 파라미터#
The Simstoshi
2026 — v2.0
GPG: E724 39CE DD85 11F9 D607 550B 87FD 60D5 EB4A 0B29
이 문서는 Zycord: A Peer-to-Peer Network of Self-Certifying State Transitions, v2.0 (이하 “논문”) 의 동반 문서다. 논문은 메커니즘을 정의한다. 이 문서는 mainnet이 어떻게 출시되었는지, 코인이 어떻게 발행되는지, 어느 에라가 무엇을 활성화하는지, 그리고 모든 파라미터의 값을 서술한다. 이 문서는 v1.0 논문의 §13과 §14를 전부 대체한다. 둘이 다른 곳에서는 이 문서가 우선한다.
1. 출시#
Mainnet 제네시스 블록: 2026-10-07 00:00 UTC (1791331200), 체인 id 1.
- 블록은 작업증명 아래에서 30초마다, 지분증명으로 전환한 뒤에는 5초마다 나온다 (§6). 작업증명: RandomX v2, CPU로 채굴 가능. 난이도: 90블록 창에 대한 LWMA.
- 블록 0에는 인증서도, 주소도, 키도 없다. 블록 0 이전에는 어떤 코인도 존재하지 않는다. 제네시스 블록은 공개된 소스로부터 재현 가능하다.
- 투자 라운드도 관리자 키도 없다. 어떤 코드 경로도 어떤 키에게 일시 정지, 업그레이드, 발행, 검열, 재구성을 허용하지 않는다.
출시 확약. 파라미터 집합은 비밀 출시 메시지에 대한 확약을 지닌다. 블록 1은 헤더에서 그 확약을 열어야 하므로, 그 메시지를 보유한 자만이 블록 1을 생산할 수 있고, 다른 누구도 공지된 제네시스 블록보다 앞서 시작하는 체인에 작업량을 쌓을 수 없다. 발행 램프는 어떤 선행 출발도 별 가치가 없게 만든다. 블록 2부터는 어떤 채굴자든 구성할 수 있다.
체인 id는 장부에 기록된다. 각 운영 중인 네트워크가 지니는 제네시스 블록 id와 함께, 이 장부는 모든 바이너리에 내장되어 시작 시 검사된다. 노드는 퇴역한 id를 거부하며, 기록된 id에 다른 제네시스 블록을 부여하게 될 파라미터 집합도 거부한다. 노드는 네트워크가 선언한 것과 다른 작업 엔진으로는 시작하기를 거부한다.
2. 발행#
보조금은 매끄럽게 감쇠해 영구 꼬리에 이른다. 그 비율은 하루인 한 에포크 안에서는 일정하고 에포크 경계마다 내려가며, 네 개의 상수에 대한 정확한 정수 산술로 계산된다:
E(0) = E0
E(n) = max(tail, E(n−1) − floor(E(n−1) / Q))
여기서 E0 = 블록당 21 ZCD, Q = 1054, tail = 블록당 0.33 ZCD이며, 이는 30초의 작업증명 간격 기준이다. 비율은 약 2년마다 절반이 된다. 부동소수점도 표도 없다. 제네시스 블록은 coinbase를 지급하지 않는다. 꼬리는 에포크 4,376, 약 12년 차에 시작되며, 그때까지 61,836,900.03 ZCD가 예정되어 있다. 이는 일정의 합계인 62,744,838.47에서 출시 램프와 제네시스 블록을 뺀 값이다. 이 수치들은 점화식이 산출하는 그대로이며, 어떤 노드도 닫힌 형식을 계산하지 않는다. 1 ZCD는 100,000,000 drops다.
느린 시작. 처음 86,400블록 (30일) 은 램프다. 블록 h는 램프가 끝나는 에포크의 비율을 쓴 E(30) · h / 86,400을 내림하여 지급하므로, 보상은 0에 가까운 값에서 일정까지 직선으로 올라간다. 램프가 보류하는 약 907,917 ZCD는 결코 나중에 지급되지 않는다.
간격의 변화. 지분증명으로 전환한 뒤부터 (§6), 에포크는 17,280 슬롯이며 블록당 보조금은 E(n)/6을 drops 단위로 내림한 값이다. 점화식은 바뀌지 않는다. 슬롯이 꽉 찬 하루가 지급하는 양은 두 간격에서 같다. 제네시스 블록 곡선에서 블록당 21 ZCD는 5초 블록당 3.5와 같고, 0.33의 꼬리는 0.055와 같다. 꼬리는 같은 에포크인 4,376에서 시작된다. 내림은 에포크당 1000분의 1 ZCD 미만을 보류하며, 그것은 결코 나중에 지급되지 않는다.
꼬리는 수수료 시장을 징발하지 않고 현재 에라를 보호하는 자에게 지급된다. 그에 맞서 두 시장의 기본 수수료 소각과 건너뛰어진 모든 인증서의 소각 (논문 §9) 이 작동하므로, 순발행량은 꼬리에서 소각을 뺀 것이며 부하가 걸리면 음수가 될 수 있다. 공급량에 대한 비율로서 꼬리는 0으로 수렴한다.
3. 보조금 분할#
모든 블록 보조금은 블록 0부터 합의에 의해 94 / 3 / 3으로 분할된다. 이 분할은 보조금에만 적용되며 수수료에는 결코 적용되지 않고, 모든 블록에 동일하게 적용된다. 지분증명 램프 (§6) 동안에는 생산자의 94% 자체가 램프가 도달한 비율에 따라 채굴자와 추첨된 스테이커 사이에 나뉜다.
| 몫 | 수령자 | 종료 시점 |
|---|---|---|
| 94% | 블록의 생산자, 2시간의 성숙 기간 뒤 (작업증명 아래에서 240블록, 지분증명 아래에서 1,440블록) | 항상 |
| 3% | 창립자의 영구 주소, 성숙 기간 없이 직접 입금 | 에포크 1,095 (3년) |
| 3% | 트레저리 (treasury) 셀 | 항상. 에포크 1,095부터는 창립자의 3%도 가져감 |
프리마인은 없다. 분할은 채굴되는 모든 블록에 적용되는 규칙이지, 제네시스 블록에서의 할당이 아니다. 3년 동안 창립자의 몫을 합하면 꼬리 이전 공급량의 2% 미만이다. 소프트 상한 (논문 §9) 을 넘어 분출하는 생산자는 자신의 몫에서만 잃는다. 트레저리 몫과 창립자 몫은 감액되지 않은 보조금에서 떼어진다.
4. 트레저리#
트레저리 (treasury) 셀은 프로토콜 주소의 네이티브 잔액이다. 어떤 키도 해시하여 그 주소가 되지 않고, 어떤 인증서도 그것에서 인출할 수 없으며, 제네시스 블록은 어떤 정족수도 지칭하지 않는다. 트레저리는 블록 1부터 적립되며, 이 릴리스에는 지출 경로가 전혀 없다. 지출 경로는 높이 259,200 (약 2027년 1월 5일) 이전이 아닌 시점에 업그레이드로 정의되며, 서명자는 창립자가 아니라 커뮤니티가 선택한다. 그때까지 그 셀은 누구든 감사할 수 있고 아무도 손댈 수 없는 공개된 정수다.
5. 관리: 처음 3년 (제안)#
상태. 이 절은 커뮤니티 검토를 위한 방향 제시다. §4의 트레저리 업그레이드가 키 집합을 고정하기 전까지 이 절의 어떤 내용도 합의 규칙이 아니며, 세부 사항은 방향이 수용된 뒤에야 명세된다.
트레저리가 받는 것. 1년 차에 약 533,000 ZCD, 2년 차에 396,000, 3년 차에 280,000으로, 합계 약 121만이다. 4년 차부터는 창립자의 3% (§3) 도 가져가므로, 그해에는 모두 합쳐 약 396,000이 된다. 이것으로 무엇을 살 수 있는지는 아무도 모르는 가격에 달려 있으며, 얇은 시장은 대량 매도를 흡수할 수 없으므로, 계획은 낮은 쪽 끝에서도 작동해야 한다:
| ZCD 가격 | 트레저리, 1년 차 | 한 자리 (8%) | 인프라 (20%) |
|---|---|---|---|
| US$ 0.01 | US$ 5,300 | US$ 430 | US$ 1,100 |
| US$ 0.05 | US$ 27,000 | US$ 2,100 | US$ 5,300 |
| US$ 0.50 | US$ 267,000 | US$ 21,000 | US$ 53,000 |
| US$ 20 | US$ 1,070만 | 상한 적용 전 US$ 853,000 | US$ 210만 |
그러므로 아래의 모든 금액은 트레저리 유입의 몫이며, 결코 달러나 ZCD로 표시된 수치가 아니다.
다섯 자리. 자리는 그 보유자보다 먼저 정의된다. 각 자리에는 공개 헌장이 있다. 그 의무, 산출물, 보고 방식, 그리고 보수다. 누구든 지원할 수 있다. 자리를 보유한 자는 계약에 따르듯 헌장에 복무한다.
| 자리 | 임무 |
|---|---|
| 수석 개발자 | 프로토콜과 그 릴리스. 첫 보유자: 창립자. |
| 검토 개발자 | 모든 합의 변경에 대한 독립적 검토. |
| 채굴자 | 활동 중인 채굴자. 블록 생산자들을 대변한다. |
| 커뮤니티 | 채널, 문서, 지원, 온보딩. |
| 공개 대표자 | 공개적으로 신원이 밝혀진 인물. 거래소, 제휴, 그리고 프로젝트를 대리하여 서명하는 계약. |
결정.
- 지출에는 5명 중 3명이 필요하다.
- 보유자 교체, 키 교체, 준비금 지출, 헌장 개정에는 5명 중 4명이 필요하며, 효력이 발생하기 전 7일 동안 공개된다.
- 임기는 1년이며 갱신할 수 있다. 후보 등록은 30일 동안 공개된다. 첫 다섯 보유자는 노드 운영자들이 채택하는 업그레이드가 고정하는 키 집합이다. 이후의 하드 포크가 그것을 다시 고정할 수 있다.
보수는 급여가 아니라 참여다. 자리의 몫은 잠긴 채로 적립되며, 공개된 보고서와 나머지 4명 중 3명의 투표에 따라 6개월마다 풀린다. 어떤 보유자도 자신의 보수 해제에 대해 투표하지 않는다. 풀리지 않은 것은 준비금으로 돌아간다. 자리의 보수는 헌장이 고정하며 지출 투표로 정해지지 않는다. 해제일의 시장 가격으로 측정되는 자리별 상한이 있어, 초과분은 준비금으로 보내진다.
유입 몫으로 표시한 예산.
| 몫 | 목적 | 규칙 |
|---|---|---|
| 40% | 다섯 자리, 각 8% | 잠김. 위와 같이 6개월마다 해제 |
| 20% | 인프라 | 공개된 영수증에 따라 실비로 상환 |
| 25% | 해커톤, 행사, 바운티 | 제안에 따라, 5명 중 3명, 인도 시 지급 |
| 15% | 준비금 | 5명 중 4명으로만 |
인프라가 첫 번째 청구권을 가진다. 노드, 시드, 익스플로러, 빌드 서버에는 현재 월 약 US$ 500이 든다. 상환은 지급일의 시장 가격으로 환산된다. 이 몫은 ZCD당 1년 차에 약 US$ 0.06, 2년 차에 US$ 0.08, 3년 차에 US$ 0.11에서 그 비용을 충당한다. 그 미만에서는 부족분이 이자 없이 이월되어 몫이 허용할 때 지급된다.
창립자. 보조금 중 창립자의 3% (§3) 는 출시까지, 그리고 출시 시점에 이루어진 작업을 보상한다. 이는 수석 개발자 자리와 별개이며, 그 자리는 진행 중인 작업에 대해 다른 자리와 똑같이 보수를 받는다. 창립자는 다섯 개의 키 중 하나를 보유하며, 그 자리의 보수 해제에 대해서는 투표하지 않는다.
합의가 강제하는 것. 업그레이드가 반영되고 나면, 5명 중 3명의 지출과, 지연이 수반되는 5명 중 4명의 교체다. 이 절의 다른 모든 것은 규범이다. 규범을 강제하는 것은 모든 지출이 체인만으로 공개적으로 확인하고 셀 수 있는 평범한 인증서라는 사실이다.
미정. 자리별 상한. 공개 대표자가 서명하는 법적 형태. 머신이 활성화된 뒤 6개월 잠금을 표준 라이브러리의 에스크로 컨트랙트로 강제할지 여부.
6. 에라#
에라는 공개 릴리스에 컴파일되어 들어가는 높이 상수다. 관문 아래에 있는 블록이 그 관문이 활성화하는 프로그램을 지니면 무효이며, 그 높이 검사가 에라를 구분하는 유일한 것이다. 다만 에라 2의 램프와 전환은 예외로, 높이 범위 안에서 상태에 의해 발동된다. 새 에라는 규칙과 기록 타입을 추가할 수 있다. 그러나 결코 활성화 높이 아래에 있는 기존 블록의 의미를 바꾸지 않는다.
| 에라 | 활성화 시점 | 존재하는 것 |
|---|---|---|
| 0 — 채굴과 결제 | 블록 0 | Nakamoto 규칙 아래의 작업증명. 네이티브 자산 (논문 §5). 일회성 주소와 영구 주소. 두 개의 수수료 시장. 보조금 분할. 적립되는 봉인된 트레저리 (treasury) |
| 1 — 머신 | 높이 80,640 (28 에포크, 약 한 달) | cEVM과 표준 라이브러리 (논문 §6). 시퀀서와 관리자를 갖춘 컨트랙트 기록. 인텐트, fill, 공동 시퀀싱 (논문 §7). 디렉터리. 강제 경로 (논문 §8) |
| 2 — 지분증명 | 본딩: 에포크 182 (높이 524,160, 2027년 4월 7일). 램프: 활성 지분 ≥ 공급량의 10%가 30 에포크 동안 유지될 때, 늦어도 에포크 273 (2027년 7월 7일). 전환: 램프가 완료된 다음 에포크의 첫 블록. 관문이 한 번도 일시 정지시키지 않으면 늦어도 에포크 363 (2027년 10월 5일) | BOND, UNBOND, DELEGATE. 램프 동안에는 추첨된 스테이커가 공동 서명한 채굴 블록. 전환부터는 지분만으로 생산되는 5초 슬롯, 작업증명은 퇴역 (논문 §11) |
| S — 기밀 결제 | 독립적인 감사와 적대적인 공개 testnet을 거친 뒤 | 숨겨진 금액과 일회용 주소 |
에라 2와 S는 각각 명세, 적대적 devnet, 검토를 갖추어 하드 포크를 통해 자체 릴리스로 배포된다. 에라 2는 높이에 따라 본딩을 열고, 기한이 있는 지분 조건으로 램프를 시작하며, 램프가 완료되면 전환한다. 전환이 일어날 수 있는 가장 이른 시점은 에포크 303 (10개월 차) 이며, 시작 기한은 9개월 차가 끝날 때까지 램프가 진행 중임을 보장한다. 10% 문턱에서 지분은 위임분을 포함한 활성 지분이고 공급량은 발행된 코인이며, 둘 다 에포크가 열릴 때의 값이다. 관문은 전환을 에포크 363 이후로 일시 정지시킬 수 있다. 관문이 할 수 없는 것은 그것이 시작되지 못하게 막는 일이다.
지분. 최소 본딩은 1,000 ZCD이며, 지분은 본딩된 지 한 에포크 뒤에 참여한다. 위임만 하는 본딩은 에라의 릴리스가 정하는 더 작은 최솟값을 가지며, 결코 위임자의 보관을 떠나지 않는다. 최솟값이 달러가 아니라 ZCD로 표시되는 것은 어떤 규칙도 가격을 읽을 수 없기 때문이다. 최솟값은 블록 상한이 커짐에 따라 에라 경계에서 개정된다.
에라 0은 의도적으로 아주 작고, 에라 1은 설계에 필요한 것으로 축소되어 있다. 관리자 키가 없으므로 일시 정지 버튼도 없으며, 따라서 모든 합의 코드 한 줄 한 줄은 구제책 없이 네트워크를 죽일 수 있는 한 줄이다. 도달할 수 없는 합의 코드는 감사할 수 없는 합의 코드이며 제공되지 않는다. 그 복잡성만큼의 가치를 증명하지 못한 에라는 결코 발동되지 않는다.
폴드가 누가 정렬하는지에 대해 무관하므로 이행은 다루기 쉽다. 에라 2는 헤더에 누구의 서명이 있는지를 바꾼다.
에라 1 관문. 관문 블록은 그 에라의 컴파일된 상수를 프로토콜 셀에 쓰므로, 그때부터 상태 루트가 그것에 확약한다. 관문 이후 처음 240블록 동안, SETSEQ를 실행하는 인증서는 관문으로부터 적어도 240블록 뒤까지의 TTL을 지녀야 하며 그것이 범위 안에 들어올 때까지 기다려야 한다.
에라 2와 시간을 측정하는 높이. 전환 이후 높이는 여섯 배 빠르게 전진한다. 실제로는 기간인 모든 제네시스 블록 상수 (창립자 몫의 종료, coinbase 성숙 기간, 최대 TTL, 인텐트 창, 되돌리기 깊이, 중앙값 시각 창, 디렉터리 항목의 수명) 는 에라 2가 그것이 측정하는 단위로 읽는다. 높이 3,153,600은 2,880블록짜리 에포크 1,095개이며, 이 에라는 창립자 몫을 에포크 1,095에 끝낸다. 제네시스 블록 파라미터 표는 바뀌지 않는다. 합의 루트가 모든 파라미터를 순회하므로, 하나를 옮기면 운영 중인 모든 네트워크의 제네시스 블록 id가 옮겨지기 때문이다. 이 에라의 상수는 에라 1의 것처럼 컴파일된다.
7. 파라미터#
파라미터 집합은 제네시스 블록에서 동결되고, 컴파일 시 모든 바이너리에 내장되며, 하드 포크에 의해서만 변경될 수 있다. 그 합의 루트는 모든 서명에 들어간다. zcd params는 빌드의 컴파일된 값을 출력하고, zcd genesis는 네트워크, 체인 id, 파라미터 해시, 제네시스 블록 id, 상태 루트를 출력한다.
| 파라미터 | Mainnet 값 |
|---|---|
| 체인 id | 1 |
| 제네시스 블록 시각 | 1791331200 (2026-10-07 00:00 UTC) |
| 블록 간격 | 30 s |
| 에포크 | 2,880블록 |
| 작업 엔진 | RandomX v2 |
| 난이도 창 | 90블록, LWMA |
| 제네시스 블록 보조금 | 21 ZCD |
| 꼬리 보조금 | 0.33 ZCD |
| 감쇠 제수 | 에포크당 1054 |
| 발행 램프 | 86,400블록 |
| 생산자 / 창립자 / 트레저리 (treasury) | 94% / 3% / 3% |
| 창립자 몫의 종료 | 높이 3,153,600 (에라 2는 에포크 1,095로 읽음) |
| coinbase 성숙 기간 | 240블록 |
| 최대 TTL | 240블록 |
| 건너뜀 (skip) 수수료 | 1,000,000 drops |
| 인증서당 최대 읽기 / 쓰기 / 서명 수 | 64 / 64 / 16 |
| 송금당 이동 수 | 32 |
| 인증서당 퇴역 주소 수 | 64 |
| 순차 gas 목표치 | 1,600,000 |
| 순차 목표치 상한 | 5,120,000 |
| 병렬 gas 비율 | 3×: 병렬 목표치 3T, 상한 6T |
| 블록당 인증서 수 | 제네시스 블록에서 4,000 |
| 블록당 서명 수 | 제네시스 블록에서 6,000 |
| 블록 바이트 | 제네시스 블록에서 2.5 MB, 용량 8 MB |
| 상한 증가 / 감쇠 제수 | 512 / 1024 |
| 건전성 관문 | 인용된 경쟁 헤더 2% |
| 초기 기본 수수료, 순차 / 병렬 | 1000 / 10 |
| 기본 수수료 단계 | 블록당 1/8 |
| 블록당 인용 수 | 4 |
| 되돌리기 깊이 | 1,024블록 |
| 미래 시각 한도 | 180 s |
| 중앙값 시각 블록 수 | 11 |
| 에라 1 (h1_vm) | 80,640 |
| 지분증명을 위해 예약된 높이 | 1,576,800 (제네시스 블록에서 고정됨. 어떤 규칙도 읽지 않음) |
에라 1 상수는 파라미터가 아니라 컴파일된 값이다. 합의 루트가 모든 파라미터를 순회하므로, 파라미터를 하나 추가하면 운영 중인 모든 네트워크의 제네시스 블록 id가 바뀌기 때문이다.
| 상수 (에라 1) | 값 |
|---|---|
| 인텐트 (intent) 창 (TTL − NotBefore) | 최대 8블록 |
| 블록당 강제 인증서 수 | 16 |
| 인증서당 강제 병렬 예산 | 4,000 도출 단위 (머신 gas 200,000) |
| 디렉터리 항목의 수명 | 259,200블록 (약 90일) |
| fill당 서명자 수 | 최대 16 |
에라 2 상수도 같은 이유로 컴파일된다.
| 상수 (에라 2) | 값 |
|---|---|
| 본딩 시작 | 에포크 182 |
| 램프 시작 | 30 에포크 동안 활성 지분 ≥ 공급량의 10%. 늦어도 에포크 273 |
| 램프 길이 | 관문을 통과하는 90 에포크. k는 1에서 시작해 에포크마다 늘어나며, 스테이커의 비율은 k/180 |
| 램프 관문 | 그 에포크 블록의 90%가 서명되고, 활성 지분 ≥ 공급량의 10% |
| 램프 동안 서명 없는 블록 | 유효한 블록임. 그 블록의 보조금 생산자 몫과 우선 수수료는 소각됨. 작업량이 같으면 서명된 블록이 이김 |
| 전환 이후의 슬롯 간격 | 5 s |
| 전환 이후의 에포크 | 17,280 슬롯 |
| 전환 이후의 블록당 보조금 | E(n)/6, drops 단위로 내림 (제네시스 블록 곡선에서 3.5 ZCD, 꼬리 0.055). 빈 슬롯은 아무것도 지급하지 않음 |
| 전환 이후의 coinbase 성숙 기간과 최대 TTL | 1,440블록. 전환 높이 S 위에 있는 성숙 기간, TTL 또는 디렉터리 만료 높이 x는 S + 6·(x − S)가 됨 |
| 전환 이후의 인텐트 창 | 최대 48블록 |
| 전환 이후의 중앙값 시각 블록 수 | 67 |
| 전환 이후의 되돌리기 깊이 | 6,144블록 |
| 전환 이후의 디렉터리 항목 수명 | 1,555,200블록 |
| 전환 이후의 블록당 상한 | 순차 목표치와 그 하한 및 최대치를 6으로 나누어 내림. 인증서, 서명, 바이트 한도는 제네시스 블록에서처럼 T를 따르며, 그 최대치는 6으로 나눔 |
| 전환 이후의 블록당 강제 인증서 수 | 2 |
| 권장 최종성 대기 | 전환 전 20블록, 전환 후 120블록 (10분) |
| 창립자 몫의 종료 | 에포크 1,095 |
| 최소 본딩 | 1,000 ZCD |
| 본딩과 참여 사이의 지연 | 1 에포크 |
| 최소 위임 | 미정. 최소 본딩 미만 |
| 출금 지연 | 미정. 시행 중인 에라의 되돌리기 지평보다 김 |
| 소각된 본딩 중 신고자에게 지급되는 비율 | 미정. 50% 미만 |
| 최소 풀 마진 | 미정 |
| 추첨 함수와 시드 출처 | 미정 |