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.
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ç nokta | Yanıtladığı |
|---|---|
/status, /head | Uç 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=ssz | Aynı blok, kurallı SSZ baytları olarak, application/octet-stream |
/params | Etkin parametre kümesi ve onun uzlaşı kökü |
/cell, /balance | Uç durumu |
/fees | Taban ücretler ve yürürlükteki esnek tavanlar |
/mempool | Havuz sayaçları; ?limit=N en düşükten başlayarak 1000'e kadar bekleyen kimlik ekler |
/network, /metrics | Bağlantı biçimi ve sayaçlar |
/submit | Tek yazma ve hiçbir şey vermez |
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.
/cellve/balanceucu 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
--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ınYukarı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#
| Bayrak | Ağ | Zincir kimliği | Motor |
|---|---|---|---|
| (hiçbiri) | mainnet | 1 | randomx-v1 |
--testnet | açık testnet | 2 | randomx-v1 |
--devnet | yerel devnet | 1337 | geliş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.