ZYCORD belgeler
Türkçe
ZycordBelgelerDüğüm çalıştırma

Düğüm çalıştırma

zycordd için işletmeci rehberi. Konuştuğu protokol hat belirtimidir; bu sayfa ise onu çalıştırmakla ilgilidir.

Tek satırlık sürümü#

zycordd --devnet --dir ./devnet

Bu bir tam düğümdür: genesis'ten itibaren her bloğu doğrular, eşlere hizmet verir ve 127.0.0.1:9420 üzerinde salt okunur bir RPC yanıtlar. Gerçekten çalışmakta olan ağa katılmak için Açık testnet sayfasına bakın — ve bunun -randomx ikili dosyasını gerektirdiğini unutmayın.

Düğümde olmayanlar#

Düğüm sürecinde hiçbir zaman anahtar malzemesi bulunmaz. Ne tohum, ne parola, ne de anahtar dosyası kabul eder. İmzalama zcd içinde olur ve düğümün tek yazma uç noktası — /submit — hiçbir yetki vermez: gönderilen bir sertifika, bir yabancıdan gelen bir sertifika nasıl doğrulanırsa tam olarak öyle doğrulanır.

Ayrıca ayrıcalıklı bir uç nokta da yoktur, çünkü ayrıcalık verilecek bir şey yoktur. Hiçbir anahtar duraklatamaz, yükseltemez, sansürleyemez ya da basamaz; dolayısıyla açığa çıkarılacak bir çağrı da yoktur.

RPC'yi bir vekil sunucunun arkasına koyarsanız, hız sınırlamasını vekil sunucuda yapın

Sınırlayıcı, taşıma eşine göre anahtarlanır, asla X-Forwarded-For başlığına göre değil: istemcinin ayarladığı bir başlığa güvenen bir sınırlayıcı, istemcinin kapattığı bir sınırlayıcıdır. Bir vekil sunucunun arkasında her istek bu nedenle vekil sunucunun adresiyle gelir; böylece istemci başına sınır artık istemci başına olmaktan çıkar ve herkes için aynı anda paylaşılan, dakikada 600'lük tek bir kovaya dönüşür — ve tek bir çağıran onu hepsi adına boşaltabilir. Bu, tartışmasız hiç sınır olmamasından daha kötüdür ve yanıtta bunu söyleyen hiçbir şey yoktur: çağıranlar, buna kendileri mi yoksa başkası mı yol açtı fark etmeksizin düz bir 429 alır.

Salt okunur yüzey#

Zinciri dışarıdan izleyen her şey — bir gezgin, bir izleyici, bir indeksleyici — onu buradan okur. Düğüm baytları devreder, hiçbir zaman yorum devretmez.

Uç noktaYanıtladığı
/status, /headUç kimliği, yükseklik, state root
/block?height=N ya da ?id=0x…JSON olarak tek bir blok; canonical, orphaned ve confirmations ile birlikte
/block?…&format=sszAynı blok, kurallı SSZ baytları olarak, application/octet-stream
/paramsEtkin parametre kümesi ve onun uzlaşı kökü
/cell, /balanceUç durumu
/feesTaban ücretler ve yürürlükteki esnek tavanlar
/mempoolHavuz sayaçları; ?limit=N en düşükten başlayarak 1000'e kadar bekleyen kimlik ekler
/network, /metricsBağlantı biçimi ve sayaçlar
/submitTek yazma ve hiçbir şey vermez
Tavanlar birer parametre değildir

Teknik doküman §8.1, bloğun bayt, gas ve sertifika tavanlarını sıralı hedef olan T'nin işlevleri kılar ve T, epoch denetleyicisinin kaydırdığı bir uzlaşı durumudur. Dolayısıyla /params yalnızca genesis değerlerini taşır — block_byte_limit_genesis ve benzerleri — ki bunlar T'nin başladığı yer ve geri sönebileceği tabandır, asla yürürlükteki sınır değil. O sayılar sonsuza dek gerçek kalır, dolayısıyla birini "blok boyutu sınırı" diye okumak sessizce yanlıştır ve 2,5 MB'lık genesis değeri ile 8 MB'lık kapasite duvarı arasındaki mesafe kadar yanlış olabilir. /fees, canlı T'yi ve ondan türetilen dört tavanı sunar; böylece türetme, güvenilmek yerine denetlenebilir.

Baytlar neden önemli#

Blok kimliği blake3("zcd/block/v1" ‖ header_bytes)'tır; dolayısıyla kendisine sunulandan kimlikleri yeniden türeten bir gözlemci ya ağla aynı fikirdedir ya da bunu anında öğrenir. Sertifika başına sonuçların elde edilme biçimi de budur: bir sertifikanın uygulandığı mı, atlanıp faturalandırıldığı mı yoksa düşürüldüğü mü, fold'un içinde hesaplanır ve asla kalıcı kılınmaz; çünkü bellekte yaşayan bir depoda, sertifika başına sonsuza dek bir satır, bir düğümden taşıması istenebilecek bir şey değildir. Sonuçları isteyen bir gözlemci, bloğu kendisi fold'lar.

Burada olmayan ve olmayacak olanlar#

  • Serbest durum yinelemesi yok. Adres listesi yok, önek taraması yok, zengin listesi yok.
  • Tarihsel durum yok. /cell ve /balance ucu okur; "H yüksekliğindeki bakiye", düğümün tutmadığı bir saklanmış geçmişi gerektirir.
  • Yönetici, yeniden indeksleme ya da hata ayıklama çağrısı yok, çünkü ayrıcalık verilecek bir şey yoktur.

Toplama işi, izleyen her neyse ona aittir ve alım sırasında bir kez, kendi veritabanına hesaplanır.

Durum kodları#

Okumalar GET ve HEAD yanıtlar ve diğer her eylemi 405 ile geri çevirir. Yanıtı olumsuz olan iyi biçimli bir soru — zincirin ulaşmadığı bir yükseklik, bilinmeyen bir kimlik, yeniden düzenlemeyi kaybeden bir bloğun gövdesi — 404'tür; yalnızca hatalı biçimli bir istek 400'dür. Düğümün yazdığı ve artık geri okuyamadığı bir kayıt 400 değil, 500'dür: kusur düğümün diskindedir ve bir çağırana isteğinin hatalı biçimli olduğunu söylemek, onu her zaman iyi biçimli olan bir isteği yeniden denemekten vazgeçmeye davet eder. Bir yoklayıcı, yokluğu hatadan ya da kendi hatasını düğümünkinden ayırmak için asla düz yazı okumak zorunda kalmamalıdır.

Yeniden düzenlemeler#

Yükseklikle arama yalnızca kurallı zincir için yanıt verir. Yeniden düzenlemeyi kaybeden bir blok başlığını korur ve gövdesini yitirir; dolayısıyla kimliği hâlâ çözümlenir, orphaned işaretiyle geri gelir ve çatal noktasına dönen ana bağlantıyı hâlâ taşır — bu da kimlikle aramayı, yeniden düzenlemeye karşı güvenli tek yol yapar.

Erişilebilirlik ve neden göründüğünden daha önemli olduğu#

Zycord NAT geçişi yapmaz. Erişilebilir bir portta --listen ile çalışan bir düğüm, başkalarının kendisinden önyükleme yapabileceği bir yerdir ve böyle düğümlerin payı, NAT geçişi yapmama kararının tümüyle dayandığı yanlışlanabilir koşuldur.

# periphery: nothing to configure
zycordd --testnet --dir ./testnet

# core: bind a port, and make sure it is actually reachable
zycordd --testnet --dir ./testnet \
  --listen 0.0.0.0:9421 --advertise <public-address>:9421
Yanıt veren bir adres duyurun, ya da hiçbirini duyurmayın

--listen 0.0.0.0:9421, --listen değerine geri düşer; dolayısıyla --advertise verilmeden --advertise kullanmak, 0.0.0.0:9421 adresini yayımlar ki bunu kimse arayamaz. Yanlış bir adres eş değişimi yoluyla yayılır ve onu deneyen her düğüme bir arama maliyeti çıkarır. Bir portu yönlendiremiyorsanız --listen vermeyin ve çeperde kalın.

İşe yarayıp yaramadığını denetlemek#

curl -s localhost:9420/network
{"enabled":true,"peers":8,"listening":true,"inbound":5,"outbound":3,"reachable":true}

Düğüm birkaç dakikadır ayaktayken inbound: 0 ile birlikte listening: true görmek, portun gerçekte erişilebilir olmadığı anlamına gelir: süreç bağlanmış ve bekliyordur, hiçbir şey de gelmemektedir. Bu, diğer her görünümde sağlıklı görünür; bu uç noktanın var olma nedeni de budur.

Bir dosyadan önyükleme adresleri#

zycordd --testnet --dir ./testnet --peers-file peers.txt

Satır başına bir adres; # yorumları ve boş satırlar yok sayılır ve liste, ağın gömülü tohumlarıyla birleştirilir. --peers aynı şeyi virgülle ayrılmış bir bağımsız değişken olarak alır ve --no-seeds, ikisini de korurken gömülü olanları çıkarır.

Cüzdan arayüzü, ssh tüneli üzerinden#

Bir düğüm hiçbir anahtar tutmaz ve hiç tutmayacaktır. Cüzdan ayrı bir süreçtir ve bir sunucuda zcd ui'dir:

zcd ui --key wallet.json --no-open

Bu, bir URL yazdırır ve onu 127.0.0.1:9430 üzerinde sunar. Geri döngüye bağlanır ve başka her şeyi reddeder; bunu geçersiz kılacak bir bayrak yoktur. O dinleyicinin arkasındaki süreç, kilidi açılmış bir özel anahtar tutar ve bir URL'deki taşıyıcı jetonla kimlik doğrular; bu, yalnızca yerel makinenin açabileceği bir soket için yeterlidir ve başka hiçbir şey için yeterli değildir. Ona başka bir yerden ulaşmak ssh'ın işidir ve ssh bunu buradakinden daha iyi yapar:

# on your own machine
ssh -L 9430:127.0.0.1:9430 <host>

Sonra sunucunun yazdırdığı URL'i açın. Jeton, URL'in parça bölümünde gider; dolayısıyla sunucuya, bir günlüğe ya da bir Referer başlığına asla ulaşmaz — URL'e, olduğu şey gibi, bir sır gibi davranın. Her çalıştırmada yenidir ve Ctrl-C anahtarı siler ve hizmeti durdurur.

Yönlendirmenin yerel ucunun 9430 portu olması gerekmez: arayüz, Host başlığındaki konak adını denetler ve bilerek portu denetlemez. Önemli olan konak adıdır — DNS yeniden bağlamasını engelleyen odur ve geri döngüdeki bir sunucuya karşı gerçek saldırı da budur; çünkü tarayıcınızdaki herhangi bir sayfa 127.0.0.1'e istek yapabilir ve uyduramayacağı tek şey, gidildiği addır.

zcd ui önüne ters vekil sunucu koymayın

Yukarıda düğümün RPC'si hakkındaki öğüt, hiçbir anahtar tutmayan ve hiçbir yetki vermeyen bir yüzey hakkındadır. Bu yüzey bir anahtar tutar. Onu açığa çıkarmanın iyi fikir olduğu hiçbir biçimi yoktur ve tünelin bedeli tek bir bayraktır.

Bilmeye değer iki biçim daha:

  • zcd ui --locked, terminalde parola sormadan başlar; bunun yerine tarayıcı sorar. Terminal paylaşıldığında ya da günlüklendiğinde işe yarar.
  • zcd ui --lock-after 5m, boşta kalma kilidini kısaltır; bu kilit anahtarı yerinde siler — tohumun yalnızca başvurusu kaldırılmaz, üzerine yazılır.

Eş kimliği ve anonimlik#

Düğüm her başlangıçta taze bir Ed25519 eş anahtarı üretir ve onu asla diske yazmaz. Hiçbir şeyden türetilmez — cüzdanınızdan değil, bir tohumdan değil, makinedeki başka hiçbir şeyden değil. Yeniden başlatmak onu döndürür.

Bir düğümü sizin için önemli olan bir biçimde çalıştırıyorsanız, kimliğinizi açık eden şey anahtar değildir. Adrestir. Size kadar izlenebilen bir altyapıda çalıştırdığınız bir önyükleme düğümü, hiçbir anahtar hijyeninin gideremeyeceği bir kimlik ifşası yoludur.

Veri dizini#

data/
  chain/       blocks, state, and the write-ahead log
  peers.json   the persisted peer store

Eş deposu bilerek kalıcı kılınır: her yeniden başlatmadan sonra boş bir sayfadan başlayan bir düğüm, saldırgana onu doldurmak için taze bir şans verir. Onu silmek güvenlidir ama bunu bir kenara atar.

Düğüm her an öldürülmekten sağ çıkar — yazma-öncesi günlüğün var olma nedeni budur ve bu, ağ kaosu altında düğümleri rastgele öldürerek sınanır. Veri dizininin altından düzenlenmesinden ise sağ çıkmaz: başlangıçta state root'u yeniden hesaplar ve saklanan değerle uyuşmazsa çalışmayı reddeder.

Bir ağ seçmek#

BayrakAğZincir kimliğiMotor
(hiçbiri)mainnet1randomx-v1
--testnetaçık testnet2randomx-v1
--devnetyerel devnet1337geliştirme motoru

Parametreler bir yoldan okunmaz, ikili dosyaya gömülüdür. Açık bir ağın her katılımcısı aynı baytları taşımak zorundadır, yoksa tek bir ağ üzerinde değillerdir ve --params ile geçirilen bir dosya, kayan bir dosyadır. Farklı bir ağ, farklı bir ağdır: ikisi el sıkışmada bağlantıyı keser ve yanlış zinciri barındıran bir veri dizini, sessizce karıştırılmak yerine başlangıçta reddedilir.

Hasarlı bir veri dizinini kurtarmak#

zycordd, bir düğümün karşısında başlamayı reddettiği bir veri dizini için bir onarım yolu taşır. Önce düğümü durdurun — zycordd repair --dir ./data dizin kilidini alır ve bir düğüm onu tutarken çalışmayı reddeder — sonra hiçbir şeyi değiştirmeden önce ne olduğunu --dry-run ile sorun. Yerinde onarılabilen yalnızca tek bir hasar sınıfı vardır; diğerleri için çare yeniden eşitlemektir ve hangisiyle karşı karşıya olduğunuzu söyleyen şey bu kuru çalıştırmadır.