Mimari
Teknik dokümanın mühendislik eşlikçisi — referans düğümün tasarımı nasıl hayata geçirdiği ve bunun ardındaki kararlar. Açıklayıcıdır, bağlayıcı değil.
Protokol, parametre dosyaları ve altın vektörlerdir, artı nerede tanımlanmış olurlarsa olsunlar adı konmuş kurallar; hat belirtimi ise eş katmanının gerekliliklerini taşır. Bu sayfa o yüzeyi açıklar ve ardındaki kararları kaydeder. Bağlayıcı yüzeyle çeliştiği yerde bağlayıcı yüzey kazanır ve bu metin düzeltilir. Tam mühendislik eşlikçisi docs/ARCHITECTURE.md dosyasıdır.
İki yüklem, iki motor#
Bir sertifikanın baştan sona yaşamı:
wallet network every full node
+------------+ gossip +--------------+ +---------------------+
| build cert | ---------> | cert topic | ------------> | STATELESS PIPELINE |
| (reads, | | (TLS gossip) | | V1..V8, batch sigs, |
| writes, | +--------------+ | native re-exec |
| sigs, seq, | | -> mark VALID |
| deposit) | +----------+----------+
+------------+ | mempool
v
miner (any node) +---------------------+
+-------------------+ block | FOLD (sequential) |
| assemble ordered | --------> | F-rules per cert: |
| hash list + bodies| gossip | APPLY / SKIP / DROP |
| + RandomX solve | | -> new state |
+-------------------+ +---------------------+
Geçerlilik durumsuz ve paraleldir: düğüm başına, sertifika başına bir kez, bloklardan önce ve onlardan bağımsız olarak çalışır. Uygulanabilirlik durumlu ve sıralıdır: fold'un içinde, sertifikanın işlenmiş konumunda çalışır. Madenci hiçbir yürütme yapmaz; doğrulandığını zaten gördüğü özetleri sıralar ve proof of work'ü çözer. Fold, bellek içi bir çalışma kümesi üzerinde sıkı bir döngüdür — karşılaştır, ekle, yaz.
Mühendislik ilkeleri#
| İlke | |
|---|---|
| P1 | Fold kutsaldır. Durum geçiş işlevi; G/Ç'si, saati, goroutine'i, map yinelemesi ve kayan noktası olmayan tek bir saf pakette yaşar. Hataları olaydan sonra düzeltilemeyecek tek koddur. Düğümdeki geri kalan her şey değiştirilebilir tesisattır. |
| P2 | Belirlenimcilik başarımı yener. Belirlenimsizlik riski taşıyan her eniyileme, uzlaşı kodunda reddedilir. Başarım, güvenli olduğu yere, durumsuz iş hattına aittir. |
| P3 | Yönetici anahtarı yok, ayrıcalıklı RPC yok. Herhangi bir anahtarın duraklatabileceği, yükseltebileceği, basabileceği ya da yeniden düzenleyebileceği bir kod yolu yoktur. Fold kurallarında değilse, yoktur. |
| P4 | Küçük uzlaşı yüzeyi. core/ standart kitaplığın dışından hiçbir şeyi içe aktarmaz. Düğümün geri kalanı ekosistem kitaplıklarını kullanabilir; çekirdek kullanamaz. |
| P5 | Önce belirtim. Protokol, altın vektörlerdir. Go kodu bir referans gerçekleştirimdir; vektörleri geçen bağımsız bir gerçekleştirim bir çatallanma değil, bir eştir. Bakımcının sonunda hiç kimse olabilmesini sağlayan da budur. |
| P6 | v0.1'den itibaren yeniden üretilebilir. Sabitlenmiş Go araç zinciri, -trimpath, sabitlenmiş bağımlılıklar. Güven, ikili dosyadan koda kayar; anonim bir yazarın sunabileceği tek güven de budur. |
| P7 | Tek ikili dosya, yükseklikle açılır. Makine, teminat işlemleri ve sıralayıcı kaydı her sürüme derlenir ve etkinleşme yüksekliğinin altında reddedilir — Validate, h1_vm ≥ h1_bond olmasını ve h1_vm'nin bir epoch sınırına denk gelmesini şart koşar. Bir Era, zincir bir sayıya ulaştığı için gelir; işletmecilerden yükseltme yapmaları istendiği için asla. |
Kuşkucu bir okurun en çok üstüne gitmesi gereken P3'tür ve üstüne gidilecek yer de hazinedir: genesis hiçbir anahtar ve hiçbir harcama yolu içermez, dolayısıyla tutulacak, devredilecek ya da çalınacak bir ayrıcalık yoktur. Era 2'nin 5'te 3'lük yeter sayısı bir gelecekteki sert çatallanmayla sabitlenir — başka herhangi bir uzlaşı değişikliğiyle aynı toplumsal düzenek, aynı reddedilmeye açık ve o hâlde bile tam olarak tek bir hücreyi kımıldatabilir. Yalnızca ağ onu yazmaya razı olursa ortaya çıkan ve o zaman da tek bir hücreyi tutan bir yeter sayı, bir harcama kuralıdır. Bir yönetici anahtarı ise kimse rıza göstermeden önce var olan ve her şeye uzanan şeydir.
Kriptografik ilkeller#
| Rol | Seçim | Neden |
|---|---|---|
| İmzalar | Ed25519 | Yığın doğrulama (GPU'ya giriş rampası), esneklik yok, minik anahtarlar. Genesis'te sabitlenmiş katı kurallar: açık anahtar ve R için kurallı kodlamalar zorunlu, açık anahtar burulmasız ve düşük mertebeden olmayacak, doğrulama ise eşçarpansız. |
| Özetleme | BLAKE3 | Sertifika ve blok kimlikleri, adresler, state root. Aktarma hat hızında özetleyecek kadar hızlı; epoch state root'u için paralele elverişli. |
| Proof of work | RandomX | CPU'ya göre eniyilenmiş. Ağaçtaki tek cgo; bir derleme etiketinin ardında durur ve o etiket olmadan yapılan bir derlemede bulunmaz. pow_engine uzlaşı kökündedir, dolayısıyla yanlış motoru taşıyan bir ikili dosya, yanlış kanıtı kabul etmek yerine başlamayı reddeder. |
| Alan ayrımı | zorunlu | Her özet blake3(tag ‖ payload)'dır. İmzalar hem zincir kimliği hem de uzlaşı kökü üzerinden imzalar; bu da hem ağlar arasında hem de bir ağın iki bedenlenişi arasında yeniden oynatmayı öldürür. |
Yığın yolunu güvenli kılan şey, burulmanın reddedilmesidir. Karma mertebeli bir anahtar küçük mertebeli değildir, dolayısıyla hiçbir engelleme listesi ona ulaşmaz ve tam olarak eşçarpanlı bir yığın doğrulayıcının eşçarpansız tekil bir doğrulayıcıyla anlaşmazlığa düştüğü yerdir. Anahtar ve R asal mertebeli altgrupta olduğunda ikisinin denk olduğu kanıtlanabilir — dolayısıyla bir yığın doğrulayıcı, yığınlamadan önce aynı kodlama ve burulma kurallarını uygulamak koşuluyla eşçarpanlı olabilir. O yükümlülük, seçimin bedelidir ve yığın doğrulayıcı henüz yoktur.
Kurallı kodlama ve tanımlayıcılar#
Bütün uzlaşı nesneleri SSZ kaplarıdır: tek bir kurallı bayt kodlaması, map sıralaması yok, isteğe bağlı alan belirsizliği yok, ucuz kısmi ayrıştırma için sabit konumlar ve yerleşik merkleleştirme.
cert_id = blake3("zcd/certid/v1" || ssz(certificate with an empty signature list))
cert_exemplar = blake3("zcd/cert/v1" || ssz(certificate))
block_id = blake3("zcd/block/v1" || ssz(header))
İlk ikisi, farklı soruları yanıtlayan farklı özetlerdir ve birini ötekinin yerinde kullanan bir gerçekleştirim parasal olarak bozuktur. Kimlik, bu yetkilendirme faturalandırıldı mı sorusunu yanıtlar; örnek (exemplar) özeti ise bu baytlar bunu kanıtlıyor mu sorusunu. İkisi asla bir anahtarı paylaşmaz.
İmzalar kimliğin ön görüntüsünün dışındadır, çünkü bir imza rastgeleleştirilmiş bir gösterimdir: nonce'ı imzalayan seçer, her nonce aynı gövde üzerinde bir başka geçerli ve kusursuzca kurallı imza verir ve hiçbir doğrulayıcı hangisinin kullanıldığını denetleyemez. İçeride olsalardı, tek bir yetkilendirmenin her biri faturalandırılabilir ve her biri gerekli imzalayanlardan herhangi biri tarafından ötekilerin yetkisiyle üretilebilir sınırsız sayıda kimliği olurdu.
Kimliğin dışındaki bir teklif, aktarım sırasında herhangi birinin yeniden yazabileceği bir teklif olurdu — taban ücret üzerinden imzalayanın bakiyesini yakmak için şişirilebilir ya da sertifikayı her bloğun dışında tutmak için sıfırlanabilirdi. Bir sertifikanın ödediği şey, imzalayanının yetkilendirdiği şeyin bir parçasıdır; dolayısıyla özetlenir ve imzalanır. Sonradan "ücreti, aktarma esnekliği için imzalı gövdenin dışına taşıyan" bir kodlama değişikliği bir eniyileme gibi görünür ve bir hırsızlık yolu olurdu.
Bunu izleyen kural: ayrıştırın, iki kez doğrulamayın. Kod çözme kurallı biçimi dayatır, dolayısıyla kodu çözülmüş bir nesne kuruluş gereği yapısal olarak geçerlidir ve kural motorları biçimi hiç yeniden denetlemez.
Hücre modeli#
Bir hücre, bir slot'taki değerdir. Hücre değerleri, 32 baytta big-endian saklanan işaretsiz 256 bitlik tam sayılardır. Var olmayan hücreler sıfır olarak okunur — sıfır yokluktur, ki bu, bir gerçekleştirim kolaylığı değil, bir uzlaşı gerekliliğidir: state root'u, onu üreten geçmişin değil, durumun bir işlevi olarak tutar.
Bundan ayrı olarak protokol bir harcanmış adres kaydı tutar: imzalama yetkisi yakılmış one-shot adreslerin kalıcı uzlaşı kümesi.
Addr = version || blake3("zcd/addr/v1" || version || payload)[:31]
| Sürüm | Tür | Borçlandırma yetkisi |
|---|---|---|
0x01 | one-shot kullanıcı | Sahip imzası; borçlandıran her sertifika ayrıca açık bir MARK_SPENT taşımak zorundadır. Bu uygulandıktan sonra, adres altındaki her okuma ve yazma sonsuza dek başarısız olur. |
0x02 | kalıcı kullanıcı | Sahip imzası; sonsuza dek yeniden kullanılabilir. Harcanmış kaydına asla giremez. |
0x03 | varlık | Varlığın değiştirilemez yetki hücreleri tarafından yönetilir. |
0x00 | protokol | Yalnızca fold: epoch beacon, taban ücret hücreleri, coinbase olgunlaşma halkası, hazine hücresi. |
0x04 | ayrılmış — gizli değer hücresi (Era S) | Era 0'da ulaşılamaz. |
0x04, sonradan tahsis edilmek yerine şimdi ayrılıyor; çünkü gizli
bir değer, sıradan bir değerden adresiyle ayırt edilebilmek zorundadır: bir Pedersen
taahhüdü ile 256 bitlik bir bakiyenin ikisi de 32 bayttır, dolayısıyla hataen ya da kötü niyetle
bir taahhüt slot'una nişan alan korumalı bir delta, fold'un bir eğri noktası kodlamasına bir tam
sayı eklemesine yol açardı — her denetimi geçen ve kimsenin asla harcayamayacağı bir hücre
bırakan bir aritmetik. Bu tablo genesis'te dondurulur, dolayısıyla bayt burada sahiplenilir ve
ulaşılamaz bırakılır.
Kayıt girdisi asla sıkıştırılmaz. Harcanmış bir adres altındaki hücre değerleri, geri alma ufkundan sonra budanabilir; ama adresi harcanmış olarak kaydeden girdi, onun yeniden diriltilmesini engelleyen şeydir. Yalnızca ekleme yapılan bir uzlaşı durumudur, adres başına yaklaşık 33 bayt, sonsuza dek — protokolün dürüstçe kabul ettiği açık sorun; her nullifier kümesi tasarımıyla yapısal olarak paylaşılan bir sorun.
Durumsuz geçerlilik ve faturalandırma yasası#
V kuralları her sertifika üzerinde, paralel olarak, mempool'a kabulden önce ve blok doğrulaması sırasında çalışır ve sıfır durum ister: kurallı biçim ve zincir kimliği; imzalama kökü üzerinde doğrulanan her imza; yalnızca sertifikadan türetilebilen yetkilendirme; bildirilen okumaların programın türettiğine eşit olması; ve iade hedefinin, sertifikanın kendisinin yaktığı şeye karşı denetlenmesi.
Sistemin faturalandırma yasası tek bir cümledir ve tutunulacak şey odur:
Bir imza, en fazla bir fatura ve asla imzalayanının kaçınamayacağı bir konumda değil.
Bu belirtim, teknik dokümanın söz dağarcığına bir terim ekler: düşürme (drop), faturalandırılmayan bir olmayan-olay. Teminatı çoktan tüketilmiş olarak uygulanmaya ulaşan bir sertifika düşürülür — faturalandırılmaz, görüldü olarak işaretlenmez, taze bir teminata karşı yeniden gönderilmekte serbesttir — dolayısıyla dürüst kullanıcılar kendi teminat hücrelerindeki yarışlar yüzünden hiçbir şey kaybetmez.
Depo düzeni#
zycord/
spec/ parameter sets, golden vectors, library images <- THE PROTOCOL
core/ consensus-critical; standard library only (P4)
types/ crypto/ ssz/ u256/ state/ validity/ fold/ params/ genesis/
cevm/ the certificate-adapted EVM; vendored interpreter, pure Go
stdlib/ the pre-deployed library, its addresses and code hashes
pow/randomx/ the mainnet engine: vendored C++, cgo, behind a build tag
node/ storage/ chain/ verify/ mempool/ miner/ p2p/ sync/ rpc/ stratum/
wallet/ key management, certificate builders (reference; not consensus)
contracts/ the reference contracts, in Solidity
sim/ simulator, fuzz harnesses, differential refold, chaos soak
cmd/ zycordd, zcd
desktop/ the wallet in a native window — a separate Go module
docs/ architecture, protocol, operating guide, whitepaper
Bağımlılık okları yalnızca içeri doğrudur — node → core,
wallet → core, asla tersi değil — ve core/ içindeki hiçbir şey
core/ ile standart kitaplığın dışına uzanmaz. Adı konmuş ve dayatılan tek istisna:
core/pow/randomx, ağaçtaki tek cgo'dur ve yalnızca derleme etiketi altında derlenir;
dolayısıyla o etiket olmadan yapılan her derleme yine yalnızca standart kitaplığa dayanır ve bir C
araç zinciri gerektirmez. Bunu dayatan denetimi CI çalıştırır, çünkü üçüncü taraf denetimi modül
yollarını tarar ve cgo'nun böyle bir yolu yoktur — bu da kural eklenene kadar onu kimsenin
dayatmadığı anlamına geliyordu.
Nasıl sınanıyor#
- Altın vektörler. Her fold, blok ve geçerlilik kuralının
(pre-state, block) → (post-state | invalid, outcomes, fees)biçiminde olumlu ve olumsuz durumları vardır. Bu takım, bağımsız gerçekleştirimler için uyumluluk sözleşmesidir. - Mağdur etme takımı. Uygulanmış ve atlanmış sertifikaların yeniden dahil edilmesi, süresi dolmuş dahil etme, düşük teklifli dahil etme, proposer karıştırması altında bağımlı zincirler, yak-ve-iade döngüleri, üçüncü taraf alacak fırtınaları, basım tavanı sınır yarışları.
- Özellik tabanlı. Proposer sırası permütasyonu altında fold belirlenimciliği, delta yer değiştirebilirliği, ABA dayanıklılığı ve korunum — yoldaki teminatlar, olgunlaşma halkası ve hazine hücresi dahil; çünkü hazineyi atlayan bir korunum denetimi her bloğu değer yaratıyor diye bildirir.
- Ayrımsal. Hız için değil, apaçıklık için yazılmış, bilerek naif ikinci bir fold gerçekleştirimi, gerçek olana karşı bulandırılır. Ayrışma, bir sürüm engelidir.
- Çekişmeli benzetim. Atlama fırtınaları, teminat boşaltma yarışları, düşürme tıkıştıran madenciler, yeniden düzenleme işkencesi, zaman damgası oynaması, hafif tutulma aktarma senaryoları. Senaryo yapılandırmaları işlenir; koşular tohumla yeniden üretilebilir.
- Eşzamanlılık, bilerek. Birden çok goroutine'in dokunduğu her bileşenin, sürecin gerçekte kullandığı biçimde, gerçekten eşzamanlı olan bir sınaması vardır. Tek goroutine'li bir takım üzerindeki
-racehiçbir şey ölçmez ve başarı bildirir. - Kaos yükleme sınaması. Gecikme, seğirme, kayıp ve bölünme enjekte eden bir vekil sunucunun arkasında, gerçek soketler üzerinde gerçek düğüm süreçleri; düğümler rastgele
SIGKILLile öldürülür. Bütün-racetakımının kaçırdığı veri yarışını bulan yüzey budur.
Genesis bir tören değil, bir üründür#
zcd genesis, genesis bloğunu — boş durum, ilklendirilmiş beacon hücreleri,
boş harcanmış kaydı, hiçbir türden tahsis yok — ve kimliğini yayar.
Duyurulan açılış; haftalar öncesinden kod etiketine, parametre özetine, genesis kimliğine ve açılış
zamanına bağlanır. Herkes bu dördünü, kaynaktan, herhangi bir makinede, milisaniyeler içinde
yeniden kurabilir. Güvenilecek başka bir şey yoktur.