ZYCORD belgeler
Türkçe
ZycordBelgelerCüzdan

Cüzdan

Anahtarlar, adresler ve gönderim — artı bu protokoldeki her cüzdanın karşılaması gereken davranış sözleşmesi. Her kural, protokolün izin verdiği ve dolayısıyla bir cüzdanın önlemesi gereken bir para kaybetme yolunu anlatır.

Komutlar#

zcd wallet new     --out KEYFILE                        # create an encrypted key file
zcd wallet address --key KEYFILE                        # show an address
zcd wallet balance --key KEYFILE                        # ask a node for a balance
zcd wallet send    --key KEYFILE --to ADDR --amount N
zcd wallet sweep   --key KEYFILE --to ADDR --one-shot
zcd wallet retire  --key KEYFILE [--addr ADDR]
zcd ui             --key KEYFILE                        # the same wallet in a browser

Grafik arayüzlü cüzdan ikinci bir gerçekleştirim değildir. zcd wallet, zcd ui ve masaüstü uygulaması, tek bir wallet/session üzerindeki üç arayüzdür: her biri sertifikasını orada kurar ve kural denetimleri o çağrının içinde çalışır. Dolayısıyla grafik arayüzlü bir cüzdan, yapısal olarak CLI'dan daha hoşgörülü olamaz — onu yazan kişi dikkatli olduğu için değil, olabileceği ikinci bir kod yolu bulunmadığı için.

İki tür adres#

SürümTürNe için kullanılırYeniden kullanılabilir mi?
0x01One-shotBeklenen tek bir ödeme. Aldığınız her ödeme için taze bir tane türetin.Hayır. Bir borçlandırma onu kalıcı olarak yakar.
0x02KalıcıSatıcılar, bağış adresleri, sıcak cüzdanlar, madencilik ödemeleri.Evet, sonsuza dek. Harcanmış kaydına asla giremez.

One-shot ile kalıcı arasındaki fark, iki ayrı defter değil, bir adres bitiyle yüzeye çıkan bir cüzdan ilkesidir. Cüzdanlar, aldığınız ödeme başına varsayılan olarak 0x01 kullanır; çünkü bir ödemeyi bir sonrakiyle ilişkilendirilemez kılan budur. Hesap isteyen 0x02 kullanır.

Sekiz kural#

Aşağıdaki her kural, protokolün — bilerek, çünkü seçeneği daha kötüydü — izin verdiği ve dolayısıyla bir cüzdanın önlemesi gereken bir para ya da ücret kaybetme yolunu anlatır. Referans cüzdan bunları gerçekleştirir. Yalnızca belgelemekle kalmaz.

Kural 1 — hücrelerin tamamını süpürün#

Bir 0x01 adresinden harcama yaparken bakiyenin tamamını taşıyın — hem alıcıya hem de denetiminizdeki bir para üstü adresine. Sertifika o adresin bir MARK_SPENT'ini taşır ve uygulandıktan sonra adres altındaki her okuma ve yazma kalıcı olarak başarısız olur. İkinci bir işlem yoktur.

Zincir bunu artık yumuşatıyor: yakılmış bir adresin hâlâ tuttuğu her ne varsa, işlenme anında sertifikanın kendi RefundTo hücresine taşınıyor — hem adresin yerel bakiyesi için hem de sertifikanın kendisinin adını andığı her hücre için. Dolayısıyla eksik süpürmek artık artıkları yok etmez; onları para üstü adresinize teslim eder.

Bununla birlikte gelen yükümlülük

Bir sertifikanın tek bir RefundTo'su vardır ve birkaç imzalayana ait one-shot adresleri yakabilir; dolayısıyla sizin hücreniz altındaki bir artık onlarınkine teslim edilebilir. Size ait bir one-shot adresi yakan ve denetiminizde olmayan bir adrese iade eden bir sertifikayı asla birlikte imzalamayın.

Bu kuralın kurtaramayacağı şey: sertifikanın adını hiç anmadığı bir varlıktaki bakiye. Bir adres altındaki varlıklar bir slot'tan türetilemez, dolayısıyla adı anılmamış bir varlığa uzanmak, paralelleşmeyen tek aşamada bütün hücre tablosunu taramak demek olurdu. Adresi yakan sertifikada her varlığın adını anın.

Kural 2 — RefundTo hâlâ kullanabileceğiniz bir adres olmalıdır#

Ya denetiminizdeki kalıcı bir adresi ya da bu sertifikanın yakmadığı taze bir one-shot adresi anmak zorundadır. Yakılmış bir hücreye yerleştirmek artığı kıstırır: fold, onu kimsenin okuyamayacağı bir hücreye yazmak yerine yakar ve refunded değil refund_burned olarak bildirir; böylece bir bakiyeyi karşılaştıran bir cüzdan bunu ayırt edebilir.

Kural 3 — bir adres, beklenen bir ödeme#

Her tarafta bir tane olmak üzere iki yükümlülük:

  • Alırken. Beklediğiniz her ödeme için taze bir 0x01 adresi türetin. Aynısını asla iki kez yayımlamayın. Son ttl_max blok içinde açıkladığınız bir adresi, ona doğru yoldaki bir ödemenin atlanacağını ve göndericisine fatura edileceğini kabul etmiyorsanız süpürmeyin ve emekli etmeyin.
  • Gönderirken. Alacaklandırıldığını ya da harcandığını görebildiğiniz bir one-shot adrese ödeme yapmayı reddedin. Bir alıcı size bir adresi ikinci kez veriyorsa, bunu bir kolaylık değil, bir hata sayın.

Birden çok kez ödeme alan her şey için — bir satıcı, bir bağış adresi, bir madencilik ödemesi — kalıcı (0x02) bir adres kullanın. Bu, riski daraltmak yerine ortadan kaldıran tek kuraldır.

Kural 4 — bağımlı zincirler: onaylayın ya da riski kabul edin#

Bir öncekine bağımlı her sertifika için Seq'i artırın. Tek bir blok içinde fold, bir imzalayanın sertifikalarını Seq sırasıyla işler; dolayısıyla aynı bloktaki bağımlı bir zincir güvenlidir. Bloklar arasında ise değildir: Seq = n+1'i ancak Seq = n onaylandıktan sonra yayın ya da bağımlı olanın tek başına işlenip atlanabileceğini kabul edin. Bu bir protokol kusuru değildir — imzalayan, imzalayarak bayatlama riskini kabul etmiştir.

Kural 5 — en yüksek değeri cömertçe, önceliği dürüstçe belirleyin#

Her piyasa iki fiyat alır. En yüksek değer bir ödeme gücü sınırıdır: taban ücret onu aştığında sertifika dahil edilemez hâle gelir ve yeniden imzalanması gerekir. Öncelik ise bir madenciye gerçekten ödenen şeydir.

  • En yüksek değeri yükseltmenin ücret bakımından hiçbir maliyeti yoktur — güvenlik payı bedavadır.
  • Ama teminat gas × max kadarını ayırır, dolayısıyla en yüksek değer, tek bir fold adımı için ne kadar bakiyenin kilitleneceğini sınırlar. Onu gerçekten elde olan bakiyeye göre ölçün.
  • Uzun TTL'li bir sertifika, kısa TTL'li olandan daha fazla pay ister; çünkü taban ücretin kımıldayacağı daha çok blok vardır.

Küçük bakiyeler için kaçış kapağı, güvenliği değil, pencereyi daraltmaktır: kısa bir TTL ile imzalayın ve süresi dolduğunda yeniden imzalayın; kilitlenmeyi gecikmeyle takas edin. Yanlış karşılık, uzun TTL'yi koruyup en yüksek değeri küçültmektir; bu da sertifikayı tam da piyasa kımıldadığında kıstırılabilir kılar — payın var olma nedeni olan durumda.

Kural 6 — hareketleri kurallı biçimde sıralayın#

Protokol bir transferin hareketlerine bir sıra dayatmaz; dolayısıyla kurallı bir sıra olmadan aynı mantıksal ödemenin yeniden denenmesi farklı bir kimlik üretir ve cüzdan "zaten gönderildi" ile "iki kez gönderildi"yi ayırt edemez. wallet.Transfer; varlığa, kaynağa, hedefe, sonra tutara göre sıralar, böylece bir yeniden deneme aynı kimliği üretir.

Bir yeniden denemenin imzayı yeniden üretmesi gerekmez: kimliğin ön görüntüsü imza listesini dışarıda bırakır, dolayısıyla taze bir nonce ile yeniden imzalanan bir deneme aynı kimliktir ve ağ onu, olduğu şey olarak, bir yineleme olarak reddeder. Etkisizlik, protokolün sağladığı bir özelliktir; yalnızca dikkatli cüzdanlara değil, her cüzdana.

Kural 7 — bir tohumu asla elden vermeyin#

Tohum, anahtarın kendisidir. Onu okuyan herkes, iki adresinin de tuttuğu her şeye sahip olur — zincir üzerinde birbiriyle ilişkisiz olan ama aynı anahtardan türetilen one-shot ve kalıcı adreslerin.

Anahtar dosyaları her zaman şifrelidir: parola üzerinde Argon2id, tohum üzerinde AES-256-GCM; ikisinin de parametreleri dosyada saklanır, böylece bu ikili dosyadan dışlanmış bir kullanıcı herhangi bir dilin standart kitaplığıyla kurtarma yapabilir. Şifresiz bir tane yazmak için hiçbir bayrak yoktur. Parolalar terminalden, ekranda görünmeden okunur, asla bir bayraktan değil — komut satırındaki bir parola, kabuk geçmişinde ve süreç tablosundadır.

Yazma iki özelliği aynı anda tutar ve ikisi de aynı cümleyle ilgilidir — birini yitirmek, para yitirmektir:

  • Asla sessizce üzerine yazmayın. Hedefte zaten duran bir anahtar dosyasına dokunulmaz ve yazma başarısız olur.
  • Asla yarım kalmış bir tane bırakmayın. Tohum aynı dizindeki geçici bir dosyaya gider, orada fsync edilir ve ancak ondan sonra tek bir dosya sistemi işlemiyle son adı altında yayımlanır.

İkisi de, CLI'ın karşısında ölçüldüğü her dosya sisteminde geçerlidir, FAT32 ve exFAT dahil — soğuk depolama için bir USB yedeğinin en çok kullanacağı biçimler.

FAT biçimli bir bellekteki şifreli bir anahtar dosyasını parolası korur, başka hiçbir şey korumaz

FAT32 ve exFAT'ta Unix izin bitleri yoktur, dolayısıyla bir anahtar dosyasının oluşturulduğu 0600 onların üzerinde yaşamaz — kararı bağlama seçenekleri verir. Linux'ta varsayılan fmask onu genellikle herkesçe okunabilir bırakır; macOS böyle birimleri noowners ile bağlar, bu da 0700 bildirir ve hiçbir şey dayatmaz. Parolayı buna göre seçin. Ayrıca günlükleri de yoktur; dolayısıyla FAT üzerinde bir yayımlama yarıda kesilir ve başarısızlık bildirirse, yeniden çalıştırmadan önce hedefi denetleyin.

Kural 8 — ağın geri çevireceğini siz de geri çevirin#

Ağın yalnızca atabileceği bir şey için başarı bildiren bir cüzdan, başarısızlığı kullanıcının asla bakmayacağı bir yere taşımıştır. Bunun sahada bulunmuş iki biçimi:

  • Hiçbir eşin kodunu çözemeyeceği baytlar. Kodlayıcı kendi başına bir otoritedir ve doğrulayıcının yinelemediği kuralları vardır. Kurucu artık bu özelliği doğrudan ileri sürüyor: ne yayarsa yaysın, kod çözücü onu kabul eder.
  • Fold'un yalnızca atlayabileceği bir transfer. Kaynağın bakiyesinin üzerindeki bir transfer hiçbir kuralı çiğnemez, dolayısıyla her düğüm onu kabul eder — ve onu yine de dahil eden bir üreticiyi hiçbir şey geri çevirmez; o noktada fold onu skip_fee ile sonuçlandırır, ücret teminattan yakılır ve kimseye ödenmez. Kötü durum "hiçbir etkisi yok" değil, "ücret yakıldı ve değer hiç kımıldamadı"dır.

zcd wallet send --force, yalnızca o tek reddedişi atlar, başka hiçbir şeyi değil; çünkü TTL penceresi içinde ulaşması beklenen bir teminat aynı sertifikayı uygulanır kılar ve cüzdan geleceği göremez. Geçersiz bir sertifikayı geçerli kılamaz; yalnızca atlanabilecek geçerli bir sertifikayı gönderebilir — ve bir atlama bedava değildir.

Çalıştırmadığınız bir düğüme güvenmek#

zcd ve cüzdan tam düğüm değildir. Bir düğümün kendilerine söylediğine inanırlar ve kendisinin doğrulamadığı bir düğümle RPC konuşan bir CLI, o düğümün yanıtları hakkında bir şeye güvenmek zorundadır — bu, düzeltilecek bir hata değil, bir cüzdanın ne olduğudur. Her biri belirli bir yalana karşı olmak üzere üç azaltıcı önlem:

Azaltıcı önlemNeyi yakalar
--devnet / --testnet / --paramsİşletmeci, hangi ağ için imzalamayı düşündüğünü ileri sürer ve sorulan her düğüm bu iddiaya karşı denetlenir. Ağ kimliği asla tek başına bir düğümden alınmaz. Bu, yalnızca imzalayan komutlar için değil, balance için de geçerlidir.
--confirm-rpc NODEİkinci, bağımsız bir düğümü anar. Her adresin bakiyesi ve harcanmış bayrağı, herhangi bir şey ilerlemeden önce her ikisi tarafından aynı biçimde bildirilmek zorundadır. chain_id'si uyuşmayan bir düğüm reddedilir ve --rpc'nin zaten andığı uç noktayı anan bir --confirm-rpc düpedüz reddedilir — kendini çapraz denetleyen bir düğüm kendisiyle aynı fikirdedir.
Yazılarak verilen onayGöndermeden önce zcd wallet sweep tam sayıları yazdırır ve sizden sweep yazmanızı ister. --yes yalnızca bu istemi atlar, asla üstündeki denetimleri değil.

Bir cüzdan gerçekleştirimi için denetim listesi#

Bu protokole karşı bir cüzdan yazıyorsanız, sözleşme şudur:

  • 0x01'den harcamak, teminat ayırmasını da onun bir parçası sayarak bakiyenin tamamını taşır — hiç hareketi olmayan programlarda da.
  • RETIRE, hâlâ bakiye tutan bir hedefi geri çevirir.
  • Düğümün bir bakiyeye ilişkin bildirimi sorgusuz sayılmaz: ağ kimliği işletmecice ileri sürülür, ikinci bir kaynak çapraz denetlenebilir olur ve geri döndürülemez bir süpürmeden önce tam sayılar onaylanır.
  • RefundTo, imzalamadan önce kalıcı ya da taze olarak doğrulanır.
  • Alma işlemi, beklenen her ödeme için taze bir adres türetir; gönderme, zaten alacaklandırılmış ya da harcanmış bir one-shot adresi geri çevirir.
  • Satıcı ve ödeme adresleri varsayılan olarak 0x02'dir.
  • Seq, bağımlı sertifika başına artar ve cüzdan bir sonrakini yayınlamadan önce onayı bekler — ya da beklemediğini açıkça söyler.
  • Ücret üst sınırları sabit kodlanmaz, elde olan bakiye ve TTL'ye göre ölçülür.
  • Hareketler kurallı biçimde sıralanır, böylece bir yeniden deneme sertifika kimliğini yeniden üretir.
  • Anahtar dosyaları şifrelenir, sessizce üzerine yazılmadan kalıcı biçimde yazılır ve parolalar asla bir bayrağa ulaşmaz.
  • Kendi kodlamasından geri çözülemeyecek hiçbir şey imzalanmaz ve kaynak bakiyesinin karşılayamayacağı hiçbir şey gönderilmez — her geçersiz kılma adı konmuş, dar kapsamlı ve ön izlemede bildirilmiş olmak üzere.