Zycord: 자기 증명 상태 전이의 P2P 네트워크
이 페이지는 기계가 번역했으며 검수를 거치지 않았습니다. 영문과 어긋나는 부분이 있다면 프로토콜이 말하는 바는 영문 쪽입니다. 정본으로 보관된 기록은 doi:10.5281/zenodo.22167490이며, 영문 본문은 zycord.com/docs/whitepaper/에 있습니다.
Zycord: 자기 증명 상태 전이의 P2P 네트워크. 저자 Simstoshi, v1.0, 2026년. 모든 트랜잭션은 자신이 읽은 상태와 쓴 상태를 함께 지니므로, 그것을 검증하는 일은 그 바이트만의 순수 함수가 된다 — 디스크도, 이력도, 신뢰도, 병렬성의 한계도 없다.
주요 블록체인은 모두 모든 노드가 공유된 전역 상태를 대상으로 모든 트랜잭션을 재실행하게 하는 방식으로 확장한다. 처리량이 늘어나면 노드 요구 사양도 함께 늘어나고, 네트워크는 중앙화된다. 우리는 자기 증명 상태 전이로 구성된 원장을 제안한다. 각 트랜잭션은 자신이 읽은 상태와 쓴 상태를 함께 지니므로, 그것을 검증하는 일은 그 바이트만의 순수 함수다. 디스크도, 이력도, 신뢰도, 병렬성의 한계도 없다. 체인 자체는 결코 실행하지 않는다. 체인은 인증서 (certificate) 를 정렬하고, 선언된 입력이 여전히 성립하는 인증서를 적용하며 나머지는 건너뜀 (skip) 처리하는 결정론적 폴드 (fold) 로 그것들을 확정한다. 건너뜀은 실패가 아니라 값이 매겨진 사건이다. 모든 인증서는 그것이 낡아지는 위험을 보장하는 당사자가 인수하므로, 충돌에는 책임자가 있고, 이중 서명은 객관적으로 슬래싱 대상이 되며, 스팸은 구조적으로 비싸다. 컨트랙트는 저장 슬롯마다 접근이 정확한 읽기인지, 가드 방식인지, 교환 가능한지를 선언한다. 따라서 결제, 팁, 발행은 결코 경합하지 않는다. 수수료는 두 시장으로 갈라지는데, 하나는 희소한 자원인 순차적 상태 변경을 위한 것이고 다른 하나는 희소하지 않은 병렬 검증을 위한 것이다. 따라서 무거운 암호 연산은 설계상 저렴하다. 이 성질이 기밀 결제를 가능하게 한다 — 공개된 트랜잭션 그래프 위에서 금액을 숨기고 일회용 수취인 주소를 쓰는 방식으로, 그 암호 연산 비용은 전부 병렬 시장에 떨어지고 인플레이션 위험은 사후 감사에 그치지 않고 폴드 규칙이 차폐 풀의 잔액으로 한정한다. 순차적인 것은 확정뿐이며, 확정은 메모리를 도는 루프다. 출시 시점에는 모든 노드가 모든 것을 저렴하게, 그리고 병렬로 검증한다. 검증이 반복이 아니라 표본 추출로 바뀌고 나면, 네트워크가 커질수록 노드당 비용은 떨어진다.
이 문서의 인용. 보관된, 버전이 매겨진 정본 기록은
doi:10.5281/zenodo.22167490이다.
PDF가 이 사이트에서 제공되며,
프로젝트 키 E724 39CE DD85 11F9 D607 550B 87FD 60D5 EB4A 0B29. 아래 본문이 바로 그 문서 전문이다.
백서는 논증이다. 프로토콜이 아니다. 이 본문과 규범적 표면이 어긋나는 곳에서는 규범적 표면이 이기며 그 불일치는 버그다. 프로토콜은 파라미터 파일과 골든 벡터이고, 피어 계층의 요구 사항은 와이어 명세에 있다. 레퍼런스 노드가 이 모든 것을 어떻게 구현하는지 설명하는 엔지니어링 동반 문서는 아키텍처다.
1. 서론#
오늘날의 블록체인 노드는 서로 공통점이 없는 세 가지 일을 한다. 데이터를 전파하고, 계산을 검증하며, 상태를 변경한다. 데이터는 대역폭에 따라 확장된다. 검증은 코어 수에 따라 확장된다. 트랜잭션을 독립적으로 검사할 수 있다면 검증은 민망할 만큼 병렬적이다. 상태 변경만이 진정으로 순차적인 자원이다. 어딘가에는 쓰기의 권위 있는 단일 이력이 존재해야 한다.
기존 설계는 이 셋을 모두 뒤엉키게 한다. 지배적인 모델에서 노드는 전역 상태를 보유하지 않고서는 트랜잭션을 검증할 수 없으므로, 검증은 상태의 확장 한계를 그대로 물려받는다. 그리고 단일 gas 시장이 이 세 자원을 한꺼번에 가격 매기기 때문에, 서명 검사가 저장 쓰기와 같은 경매에서 경쟁한다. 최근의 고성능 체인들은 노드 내부에서 실행을 병렬화하지만, 여전히 모든 노드가 모든 것을 재실행하고, 구속 조건은 상태 I/O가 된다. 그동안의 답은 점점 더 큰 기계였고, 이는 곧 점점 더 적은 노드를 뜻했다.
이 논문은 반대 경로를 택한다. 우리는 공유 상태를 대상으로 실행을 병렬화하지 않는다. 우리는 병렬 경로에서 상태를 통째로 제거한다. 트랜잭션은 자신의 입력과 출력을 함께 지니는 인증서 (certificate)가 된다. 그것을 검증하는 일은 그 바이트만의 순수 함수다. 체인의 일은 인증서를 정렬하고 그 위에서 결정론적 폴드 (fold) 를 돌리는 것으로 줄어든다 — 인증서당 상태를 정확히 한 번 건드리는 비교와 덧셈의 루프다. 충돌은 블록을 무효로 만들지 않는다. 충돌은 개별 인증서가 건너뜀 처리되게 하며, 모든 건너뜀은 채권을 건 인수인 (underwriter) 에게 청구된다. 동시성은 실행 시점에 발견되는 것이 아니다. 동시성은 컨트랙트 작성자가 슬롯 단위로 선언하는 것이다.
이어지는 절들은 인증서 (§2), 폴드 (§3), 타입이 지정된 상태 접근 (§4), 보험 경제 (§5), 애플리케이션 시퀀서 (§6), 검열 저항성 (§7), 이중 수수료 시장 (§8), 사기 증명과 표본 추출로 가는 길 (§9), 가상 머신 (§10), 머신 없는 네이티브 자산 (§11), 기밀 결제 (§12), 네트워킹 (§13), 3에라 (Era) 출시와 그 트레저리 (treasury) (§14), 그리고 레퍼런스 구현에서 얻은 측정값 (§15) 을 정의한다.
2. 상태 전이 인증서#
인증서 (certificate)는 Zycord의 유일한 트랜잭션 타입이다:
Certificate {
reads: [(slot, access, operand)] // declared inputs
writes: [(slot, op, value)] // declared outputs
program: bytes // code or native-op reference
sigs: [signature] // spending authority
underwriter: (id, sig, seq) // who insures it (§5)
ttl: height // valid if committed by this height
fee: (seq_gas_bid, par_gas_bid) // two markets (§8)
}
슬롯은 (address, word)이다. 인증서는 세 가지 검사를 통과하면 유효한 것이며, 그중 어느 것도 상태를 필요로 하지 않는다:
- 모든
sig는 자신이 소비하는 셀 (cell) 에 대한 권한을 부여한다; - 인수인 서명이
(certificate, ttl)에 대해 올바른 형식을 갖춘다; - 선언된
reads에 대해program을 재실행하면 선언된writes가 정확히 산출된다. 서명은 정규 형식이어야 하며, 이는 라이브러리의 예의범절이 아니라 합의 규칙이다. 인증서의 id는 그 권한 부여 필드들 — reads, writes, program, underwriter, ttl, 그리고 수수료 입찰 — 의 해시다. 서명은 그 안에 들어가지 않으며, 그 이유는 다음 문단이 말한다. 그 id를 키로 하는 확인 집합 (seen set) 이 재전송 방어의 전부다. 수수료는 중계 선호가 아니라 권한 부여 필드이며, 그 구별은 화폐적이다. 입찰이란 서명자가 비용에 동의하는 행위이므로, id 바깥의 입찰은 전송 중 누구든 고쳐 쓸 수 있는 입찰이 된다 — 기본 수수료를 통해 발신자의 잔액을 태우도록 부풀리거나, 인증서를 모든 블록에서 배제하도록 0으로 만들 수 있다. 인증서가 무엇을 지불하는지는 그 서명자가 권한을 부여한 것의 일부이며, id가 그렇게 말한다. 정규성이 사주는 것은 id보다 좁지만 여전히 합의 규칙이다. 하나의 서명에 두 가지 인코딩을 허용하는 방식은 하나의 인증서에 두 개의 실체 (exemplar) 를 허용하는 것이고, 그중 어느 쪽이 검증되는지를 두고 의견이 갈리는 두 구현은 어느 쪽도 무효라고 부를 수 없는 인증서 위에서 갈라선 것이다. 그것을 막는 규칙은 한 문장이다. 정규가 아닌 서명 인코딩은 무효이며, 그런 것을 받아들이는 검증기를 가진 구현은 이 프로토콜의 구현이 아니다. 건전한 방식은 이미 그런 인코딩을 거부한다. 이것을 적어 두는 이유는 그렇게 하지 않는 방식들 또한 널리 쓰이고 있고, 그중 하나에 손을 뻗은 독립 구현은 자기 테스트로는 결코 드러나지 않을 방식으로 갈라서게 되기 때문이다.
무작위화된 증시(證示)는 예외이며, 그 예외는 인코딩의 문제가 아니라 구조적인 것이다. 범위 증명 (§12) 은 무작위화되어 있다. 하나의 진술에 대해 증명자가 논스를 고르므로, 하나의 진술에는 무한히 많은 유효한 증명이 있고 모두가 정규 형식이며, 거부할 비정규 인코딩이란 것이 없다. 하나의 진술에 대한 두 개의 유효한 증명은 한 증명의 두 인코딩이 아니다. 그것은 두 개의 증명이고, 개봉값을 쥔 수취인은 언제든 새 증명을 만들어 낼 수 있다. 따라서 정규성은 여기에 미치지 않는다. 서명이 바로 그런 것 중 하나이며, 이는 그것이 이국적인 축에 들지 않기 때문에 놓치기 쉽다. Ed25519는 Schnorr 지식 증명이다. 서명자가 논스를 고르고, 같은 메시지에 대해 논스마다 서로 다른 서명이 나오며, 각각이 유효하고 각각이 완벽하게 정규 형식이다. 결정론적 논스 도출은 어떤 검증자도 검사할 수 없고 어떤 인코딩 규칙도 강제할 수 없는, 서명자를 위한 규칙이다. 모든 논스 점은 다른 어떤 점과 마찬가지로 정규적으로 인코딩 가능한 점이기 때문이다. 그러므로 하나의 권한 부여에는 무한히 많은 서명이 있고, 그것들을 포괄하는 id라면 무한히 많은 값을 갖게 된다 — 각각은 인증서가 요구하는 서명자 중 하나만으로도 만들어 낼 수 있고, 나머지 서명은 손대지 않은 채 그대로 실어 나르며, 각각이 저마다의 블록에서 청구될 수 있다. 위협 모델은 증명의 경우보다 좁지만 결론은 같다. 증명은 키를 하나도 갖지 않은 수취인이 재무작위화할 수 있는 반면, 두 번째 서명에는 인증서가 이미 요구하고 있는 키가 필요하다. id는 구조적으로 그 틈을 막는다. id는 인증서가 권한을 부여하는 것에 대해 확약하며 그것이 단지 증시하는 것에는 결코 확약하지 않으므로, 서명도 증명도 똑같이 id의 원상(原像) 바깥으로 다닌다. 다시 서명하거나 재무작위화해도 같은 id가 나오고, 확인 집합 (seen set) 이 중복을 잡아내며, 둘 다 실은 블록은 무효다. 이로써 인증서의 필드는 두 종류로 갈린다 — id가 포괄하고 서명이 서명하는 권한 부여, 그리고 그 어느 쪽도 하지 않는 증거. 이 구분은 기밀 결제를 기다리는 §12만의 관심사가 아니다. 이 구분은 블록 0에서부터 하중을 받는데, 그 시점에 인증서가 지니는 유일한 증거는 그 서명들이기 때문이다. 검증자는 병렬 단계에서 바이트로부터 증거를 검사한 뒤 그것을 버린다. id와 확인 집합과 폴드 (fold) 로 살아남는 것은 권한 부여뿐이다.
이 구분은 id가 더 이상 지지 않는 의무를 하나 만들어 내며, 그것은 운영 중에 발견되는 대신 여기서 명시된다. id의 원상 바깥에 있는 증거는 전송 중 누구든 갈아치울 수 있는 증거다. 인증서를 하나 집어 증명 자리에 쓰레기를 넣고 전파하면 — id는 같고, 실체 (exemplar) 는 이제 무효다. 이로 인해 열리는 두 구멍은 두 규칙이 막는다. 첫째, 블록은 자신이 싣는 증거에 확약한다. 블록의 인증서 목록은 실체 해시의 목록이다 — 인증서마다 잎 하나씩, 증거를 포함한 인코딩 전체에 대한 해시 — 그러므로 "이 블록은 유효하다"는 블록 스스로 고정한 바이트에 관한 진술로 남는다. id는 이 권한 부여가 청구된 적이 있는가에 답하고, 실체 해시는 이 바이트가 그것을 증명하는가에 답하며, 두 물음은 결코 키를 공유하지 않는다. 증거가 인코딩과 분리될 수 없는 동안에는 — 증거가 서명인 동안에는 그렇다 — 잎 하나로 충분하다. §12의 증명이 증거를 별도의 필드로 만들면 잎은 (id, 증거 해시) 쌍이 되고, 확약은 같은 확약이다. 결코 되어서는 안 되는 것은 id의 목록이다. 그것은 어떤 특정한 증거에도 확약하지 않는 셈이고, 인증서 목록의 루트가 헤더 필드이며 헤더가 작업증명의 원상이므로, 그렇게 되면 증거를 바꿔치는 데 아무 비용도 들지 않으면서 작업은 그대로 서 있게 된다. 이것은 증인 확약 트랜잭션의 선례이며, 그것이 발명된 바로 그 이유로 따르는 것이다. 증거를 포괄하는 id는 가변적이었고, 확약되지 않은 증거를 무시하는 id는 눈이 멀어 있다. 둘째, 중계는 id가 아니라 실체를 다룬다. 증거 검증에 실패한 실체를 받은 노드는 그 실체를 버리되 id에는 아무 불이익도 주지 않는다 — id는 표시되지도, 무효로 캐시되지도 않으며, 나중에 검증에 통과하는 실체가 오면 평소대로 중계된다. 훼손된 사본은 그것을 보내는 대역폭을 훼손자에게 물리고 인증서에는 아무 비용도 물리지 않는다. 제안자의 눈멂은 온전히 유지된다. 제안자는 자신의 무상태 검사가 받아들인 실체를 포함하므로, 잘못된 서명을 포함하도록 유도될 수 없는 것과 마찬가지로 훼손된 증명을 포함하도록도 유도될 수 없고, §3의 단언은 그것이 갖던 뜻을 그대로 유지한다.
유효성은 인증서 바이트의 순수 함수다. 어떤 기계든 그것을 검사할 수 있다. 스레드 풀에서, 다른 컴퓨터에서, GPU에서, 데이터베이스 없이, 이력 없이, 동기화 없이. 서명 검사는 인증서들에 걸쳐 일괄 처리된다. 같은 프로그램에서 나온 인증서들은 단일 명령 다중 스레드 작업으로 묶인다 (§6). 범위 증명 (§12) 은 로그 규모의 한계 비용으로 일괄 처리된다. 이것이 이 논문의 나머지 전부가 딛고 선 성질이다.
유효성만으로는 실행에 충분하지 않다. 두 개의 유효한 인증서가 같은 슬롯에 대해 같은 입력값을 선언할 수 있고, 그중 많아야 하나만 효력을 가질 수 있다. 그래서 우리는 고전적인 트랜잭션 유효성 개념을 둘로 나눈다. 유효한 (무상태, 병렬, 누구나 검사) 과 적용 가능한 (상태 의존, 순차, 원장에서의 위치로만 결정) 이다. 다음 절은 두 번째 술어를 정의한다.
3. 폴드로서의 원장#
블록은 헤더 하나, 인증서 해시의 순서 있는 목록, 그리고 인증서 본문 자체를 담는다. 본문은 체인 데이터다. 블록은 그 본문이 가용할 때에만 유효하다 (§13). 블록의 제안자는 아무것도 실행하지 않으며 어떤 애플리케이션 상태도 보유하지 않는다. 제안자는 바이트 그 자체로부터 유효성을 검사할 수 있는 바이트를 정렬할 뿐이다. 제안자가 완전히 무상태인 것은 아니며, 그 예외는 뭉뚱그리기보다 짚어 둘 만하다. 제안자는 TTL 창 안에서 확인된 인증서 id의 집합을 지녀야 하는데, 하나를 두 번 포함하면 블록이 무효가 되고 아무도 실수로 그렇게 유도될 수는 없어야 하기 때문이다. 그 집합은 TTL로 한정되고 가지치기가 가능하며, 그래서 TTL은 중계 선호가 아니라 합의 파라미터다. 제안은 의도적으로 값싸고 우둔하며, 의도적으로 눈먼 것은 아니다.
체인의 상태는 순서 있는 인증서들에 대한 폴드 (fold) 로 정의된다:
apply_block(S, B):
assert bodies_available(B)
assert ∀c: height ≤ c.ttl ∧ ¬seen(c.id) // an expired or replayed certificate
// makes the BLOCK invalid: a signature
// is billable at most once, and never at
// a position its signer could not avoid
C ← sort(B.certs, key = (underwriter.id, underwriter.seq, c.id))
for c in C:
if leased(S, c): bill(c, LEASED); mark_seen(c.id, c.ttl); continue // §7; Era 1 only
ok ← true
for (slot, access, x) in c.reads:
EXACT: ok ← ok ∧ (S[slot] = x)
GUARD: ok ← ok ∧ pred_x(S[slot])
if ¬ok: bill(c, STALE); mark_seen(c.id, c.ttl); continue
w ← stage(S, c.writes) // a target whose address is spent, or a delta that would
// over- or underflow, fails HERE — nothing has landed yet
if w = ⊥: bill(c, STALE); mark_seen(c.id, c.ttl); continue
commit(S, w); settle_fees(c); mark_seen(c.id, c.ttl)
쓰기는 검사되며, 그중 어느 것도 반영되기 전에 검사된다. 이 스케치의 앞선 초안은 쓰기 집합을 조건 없이 적용했는데, 그러면 마치 입금이 사용된 셀을 되살릴 수 있고 델타가 순환할 수 있는 것처럼 읽혔다. 둘 다 사실이 아니고 둘 다 치명적이므로, 준비 단계는 명세에 미루지 않고 이제 스케치 안에 들어 있다. 산술은 그것이 나타나는 모든 곳에서 검사된다. 2²⁵⁶를 넘어가거나 0 아래로 내려가는 델타는 인증서를 순환시키는 대신 건너뜀 처리하며, 이것이 무제한의 동시 발행 아래에서도 §11의 공급 상한이 유지되는 이유이기도 하다. 권한이 소각된 주소에 대한 쓰기는 조용히 사라지는 대신 소리 내어 실패한다 — 영구적인 사용된 주소 레지스트리가 존재하는 이유가 바로 그것이며, §5의 귀속 정리에 있는 유일한 예외의 출처다.
**leased는 에라 (Era) 1의 기구이며 제네시스 블록에는 존재하지 않는다.** 이 절이 프로토콜 전체의 폴드를 규정하기 때문에 여기 실었을 뿐, 출시 에라에는 리스도, 강제 큐도, 그것으로 방어할 공동 서명자도 없으므로 제네시스 바이너리에서 그 분기는 도달 불가능하다 — 그리고 도달 불가능한 합의 코드는 감사 불가능한 합의 코드이므로, 출하되지 않는다. 열린 질문 하나를 덮지 않고 표시해 둔다. 지금 쓰인 대로라면 LEASED는 서명자가 예견할 수 없었던 위치에서 인증서에 요금을 청구하는데, 이는 네 줄 위의 단언이 금하는 바로 그것이다. 그 결과가 요금을 청구하지 않도록 하거나, 아니면 블록을 무효화해야 한다. 그 선택은 리스를 도입하는 에라의 몫이며, 그 에라가 이 모순을 조용히 물려받지 않도록 여기에 기록해 둔다.
명시해 둘 만한 성질들:
건너뜀 (skip) 은 실패가 아니라 의미론이다. 읽기가 더 이상 성립하지 않는 인증서는 건너뜀 처리되고, 그 건너뜀 수수료는 인수인 (underwriter) 에게 청구되며 (§5), 블록은 유효하게 남는다. 포함과 적용은 다른 사건이다. 이것이 제안자가 눈멀 수 있게 하는 것이다. 제안자는 낡은 인증서를 포함시킴으로써 무효한 블록을 만들어 낼 수 없다.
결정성. 모든 노드는 동일한 블록 열로부터 동일한 상태를 도출한다. 정렬 키 (underwriter, seq, certificate id)는 블록 내용에 대한 전순서이므로, 폴드는 제안자가 서로 다른 인수인의 인증서를 어떻게 끼워 넣었는지에 무감각하다 — 그리고 제안자에게는 어떤 재량도 남기지 않으며, 한 인수인이 같은 seq로 서명한 두 인증서 사이에서조차 그렇다. 한 인수인 자신의 파이프라인 (seq 오름차순) 은 제안자가 어떤 순서로 제출했든 서명된 순서대로 확정된다.
인증서당 정확히 한 번의 상태 접촉. 폴드 (fold) 는 뜨거운 키-값 작업 집합 위에서 비교와 덧셈과 쓰기를 수행한다. 코드 실행도, 서명 검증도, 재실행도 없다. 그 모두는 유효성 검사 도중에 이미 병렬로 일어났다.
그리고 타원곡선 연산도 없다. 기밀 결제 (§12) 는 Pedersen 확약을 슬롯 값에 넣고, 확약은 곡선 위의 점이다. 이 방식은 준동형적이고 두 확약의 합은 의미를 가지므로, 폴드에게 그것들을 더하라고 권하는 셈이다. 폴드는 거절한다. 점 덧셈은 u256 덧셈의 ~1 ns에 견주어 수백 나노초가 들고, 유일한 순차 단계에서의 EC 연산 하나가 이 아키텍처가 지키는 예산을 다 써 버릴 것이다. 폴드는 확약 바이트를 새 셀 (cell) 에 저장하고 그것들의 동일성을 비교할 뿐이다 — 둘 다 메모리 연산이다. 모든 곡선 연산은 병렬 단계에서나 소유자의 지갑에서 일어난다 (§12). 아래의 해싱도 같은 규율의 지배를 받는다.
암호 연산 한 조각은 제거되지 않았으며, 그렇지 않다고 주장하는 것은 너무 편리한 일일 것이다. 인증서 (certificate) 의 id는 그 권한 부여 필드들의 해시이고 (§2), 확인 집합 (seen set) 은 그 id를 키로 삼으므로, 누군가는 그것을 계산해야 한다. 중요한 것은 어디에서이며, 답은 그것이 여기일 필요는 없다는 것이다. id는 인증서의 바이트에만 의존하고 그 밖의 무엇에도 의존하지 않는다 — 상태도, 순서도, 위치도 아니다 — 그래서 id는 병렬 단계에서 서명 검사와 나란히 계산되어, 인증서 자체와 똑같이 폴드로 실려 들어간다. 그 대신 순차 루프에서 그것을 다시 계산하는 구현은, 메모리에 관한 것이어야 할 단계를 해싱이 지배하는 광경을 보게 될 것이다. 이는 저지르기 쉬운 실수이므로 짚어 둘 만하다. 여기서 무엇이 제거되고 무엇이 제거되지 않는지에 대해 우리는 정확하고자 한다. 폴드는 여전히 전체 상태에 대해, 선언된 슬롯당 한 번씩 임의 접근을 수행하며, 확정하는 노드는 여전히 그 상태를 보유한다. 순차 경로를 떠나는 것은 통상적인 체인에서 그 접근을 둘러싸고 있던 모든 것이다 — 해석, 서명 검사, 해싱, Merkle화된 저장소의 연산별 인증 — 그래서 상태는 평평한 테이블에 놓일 수 있고 이 시스템의 유일한 순차 단계는 메모리를 도는 촘촘한 루프가 된다. 레퍼런스 폴드는 10코어 x86 데스크톱에서 코어당 초당 883,000회의 슬롯 연산을 지속한다 (§15). 그리고 그것이 병렬화되지 않는 유일한 단계다.
버전이 아니라 값의 동일성. 적용 가능성은 버전 카운터가 아니라 선언된 읽기 값을 비교한다. 실행이 읽기 집합의 순수 함수이므로, 바뀌었다가 도로 돌아온 슬롯 (ABA 사례) 도 여전히 적용 가능한 상태다. 지금 그 인증서를 적용하는 것은 그때 실행했던 것과 의미론적으로 동일하다. 따라서 이 시스템은 버전 기반 동시성 제어보다 엄격히 더 드물게 건너뜀 처리한다. 확약을 값으로 갖는 슬롯의 경우 비교는 확약의 바이트 동일성이다. 불투명하고, 정확하며, §4의 정규성 조건이 강제되기만 하면 똑같이 저렴하다.
재전송과 단일 청구. 인증서의 id는 그것이 권한을 부여하는 것의 해시이지 그 권한 부여를 증시하는 서명들의 해시가 결코 아니며 (§2), 적용된 인증서 와 청구된 채 건너뜀 처리된 인증서 모두 확인된 것으로 표시된다. 이 구별이 규칙을 규칙이게 한다. 하나의 본문을 새 논스로 다시 서명한 서명자는 같은 id를 만들어 내므로, 확인 집합이 그 사본에 요금을 매기는 대신 잡아낸다. 이미 확인되었거나 만료된 인증서를 포함하면 블록이 무효가 된다 — 그러므로 서명은 많아야 한 번 청구 가능하며, 그것도 그 서명자가 서명함으로써 받아들인 위치에서만 그렇다. 이 규칙이 없다면 블록 생산자는 남의 인증서를 다시 포함시키거나 고의로 지연시켜 그 인수인 (underwriter) 의 자금을 태울 수 있을 것이다. TTL은 합의로 한정되므로 확인 집합은 가지치기 가능한 상태로 남는다.
4. 타입이 지정된 상태 접근#
정확한 읽기만 지원하는 폴드는 인기 있는 컨트랙트를 죄다 직렬화할 것이다. 하나의 AMM 풀을 건드리는 천 개의 인증서는 하나의 적용과 999개의 건너뜀을 낳을 것이다. Zycord의 답은 동시성을 컨트랙트 작성자가 슬롯 단위로, 인증서 형식 자체 안에서 선언한다는 것이다. 접근 규율에는 세 가지가 있다:
정확한 읽기. SLOAD 방식이다. 읽기는 슬롯의 값을 계산 안으로 반환하고 인증서를 그 값에 고정한다. 임의의 로직, 뜨거운 슬롯에서의 충돌, 애플리케이션 시퀀서의 영역 (§6).
가드 델타. 인증서는 슬롯에 대한 술어를 단언하되 — balance ≥ 10 — 그 값을 계산 안으로 읽어 들이지 않으며, 부호 있는 델타를 쓴다 — balance += −10. 폴드는 현재 상태에 대해 술어를 검사하고 델타를 적용한다. 같은 슬롯에 대한 가드 출금과 입금은 몇 개든 교환 가능하다. 어떤 순서로든 적용되고, 건너뜀은 오직 가드가 진짜로 실패할 때 (실제 초과 인출) 일어날 뿐, 잔액이 단지 바뀌었다고 해서 일어나지 않는다. 이 규율 하나가 이체, 공급 상한이 있는 발행, 허용량, 볼트 지분을 포괄하며, 이는 곧 온체인 쓰기의 압도적 다수를 뜻한다.
순수 델타. 가드가 없는 부호 있는 델타. 결코 충돌할 수 없고 결코 건너뜀 처리되지 않는다. 팁, 카운터, 누산기, 보상 집계.
이 모델을 건전하게 유지하는 규칙은 이렇다. 가드 값은 계산으로 흘러들어서는 안 된다. 단언은 아무것도 반환하지 않고, 델타는 아무것도 읽지 않는다. 따라서 재실행은 선언된 읽기의 순수 함수로 남고, 무상태 유효성 (§2) 이 보존된다. 이 착상의 계보는 오래되고 탄탄하다. 데이터베이스의 에스크로 트랜잭션, 트랜잭셔널 부스팅, CRDT [9][10][11]. 그러나 기존 체인들은 기껏해야 한 노드의 스케줄러 내부에서 교환성을 활용할 뿐이다. Zycord는 그것을 노드 사이의 동시성 계약으로 삼고, 인증서 형식으로 강제하며, 보험 경제로 가격을 매긴다.
같은 등급의 두 번째 규칙은 §12가 강제하는 것이다. 숨겨진 값을 담은 슬롯은 제3자의 가드를 허용하지 않는다. 비밀이어야 할 잔액에 대해 결과가 공개적으로 관측되는 — 적용되었거나 건너뜀 처리되었거나 — 가드는 잔액 신탁이다. balance ≥ x를 제출하고, 폴드를 지켜보고, 이분하면, log₂(balance) 번의 시도로 확약을 한 번도 열지 않은 채 그 수를 읽어 낸다. 해법은 통계적인 것이 아니라 구조적인 것이다. 숨겨진 값은 소유자의 서명으로만 사용할 수 있는 일회성 셀 안에서만 산다. 낯선 사람이 슬롯을 안전하게 건드릴 수 있다는 것이 요체인 가드 델타 규율은, 값이 공개된 슬롯에만 쓰인다. 따라서 끌어가는 방식의 결제 — 허용량, 구독, 볼트 일괄 인출 — 는 투명한 레일에만 존재한다 (§12).
그 규칙을 강제하려면 폴드가 숨겨진 슬롯과 공개 슬롯을 구별할 수 있어야 하는데, 평평한 테이블에서는 들여다보는 것만으로는 그럴 수 없다. 압축된 확약과 u256 잔액은 둘 다 32바이트다. 그러므로 숨겨진 값을 담는 셀은 우연히 확약을 담게 된 보통 셀이 아니다. 그것은 별개의 셀 종류이며, 네이티브 차폐 연산 (§12) 으로만 생성되고, 주소 공간의 예약된 도출 가능한 영역에 산다. 그래서 슬롯의 규율은 그 주소의 함수이고 다른 모든 것과 마찬가지로 바이트로부터 검사 가능하다. 이것이 없다면 — 실수로든 악의로든 — 확약 슬롯을 겨냥한 가드 델타는 폴드로 하여금 곡선 점 인코딩에 u256을 더하게 만들 것이다. 산술 검사는 통과하고, 결과는 확약이 아니며, 그 셀은 사용 불가능해진다. 폴드에서 아무것도 실패하지 않은 채 값이 조용히 파괴되는 것이야말로 §3의 준비 단계가 막으려고 존재하는 바이며, 셀 종류가 이 경우도 막을 수 있게 해 주는 것이다.
두 가지 원시 요소가 이 모델을 마저 완성한다:
일회 쓰기 셀. 체인에 한 번도 나타난 적 없는 주소는 ∅ 상태에 있다. 첫 쓰기가 그것을 저장됨으로 옮기고, 그 키의 서명이 그것을 영구히 사용됨으로 옮긴다. 새 셀에 쓰는 것은 정의상 충돌이 없으므로, 새로 도출한 주소로 지불하는 것이 경합 없는 빠른 경로다. 이것이 이 네트워크의 키메라적 유산이다 [8]. 컨트랙트를 위한 계정 방식의 영구 셀과 결제를 위한 UTXO 방식의 일회성 셀이 하나의 원장 안에 있다. 사용된 셀 아래의 값들은 그것을 사용한 블록이 재구성 지평보다 깊이 묻히고 나면 압축될 수 있다 — 확정성 장치가 아니라 확인 수로 센 깊이인데, 출시 에라 (Era) 에는 기다릴 확정성이 없기 때문이다. 그 주소를 사용됨으로 기록하는 레지스트리 항목은 결코 압축되지 않는다. 그것이 주소가 되살아나는 것을 막는 것이며, 그것은 모든 널리파이어 집합 설계와 공유되는, 이 프로토콜의 정직한 미해결 문제다. §12의 스텔스 출력은 이 레일을 그대로 타며, 투명한 결제가 이미 그러는 것과 정확히 같은 속도로 레지스트리를 키운다. 숨겨졌든 아니든, 사용 한 건당 항목 하나다.
0은 부재다. 한 번도 쓰인 적 없는 슬롯과 0이 쓰인 슬롯은 같은 슬롯이다. 0을 쓰면 셀 (cell) 이 삭제되고, 부재한 셀을 읽으면 0이 나온다. 이는 구현상의 편의가 아니라 합의 요구 사항이며, 두 겹으로 하중을 받는다. 이것은 가드나 정확한 읽기가 슬롯이 존재하는지 묻지 않고도 0을 지목할 수 있게 해 준다 — 구분해야 할 세 번째 답이란 없다. 그리고 이것은 상태 루트를 그것을 만들어 낸 이력이 아니라 상태의 함수로 유지해 준다. 비워진 셀이 명시적인 0으로 남아 서성인다면, 서로 다른 경로로 동일한 잔액에 이른 두 노드가 서로 다른 루트에 확약하게 되고, 이는 부기(簿記)로 도래하는 체인 분열이다.
이것은 §12를 제약하며, 날카로운 모서리가 하나 있다. Pedersen 확약 vG + rH는 일반적으로 0 문자열이 아니므로, 숨겨진 잔액은 산술만으로 부재가 되지 않고 소유자 말고는 아무도 그것이 비었는지 알 수 없다. 영구적인 숨겨진 슬롯은 영원히 압축 불가능할 것이고, 이는 차폐 레일이 오직 일회성 셀뿐이며 사용됨으로써 죽는 이유가 하나 더 늘어난 것이다 — 0은 부재라는 원리가 제공할 필요가 애초에 없었던 전이다. 그 모서리란 v = 0, r = 0이 군의 항등원이고, Ristretto 인코딩에서 항등원은 서른두 개의 0 바이트 — 바로 부재를 뜻하는 그 문자열이라는 점이다. 확약은 삭제와 결코 충돌해서는 안 되므로 항등원은 유효한 확약이 아니다. 차폐 연산은 곡선 점이 이미 필요로 하는 정규 인코딩 검사 (비정규 체 원소, 비틀림 성분) 와 나란히 그것을 입구에서 거부하며, 레퍼런스 H는 도출 과정이 공개된 NUMS 점이다. "바이트 동일성은 정확하다" (§3) 는 이 조건들이 성립할 때에만 점에 관한 주장이 된다.
에포크 비컨. 프로그램은 주변값 (타임스탬프, 높이) 을 직접 읽어서는 안 된다. 그렇게 하면 실행이 선언된 읽기가 아닌 다른 무엇의 함수가 되어 버린다. 대신 프로토콜은 에포크마다 한 번씩 예약된 슬롯에 에포크 비컨을 써 넣고, 프로그램은 그것을 다른 슬롯과 마찬가지로, 되도록이면 범위 가드 (epoch ∈ [e, e+2]) 와 함께 읽는다. 이로써 블록마다 낡아지는 일 없이 시간 인지가 제공된다.
5. 보험이 적용된 인증서: 모든 충돌에는 책임자가 있다#
건너뜀 (skip) 이 공짜여서는 안 된다. 그렇지 않으면 멤풀이 잠긴다. 공격자는 같은 입력에 대해 수천 개의 유효한 인증서 (certificate) 를 게시해 블록을 채우고 하나의 값만 치를 수 있을 것이다. 그러나 건너뜀 처리된 인증서들은 발신자의 잔액을 건드린 적이 없으므로 발신자에게 청구할 것이 없다. 수수료 슬롯이 바로 그 낡은 입력이기 때문이다. Zycord의 답은 이렇다. 인수인 (underwriter) 없이는 어떤 인증서도 존재하지 않는다. 인수인이란 채권을 건 자금으로 그것에 답하는 당사자다.
인수되는 방식에는 세 가지가 있으며, 하나의 기제가 세 가지 모습으로 나타난 것이다:
- 자기 보험. 발신자가 아무 제약이 없는 셀에서 소액의 예치금을 붙인다. 미리 리스되는 것은 아무것도 없다. 폴드 (fold) 는 블록 안의 인증서 위치에서 그 예치금을 유보하며 (§3의 스케치는 이 배관을 생략했다), 예치금이 이미 소진된 채로 적용에 이른 인증서는 폐기 (drop) 된다 — 청구되지도, 확인된 것으로 표시되지도 않으며, 새 예치금으로 재제출할 수 있다 — 그래서 정직한 사용자는 자기 예치금 셀에서의 경합으로 아무것도 잃지 않는다. 예치금이 온전한 상태에서의 건너뜀은 그 일부를 태운다. 반면 게시하는 것 자체는 아무 비용도 들지 않으므로, 멤풀은 합의가 아니라 중계 정책으로 한정된다. 노드는 인수인당 보관할 양에 상한을 두며, 이는 Bitcoin 이래 모든 멤풀과 같은 분업이다. 이것이 무허가성의 바닥이다. 누구든 언제나 거래 상대 없이 거래할 수 있다. 이것은 또한 출시 에라 (Era) 의 유일한 방식이며 (§14), 그 덕에 제네시스가 최소한으로 유지된다. 예치금 셀은 공개되어 있고 발신자의 것이므로, 자기 보험은 그것이 서명하는 모든 인증서에 박히는 지속적 식별자가 된다. 투명한 결제에서는 그 결제가 이미 드러내는 것 이상을 드러내지 않지만, 차폐 결제 (§12) 에서는 그것이 값을 치르고 얻은 스텔스 출력을 무위로 돌린다. §12가 공동 서명으로 돌아서는 것은 바로 이 이유에서다.
- 공동 서명. 채권을 건 인수인이 인증서를 최신 상태에 대해 검사하고,
(certificate, ttl, seq)에 공동 서명하며, 건너뜀 책임을 떠맡는다. 그 대가로 인수인은 발신자에게 체인 밖에서 청구할 수 있고, 그 공동 서명 자체가 하나의 상품이다. 인수인 자신의 자본이 뒷받침하는 사전 확인인 것이다. 이 역할의 어느 부분도 인증서가 무엇을 옮기는지 볼 것을 요구하지 않는다. 낡음은 금액이 아니라 셀의 성질이며 — 살아 있거나 사용되었거나 — 그래서 인수인은 차폐 인증서를 투명한 인증서와 똑같이 가격 매기며, 그 가치를 맡아 두는 신뢰를 받지 않는다.
그 약속에서 뭉뚱그려져서는 안 되는 두 가지가 있는데, 이 논문이 전에 그것들을 뭉뚱그린 적이 있기 때문이다. 건너뜀에 대한 프로토콜의 대응은 인수인의 예치금에서 건너뜀 수수료를 태우는 것이다 — 아무에게도 지불되지 않는 벌칙이며, 이것이 건너뜀을 유발해 이득을 보는 일을 막는다. 발신자에게 보상하는 것은 별개의 거래다. 그것은 인수인의 상업적 약속이며, 이 설계는 그것을 합의 기제로 아직 규정하지 않는다. 그것을 합의 기제로 만드는 일은 문구의 문제가 아니다. 공동 서명에 선언된 정책 값, 발신자가 아닌 지정 수익자 (그렇지 않으면 그 상품은 보험 사기로의 초대장이다), 그리고 하나의 채권이 두 번 팔릴 수 없도록 온체인에서 추적되는 총 익스포저가 필요하다. 그것들이 존재하기 전까지 "내 채권이 지불한다"는 인수인이 하는 주장이자 시장이 가격 매기는 대상일 뿐, 폴드가 강제하는 규칙이 아니다. 그리고 이 논문은 그 모호함이 상품을 팔게 놔두는 대신 그렇게 말한다.
- 강제. 검열 저항 경로 (§7) 로, 사용자 예치금으로 인수되며, 유일하게 적용이 보장된다. 경제 구조는 두 종류의 부정행위 사이에서 비대칭적이며, 그 비대칭이 요점이다:
객관적 과실은 슬래싱된다. 한 인수인이 정확한 읽기가 충돌하는 (같은 슬롯, 같은 선언 값, 겹치는 TTL) 두 인증서에 공동 서명하면, 그 두 서명은 그 자체로 완결된 온체인 이중 서명 증명이다. 누구나 그것을 제출할 수 있고, 채권은 슬래싱된다. 마찬가지로 무상태 유효성에 실패하는 인증서 (잘못된 서명, 틀린 실행) 에 공동 서명한 인수인은 순수한 재실행만으로 슬래싱된다. 그 인증서 자체가 사기 증명이다 (§9).
주관적 과실은 결코 슬래싱되지 않는다. 같은 슬롯을 두고 경합한 서로 다른 두 인수인은 증명 가능한 과실을 저지르지 않았다. 폴드 순서상 나중인 쪽이 소액의 건너뜀 수수료를 무는 것이 전부다. 느리거나, 오프라인이거나, 신뢰할 수 없는 인수인은 자금이 아니라 자격과 평판을 잃는다. 지연이 몰수가 되면 네트워크는 죽는다. Zycord는 바이트로부터 증명될 수 있는 것만 몰수한다.
그리고 청구서는 인증서가 지목한 당사자에게 떨어진다. 이 절의 제목은 구호가 아니라 정리이며, 그 가장자리까지 함께 진술할 만하다. 청구된 건너뜀은 언제나 정확히 다음 셋 중 하나다. 실패한 읽기나 쓰기가 그 키로 인증서에 서명한 주소 아래에 있거나, 그것이 같은 자산의 선언된 발행자 — 이 사람 역시 서명했다 — 에 의한 다른 발행과 경합하는 발행이거나, 인증서가 서명된 뒤 그 보유자 자신이 폐지한 (RETIRE, §11) 일회성 주소로의 입금이거나다. 인증서가 지목하지 않은 어떤 당사자도 그것이 청구되게 만들 수 없다. 오직 세 번째 경우만이 청구서를 원인으로부터 떼어 놓으며, 그것은 구조적으로 한정된다. 폐지될 수 있는 것은 일회성 셀뿐이므로 영구 주소를 공개하는 수취인은 아무 표면도 내주지 않는다. 하나의 인증서는 많아야 정해진 수의 주소를 폐지할 수 있으므로 (§13), 한 차례의 폐지 폭주가 건드릴 수 있는 진행 중 결제의 수에는 상한이 있다. 그리고 건너뜀 수수료는 지불되지 않고 태워지므로, 그것을 촉발해서 이득을 보는 사람은 없다.
채권 규모는 하나의 부등식을 따른다. 인수인의 채권은 하나의 TTL 창 안에서 누적할 수 있는 최대 건너뜀 책임을 넘어야 하며, 채권 해제는 사기 증명 창보다 오래 걸려야 한다. 그래야 부정행위를 하고 인출한 뒤 사라지는 일이 불가능해진다.
6. 애플리케이션 시퀀서#
가드 델타는 결제에 대한 경합을 녹여 없앤다. 남는 것은 뜨거운 상태 위의 정확한 읽기 로직이다 — 오더북, AMM 풀 — 여기서는 정직한 두 인수인이 경합하면 여전히 건너뜀이 생긴다. 프로토콜의 답은 컨트랙트가 자신의 직렬화 담당을 고르게 하는 것이다. 컨트랙트는 채권을 건 시퀀서의 키를 온체인에 등록할 수 있고, 그 뒤로는 그 시퀀서가 공동 서명한 인증서만이 그 컨트랙트의 정확한 읽기 경로를 탈 수 있다.
시퀀서는 애플리케이션 팀이 운영하는 평범한 서버이며 — 웹소켓, 큐, 오토스케일링, 그 밖의 어떤 웹2 기구든 — 가용성에 대해서만 신뢰될 뿐, 안전성에 대해서는 결코 신뢰되지 않는다. 시퀀서는 상태를 위조할 수 없다. 구성 중에 입력에 대해 거짓말을 하면 그 인증서 (certificate) 는 정본 폴드 (fold) 에 대해 그냥 건너뜀 처리되고, 그 거짓말은 그 자신의 채권을 비용으로 치른다. 시퀀서가 제공하는 것은 이렇다:
직렬화. 시퀀서는 진행 중인 인증서에 짧은 TTL로 슬롯을 리스해 주고, 각 인증서를 앞선 인증서의 선언된 출력 위에 사슬처럼 잇는다 (공동 서명에 seq로 번호를 매긴다. 폴드의 전순서가 제안자의 뒤섞음과 무관하게 그 파이프라인이 순서대로 확정되도록 보장한다). 뜨거운 슬롯의 경합은 체인에는 보이지 않는, 체인 밖의 스케줄링 문제가 된다.
배치 인증서. 같은 코드 경로를 거치는 N개의 트랜잭션이 읽기/쓰기가 집계된 하나의 인증서로 폴드 (fold) 되고, 내부의 중간 쓰기는 잘려 나가며, N개의 하위 실행이 하나의 SIMT 작업으로 검증된다. GPU 논지가 구체화되는 지점이 여기다. 직렬화하는 주체가 곧 병렬 하드웨어가 원하는 모양으로 작업을 포장하는 주체이며, 그렇게 한 대가를 병렬 gas 시장을 통해 지급받는다 (§8).
원자적 조합 가능성. 두 애플리케이션에 걸치는 트랜잭션은 두 시퀀서가 체인 밖에서 함께 구성하고 (슬롯 리스에 대한 2단계 커밋), 두 공동 서명을 모두 지닌 하나의 인증서로 체인에 올라오며, 구조적으로 원자적이다. 애플리케이션 간 조율은 조율이 값싼 곳에서 일어나고, 체인은 결과만 본다.
정직하게 밝혀 둘 점. 시퀀서는 자기 애플리케이션의 주문 흐름을 가장 먼저 보며, 따라서 그 애플리케이션 MEV의 자연스러운 무대다. Zycord는 그 맞바꿈을 명시한다. 애플리케이션은 자기 MEV를 블록 제안자에게 흘려보내는 대신 스스로 취하고, §7이 그것이 함의하는 권력을 한정한다. 퇴출을 보장하는 바로 그 강제 경로가 추출도 규율한다. 시퀀서의 대우가 마음에 들지 않는 사용자는 지연 시간만 치르고 그것을 통째로 우회할 수 있다.
7. 적용이 보장되는 강제 포함#
문이 시퀀서뿐인 컨트랙트는 그 시퀀서가 검열하면 감옥이다. 그러므로 모든 사용자에게는 누구의 허락도 필요 없는 느린 경로가 있다:
사용자 (또는 아무 릴레이어나) 가 공개된 폴드로부터 상태를 재구성하고, 인증서를 만들고, 예치금을 붙여 강제 큐에 제출한다. 제안자는 큐에 든 인증서를 F 블록 안에 포함시켜야 한다 (§13). 그 포함 위치에서 폴드는 그 읽기를 현재 상태에 대해 검사한다. 성립하면 폴드는 그 슬롯에 결정론적 리스를 부여하고 D 블록 뒤로 적용을 예약한다. 리스가 유효한 동안 그 슬롯을 건드리는 공동 서명 인증서들은 그 뒤로 정렬된다. 따라서 강제 인증서는 건너뜀 처리될 수 없다. 수용은 곧 적용을 함의한다.
유예 기간 D는 정직한 시퀀서의 진행 중 파이프라인 — 그중 리스된 슬롯을 건드리지 않는 부분 — 을 위한 것이다. 그것을 건드리는 것은 무엇이든 공동 서명이든 자기 보험이든 가리지 않고 강제 인증서 뒤로 정렬되며, 이것이 "건너뜀 처리될 수 없다"를 소망이 아니라 참으로 만드는 것이다. 읽기가 유예 기간 내내 보호되는 인증서는 그동안 낡아질 수 없다. 쓰기가 선언되어 있으므로 적용 이후의 상태는 예측 가능하고, 그래서 시퀀서는 아직 적용되지 않은 강제 인증서 위에 확신을 갖고 사슬을 이어 갈 수 있다.
리스는 인증서가 권한을 가진 슬롯만 덮을 수 있다. 이것은 기제가 거저 주지 않는 제약이며, 설계의 나머지는 이것 없이는 살아남지 못한다. 읽기를 선언하는 데는 서명이 필요 없고 — 권한 부여는 쓰기에서만 나온다 — 그래서 이 규칙이 없다면 누구든 남의 슬롯에 걸친 읽기를 선언한 강제 인증서를 큐에 넣어 예치금 값에 그것들을 D 블록 동안 얼려 버릴 수 있다. 컨트랙트별 할당량도 그것을 한정하지 못하는데, 네이티브 결제는 어떤 컨트랙트에도 속하지 않기 때문이다. 그러므로 리스는 인증서가 쓸 자격이 있는 슬롯에 대해서만 허용되며, 이는 폴드가 이미 적용하는 것과 같은 권한 검사를 한 단계 앞당겨 쓰는 것이다.
그 밖의 훼방 방지 한계들. 컨트랙트별·에포크별 할당량, 부과된 비용을 감당하는 예치금, 그리고 리스된 슬롯은 해제될 때까지 추가 강제 진입을 거부한다.
두 가지 귀결이 이것을 기능에서 생존 기제로 끌어올린다. 첫째, 검열이 뒤집힌다. 검열은 검열자에게 비용을 물리고 (잃은 수수료, 우회해 가는 사용자들) 네트워크에는 아무 비용도 물리지 않는다. 둘째, 시퀀서가 사라진 컨트랙트 — 또는 인수인 계층 전체가 공격받은 체인 — 는 강제 전용 모드로 격하된다. 느리고, 비싸고, 살아 있다. 어떤 상태도 고아가 되지 않으며, 어떤 운영자도 안전성의 하중을 지지 않는다. 창시자보다 오래 살도록 설계된 네트워크에서 중요한 성질은 바로 이것이다.
8. 두 시장: 순차 gas와 병렬 gas#
체인은 확장성 등급이 서로 다른 세 자원을 소비하며 — 데이터, 검증, 변경 — 그것들을 한 시장에서 가격 매긴다는 것은 영지식 증명 검증이 저장 쓰기와 경매에서 경쟁한다는 뜻이다. Zycord는 수수료를 서로 독립적인 두 시장으로 나눈다:
순차 gas는 폴드 연산의 값을 매긴다. 읽기 검사, 쓰기, 리스. 이것이 희소한 자원이며, 모든 노드가 순서대로 도는 유일한 루프이고, 그에 걸맞게 가격이 매겨진다.
병렬 gas는 검증의 값을 매긴다. 서명 검사, 재실행 단위, 바이트, 그리고 무거운 프리컴파일 (증명 검증, 서명 집계, 양자 내성 방식). 이것은 풍부하고, 그 공급은 네트워크에 코어와 GPU가 더해질 때마다 자라며, 블록 상한은 높고 저렴하게 잡혀 있다.
두 시장 모두 EIP-1559의 형태를 띠되 [15] 각자의 단위를 쓴다. 기본 수수료는 태워지고 우선 수수료는 블록 생산자에게 지급된다 — 적용되는 인증서에 한해, 오직 그것에만. 건너뜀 처리된 인증서의 수수료는 전액 태워지며 아무에게도 지불되지 않는데, 이는 수수료 산정표의 세부 사항이 아니라 경제 모델 전체의 하중을 지는 규칙이다. 건너뜀이 팁을 준다면, 블록에 무엇이 담길지 고르는 당사자가 남들의 실패를 배치해 준 대가를 받게 되고, 가장 값싸게 버는 길은 작업을 포함시키는 것이 아니라 건너뜀을 경작하는 것이 된다. 태우기가 그것을 뒤집는다. 건너뜀은 상한 공간을 소비하고 아무것도 내놓지 않으므로, 수익을 최대화하는 생산자는 곧 적용을 최대화하고 있는 것이며, 건너뜀을 유발하는 데 대해 단지 무관심한 것이 아니라 적극적으로 반대하게 된다. 순차 기본 수수료를 태우는 것은 그 유일한 희소 루프의 혼잡을 디플레이션적으로 만든다 (§14.2). 병렬 기본 수수료를 태우는 것은 제안자로 하여금 어떤 무거운 인증서가 그 값싼 차선을 채우는지에 무관심하게 유지시키므로, 검증 차선의 우선권은 장부 밖에서 팔릴 수 없다. 이 분리는 다차원 수수료 설계 [18] 의 방향을 따르되, 완전히 분리된 시장까지 밀고 나간 것이다. 두 시장 중 어느 쪽도 결정하지 않는 것은 희소 자원이 얼마나 있어야 하는가이다. 그것은 상한의 문제이며, §8.1이 그것을 움직이는 규칙을 준다.
그 귀결은 불변식으로 진술된 설계 목표다. 무거운 암호 연산은 경제적 구조에 의해 네트워크에 영향을 주지 않는다. 큰 증명을 검증하지만 슬롯 두 개만 쓰는 인증서는 거의 전부를 값싼 시장에서 지불한다. 이로써 Zycord는 단일 시장 체인에는 너무 무거운 암호 프로토콜이 경제성을 갖는 정산 계층으로 자리매김한다. 같은 시장이 작업을 모양 짓는 대가를 시퀀서에게 지급한다. 시퀀서는 N개의 트랜잭션을 하나의 배치 인증서로 모아 그것에 대해 한 번의 병렬 입찰을 지불하고 사용자들에게는 N번 청구한다 — 그 마진이 작업을 SIMT 모양으로 만든 데 대한 수수료다 (§6).
8.1 탄력적 순차 상한#
수수료 시장은 희소성에 값을 매길 뿐, 희소성이 얼마나 있어야 하는지를 결정하지는 않는다. 그 물음에 대한 앞선 두 답은 서로 반대 방향으로 실패했다. 고정된 상한은 채택을 사용자가 지는 경매로 바꾼다. Bitcoin의 블록이 차자 수수료는 50달러를 넘어섰고 평범한 결제는 그저 가격으로 체인에서 밀려났으며, 이득을 본 것은 그 공간을 판 쪽뿐이었다. 수요 없는 열린 상한은 반대 방향으로 실패한다. 대형 블록 포크들은 아무도 쓰지 않는 용량을 사들이고 그 대가를 보안으로 치렀는데, 수수료가 나오는 곳은 여유 공간이 아니라 거래량이기 때문이다. 그러므로 Zycord의 상한은 고정된 것도 투표로 정하는 것도 아니다 — 자신을 포크해 줄 저자가 곁에 없을 네트워크는 일상적인 성장을 거버넌스 사건으로 취급할 수 없고, 투표는 손잡이다. 채굴자는 공급을 제한해서 이득을 보고, 대형 운영자는 작은 노드가 따라올 수 없는 지점까지 확장해서 이득을 본다. 상한은 측정된 수요의 합의 함수이며, 블록 0부터 제네시스에 들어 있고, 아무도 그것을 움직이지 않는다.
이 규칙은 시간 척도마다 하나씩, 세 부분으로 이루어진다. 블록 안에서는 각 시장이 목표치 T와 단단한 탄력 한계 2T를 갖는다. 기본 수수료는 §8의 EIP-1559 형태로 블록당 한정된 비율만큼 균형점을 향해 움직인다 — 한정된 이유는 한정 없는 조정은 수렴하지 않고 진동한다고 알려져 있기 때문이다. 에포크에 걸쳐서는 순차 목표치가 수요를 따른다. T ← clamp(2·median_applied(e), T − T/Δ, T + T/Γ)이며, 제네시스 값이 하한이다 — 여기서 median_applied는 적용된 인증서 (certificate) 의 순차 gas만 센다. 건너뜀 처리된 인증서는 수수료를 태우고 아무것도 기록하지 않으므로, 상한을 올리는 유일한 길은 적용을 얻어 내는 것이다. 즉 지속적이고, 충돌하지 않으며, 기본 수수료를 태우는 사용이다. 성장을 억지로 밀어붙이는 데 공격자가 치르는 비용은 유기적 채택이 다른 모두에게 치르게 하는 비용과 정확히 같다. 다시 말해 이 기제는 둘을 구별할 수 없고, 구별할 필요도 없다. 성장은 에포크 건강 신호에 한 번 더 걸린다 — 경합하는 헤더의 관측 비율이 임계치 아래에 머무를 것 (에라 (Era) 0), 체크포인트가 일정대로 확정될 것 (에라 1 이후) — 그래서 용량이 전파가 실증적으로 감당하는 바를 결코 앞지르지 않는다. 낡은 블록은 체인이 기록하지 않는 바로 그 사건이므로, 이 신호는 정직한 유일한 방식으로 들여온다. 헤더는 최근의 경합 헤더를 인용할 수 있고 그에 대한 보수는 없다. 인용하려면 실제 작업증명이 필요한 반면, 이 신호를 억누르려면 거의 모든 제안자가 인용을 생략해야 하는데 정직한 하나만 있어도 그것이 복원된다. 이 비대칭은 관문을 신중함 쪽으로 기울이며, 그것이 관문이 기울어야 할 방향이다. 블록 단위로는 폭주 밸브가 있다. 제안자는 2T를 넘어 4T까지 갈 수 있되, 그 블록이 자신에게 주는 것을 이차적으로 몰수당한다 — 자신의 보조금 몫에 그 블록의 수수료를 더한 것으로, §14.2의 일정에 견주어, 아무에게도 돌아가지 않는 영구적 부족분으로 처리된다 — 그리고 벌칙은 적용된 것과 건너뜀 처리된 것을 가리지 않고 총 순차 gas에 부과되므로, 초과분을 인위적으로 만든 충돌로 할인가에 채워 넣을 수 없다. 기준이 생산자의 보조금만이 아니라 수익인 것은 그 둘이 함께 줄어들지 않기 때문이다. 보조금은 §14.2의 곡선에서 제네시스 값의 약 1.6 %까지 떨어지는 반면 폭주로 사려는 수수료 수익은 전혀 떨어지지 않으므로, 보조금만으로 표시된 억지력은 기회가 가장 큰 바로 그 지점에서 억지하기를 멈춘다. 상시적인 성질은 그 편익을 따라가는 무언가로 값이 매겨져야 하며, 이는 EIP-1559가 부과금을 조작으로 얻는 가치에 결합시키는 근거로 드는 논거다. 제네시스 시점에는 수수료가 거의 0이므로 이 차이가 바꾸는 것은 거의 없다. §14.1의 트레저리 (treasury) 몫은 감액되지 않은 보조금에서 떼어지며 결코 몰수되지 않는다. 폭주는 생산자의 선택이고 트레저리는 그 선택의 당사자가 아니기 때문이다. 진짜 급증은 즉시 통행권을 사고 에포크 제어기에 정보를 주며, 스팸은 벌칙을 산다. 선례는 Monero의 벌칙-중앙값 기제 [19] 인데, 그것의 기록된 정체 현상 — 통상적인 작업 단위가 중앙값에 가까워지면 성장이 얼어붙는 것 — 은 여기서는 구조적으로 회피된다. 배치 인증서 (§6) 가 통상적인 단위를 목표치에 견주어 작게 유지하기 때문이며, 변동률 한계는 적응형 한계의 계보 [20] 를 따른다. 병렬 상한에는 이런 주의가 필요 없다. 그것은 순차 목표치의 고정된 큰 배수로 못 박혀 그 성장을 물려받으며, 이는 §8의 불변식을 용량의 언어로 다시 말한 것이다.
줄다리기의 결과는 기제에서 그대로 읽어 낼 수 있다. 사용자의 수수료는 바닥으로 끌린다. 지속적인 혼잡이란 정의상 상한을 올렸다가 도로 내리는 신호이기 때문이다 — 영구 경매라는 Bitcoin의 균형점은 여기서 도달 불가능하다. 생산자는 네트워크가 어릴 때는 보조금으로, 성숙기에는 거래량으로 지급받으며, 결코 희소성으로 지급받지 않는다. 태우기는 모든 혼잡 국면이 생산자가 들고 있는 코인에 누적되게 하고, §8은 이미 배제가 아니라 적용을 수익 최대화 전략으로 만들어 두었다. 정직하게 밝힐 점이 하나 있고 그것은 두 겹이다. 탄력성이 보장하는 것은 오직 용량이 결코 채택이 멈추는 이유가 되지는 않는다는 것뿐이며 — 대형 블록 포크들이 증명했듯 탄력성이 수요를 만들어 내지는 않는다 — 그리고 자라는 상한은 상태도 자라게 한다. 새 슬롯에 쓰는 것이 순차 gas에서 델타보다 비싼 이유가 그것이다. 폴드 (fold) 가 사는 평평한 테이블은 그것을 먹여 살리는 상한보다 빨리 팽창하지 않는다. 여기서 보정 규칙 하나가 따라 나오며, 그것을 어겼을 때 소리가 나지 않으므로 명시해 둔다. 순차 목표치 대 바이트 상한의 제네시스 비율은 이 네트워크가 상정한 트래픽의 밀도보다 낮아야 하며, 그래야 평범한 결제로 가득 찬 블록이 기본 수수료를 낮추는 게 아니라 올린다. 자기 설계 부하에 거꾸로 반응하는 시장은 아무것도 가격 매기지 않으며, 이 비율은 동결 전에 측정된 트래픽으로부터 정해진다.
에라에 걸친 용량. 인증서 수 상한과 바이트 상한은 순차 목표치 옆에 고정된 채 서 있는 것이 아니라 그것과 함께 규모가 커진다. 제네시스에서는 셋이 모두 서로 두 배 안쪽에서 구속하므로, 고정된 것 하나는 단 한 번의 배증만으로 진짜 한계가 되어 버리고 탄력적인 쪽을 장식으로 만든다. 그 뒤에는 정적인 용량들이 서 있다. 블록의 머클 깊이를 고정하는 인증서 목록 폭, 그리고 블록이 도달할 수 있는 바이트 용량, 그리고 그 아래의 전송 상수들이다 — 블록은 청크로 이동하므로 어떤 단일 네트워크 메시지도 블록을 한정하지 않는다. 목록 폭은 곡선 전체를 감당하도록 제네시스에서 크기가 정해진다 (2²⁵ 인증서. 나중에 다시 못 박으면 한 체인 안에 두 개의 머클 폭이 놓이게 되고, 가상 패딩 덕에 그 여유 공간은 공짜다). 바이트 용량은 출시 네트워크에 맞춰 정해지고 에라 경계에서 다시 못 박힌다 — 이미 하드포크인 시점이다 (§14) — 건강 관문이 측정한 전파 성능에 견주어서다. 에라 안에서는 결코 아니고, 투표로도 결코 아니다. 이 사다리가 떠받치는 곡선은 Γ에서 따라 나온다. 목표치는 건강한 꽉 찬 블록이 이어지는 1년마다 많아야 2배로 복리 성장하므로, 제네시스 상한인 초당 적용 인증서 ~90개 (30초 간격당 §15의 블록 하나) 는 수요가 지속될 때 7년이면 초당 ~11,000개, 10년이면 ~90,000개, 그리고 14년이 채 못 되어 2²⁵의 목록 폭이 고정하는 초당 ~110만 개에 이른다 — 이것이 어떤 에라도 움직이지 않는 유일한 벽이며, 따라서 사다리의 한 칸이 아니라 사다리의 끝이다. 단위는 결제가 아니라 인증서다. 하나의 인증서는 결제 하나를 싣거나, 시퀀서가 그 안에 배치로 묶은 N개를 싣는다 (§6). 그러므로 각 수치는 트랜잭션 수의 하한이지 그것에 관한 주장이 아니다. 조건은 정확히 셋이며, 각각은 이미 위에서 다룬 기제다. 수요가 꽉 찬 블록을 지탱해야 한다. 적용된 gas만이 T를 올리는 유일한 입력이기 때문이다. 전파가 건강 관문을 열린 채로 유지해야 한다. 관문이 닫히는 에포크에는 성장이 보류되기 때문이다. 그리고 다시 못 박는 일이 에라마다 이루어져야 한다. 그 사이에는 바이트 용량이 벽이기 때문이다. 계산은 조건이 아니다 — 폴드는 측정된 코어 하나만으로 이 곡선의 먼 끝을 넘어서고 (§15), 검증은 네트워크가 소유하지 않은 하드웨어와 함께 규모가 커진다 (§2). 대역폭은 조건이다. 본문은 체인 데이터이고 (§13) 표본 추출 (§9) 은 검증을 나눌 뿐 데이터를 나누지 않으므로, 모든 노드가 모든 바이트를 나른다. 그리고 곡선 꼭대기의 생산자는 대역폭만 놓고 보면 데이터센터급이다 — 생산자에게는 받아들여진 종착 상태이지만 다른 누구에게도 그렇지 않은데, 검증의 노드당 비용은 반대 방향으로 움직이기 때문이다 (§9). 대역폭이 구속하기 전에 상태가 먼저 구속한다. 사용된 주소 레지스트리 (§4) 는 일회성 사용 한 건당 항목 하나씩 자라며, 초당 10⁵개의 인증서에서는 연간 10² 테라바이트 규모가 된다. 이는 §4가 선언한 미해결 문제를 상시 항목에서 곡선이 일정을 잡아 주는 작업으로 바꿔 놓는다.
상수 (제네시스, 예시, §13과 동일): 성장 제수 Γ = 에포크당 512 (상한은 꽉 찬 블록이 이어지는 1년마다 많아야 두 배가 된다), 감쇠 제수 Δ = 1024 (놀고 있는 용량은 ~2년에 절반이 되며, 결코 제네시스 아래로는 내려가지 않는다), 폭주 한계 4T, 그 한계에서 생산자의 보조금 몫 과 그 블록의 수수료 몰수 (§14.1의 트레저리 몫은 감액되지 않은 보조금에서 떼어지며 결코 몰수되지 않는다. 폭주는 생산자의 선택이고 트레저리는 그 선택의 당사자가 아니기 때문이다), 건강 관문: 인용된 경합 헤더가 에포크당 블록의 2% 이하일 것, 인증서 목록 용량 2²⁵ (구조적, 위 참조), 바이트 상한은 제네시스에서 2.5 MB이며 목표치와 함께 커져 구조적 바이트 용량 8 MB에 이른다 (에라마다 다시 못 박음), 블록당 서명 상한은 제네시스에서 6,000이며 목표치와 함께 커지고 어떤 서명도 검증되기 전에 검사된다 — 이는 검증에 대한 한계로, 병렬 gas 가격과는 별개로 유지된다. 하나의 파라미터가 작업을 한정하는 동시에 시장에 가격을 매길 수는 없기 때문이다.
9. 즉각적 사기 증명과 표본 추출로 가는 길#
유효성이 인증서 (certificate) 바이트의 순수 함수이므로, 무효한 인증서는 그 자체가 사기 증명이다. 그것을 재실행하는 사람은 누구든 상태 없이, 대화형 이분 게임 없이, 단 한 통의 메시지로 즉시 그것을 반박할 수 있다. 출시 구성에서는 이 논점이 가장 좋은 방식으로 무의미하다. 모든 노드가 블록을 받아들이기 전에 모든 인증서를 검증하므로, 무효한 인증서는 이의 제기가 필요할 만큼 오래 살아남지 못한다. 이 창은 검증이 표본 추출로 바뀌고 나서야 의미를 갖게 되며, 그때 그것은 분쟁 프로토콜이 아니라 전파 파라미터다. 메시지 하나가 네트워크를 건너는 데 걸리는 블록 몇 개이고, 그 인증서를 보증한 인수인 (underwriter) 에게 청구된다 (§5). 대안들과 비교해 보라. 옵티미스틱 롤업은 분쟁하려면 분쟁 대상 단계의 상태가 필요하기 때문에 일주일짜리 대화형 분쟁을 필요로 한다. 증명 기반 시스템은 분쟁을 피하지만 실행보다 몇 자릿수 더 비싼 증명자에 값을 치른다. Zycord의 사기 증명은 검증이 드는 만큼 든다. 재실행 ~1회분이다.
이것이 재실행 체인은 갈 수 없는 확장의 길을 연다. 네트워크는 원리적으로 모든 노드가 모든 인증서를 영원히 검증할 것을 필요로 하지 않는다. 인수인 채권이 자리를 잡으면 검증은 표본 추출될 수 있다. 인증서마다 VRF로 선정된 위원회를 두고, 검증되지 않은 무효 인증서가 나올 확률이 무시할 만하도록 규모를 잡으며, 어떤 풀 노드든 무엇이든 자유로이 검사할 수 있고 슬래싱에는 메시지 하나면 족하다. 제네시스에서는 모두가 모든 것을 검증한다. 값싸고 병렬적이기 때문이다. 표본 추출은 출시가 아니라 로드맵이다. 그러나 그것은 이 업계의 곡선을 뒤집는 로드맵이다. 네트워크가 커질수록 노드당 비용이 떨어진다. 재실행 패러다임에서는 노드당 비용이 처리량과 함께 자라나 결국 데이터센터만 남는다.
10. 머신: cEVM#
Zycord는 하나의 가상 머신을 돌린다. cEVM은 인증서에 맞게 적응시킨 Ethereum EVM [2] 의 방언이다. 이 선택은 의도적이다. 이 프로젝트의 새로움 예산은 상태, 동시성, 경제 모델에 쓰인다. 머신은 이 시스템에서 가장 익숙한 것이어야 한다. Solidity와 그 컴파일러, 감사인, 도구 일체가 그대로 넘어온다.
표준 EVM과의 차이점:
SLOAD는 정확한 읽기 (인증서에 선언된) 로 컴파일되고,SSTORE는 SET 쓰기로 컴파일된다.- 새 옵코드
SASSERT(slot, pred)와SDELTA(slot, ±v)가 가드 델타와 순수 델타를 노출한다.SASSERT는 스택에 아무것도 밀어 넣지 않는다 — 가드는 값을 반환하지 않는다 (§4). TIMESTAMP와NUMBER는 에포크 비컨 슬롯을 읽는다. 그 밖의 주변 입력은 없다.- gas 계량은 이중이다 (§8). 저장 옵코드는 순차 gas를 계량하고, 계산과 calldata와 프리컴파일은 병렬 gas를 계량한다.
- 트랜잭션 형식은 인증서다. Ethereum 컨트랙트는 소스 수준에서 이식된다. 원시 지갑 호환성은 주장하지 않으며, 우리는 그런 척하지 않는다. 이식된 컨트랙트는 전부 정확한 읽기 모드로 돌아간다. 첫날부터 올바르게 동작하고, 뜨거우면 시퀀서를 통해 직렬화된다. 병렬성은 슬롯 단위로 선택하는 것이며 대개 작은 diff다 (토큰의 잔액 맵이
SLOAD/SSTORE에서SASSERT/SDELTA로 옮겨 가는 데 ~30줄이면 된다). 대표 기능이 이식을 기다리는 대신 VM 에라 (Era) 의 첫 블록부터 보이도록, 머신은 네이티브 표준 라이브러리와 함께 활성화된다 — 토큰, 팁 항아리, 에스크로, 베스팅, 그리고 오더북/AMM 혼합 레퍼런스 — 모두 델타 우선으로 작성되어 알려진 주소에 미리 배포되어 있다.
11. 머신 없는 자산#
출시 에라에는 컴퓨터보다 경제가 먼저 필요하다. 그래서 Zycord는 블록 0부터 VM 없이 인증서 연산으로서의 네이티브 자산을 출하한다. ISSUE (일회 쓰기 셀 (cell) 에 공급 상한과 함께 자산 id를 생성), MINT (가드 방식: minted + Δ ≤ cap), TRANSFER (가드 balance ≥ Δ, 짝지어진 델타. 순수 델타나 새 일회성 셀을 겨냥한 입금이 곧 팁이므로, 팁 주기는 자기 몫의 옵코드를 쓰지 않는다), 그리고 RETIRE (주소를 사용하지 않고 소각하기: 읽기 없음, 옮겨지는 값 없음, 셀을 사용됨으로 표시하는 순수한 쓰기 하나 — 본래 의미의 사용은 TRANSFER 안에서 자동으로 일어난다). RETIRE는 자기 슬롯을 두 겹으로 벌어들인다. 그것은 압축과 프라이버시의 원시 요소로, 수취인이 일회성 주소를 소임이 끝나는 즉시 지울 수 있게 한다. 그리고 그것은 §5의 귀속 정리에 있는 단 하나의 예외 뒤에 놓인 연산이다 — 세 번째 경우는 폐지가 존재하기 때문에 존재하며, 그래서 인증서 형식이 인증서당 폐지 주소 수에 상한을 두고 (§13), 그래서 그 정리가 그 모서리를 에두르지 않고 함께 진술되는 것이다. 이 집합은 닫혀 있다. 이 넷이 제네시스 명령어 집합의 전부이며, 그 밖의 모든 연산은 — 채권 설정을 포함해 — 이후 에라의 규칙 집합과 함께 도착하고 (§14), §5의 귀속 정리는 정확히 이 표면에 대해 증명된다.
한 블록에 만 건의 팁을 받는 스트리머는 폴드 (fold) 에 만 번의 교환 가능한 덧셈만큼의 비용을 지운다. 충돌 0, 건너뜀 0, 시퀀서 없음, 머신 없음. 이전 체인들의 팁 문화는 플랫폼 API의 처분에 기대어 살다가 그것과 함께 죽었다. 여기서 팁은 프로토콜의 원시 요소다. 그것은 또한 우연찮게도 이 시스템의 핵심 주장에 대한 상시 부하 시험이기도 하다. 네이티브 코인의 공급 상한은 여기, 투명한 레일 위에 있으며, §3의 검사되는 산술로 강제되고, §12는 그것을 건드리지 않는다.
12. 기밀 결제#
앞의 절들은 결제 금액을 공개된 것으로 다룬다. 이 절은 그것을 숨기는 선택지와, 수취인을 일회용 주소 뒤에 숨기는 선택지를 앞선 절들의 성질을 보존한 채로 더한다. 이 설계는 그것이 파생되어 나온 시스템들보다 좁다. 아래의 각 제약은 더 일반적인 설계라면 더 무거운 기구로 답했을 공격을 하나씩 막는다.
무엇이 숨겨지고 무엇이 숨겨지지 않는가. 차폐 결제는 금액을 숨기고 수취인과의 연결을 미룬다. "미룬다"에 대해 정확하자. 새 스텔스 출력은 수신되는 시점에는 연결 불가능하지만, 링이 없으므로 나중에 그것을 사용하면 사용되는 출력이 지목되고, 그 출력이 지목되면 어느 앞선 결제가 그것을 채웠는지가 드러난다. 연결 불가능성은 첫 사용까지 유지되고 거기서 끝난다. 그것은 지연이지 삭제가 아니다. 이 설계는 발신자의 그래프상 위치도 숨기지 않는다. 인증서는 공개적으로 서명되고 인수되고 정렬되므로, 관측자는 결제가 일어났다는 것과 누가 그것을 인수했는지를 본다 — 금액은 보지 못하고, 사용이 그것을 드러내기 전까지는 수취인의 여러 출력 가운데 어느 것이 어디로 갔는지도 보지 못한다. 정직한 설명은 공개 그래프 위의, 일회용 수취인 주소를 갖춘 기밀 트랜잭션이며, 출력이 사용됨에 따라 그래프는 소급적으로 익명성을 잃는다. 발신자 측의 모호성 — 링 서명, 과거 출력에 대한 소속 증명 — 은 범위 밖이다. 링은 다른 사람들의 출력을 참조하고, 그러면 유효성이 이력의 함수가 되는데, §2의 무상태성은 이 프로토콜이 내주지 않는 성질이다. Monero의 위협 모델에는 다른 프로토콜이 필요하다.
차폐 출력. 차폐 결제는 주소가 스텔스 주소인 새 일회 쓰기 셀 (§4) 을 쓴다. 발신자는 수취인이 공개한 조회 키와 자신의 일시 키로부터, 수취인만이 알아볼 수 있고 수취인의 사용 키만이 서명할 수 있는 일회용 주소를 도출한다. 그 셀의 값은 Pedersen 확약 C = vG + rH이고, 그 곁에는 v ∈ [0, 2⁶⁴)임을 보이는 범위 증명과 수취인의 조회 키로 암호화된 쌍 (v, r), 그리고 스캔하는 지갑이 남의 출력 대부분을 일찍 버릴 수 있게 해 주는 1바이트짜리 조회 태그가 함께 실린다. 원시 요소는 스텔스 주소 지정을 곁들인 기밀 트랜잭션이다. 즉 링 없는 RingCT의 금액 은닉 절반이며, 둘 다 실전 배포 실적이 확립되어 있다.
유효성은 여전히 바이트의 함수다. 차폐 인증서 (certificate) 의 수지 검사는 확약 등식이다. 선언된 입력 확약에서 선언된 출력 확약을 뺀 것이 fee·G와 같고, 수수료는 공개된다 (아래의 풀 참조). 이 등식과 범위 증명과 서명은 모두 인증서의 바이트만으로, 병렬 단계에서, 일괄로 검사된다. Bulletproof 검증은 일괄 처리에 걸쳐 로그 규모로 분산 상각되며, 그중 어느 것도 상태를 건드리지 않는다. 위조된 인플레이션 인증서 — 깨진 가정이나 깨진 검증기 아래에서 확약이 맞아떨어지지 않는 인증서 — 도 여전히 그 바이트만으로 유효하거나 무효하며, 폴드 (fold) 는 그것을 결코 다시 검사하지 않는다. 이는 §2의 유효/적용 가능 구분이 설계대로 작동하는 것이지 그에 대한 예외가 아니며, 아래의 풀 규칙이 건전성 파탄이 한계 없이 번지는 것을 막는다. 이 지점은 또한 이중 수수료 시장 (§8) 이 효율성 논거이기를 그치고 가능케 하는 논거가 되는 곳이다. 단일 gas 시장 체인에서는 기밀 트랜잭션이 비싼데, 증명 검증에 드는 1밀리초가 저장 쓰기와 같은 경매에서 경쟁하기 때문이다. 반면 여기서는 그 검증이 전부 par_gas에 떨어지고 — 설계상 값싸며 — 순차 시장은 그것을 아예 보지 않는다.
폴드는 바이트를 저장한다. 적용 시점에 차폐 결제는 폴드가 보는 가장 값싼 인증서다. 그 출력 셀 (cell) 은 새것이므로 충돌할 수 없고 (§4의 경합 없는 빠른 경로), 입력 셀은 살아 있거나 사용되었거나이며 이는 레지스트리 조회다. 그리고 쓰기는 32바이트의 확약을 저장한다. 어떤 곡선 연산도 순차 단계에 들어오지 않는다 (§3). 이 규칙이 배제하는 대안은 낯선 사람들이 준동형적으로 입금하는 영구적인 "누적 슬롯"인데, 그것은 세 방면에서 실패한다. 순차 루프에 EC 덧셈을 집어넣고 (§3), 재사용되는 공개 식별자를 만들어 내는데 이는 스텔스 주소가 피하려는 바로 그 공통 소유 휴리스틱이며, 숨겨진 영구 잔액은 §4가 금하는 제3자 가드를 불러들인다. 누적은 지갑에서 일어난다. 수취인은 하나의 조회 키로 모두 알아볼 수 있는 여러 일회성 출력을 보유하다가, 자기 셀 여럿을 하나의 새 셀로 사용하는 평범한 차폐 인증서로 그것들을 통합한다. 원하는 어떤 주기로든, 에포크 비컨 (§4) 을 시계 삼아서 말이다. 영구 슬롯이라면 온체인에 유지했을 그 합계를 소유자가 체인 밖에서 유지하는 것이다 — 그리고 통합에도 흔적이 없지는 않다. 한 인증서에 여러 입력을 선언하는 것은 공개적인 공통 소유 사건이며, 재사용된 식별자보다는 약하지만 엄연히 실재한다. 그래서 지갑 정책은 그것을 최소화하고 서로 무관한 출처를 한 번의 통합에 섞지 않는 것이다.
소유자만의 사용, 그리고 그것이 금하는 것. 숨겨진 값은 그 소유자가 자기 셀에 대해 서명해야만 사용할 수 있다. 숨겨진 잔액에 대한 제3자 가드는 없고 (§4) 따라서 차폐 레일에는 끌어가는 방식의 결제가 없다. 허용량도, 구독도, 사용자의 차폐 자금을 일괄 인출하는 볼트도 없다. 그런 패턴은 투명한 레일에 남으며, 두 레일 사이의 경계는 인증서 하나만큼의 폭이다. 이 제약이 잔액 신탁을 없앤다. 낯선 사람이 잔액에 대해 추측을 제출하고 건너뜀 (skip) 을 읽어 낼 수 없으므로, 그 신탁에는 운영자가 없다.
차폐 풀은 폴드가 강제하는 공개된 정수다. 수수료는 공개된다. coinbase는 공개된다. 컨트랙트 슬롯으로의 결제는 공개된다. 투명한 레일과 차폐 레일 사이의 모든 건넘은 공개적으로 보이는 v를 옮긴다 — 차폐 인증서는 들어가는 길에 v를 열고, 차폐 해제 인증서는 나오는 길에 v를 연다. 그래서 풀의 총합은 예약된 슬롯 안에 평문으로 살며, 오직 가드 델타로만 움직인다 (§4). 차폐는 그것에 입금하고 pool += v, 차폐 해제는 pool ≥ v를 가드로 걸고 출금하며 pool += −v, 차폐 인증서의 수수료도 마찬가지로 출금한다. 그 슬롯은 정확히 Σ 입 − Σ 출이며, 가드 델타 규율 덕에 한없이 많은 건넘이 경합 없이 교환 가능하다.
이로써 풀은 경보기가 아니라 울타리가 된다. 금액을 숨기는 것은 §3의 검사되는 u256 산술을 이산 로그 가정의 계산적 건전성과 맞바꾸는 일이며, 그 가정의 — 혹은 훨씬 더 그럼직하게는 검증기의 — 파탄은 풀 안에서 확약을 위조한다. 그러나 위조된 확약은 평문을 지니지 않고, 값이 풀을 떠나는 길은 차폐 해제뿐이며 그것은 가드 아래에서 공개 슬롯을 출금한다. 그 슬롯은 실제 차폐로만 올라갔으므로, 그것을 0 아래로 밀어 내릴 차폐 해제는 건너뜀 처리된다. 위조된 값은 그 가드를 건널 수 없다. 인플레이션은 풀을 비우지 못한다. 인플레이션은 풀을 빠져나가는 데 실패한다. 암호적 실패의 폭발 반경은 감사인의 경계심이 아니라 폴드 규칙에 의해 풀의 실제 내용물로 한정되며, 그 실패 양상은 조용한 유출이 아니라 눈에 보이는 실시간 경합 — 마지막까지 정직하게 남아 차폐를 해제하려던 이들이 그러지 못하는 상황 — 이다. 나쁘고, 한정되어 있고, 관측 가능하며, 이는 비상 대응 팀이 없는 시스템이 구조적으로 갖춰야 하는 봉쇄다. 선례는 구체적이다. Zcash Sprout의 위조 버그가 견딜 만했던 것은 그 차폐 풀이 한정되고 감사 가능한 양이었기 때문이다. 여기서 그 양은 감사 가능할 뿐 아니라 폴드에서 하중을 진다. §11의 네이티브 공급 상한은 투명한 레일에 살며 검사되는 산술로 강제되는 채로 손대어지지 않는다.
풀에는 프라이버시 비용이 따르고, 그것은 기록에 남을 자격이 있다. 경계를 건널 때 정확한 공개 금액이 노출되고, 특징적인 금액은 상관을 만든다. v + fee가 풀에 들어간 직후 v가 풀을 떠나는 것을 지켜본 관측자는 어떤 확약도 숨기지 못한 무언가를 알아낸 것이다. 경계에서 표준 액면 단위를 쓰면 이것이 무뎌지고, 지갑은 그것을 기본값으로 삼는다. 프로토콜이 그것을 의무화하지는 않는데, 합의 규칙은 특징적인 금액과 정당한 금액을 구별할 수 없기 때문이다. 트래픽 분석 아래에서의 연결 가능성은 부정되는 대신 그 완화책과 함께 명시된다.
인수인 (underwriter) 은 메타데이터이며, 프라이버시와 검열 저항성은 한 인증서 안에 공존하지 않는다. 자기 보험을 든 차폐 인증서는 발신자의 공개 예치금 셀을 지목하고, 그러면 스텔스 주소가 끊어 놓은 것이 다시 이어진다 (§5). 그래서 차폐 트래픽은 공동 서명 인수 방식을 타며, 거기서는 한 인수인의 id가 여러 발신자를 아우르고 그 군중이 엄폐물이 된다. 인수인은 값이 아니라 셀의 살아 있음에 값을 매기므로 (§5) 금액은 알지 못한다 — 그러나 그 인증서인 나머지 전부를 알게 된다. 체인 밖에서 청구해야 하므로 신원을 확인해야 하는 발신자, 사용되고 있는 셀, 생성되고 있는 스텔스 출력, 그리고 시각. 그것이야말로 소환장이 원하는 바이며, 위에서 말한 소급적 익명성 상실과 결합해 공개 그래프를 따라 앞으로 번져 나간다. 그것은 또한 구조적인 KYC 지점이기도 한데, 유일한 사적 방식에 알아낼 수 있는 운영자가 있기 때문이다. 이는 이 논문이 덮지 않고 그대로 진술하는 한계를 드러낸다. 두 인수 방식은 공동 서명 (사적이지만 허가가 필요하다 — 인수인이 당신을 거절할 수 있다) 과 자기 보험 또는 강제 (무허가지만 스스로를 밝힌다) 다. §7의 강제 경로는 검열당한 사용자가 언제나 거래할 수 있음을 보장하지만, 그가 사적으로 거래할 수 있음을 보장하지는 않는다. 모든 인수인에게 거절당한 사용자는 사용할 권리는 지키되 같은 동작으로 프라이버시를 잃는다 — 그리고 그가 바로 프라이버시가 중요했던 그 사용자다. 차폐 레일은 자기 프라이버시를 대가로 치를 때에만 §7의 검열 저항성을 물려받는다. 두 성질은 하나의 인증서 안에서 함께 성립하지 않는다.
제네시스가 아니라 하나의 에라 (Era). 서로 독립적인 두 논거가 그 일정을 확정한다. 실무적으로 차폐 인증서는 공동 서명 인수인을 쓰는데, 그들은 에라 1부터 존재한다. §3의 원칙에 따라 도달 불가능한 합의 코드는 감사 불가능한 합의 코드이므로 출하되지 않는다. 제네시스 바이너리에는 확약도, 범위 증명 검증기도, 풀 슬롯도 없다 — 호출자가 미래의 에라뿐인 것은 아무것도 없다. 차폐 에라는 순수하게 덧붙이기만 하는 것이 아니며, 이 논문은 그렇게 말한다. §4의 숨겨진 셀 타입 지정과 제3자 가드 금지는 폴드의 가드 경로를 건드리는데 그것은 제네시스에 결정적인 표면이다. 그래서 그 에라는 더하는 동시에 수정하며, 그 활성화는 합의에 결정적인 변경으로서 감사받는 하드포크다. 자기 복잡도를 감당할 만한 가치를 입증하지 못하는 에라는 그저 발동되지 않을 뿐이고, 그것을 담지 않았다고 해서 제네시스 체인이 잃은 것은 없다.
비용, 있는 그대로. 차폐 인증서 (certificate) 는 투명한 것의 3–5배 크기이며 — 1~2킬로바이트로, 일괄 집계를 거친 뒤에도 범위 증명이 대부분을 차지한다 — 동적 블록 (§8) 이 그것을 경제적으로 흡수하고 §13의 전파가 그 대가를 대역폭으로 치른다. 수취인은 스캔으로 결제를 발견한다. 새로 나온 차폐 출력마다 지갑의 조회 키로 시험 삼아 검사하는데, 이는 네트워크 거래량에 대해 O(n)인 비용이며 조회 태그가 1바이트만 보고 일찍 기각함으로써 그것을 줄여 준다. 이는 그 앞에 놓인 공유 비밀 도출로 한정되는 상수 배수다. 스캔은 차폐 레일의 주된 UX 부담이며, 조회 키를 내주지 않는 외부 위탁 스캔은 이 설계가 해결하는 것이 아니라 물려받는 미해결 문제다. 이 레일에서는 중계 정책도 바뀌어야 하며, 이는 선택 사항이 아니다. 인증서를 게시하는 것은 공짜인데 (§5, §13) Bulletproof를 검증하는 것은 그렇지 않으므로, 게시자에게 어떤 비용도 부과되기 전에 검증기를 돌리는 중계는 서비스 거부 증폭기다 — 차폐 레일은 값싼 것 먼저, 비싼 것 나중이라는 중계 규율 (서명과 선언된 살아 있음 먼저, 증명은 마지막, 인수인 (underwriter) 별 할당량) 을 요구하며, 이는 멤풀의 "중계 정책으로 한정됨"을 기본값에서 요구 사항으로 바꿔 놓는다.
이 절이 이후 초안으로 넘기는 열린 질문들이며, 묻어 두는 대신 표시해 둔다. 차폐 레일이 네이티브 코인만 나르는지 아니면 §11의 자산도 나르는지. 생성원 H가 하나뿐이면 vG + rH는 (자산, 값) 쌍이 아니라 스칼라 하나에 확약하므로, 다중 자산 차폐 레일에는 자산별 생성원 (Confidential Assets) 이 필요하고 그러면 증명 크기와 위의 "3–5배" 수치가 달라진다. 결정되기 전까지 이 레일은 누락에 의해서가 아니라 규칙에 의해 네이티브 코인 전용이다. RETIRE (§11) 가 차폐 셀 (cell) 에 작용하는지. 작용한다면 공개적인 차폐 해제 없이 값이 풀을 떠날 수 있으므로 풀 슬롯은 상한이 되고 (Σ 입 − Σ 출 ≥ 내용물) 인플레이션 탐지의 방향은 부등식으로 다시 진술되어야 한다. 작용하지 않는다면 차폐 레일은 쓰레기 수집기를 잃고 열 수 없는 출력 (아래 참조) 이 쌓인다. 암호화된 (v, r)이 인증서 본문에 사는지 (지금은 값싸지만 본문이 가지치기되면 복구 불가능해져 시드만으로 하는 지갑 복원이 무너진다) 아니면 셀 값에 사는지 (출력마다 상태를 소비하고, 셀이 사용되면 사라지며, "누적은 지갑에서 일어난다"와 일관된다). 그리고 인수인이 제3자에게 채권을 걸면서 인증서 안에서 공개된 값으로 청구할 수 있는지 — 그렇게 되면 위의 신원 확인 요구가 사라지고, 이는 프라이버시/검열 한계를 넘어서는 가장 유망한 길이다 — 이것들은 문구가 아니라 설계의 문제이며, 다음 초안이 이것들을 조용히 물려받지 못하도록 여기에 이름을 붙여 둔다.
13. 네트워크#
본문은 체인 데이터다. 블록이 유효하려면 그 인증서 본문을 가져올 수 있어야 한다. 그러므로 상태는 언제나 체인만으로 재구성 가능하며, 시퀀서를 포함한 어떤 운영자도 데이터 수탁자가 아니다. 인증서는 고전적인 트랜잭션보다 크다 (읽기와 쓰기를 함께 지니기 때문이다). 그 완화책은 구조적이다. 배치 인증서는 내부 쓰기를 잘라 내고 (§6), 사용된 일회성 셀은 재구성 지평보다 깊이 묻히고 나면 압축된다 (§4).
세 번째 완화책은 장차의 것이며, 전제되는 대신 그렇게 명시된다. 읽기가 값을 되풀이하는 대신 앞선 인증서의 쓰기를 (cert_id, index)로 참조할 수 있다 — UTXO식 요령이다. 그것은 여기 기술된 프로토콜의 일부가 아니며, 한 물음에 답이 나오기 전까지는 일부가 되지 않는다. 그 물음이 인코딩의 문제가 아니라 합의의 문제이기 때문이다. 참조가 지목한 인증서가 건너뜀 (skip) 처리되었거나 아예 포함된 적이 없을 때 그 참조는 무엇으로 해석되는가. 조용히 현재 값으로 해석되는 참조는 더 이상 선언된 읽기가 아니며, 무상태 유효성도 그와 함께 죽는다. 실패하는 참조는 자기 권한 부여에는 아무 의심도 없던 인증서들을 함께 쓰러뜨린다. 이 설계 전체가 딛고 선 성질을 대가로 치르는 압축은 가질 만한 압축이 아니므로, 그 의미론이 정리되기 전까지 그 필드는 없다.
중계는 해시 우선이다. 인증서는 각자 가십으로 퍼지고 도착 즉시 (무상태로, 병렬로) 유효성 검사를 받는다. 블록은 헤더와, 멤풀에 대비한 해시 목록으로 중계되며 [13] 이는 compact block 방식이므로, 전파 지연은 블록 내용에 비례해 늘지 않는다. 중계 노드는 스팸을 온전히 걸러 내는 데 어떤 상태도 필요로 하지 않는다 — 무상태 유효성과 인수인 서명은 바이트로부터 검사 가능하며, 그래서 투명한 레일에서는 중계 인프라를 돌리는 것이 거의 공짜다. 차폐 레일 (§12) 은 값이 매겨진 예외다. 그 무상태 검사에는 서명보다 세 자릿수 더 비싼 범위 증명 검증이 포함되므로, 거기서는 게시가 공짜라는 기본값이 증폭기가 된다. 그래서 중계는 §12가 선호가 아니라 요구 사항으로 삼은 값싼 것 먼저 규율과 인수인별 할당량에 매인다. 한쪽 레일의 중계는 거의 공짜다. 다른 쪽의 중계가 값싼 것은 오직 그 정책이 의무이기 때문이다.
파라미터 (제네시스, 예시). 30초 블록. 인증서 TTL 기본값 240 블록 (~2시간). 인증서당 폐지 주소 ≤ 64개. 에포크 2,880 블록 (~1일). 강제 적용 지연 D = 4 블록. 강제 포함 한계 F = 16 블록. 에라 (Era) 발동 스테이크 창 K = 14 에포크 (~2주). 트레저리 (treasury) 몫은 블록 0부터 블록 보조금의 300 베이시스 포인트 (3%) 이며, 셀은 에라 2까지 봉인된 뒤 하드포크로 못 박은 키 집합에 대한 5분의 3 방식이고, 키 교체 지연 R = 20,160 블록 (~7일) 이다 (§14.1). 발행 상수는 §14.2에 있다.
14. 출시: 세 개의 에라, 프리마인 0#
Zycord는 프리마인 없이, 창립자 배정 없이, 투자자 라운드 없이, 관리자 키 없이 출시된다. 제네시스 블록은 공개된 소스로부터 재현 가능하다. testnet이 먼저 돌아가고, 그것이 안정되고 나서야 mainnet 날짜가 공개적으로, 미리 발표된다. 그래야 원하는 누구나 블록 0에 닿을 수 있다. 저자에게 강제되는 것은 특권의 부재이며, 그것은 제네시스에서 한 줄 한 줄 검사 가능하다. 업그레이드는 사회적 합의와 하드포크로 이루어진다.
이 논문은 논증이다. 규칙은 아키텍처 명세이고, 골든 벡터가 프로토콜이며, 그중 어느 둘이 어긋나면 더 정밀한 쪽이 이기고 그 불일치는 버그다. 그것들과 나란히 공개되는 것은 이 설계가 공격당한 기록이다. 잇따른 적대적 독해, 그것이 낸 발견들, 규칙을 바꾼 것들, 그리고 논박당한 것들과 그 이유. 그 기록은 전문이 편집 없이 공개되며, 여기에는 실제 결함을 찾아낸 검토들과 아무것도 재지 않으면서 성공을 보고한 계측 장치들이 포함된다. 저자가 직접 나서서 보증해 주지 않을 프로젝트에서, 공격당한 흔적이 보이지 않는 설계는 아무도 공격하지 않은 설계로 읽힌다. 그리고 그것을 숨겼을 때 치를 대가는 되찾을 길이 없다.
"편집 없이"는 발견들에 관한 약속이며, 그것이 정확히 무엇을 포괄하는지 밝혀 둘 만하다. 그 기록이 살아 있는 아카이브가 아니라 파일로 재공개되기 때문이다. 모든 발견, 모든 측정, 모든 논증과 기각된 모든 대안이 쓰인 그대로 살아남으며, 여기에는 틀렸던 것들과 아무것도 재지 않으면서 성공을 보고한 계측 장치들도 포함된다. 어떤 것도 솎아 내거나, 누그러뜨리거나, 합치거나, 빠뜨리지 않는다. 가해지는 변경은 두 종류이며 오직 그 둘뿐이다. 첫째는 신원 삭제다. 이름, 핸들, 주소, 기계 이름, 로컬 경로는 설계에 대해 아무것도 말해 주지 않는다. 둘째는 자기 완결성이다. 공개된 트리가 담고 있지 않은 트래커나 커밋 이력을 가리키는 포인터는, 그것이 대신하던 논거로 대체되어 본문 안에 진술된다. 그러므로 이 파일들만 손에 쥔 독자도 모든 주장을 따라갈 수 있으며, 그것이 애초에 이 약속의 목적이었다. 아무 데도 닿지 않는 포인터는 "편집 없이"의 문구는 지키면서 그 목적 전부를 잃게 할 것이다.
지분증명은 공정한 출시를 할 수 없다 — 초기 지분은 어디에선가 와야 하고, 고전적인 모든 경로 (판매, 프리마인, 배정) 는 네트워크를 집중시키거나 그 저자의 신원을 드러낸다. 그러므로 작업증명은 영구적인 합의가 아니라 만료일이 있는 분배 기제로 쓰인다:
| 에라 | 발동 조건 | 합의 | 존재하는 것 |
|---|---|---|---|
| 0 — 채굴 & 팁 | 블록 0 (안정된 testnet 이후 발표되는 공개 mainnet 날짜) | 작업증명 (RandomX [14]), Nakamoto 규칙 [1] | 네이티브 자산 (§11), 모든 인증서는 자기 보험, 리스 없음, 강제 큐 없음 — 둘 다 에라 1의 기구다 (§3, §7). 트레저리는 누적되되 봉인되어 있다 (§14.1) |
| 1 — 결제 | 높이 H₁ (명령어 집합). 채권을 건 스테이크가 공급량의 1% 이상으로 K 에포크 동안 지속되면 확정성 오버레이 | 작업증명이 제안한다. 오버레이 활성화 이후로는 채권을 건 검증자가 32 블록마다 체크포인트를 확정하며 (FFG 오버레이 [12]) 보조금은 77/20/3으로 나뉜다 — 생산자 / 체크포인트 증언자 / 트레저리 | BOND, 인수인 & 시퀀서 (§5–6). cEVM과 표준 라이브러리 (§10). 사전 확인 시장이 확정성과 함께 성숙한다 (설계 노트) |
| 2 — 플랫폼 | 높이 H₂ 이면서 스테이크가 30 에포크 동안 10% 이상 지속 | 지분증명 위원회가 제안한다. 작업증명 보상은 ~90일에 걸쳐 0으로 내려가되 체크포인트가 확정되지 못하는 동안에는 멈춘다. 무작위성은 작업증명 해시에서 VRF로 옮겨 간다 | 프로토콜 전체. 트레저리 셀이 5분의 3 방식으로 열린다 (§14.1). 표본 추출 연구 (§9) 시작 |
| S — 차폐 (당시 진행 중인 에라가 무엇이든 그에 대해 활성화되며, 에라 1의 명령어 집합을 필요로 한다) | 노드 운영자들이 채택하는 하드포크이며, 다음이 모두 갖춰진 뒤에만 제안될 수 있다. 공동 서명 인수가 가동 중일 것 (§5). 검증기와 그 일괄 처리 경로가 최소 두 건의 독립 감사와 함께 공개되고, 발견 사항과 시정 조치가 공개되어 있을 것. 차폐 레일 전체가 적대적 참여가 있는 공개 testnet에서 K 에포크 이상 운영되었을 것. 검증기에 대한 골든 벡터가 프로토콜 산출물에 들어 있을 것 | 변경 없음 — 이 에라는 어떤 합의 역할도 더하지 않고 어떤 정렬 규칙도 바꾸지 않는다 | 기밀 결제 (§12). 차폐 연산, 숨겨진 셀 종류와 가드 금지 (§4), 풀 슬롯과 그 폴드 규칙, 합의에 결정적인 코드로서의 범위 증명 검증기 |
전환에 관한 설계 노트. 에라 (Era) 0은 의도적으로 아주 작다. 관리자 키가 없으므로 일시 정지 버튼도 없고, 따라서 제네시스의 모든 줄은 구제책 없이 네트워크를 죽일 수 있는 줄이다. 폴드 (fold) (§3) 와 네이티브 연산 (§11) 이 안전에 결정적인 표면의 전부이며 (이 논문이 그 완전한 명세를 담을 수 있을 만큼 작다), 그것들은 감사와 적대적 시뮬레이션을 거쳐 출하된다. CPU 채굴 (RandomX) 은 그 인구 구성에 맞는다. 이미 갖고 있는 노트북으로 채굴하라는 것이다. 그것은 봇넷도 불러들인다. CPU로 채굴할 수 있는 모든 코인이 봇넷과 싸워 왔고, 우리가 예외이리라고 기대하지 않는다. 우리는 그 맞바꿈을 눈을 뜬 채로 받아들인다. 봇넷으로 기울어진 분배도 판매로 결정된 분배보다는 여전히 넓으며, 정직한 범용 하드웨어의 경쟁력을 지키는 것이 RandomX의 설계 취지 전부다 [14]. 공동 서명은 인수인 (underwriter) 이 등록할 수 있게 되는 순간부터 가동된다. 체크포인트 확정성은 스테이크가 지속되기 전까지 그렇지 않으며, 우리는 그 공백을 숨기는 대신 이름 붙인다. 채권은 건너뜀 (skip) 에 값을 매길 뿐 재구성에는 결코 값을 매기지 않으므로, 어떤 프로토콜 규칙도 인수인이 그 공백에 사전 확인을 팔아넘기는 것을 막지 못한다 — 어떤 규칙도 할 수 없는 일은 그 판매를 정직하게 만드는 것이다. "몇 초 안에 적용되거나 내 채권이 지불한다"는 깊은 재구성이 논외가 되고 나서야 인수 가능하므로, 보험이 적용된 사전 확인 상품은 프로토콜 법이 아니라 시장의 정직함으로서 확정성을 뒤따른다. 증언자는 오버레이가 활성화되는 순간부터 발행량에서 보수를 받는다 — 앞선 두 하이브리드 전환이 모두 그렇게 했다 (Decred는 지분증명 투표자에게 모든 블록 보상의 일부를 지급하고 [17], Ethereum의 비컨 검증자는 mainnet 블록을 제안하기 2년 전부터 발행량을 벌었다) — 그리고 생산자에게 치우친 77/20/3 분배는 분배 국면에 한정된다. 같은 선례가 채굴자에게 치우친 분배는 영구적 상태로는 틀렸음을 보여 주기 때문이며, 감축 경사가 그것을 은퇴시킨다. 에라 1은 발동 조건을 둘로 나누며, 그 분리는 하중을 진다. 명령어 집합은 높이로 활성화되고 — BOND가 먼저, 인수인과 시퀀서 등록과 cEVM이 그 뒤이며, 제네시스 파라미터가 이 두 높이를 구별해 순서를 지킨다 — 확정성 오버레이는 채권을 건 스테이크가 공급량의 1% 이상으로 K 에포크 동안 지속되고 나서야 활성화된다. 스테이크는 그것을 만들어 내는 연산이 존재하기 전에는 측정될 수 없기 때문이다. 에라 2는 이중 발동 조건을 유지하며 (높이 이면서 지속된 스테이크), 그래서 네트워크는 하찮은 스테이크로 전환하지도 않고 기존 채굴자들이 그것을 영원히 붙잡아 두게 두지도 않는다. 높이는 임계값이지 날짜가 아니며, 어떤 달력도 약속되지 않는다. 우리가 묻어 두는 대신 밝히는 단서 하나. 1%라는 활성화 하한에서 확정성을 정지시키는 데는 그 3분의 1 (공급량의 0.33%) 이면 되므로, 최초의 보험 적용 사전 확인이 딛고 선 확정성 자체가 어리다. K 에포크 지속 요건이 시간이 지나며 문턱을 높이고, 비활동 누출이 정지를 유지하는 비용을 비싸게 만들며, 인수인은 어린 확정성을 어린 보험 상품에 가격으로 반영할 것으로 기대된다. 더 깊은 보안은 선언이 아니라 더 깊은 스테이크와 함께 온다. 에라 1은 그림자 체인이다. 검증자 집합은 단 한 블록도 제안하기 전에 에라 내내 실전에서 확정을 수행한다 — 진짜 채권, 진짜 슬래싱으로 — 이는 대규모로 성공한 유일한 작업증명→지분증명 전환을 안전하게 만든 성질이다. 그것은 또한 통로가 아니라 머무를 수 있는 상태이기도 하다. 스테이크가 에라 2 임계값을 끝내 지탱하지 못하면, 네트워크는 무기한 작동하는 하이브리드로 남는다. 절벽이 아니라 보상의 경사는 채굴자 포크 결집에 그 결정적 순간을 주지 않으며, 그 경사는 중단 가능하다. 체크포인트가 연속 두 에포크 동안 확정되지 못하면, 경사는 확정성이 돌아올 때까지 현재 수준에서 멈춘다. 채굴자는 그 멈춤을 살 수 없다. 확정성을 정지시키려면 채권을 건 스테이크의 3분의 1이 필요하고, 확정성이 돌아올 때까지 비활동 누출이 그것을 흘려보내므로, 그 공격은 멈춘 보상이 주는 것보다 비싸다. 코인베이스를 채권으로 건 에라 0의 채굴자들은 첫 시퀀서 교대에서 우선권을 받으며 — 추가 코인이 아니다 — 이로써 채굴 공동체는 버려지는 대신 운영자 공동체로 전환된다.
차폐 에라의 발동 조건은 의도적으로 다른 것들과 다른 모양을 하고 있다. 높이와 스테이크 임계값은 노드가 측정하는 사실이지만, 암호 검증기의 준비 상태는 그렇지 않다. 그래서 발동 조건은 대신 하드포크가 인용할 수 있어야 하는 점검 목록이다. 공개된 감사, 수행한 testnet 에포크, 산출물에 든 벡터. 항목보다 그 형식이 더 중요하다. 이 네트워크에는 비상 대응 팀이 없다 — Zcash의 위조 버그가 견딜 만했던 데에는 인력을 갖춘 조직이 며칠 만에 수정을 출하했다는 점도 한몫했고, 여기서는 아무것도 그것을 약속할 수 없다 — 그래서 이 에라의 활성화는 유지 보수자를 전제하는 대신 만들어 내도록 설계되었다. 두 건의 독립 감사를 내놓고 적대적 testnet에 인력을 붙일 수 없는 공동체는 합의 검증기를 유지 보수할 수 없는 공동체이며, 점검 목록은 두 번째 무능을 첫 번째의 실패로서, 파탄 이후가 아니라 활성화 이전에 드러나게 한다. §12의 폴드 규칙은 살아남은 버그가 물릴 수 있는 비용을 한정한다. 점검 목록은 검증기가 무언가를 비용으로 물리기 시작하는 시점에 그것이 얼마나 덜 검토된 상태일 수 있는지를 한정한다. 어느 쪽도 다른 쪽을 대신하지 않으며, 이 에라는 둘 다 갖추고 출하되거나 아예 출하되지 않는다.
이 경사는 축소가 아니라 재분할이다. 작업증명이 내놓는 몫이 얼마든 지분증명 제안자가 그것을 가져가므로, §14.2의 보조금 일정은 네트워크가 전환의 어느 지점에 있든 영향을 받지 않는다. 이것이 그 일정을 높이의 순수 함수로, 원장을 참조하지 않고 네 개의 상수만으로 어떤 노드든 계산할 수 있는 것으로 유지해 준다.
이 전환이 다룰 만한 것이 되는 데에는 짚어 둘 만한 아키텍처상의 이유가 있다. 폴드는 누가 정렬하는지에 무관하다. 작업증명 채굴자는 이미 이 설계가 요구하는 눈먼 제안자다. 에라 2는 헤더에 누구의 서명이 실리는지를 바꿀 뿐 상태 의미론의 규칙은 하나도 바꾸지 않는다. 경계를 넘겨 옮겨야 할 실행 엔진이란 것이 없다.
에라 경계는 또한 용량이 움직이는 곳이기도 하다. §8.1의 바이트 용량과 그 아래의 전송 상수들이 거기서, 돌아가는 네트워크에서 측정된 전파 성능에 견주어 다시 못 박힌다. 그래서 일상적인 성장은 그 자체로 거버넌스 사건이 되는 대신, 이 일정이 이미 담고 있는 업그레이드를 타고 간다.
14.1 트레저리#
모든 블록 보조금의 3퍼센트가 트레저리 (treasury) 셀 (cell) 에 입금되고, 97퍼센트가 합의에 지급된다 — 그 블록의 생산자, 그리고 에라 1부터는 체크포인트 증언자에게 (§14). 이 몫은 제네시스에 고정되어 있고, 블록 0부터 적용되며, 모든 블록에 동일하게 적용된다. 수수료는 결코 건드리지 않으므로 (트레저리는 §8의 시장에 아무 권리도 없다), 그 비용은 발행량에 떨어지고 보유량에 비례해 모든 보유자에게 퍼진다.
이 셀은 에라 2까지 봉인되어 있다. 블록 0부터 누적되지만 그전에는 어떤 키도 그것을 열지 못한다. 제네시스에 정족수도, 주소도, 저자 키도, 비상 경로도 없다. 블록 0 시점에는 키를 쥘 만한 성숙한 공동체가 존재하지 않는다. 그런 공동체가 끝내 나타나지 않으면 그 셀은 결코 열리지 않고 그 코인은 결코 발행되지 않는다. 누적 규칙은 첫 블록부터 제네시스에 들어 있으므로 그것은 결코 변경이 아니다. 에라 2에서 새로 일어나는 일은 합의된 규칙이 효력을 갖게 되는 것뿐이다.
이 가운데 어느 것도 프리마인이 아니며, 그 차이는 수사가 아니라 검사 가능한 것이다. 프리마인이란 배정이다. 제네시스 블록 시점에 존재하며 누군가에게 속하는 코인과 주소와 키다. 여기 제네시스에는 그 셋 중 아무것도 없다. 사용 가능한 트레저리 (treasury) 코인도, 지정된 주소도, 존재하는 키도, 지목된 당사자도 없다. 제네시스에 들어 있는 것은 채굴된 모든 블록에 동일하게 적용되는 규칙 하나와, 언젠가 그 누적된 결과 위에 정족수를 어떻게 못 박을 수 있는지에 관한 두 번째 규칙이다. 그날이 오는지 여부는 저자가 정할 일이 아니다. 키 집합이 하드포크로 못 박히므로, 그 선정 기제는 모든 합의 변경이 쓰는 바로 그 기제다. 누군가 공개적으로 신원이 확인된 보유자 다섯을 제안하고, 노드 운영자들이 그들을 못 박는 포크를 채택하거나 그것을 돌리기를 거부하며, 자기 포크를 네트워크가 돌리도록 설득하지 못한 후보 정족수는 아무것에 대한 키도 쥐지 못한다. 장악할 투표도, 조작할 기여자 명부도, 저자의 목소리가 다른 어떤 노드 운영자의 목소리보다 무거워지는 순간도 없다.
에라 (Era) 2부터 이 셀 (cell) 은 하드포크로 못 박은 키 집합에 대한 다섯 중 세 개의 서명을 지닌 인증서 (certificate) 로만 출금된다. 지출은 평범한 인증서다. 공개되고, 최종적이며, 체인만으로 셀 수 있다. 정족수는 개방 시점에 활동 중인 기여자 가운데서 뽑히며, 그 집합이 효력을 갖기 전에 공개적으로 신원이 확인된다. 각 키는 서로 다른 당사자에게 있고, 어느 것도 공동 통제 아래 있지 않다. 유효한 5분의 3 지출은 대신 다섯 개의 대체 키를 지목할 수도 있으며 R 블록 뒤에 효력이 생긴다. 그동안 교체는 공개되어 있고 옛 집합이 여전히 유효하다. 교체는 지출의 문턱과 지출의 가시성을 함께 지닌다.
에라 0과 1은 기부로 자금을 조달한다. 제안은 지급 전에 공개되고, 마일스톤과 예산이 먼저 제시되며, 인도된 작업에 대해 집행되고, 쓰이지 않은 금액은 기금으로 돌아간다. 셀이 열리면 정족수가 그 규율을 물려받는다. 이는 합의 규칙이 아니라 규범이다. 그것을 강제하는 것은 모든 이탈이 원장에 보인다는 사실이다.
이 몫은 만료되지 않는다. 그것은 코인의 수량이 아니라 발행량의 비율이므로 §14.2의 보조금과 함께 감쇠하고, 꼬리 구간에서는 고정된 명목 흐름으로 지속된다. 공급량 대비 비율로 보면 0으로 수렴한다. 그것을 없애는 데 드는 비용은 어떤 합의 변경에나 드는 비용, 곧 하드포크다. 에라 2부터 이 5분의 3이 이 프로토콜의 유일한 신뢰받는 정족수다.
14.2 발행#
보조금은 매끄럽게 감쇠해 영구 꼬리에 이른다. 그 비율은 한 에포크 안에서는 일정하고 에포크 경계마다 한 번씩 내려가며, 네 개의 상수에 대한 정확한 정수 산술로 계산된다:
E(0) = E₀
E(n) = max(tail, E(n−1) − E(n−1)/Q)
여기서 L은 블록 단위의 에포크, Q는 감쇠 제수, E₀는 제네시스 보조금, E(n)은 에포크 n 내내의 블록당 보조금이다. 그 넷 — L, Q, E₀, tail — 이 상수이고, 이 일정이 합산해 이르는 꼬리 이전 공급량인 C는 점화식을 돌려 그것들로부터 도출되는 것이지 그 입력이 아니다. 앞선 개정판은 첫 줄을 E(0) = C / (L · Q)로 적었는데, 그러면 마치 C가 보조금을 나눠 내는 상수인 것처럼 읽힌다. 그것은 무한 기하급수적 감쇠의 닫힌 형태이며, 아래의 유한한 일정은 그 값으로 합산되지 않는다. 부동소수점도 없고, 틀릴 여지가 있는 표도 없으며, 반감의 절벽도 없다. 그 계단은 어떤 단일 블록도 그것을 겪지 않을 만큼 작은데, 이는 에라 2의 보상을 경사로 만든 것과 같은 논리다. 이 공식이 꼬리 아래로 떨어지고 나면 보조금은 블록당 고정된 양이 되며, 영원히 그렇다.
이 일정은 높이의 순수 함수다. 실제로 얼마가 지급되었는지는 참조하지 않으며, 이는 곧 일정보다 적게 지급한 블록 — 이를테면 보유자가 소각해 버린 주소에 돌아갈 코인베이스 — 이 곡선이 나중에 갚아 주는 부채가 아니라 C에 대한 영구적인 부족분이라는 뜻이다. 그러므로 C는 이 일정이 합산해 이르는 수치이지, 그것이 도달을 보장하는 상한이 아니다.
꼬리가 존재하는 것은 보안이 영구적인 비용이기 때문이다. 꼬리는 §8의 수수료 시장을 징발하지 않으면서 현재 에라를 지키는 이들 — 채굴자, 그다음에는 채굴자와 증언자, 그다음에는 검증자 — 에게 지급한다. 그 크기는 연간 꼬리 발행량이 유통 공급량의 1% 아래에서 시작하도록 정해져 있고, 분자가 고정되어 있고 공급량은 자라므로 그 비율은 떨어지기만 한다. 그것에 맞서 §8의 순차 기본 수수료 소각이 돌아가므로, 순 발행량은 꼬리에서 소각을 뺀 것이며 부하가 걸리면 음수가 될 수 있다. §14.1의 97/3 분배는 꼬리를 포함한 모든 보조금에 적용된다.
상수 (제네시스, 예시, §13과 동일): 에포크 L = 2,880 블록. 감쇠 제수 Q = 1054. 제네시스 보조금 E₀ = 블록당 21. 꼬리는 블록당 0.33. 30초 블록에서 이 값들은 연간 계수 0.70702를 주며, 이는 곧 발행률이 2년마다 절반이 된다는 뜻이다 — 근사적으로가 아니라 정확히 그렇다. E₀ = 21에 대해 E(730) = 10.50230028이다. 이 공식은 에포크 4,376, 높이 12,602,880, 대략 12년째에 꼬리 아래로 떨어지므로, 감쇠하는 팔은 에포크 0부터 4,375까지 이어지고 그것이 합산해 이르는 공급량 C는 62,744,838.47이다. 그중 실제로 발행되는 것은 62,744,817.47이다. 그 차이는 제네시스 블록의 21인데, 지급할 채굴자가 없고 재현 가능한 제네시스는 어떤 주소에도 입금해서는 안 되므로 코인베이스를 전혀 지급하지 않기 때문이다. 그러면 연간 꼬리 발행량은 ≈34.7만, 곧 발행된 공급량의 0.55%이며 거기서부터 떨어진다. **닫힌 형태 L · E₀ · Q = 63,745,920은 C의 상한이지 그 값이 아니며**, 그 격차는 반올림 오차가 아니다. 그 곱은 무한 기하급수적 감쇠의 합인 반면, 이 일정은 유한하고, 매 단계에서 내림하며, 꼬리에서 멈춘다. 그것은 C를 1,001,081.53, 곧 1.60% 초과한다. 인용해야 할 것은 그 합이지 결코 닫힌 형태가 아니다. 적합성이란 점화식을 재현하는 것이다 — 어떤 노드도 어떤 높이에서든 C를, 또는 이 문단의 다른 어떤 수치도 계산하지 않는다.
15. 측정#
핵심 주장이 처리량의 비대칭인 설계라면 독자에게 숫자를 빚지고 있다. 아래 수치는 레퍼런스 구현에서 나온 것이며 공개된 소스로부터 다시 도출할 수 있다. 하드웨어는 10코어 x86 데스크톱 CPU다. 수치는 5회 실행의 중앙값이다.
- 폴드 처리량: 100,000개 슬롯의 작업 집합에 대해 코어당 초당 883,000회의 슬롯 연산, 곧 인증서당 3개 슬롯 기준으로 초당 294,000개의 적용된 인증서.
- 무상태 검증: CPU 코어당 초당 1,470개의 인증서, 10코어에 걸쳐서는 초당 5,220개 — 그 비율이 병렬성 주장이며, 단언된 것이 아니라 측정된 것이다.
- 서명 검증: 낮은 위수 검사와 비틀림 검사를 포함해 단건으로 초당 1,500회.
- 종단 간: 인증서 2,900개짜리 블록이 1,963 ms에 검증되고 9.9 ms에 폴드된다. 둘을 따로 보고하는 것은 그것들이 이 논증의 두 절반이기 때문이다. 앞의 것은 네트워크가 소유하지 않은 코어와 함께 규모가 커지고, 뒤의 것은 네트워크가 소유한 유일한 루프다.
폴드의 측정은 뺄셈이며, 그렇다고 말하는 것도 그것을 보고하는 일의 일부다. 블록을 확정하는 일은 무상태 검사와 순차 폴드를 함께 돌리므로, 폴드의 수치는 전체에서 따로 잰 검사 시간을 뺀 값이다. 두 절반 모두 산출물에 들어 있다.
우리는 레퍼런스 구현이 실제로 돌리는 것만 보고하며, 이는 독자가 스스로 알아내도록 남겨 두는 대신 짚어 둘 만한 두 가지 한계를 낳는다. 서명 검증은 한 번에 하나씩 측정한다. 일괄 검증은 실재하는 기법이고 명백히 잘 맞지만, 그것은 이 프로젝트가 아직 작성하지 않은 보안에 결정적인 암호 코드이며, 존재하지 않는 코드에 대한 수치는 측정이 아니다. §2와 §6이 내다보는 GPU와 SIMT 수치는 시퀀서의 배치 인증서에 속하며, 그것은 에라 1과 함께 도착한다. 둘 다 설계상의 기대다. 어느 쪽도 위 수치의 하중을 지지 않는다. 병렬성 주장은 인증서를 독립적으로 검사할 수 있다는 데 놓여 있으며, 일괄 처리는 그것을 더 빠르게 만들 수는 있어도 참으로 만들 수는 없다.
16. 관련 연구#
Zycord의 파이프라인 — 먼저 실행하고, 눈먼 채로 정렬하고, 확정 시점에 검증한다 — 은 허가형 환경에 조상을 두고 있다. Hyperledger Fabric의 execute-order-validate [3] 인데, 문헌에 기록된 그 약점은 경합 아래에서의 중단율과 기관 보증 정책에 대한 의존이다. 그 계보에 견준 Zycord의 기여는 (i) 건너뜀 (skip) 을 일급 시민이자 ABA에 관대한 의미론으로 삼는 값 동일성 기반 적용 가능성, (ii) 충돌의 경제적 귀속 — 이중 서명을 객관적으로 슬래싱 가능하게 만들고 낡음을 값이 매겨진 보험 가능한 서비스로 만드는 채권 기반 인수이며, 이것이 execute-order-validate가 무허가로 가는 데 결여하고 있던 것이다 — 그리고 (iii) 적용이 보장되는 강제 포함이다. 롤업의 탈출구는 포함만을 보장한다. 미리 선언된 결정론적 읽기/쓰기 집합은 Calvin [4] 에서 내려왔고 Solana의 접근 목록 [16] 에 나타난다. 교환 가능한 에스크로 기법은 O'Neil [9] 로 거슬러 올라가며 오늘날 Block-STM [5] 위의 Aptos 애그리게이터 같은 단일 노드 스케줄러 안에 살아 있다 — Zycord는 그 교환성 계약을 노드 사이로 옮기고 거기에 값을 매긴다. 병렬 EVM 시스템 [5] 과 실행 지연 체인은 여전히 어디서나 재실행하며 상태 I/O 벽에 부딪힌다. Narwhal [6] 은 우리의 초기 설계가 그랬듯 데이터 전파를 정렬로부터 분리한다. Sui의 소유 객체는 우리의 일회 쓰기 셀 (cell) 과 나란하다. Zether [7] 의 pending/base 분리는 가드 델타 규율에 영감을 주었고 (그리고 키메라 원장의 프라이버시 뿌리 [8] 와 함께 §12의 기밀 결제로 돌아온다 — 무거운 암호 차선의 첫 입주자로, 기저 계층에 붙박이로 넣는 대신 숨긴 금액과 일회용 주소를 병렬 gas에 값으로 매긴 것이다). 사슬처럼 이어지는 확정성 오버레이는 Casper FFG [12] 를 따른다.
17. 결론#
우리는 트랜잭션을 실행하는 대신 인증서 (certificate) 를 정렬하는 네트워크를 제안했다. 유효성은 누구든, 어디서든, 병렬로, 바이트만으로 검사한다. 상태는 한 쪽 분량으로 규정할 수 있을 만큼 단순한 폴드 (fold) 로 전진한다. 충돌은 건너뜀 처리되고, 값이 매겨지고, 책임자가 있다. 동시성은 발견되는 것이 아니라 선언된다. 검열은 구조적으로 견뎌 낼 수 있다. 그리고 출시는 누군가에게 검증자 집합을 믿어 달라고 청하기 전에 코인을 먼저 분배한다. 검증은 네트워크가 소유하지 않은 하드웨어와 함께 밖으로 확장된다. 확정은 순차적으로 남되 — 거의 공짜다.
Zycord는 작업을 쫓아다니지 않는다. Zycord는 가만히 있고, 네트워크가 그 작업을 한다.
참고 문헌#
[1] S. Nakamoto. Bitcoin: A Peer-to-Peer Electronic Cash System. 2008. [2] V. Buterin. Ethereum: A Next-Generation Smart Contract 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] B. Bünz, S. Agrawal, M. Zamani, D. Boneh. Zether: Towards Privacy in a Smart Contract World. Financial Cryptography 2020. [8] J. Zahnentferner. Chimeric Ledgers: Translating and Unifying UTXO-based and Account-based Cryptocurrencies. IACR ePrint 2018/262. [9] P. E. O'Neil. The Escrow Transactional Method. ACM TODS, 1986. [10] M. Herlihy, E. Koskinen. Transactional Boosting: A Methodology for Highly-Concurrent Transactional Objects. PPoPP 2008. [11] M. Shapiro et al. Conflict-free Replicated Data Types. SSS 2011. [12] V. Buterin, V. Griffith. Casper the Friendly Finality Gadget. 2017. [13] M. Corallo. BIP 152: Compact Block Relay. 2016. [14] tevador et al. RandomX: Proof-of-Work Algorithm Optimized for General-Purpose CPUs. 2019. [15] EIP-1559: Fee Market Change for the ETH 1.0 Chain. Ethereum Improvement Proposals, 2019. [16] A. Yakovenko. Solana: A New Architecture for a High Performance Blockchain. 2017. [17] Decred Documentation: Issuance. docs.decred.org — 작업증명 채굴자, 지분증명 투표자, 트레저리 사이의 블록 보상 분배. [18] EIP-4844: Shard Blob Transactions. Ethereum Improvement Proposals, 2022. [19] Monero: Dynamic Block Weight and Penalty. Monero Research Lab 문서. 또한 JollyMort, Monero Dynamic Block Size and Dynamic Minimum Fee, 2017 참조. [20] bitcoincashautist. CHIP-2023-04: Adaptive Blocksize Limit Algorithm for Bitcoin Cash. 2023.