ZYCORD belgeler
Türkçe
ZycordBelgelerMimari

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.

Bu belge bağlayıcı değildir

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 or sequencer         network                        every full node
+-------------+   gossip   +--------------+               +---------------------+
| build cert  | ---------> | cert topic   | ------------> | STATELESS PIPELINE  |
| (reads,     |            | (TLS gossip) |               | V-rules, strict     |
| writes,     |            +--------------+               | Ed25519, program    |
| sigs, fee,  |                                           | re-execution        |
| deposit)    |                                           |  -> mark VALID      |
+-------------+                                           +----------+----------+
                                                                     | mempool
                                                                     v
                        miner (any node)                  +---------------------+
                      +----------------------+   block    | FOLD (sequential)   |
                      | order the hash list, | ---------> | per certificate:    |
                      | append forced certs, |   gossip   | APPLIED / SKIPPED / |
                      | RandomX solve        |            | FORCED_FAILED /     |
                      +----------------------+            | DROPPED -> 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 içinde, sertifikanın işlendiği konumda çalışır. Madenci kendisine verilen hiçbir şeyi yürütmez: geçerliliği doğrulanmış olarak gördüğü özetleri sıralar ve proof of work'ü çözer ya da Era 2'de proof of stake'e geçişten sonra, kurada kendisine düşen slot'u imzalar. Tek yürütme işi, Era 1'den itibaren zorunlu yolunkidir: açık intent'leri kendi bloğunun sonundaki duruma karşı yürütebilir ve sonuçları, blok başına en fazla 16 tane olmak üzere ekleyebilir; her düğüm bunları ardından diğer her sertifika gibi denetler. Fold, bellek içi bir çalışma kümesi üzerinde sıkı bir döngüdür — karşılaştır, topla, yaz — ve hiçbir şey yürütmez.

Mühendislik ilkeleri#

İlke
P1Fold 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.
P2Belirlenimcilik 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.
P3Yö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.
P4Küçü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.
P6v0.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.
P7Tek ikili dosya, yükseklikle açılır. Makine, sıralayıcı düzeneği ve zorunlu yol her sürüme derlenir ve etkinleşme yükseklikleri olan h1_vm (mainnet'te 80.640) altında reddedilir; Validate, bu yüksekliğin bir epoch sınırına denk gelmesini şart koşar. Era 1, zincir bir sayıya ulaştığı için gelir; işletmecilerden yükseltme yapmaları istendiği için asla. Sonraki Era'lar ikili dosyada değildir: her biri sert çatalla, kendi sürümü olarak gelir.

P3, kuşkucu bir okurun en çok üstüne gitmesi gereken ilkedir ve üstüne gidilecek yer 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. Hazine 259.200 yüksekliğinden önce harcanamaz ve onu hangi kural açarsa açsın bir uzlaşı değişikliği olarak gelir — diğer her değişiklikle aynı toplumsal mekanizma, aynı reddedilme olasılığına tabi ve o zaman bile tam olarak tek bir hücreyi hareket ettirebilen. Kurucu payı bir anahtar değil, bir alacaktır: parametre dosyasında sabitlenmiş tek bir adrese, Era 2'nin epoch 1.095 olarak okuduğu 3.153.600 yüksekliğine kadar her sübvansiyonun %3'ü. O adres coin tutar ve başka hiçbir şeye erişemez. Yönetici anahtarı, kimse onay vermeden önce var olan ve her şeye erişen anahtardır.

Kriptografik ilkeller#

RolSeçimNeden
İmzalarEd25519Yığı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.
ÖzetlemeBLAKE3Sertifika 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 workRandomXCPU'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ızorunluHer ö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.

Ücret teklifi kimliğin içindedir ve bu parasal bir karardır

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ümTürBorçlandırma yetkisi
0x01one-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.
0x02kalıcı kullanıcıSahip imzası; sonsuza dek yeniden kullanılabilir. Harcanmış kaydına asla giremez.
0x03varlıkVarlığın değiştirilemez yetki hücreleri tarafından yönetilir.
0x00protokolYalnızca fold: epoch beacon, taban ücret hücreleri, coinbase olgunlaşma halkası, hazine hücresi, sıralayıcı sayaçları.
0x05sözleşmeAnahtarla kimse: hiçbir anahtarın özeti böyle bir adrese denk gelmez. Kararı sözleşmenin kodu ve fold kuralları verir.
0x04tanımlı değilAltında hiçbir hücre yoktur; böyle bir adresi belirten bir sertifika geçersizdir.

Paralellik tipli erişimden gelir. Bir okuma, hücresini nasıl kısıtladığını bildirir — EXACT ya da GUARD_GE, GUARD_LE, GUARD_EQ korumalarından biri — ve bir yazma ne yaptığını bildirir: SET, DELTA_ADD, DELTA_SUB ya da MARK_SPENT. Hesaplamayı yalnızca EXACT besler ve hücre değiştiğinde yalnızca EXACT bayatlar; bir koruma hiçbir şey döndürmez ve bir delta hiçbir şey okumaz; böylece yeniden yürütme, tam okumaların saf bir işlevi olarak kalır ve tek bir slot'a yönelik istenen sayıda korumalı borç ve alacak değişmeli olur. Sertifika başına, slot başına tek bir disiplin: bir set ile bir delta asla aynı slot'u paylaşmaz. Sıfır yazmak hücreyi siler; dolayısıyla hiç yazılmamış bir slot ile sıfır yazılmış bir slot aynı slot'tur.

One-shot ile kalıcı arasındaki fark, iki ayrı defter değil, bir adres biti olarak yüzeye çıkan bir cüzdan politikasıdır. Cüzdanlar varsayılan olarak gelen her ödeme için taze bir one-shot adres kullanır; bu, sıfır çekişmeli yoldur. Hesap isteyen kalıcı sürümü kullanır. Madencilik ödülleri kalıcı bir adrese aittir: uzlaşı ödeme adresi olarak her iki türü de kabul eder, ancak bir one-shot adres harcandığı anda tuttuğu her ödülü yakar; bu yüzden düğüm onu ödeme adresi olarak reddeder.

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, her liste kendi sınırı içinde; imzalama kökü üzerinde katı Ed25519 altında doğrulanan her imza, imza kümesi hem yeterli hem de en küçük; programın bildirilen okumalara karşı yeniden yürütülmesinin tam olarak bildirilen yazmaları üretmesi; yetkilendirme gerektiren her yazma için yetkilendirme ve teminat hücresi üzerinde koşulsuz bir imza; bir kullanıcı adresinin yerel bakiyesi olan ve sertifikanın en kötü durumunu karşılayan bir teminat; öz tutarlılık, yani hiçbir yazmanın aynı slot'un bir okumasıyla çelişmemesi ve borçlandırılan hiçbir one-shot adresin harcanmış olarak işaretlenmekten kaçmaması; bir protokol hücresine hiçbir yazma olmaması; belirtilen her adreste tanımlı bir sürüm baytı; ve sıralayıcı anahtarı sıfır olmayan bir sözleşmede, tam yol üzerinde o anahtarın imzası.

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.

Fold bir bloğu üç sınıfta sıralar ve üreticiye hiçbir takdir payı bırakmaz: önce ait oldukları sıralayıcı pipeline'larının sırasıyla fill'ler; sonra diğer her sertifika (deposit address, Seq, id) sırasıyla; en son da kimliğe göre zorunlu sertifikalar. Ardından her sertifikanın dört sonuçtan tam olarak biri olur ve altın vektörler bunları adlandırır:

SonuçNe zamanKim öder
APPLIEDBildirilen her okuma geçerliliğini korur.Teminat yatıran, gerçek maliyet üzerinden: taban ücret yakılır, öncelik ücreti üreticiye gider.
SKIPPED_STALE, SKIPPED_OVERFLOWBir okuma artık tutmuyor ya da bir delta [0, 2²⁵⁶) dışına çıkacak. Hiçbir şey yazılmaz.Teminat yatıran: sabit bir atlama ücreti, yakılır. Bir fill için bir sıralayıcı — asla kullanıcı.
FORCED_FAILEDÇağrısı geri alınan (revert) ya da sınırlarını çiğneyen zorunlu bir sertifika.Ödeyicileri; başka hiçbir şey yazılmaz.
DROPPEDTeminat ayrılamıyor: hücre fonsuz ya da harcanmış.Hiç kimse. Görüldü olarak işaretlenmez, dolayısıyla fonlu bir teminata karşı yeniden gönderilebilir.

Uygulanan, atlanan ve zorunlu-başarısız sertifikaların hepsi görüldü olarak işaretlenir ve görülmüş, süresi dolmuş ya da düşük teklifli bir sertifikayı dahil etmek bloğu geçersiz kılar; böylece hiçbir üretici, başkasının sertifikasını teminatını hasat etmek için yeniden dahil edemez ya da geciktiremez. Faturalandırılacak kimsesi olmayan başarısızlıklar — pipeline sayacı sıra dışı olan ya da fence sayacı ilerlemiş bir fill, okumaları tutmayan zorunlu bir sertifika — bunun yerine bloğu geçersiz kılar: bloğu elinde tuttuğu durumdan kuran üretici, bunu bilebilecek olan taraftır.

Era kapıları#

Etkinleşme yükseklikleri spec/params.json içinde yaşar. h1_vm = 80.640, Era 1'i açar: cEVM ve önceden dağıtılmış kütüphane, sıralayıcı anahtarı, yönetici ve fence sayacı taşıyan sözleşme kayıtları, intent'ler ve fill'ler, dizin ve zorunlu yol. Era'nın kendi sabitleri — 8 blokluk intent penceresi, her biri 4.000 türetme birimlik blok başına 16 zorunlu sertifika, bir dizin girdisinin, onu duyuran sertifikanın TTL'sinden sonra 259.200 blokluk ömrü — parametre dosyası tarafından taşınmaz, derlenir; çünkü bir parametre eklemek her canlı ağın genesis kimliğini değiştirirdi. Kapı bloğu bunları protokol hücrelerine yazar; böylece state root o andan itibaren onlara taahhüt eder.

h1_bond, mainnet'te ve açık testnet'te h1_vm değerine eşittir; dolayısıyla bağlama işlemleri orada hiç açılmaz: Era 1'de stake bağlama yoktur. Kod ağacı v1.0'ın sigortalama (underwriting), kiralama ve zorunlu kuyruk kurallarını hâlâ taşır ve bunlar yalnızca geliştirme ağında, onun h1_vm değerinin üstünde ve kendi v1 kapısının altında kalan 256 blokluk bir pencerede geçerlidir; bu pencere, o düzeneği kaydeden vektörlerin, düzeneğin geçerli olduğu bir ağa sahip olmayı sürdürmesi için vardır. h2_pos = 1.576.800 proof of stake için ayrılmıştır; genesis'te dondurulmuştur ve hiçbir kural onu okumaz. Era 2, yani proof of stake, sabitleri Era 1'inkiler gibi derlenmiş olarak, hard fork yoluyla kendi sürümüyle gelir: bağlamayı yüksekliğe göre epoch 182'de açar, rampasını etkin stake 30 epoch boyunca arzın %10'unu tuttuğunda ya da en geç epoch 273'te başlatır ve rampa tamamlandığında 5 saniyelik slot'lara geçer. Geçişten itibaren, gerçekte bir süre olan her genesis sabitini ölçtüğü birimle okur; dolayısıyla parametre dosyası değişmez.

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 -race hiç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 SIGKILL ile öldürülür. Bütün -race takı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. Açılış, önceden kod etiketine, parametre özetine, genesis kimliğine ve açılış zamanına bağlandı; parametre kümesi de, özetini blok 1'in açığa çıkarmak zorunda olduğu bir açılış iletisine yönelik bir taahhüt taşıyordu; böylece hiç kimse zinciri duyurulan başlangıcından önce kazamazdı. Herkes ilk dördünü, kaynaktan, herhangi bir makinede, milisaniyeler içinde yeniden kurabilir. Güvenilecek başka bir şey yoktur.