Gizli Adresleri Kullanma
Siz Bill'siniz. Ayrıntısına girmeyeceğimiz nedenlerden ötürü, "Alice Dünya Kraliçesi Olsun" kampanyasına bağış yapmak ve kazanırsa sizi ödüllendirmesi için Alice'in bağış yaptığınızı bilmesini istiyorsunuz. Ne yazık ki zaferi garanti değil. Rakip bir kampanya var: "Carol Güneş Sistemi İmparatoriçesi Olsun". Eğer Carol kazanırsa ve Alice'e bağış yaptığınızı öğrenirse başınız belaya girer. Bu yüzden hesabınızdan Alice'in hesabına öylece 200 ETH transfer edemezsiniz.
ERC-5564 (opens in a new tab) bunun için bir çözüm sunar. Bu ERC, anonim transfer için gizli adreslerin (opens in a new tab) nasıl kullanılacağını açıklar.
Uyarı: Bildiğimiz kadarıyla gizli adreslerin arkasındaki kriptografi sağlamdır. Ancak, potansiyel yan kanal saldırıları mevcuttur. Aşağıda, bu riski azaltmak için neler yapabileceğinizi göreceksiniz.
Gizli adresler nasıl çalışır
Bu makale, gizli adresleri iki şekilde açıklamaya çalışacaktır. İlki, onların nasıl kullanılacağıdır. Bu bölüm, makalenin geri kalanını anlamak için yeterlidir. Ardından, arkasındaki matematiğin bir açıklaması bulunmaktadır. Kriptografi ile ilgileniyorsanız bu bölümü de okuyun.
Basit versiyon (gizli adresler nasıl kullanılır)
Alice iki özel anahtar oluşturur ve bunlara karşılık gelen açık anahtarları yayımlar (bunlar tek bir çift uzunluklu meta adreste birleştirilebilir). Bill de bir özel anahtar oluşturur ve buna karşılık gelen açık anahtarı yayımlar.
Bir tarafın açık anahtarını ve diğerinin özel anahtarını kullanarak, yalnızca Alice ve Bill tarafından bilinen ortak bir sır türetebilirsiniz (yalnızca açık anahtarlardan türetilemez). Bu ortak sırrı kullanarak Bill gizli adresi elde eder ve ona varlık gönderebilir.
Alice de adresi ortak sırdan alır, ancak yayımladığı açık anahtarların özel anahtarlarını bildiği için, o adresten para çekmesine izin veren özel anahtarı da alabilir.
Matematik (gizli adresler neden böyle çalışır)
Standart gizli adresler, daha az anahtar bitiyle daha iyi performans elde etmek ve aynı zamanda aynı güvenlik seviyesini korumak için eliptik eğri kriptografisi (ECC) (opens in a new tab) kullanır. Ancak çoğunlukla bunu göz ardı edebilir ve normal aritmetik kullanıyormuş gibi davranabiliriz.
Herkesin bildiği bir sayı vardır, G. G ile çarpabilirsiniz. Ancak ECC'nin doğası gereği G'ye bölmek pratik olarak imkansızdır. Ethereum'da açık anahtar kriptografisinin genel çalışma şekli, daha sonra Ppub = GPpriv açık anahtarıyla doğrulanan işlemleri imzalamak için Ppriv özel anahtarını kullanabilmenizdir.
Alice, Kpriv ve Vpriv olmak üzere iki özel anahtar oluşturur. Kpriv gizli adresten para harcamak için ve Vpriv Alice'e ait adresleri görüntülemek için kullanılacaktır. Alice daha sonra açık anahtarları yayımlar: Kpub = GKpriv ve Vpub = GVpriv
Bill, üçüncü bir özel anahtar olan Rpriv'i oluşturur ve Rpub = GRpriv'i merkezi bir kayıt defterine yayımlar (Bill bunu Alice'e de gönderebilirdi, ancak Carol'ın dinlediğini varsayıyoruz).
Bill, Alice'in de bilmesini beklediği RprivVpub = GRprivVpriv değerini hesaplar (aşağıda açıklanmıştır). Bu değere ortak sır olan S denir. Bu, Bill'e bir açık anahtar verir: Ppub = Kpub+G*hash(S). Bu açık anahtardan bir adres hesaplayabilir ve istediği kaynakları bu adrese gönderebilir. Gelecekte Alice kazanırsa, Bill kaynakların kendisinden geldiğini kanıtlamak için ona Rpriv'i söyleyebilir.
Alice RpubVpriv = GRprivVpriv değerini hesaplar. Bu ona aynı ortak sırrı, yani S'i verir. Özel anahtar olan Kpriv'i bildiği için, Ppriv = Kpriv+hash(S) değerini hesaplayabilir. Bu anahtar, Ppub = GPpriv = GKpriv+G*hash(S) = Kpub+G*hash(S) sonucundan kaynaklanan adresteki varlıklara erişmesini sağlar.
Alice'in Dave'in Dünya Hakimiyeti Kampanya Hizmetleri'ne taşeronluk yapmasına izin vermek için ayrı bir görüntüleme anahtarımız var. Alice, Dave'in açık adresleri bilmesine ve daha fazla para olduğunda onu bilgilendirmesine izin vermek istiyor, ancak onun kampanya parasını harcamasını istemiyor.
Görüntüleme ve harcama ayrı anahtarlar kullandığından, Alice Dave'e Vpriv'i verebilir. Daha sonra Dave, S = RpubVpriv = GRprivVpriv hesaplayabilir ve bu şekilde açık anahtarları (Ppub = Kpub+G*hash(S)) alabilir. Ancak Kpriv olmadan Dave özel anahtarı alamaz.
Özetlemek gerekirse, bunlar farklı katılımcılar tarafından bilinen değerlerdir.
| Alice | Yayımlandı | Bill | Dave | |
|---|---|---|---|---|
| G | G | G | G | |
| Kpriv | — | — | — | |
| Vpriv | — | — | Vpriv | |
| Kpub = GKpriv | Kpub | Kpub | Kpub | |
| Vpub = GVpriv | Vpub | Vpub | Vpub | |
| — | — | Rpriv | — | |
| Rpub | Rpub | Rpub = GRpriv | Rpub | |
| S = RpubVpriv = GRprivVpriv | — | S = RprivVpub = GRprivVpriv | S = RpubVpriv = GRprivVpriv | |
| Ppub = Kpub+G*hash(S) | — | Ppub = Kpub+G*hash(S) | Ppub = Kpub+G*hash(S) | |
| Adres=f(Ppub) | — | Adres=f(Ppub) | Adres=f(Ppub) | Adres=f(Ppub) |
| Ppriv = Kpriv+hash(S) | — | — | — |
Gizli adresler ters gittiğinde
Blokzincirde sır yoktur. Gizli adresler size gizlilik sağlayabilirken, bu gizlilik trafik analizine karşı savunmasızdır. Basit bir örnek vermek gerekirse, Bill'in bir adresi fonladığını ve hemen bir Rpub değeri yayımlamak için bir işlem gönderdiğini hayal edin. Alice'in Vpriv'i olmadan bunun bir gizli adres olduğundan emin olamayız, ancak bahis bu yönde olur. Sonra, o adresten tüm ETH'yi Alice'in kampanya fonu adresine aktaran başka bir işlem görüyoruz. Bunu kanıtlayamayabiliriz, ancak Bill'in Alice'in kampanyasına bağış yapmış olması muhtemeldir. Carol kesinlikle böyle düşünürdü.
Rpub'un yayımlanmasını gizli adresin fonlanmasından ayırmak Bill için kolaydır (bunları farklı zamanlarda, farklı adreslerden yapın). Ancak, bu yetersizdir. Carol'un aradığı model, Bill'in bir adresi fonlaması ve ardından Alice'in kampanya fonunun bu adresten çekim yapmasıdır.
Çözümlerden biri, Alice'in kampanyasının parayı doğrudan çekmemesi, bunun yerine üçüncü bir tarafa ödeme yapmak için kullanmasıdır. Alice'in kampanyası Dave'in Dünya Hakimiyeti Kampanya Hizmetleri'ne 10 ETH gönderirse Carol, Bill'in Dave'in müşterilerinden birine bağış yaptığını bilir. Eğer Dave'in yeterince müşterisi varsa Carol, Bill'in kendisiyle rekabet eden Alice'e mi yoksa Carol'un umursamadığı Adam'a, Albert'a veya Abigail'e mi bağış yaptığını bilemez. Alice ödemeye bir karma değeri ekleyebilir ve ardından bunun kendi bağışı olduğunu kanıtlamak için Dave'e ön görüntüyü sağlayabilir. Alternatif olarak, yukarıda belirtildiği gibi, Alice Dave'e Vpriv'ini verirse, ödemenin kimden geldiğini zaten bilir.
Bu çözümdeki ana sorun, gizliliğin Bill'in yararına olduğu durumlarda Alice'in bu gizliliğe önem vermesini gerektirmesidir. Alice, Bill'in arkadaşı Bob'un da kendisine bağış yapması için itibarını korumak isteyebilir. Ancak Bill'i ifşa etmekten çekinmemesi de mümkündür, çünkü o zaman Carol'un kazanması durumunda ne olacağından korkacaktır. Bill, Alice'e daha da fazla destek sağlayabilir.
Birden çok gizli katman kullanma
Bill'in gizliliğini korumak için Alice'e güvenmek yerine, Bill bunu kendisi yapabilir. Kurgusal kişiler olan Bob ve Bella için birden fazla meta adres oluşturabilir. Bill daha sonra Bob'a ETH gönderir ve "Bob" (aslında Bill'dir) bunu Bella'ya gönderir. "Bella" (yine Bill'dir) bunu Alice'e gönderir.
Carol yine de trafik analizi yapabilir ve Bill'den Bob'a, Bob'dan Bella'ya, Bella'dan Alice'e giden hattı görebilir. Ancak, "Bob" ve "Bella" ETH'yi başka amaçlar için de kullanırsa, Alice gizli adresten bilinen kampanya adresine hemen para çekse bile, Bill'in Alice'e herhangi bir şey aktardığı görülmeyecektir.
Gizli adres uygulaması yazma
Bu makale, GitHub'da bulunan (opens in a new tab) bir gizli adres uygulamasını açıklamaktadır.
Araçlar
Kullanabileceğimiz bir typescript gizli adres kütüphanesi (opens in a new tab) var. Ancak, kriptografik işlemler CPU'yu yoğun bir şekilde kullanabilir. Bunları Rust (opens in a new tab) gibi derlenmiş bir dilde uygulamayı ve kodu tarayıcıda çalıştırmak için WASM (opens in a new tab) kullanmayı tercih ediyorum.
Vite (opens in a new tab) ve React (opens in a new tab) kullanacağız. Bunlar endüstri standardı araçlardır; onlara aşina değilseniz bu öğreticiyi kullanabilirsiniz. Vite'ı kullanmak için Node'a ihtiyacımız var.
Gizli adresleri çalışırken görün
-
Gerekli araçları yükleyin: Rust (opens in a new tab) ve Node (opens in a new tab).
-
GitHub deposunu klonlayın.
1git clone https://github.com/qbzzt/251022-stealth-addresses.git2cd 251022-stealth-addresses -
Ön koşulları yükleyin ve Rust kodunu derleyin.
1cd src/rust-wasm2rustup target add wasm32-unknown-unknown3cargo install wasm-pack4wasm-pack build --target web -
Web sunucusunu başlatın.
1cd ../..2npm install3npm run dev -
Uygulamaya (opens in a new tab) göz atın. Bu uygulama sayfasında iki çerçeve bulunur: biri Alice'in kullanıcı arayüzü, diğeri ise Bill'in kullanıcı arayüzü içindir. İki çerçeve iletişim kurmaz; yalnızca kolaylık sağlamak için aynı sayfadadırlar.
-
Alice olarak, Gizli Bir Meta Adres Oluştur'a tıklayın. Bu, yeni gizli adresi ve karşılık gelen özel anahtarları gösterecektir. Gizli meta adresi panoya kopyalayın.
-
Bill olarak, yeni gizli meta adresi yapıştırın ve Bir adres oluştur'a tıklayın. Bu size Alice için fonlanacak adresi verir.
-
Adresi ve Bill'in açık anahtarını kopyalayın ve bunları Alice'in kullanıcı arayüzündeki "Bill tarafından oluşturulan adres için özel anahtar" alanına yapıştırın. Bu alanlar doldurulduktan sonra, o adresteki varlıklara erişmek için özel anahtarı göreceksiniz.
-
Özel anahtarın adrese karşılık geldiğinden emin olmak için çevrimiçi bir hesap makinesi (opens in a new tab) kullanabilirsiniz.
Program nasıl çalışır
WASM bileşeni
WASM'ye derlenen kaynak kodu Rust (opens in a new tab) dilinde yazılmıştır. Bunu src/rust_wasm/src/lib.rs (opens in a new tab) içinde görebilirsiniz. Bu kod öncelikli olarak JavaScript kodu ile eth-stealth-addresses kütüphanesi (opens in a new tab) arasında bir arayüzdür.
Cargo.toml
Rust'taki Cargo.toml (opens in a new tab), JavaScript'teki package.json (opens in a new tab) ile benzerdir. Paket bilgilerini, bağımlılık bildirimlerini vb. içerir.
1[package]2name = "rust-wasm"3version = "0.1.0"4edition = "2024"56[dependencies]7eth-stealth-addresses = "0.1.0"8hex = "0.4.3"9wasm-bindgen = "0.2.104"10getrandom = { version = "0.2", features = ["js"] }Tümünü göstergetrandom (opens in a new tab) paketi rastgele değerler üretmek için gereklidir. Bu, tamamen algoritmik yollarla yapılamaz; bir entropi kaynağı olarak fiziksel bir sürece erişim gerektirir. Bu tanım, bu entropiyi içinde çalıştığımız tarayıcıya sorarak alacağımızı belirtir.
1console_error_panic_hook = "0.1.7"Bu kütüphane (opens in a new tab), WASM kodu paniklediğinde ve devam edemediğinde bize daha anlamlı hata mesajları verir.
1[lib]2crate-type = ["cdylib", "rlib"]WASM kodu üretmek için gereken çıktı türü.
lib.rs
Bu, gerçek Rust kodudur.
1use wasm_bindgen::prelude::*;Rust'tan bir WASM paketi oluşturmak için kullanılan tanımlar. Burada (opens in a new tab) belgelenmiştir.
1use eth_stealth_addresses::{2 generate_stealth_meta_address,3 generate_stealth_address,4 compute_stealth_key5};eth-stealth-addresses kütüphanesinden (opens in a new tab) ihtiyaç duyduğumuz fonksiyonlar.
1use hex::{decode,encode};Rust, değerler için genellikle bayt dizileri (opens in a new tab) ([u8; <boyut>]) kullanır. Ancak JavaScript'te genellikle onaltılık dizeler kullanırız. hex kütüphanesi (opens in a new tab) bizim için bir gösterimden diğerine çeviri yapar.
1#[wasm_bindgen]Bu işlevi JavaScript'ten çağırabilmek için WASM bağlamaları oluşturun.
1pub fn wasm_generate_stealth_meta_address() -> String {Birden çok alanı olan bir nesneyi döndürmenin en kolay yolu bir JSON dizesi döndürmektir.
1 let (address, spend_private_key, view_private_key) = 2 generate_stealth_meta_address();generate_stealth_meta_address (opens in a new tab) üç alan döndürür:
- Meta adres (Kpub ve Vpub)
- Görüntüleme özel anahtarı (Vpriv)
- Harcama özel anahtarı (Kpriv)
Demet (opens in a new tab) sözdizimi, bu değerleri tekrar ayırmamızı sağlar.
1 format!("{{\"address\":\"{}\",\"view_private_key\":\"{}\",\"spend_private_key\":\"{}\"}}",2 encode(address),3 encode(view_private_key),4 encode(spend_private_key)5 )6}JSON kodlu dizeyi oluşturmak için format! (opens in a new tab) makrosunu kullanın. Dizileri onaltılık dizelere dönüştürmek için hex::encode (opens in a new tab) kullanın.
1fn str_to_array<const N: usize>(s: &str) -> Option<[u8; N]> {Bu fonksiyon, bir onaltılık dizeyi (JavaScript tarafından sağlanan) bir bayt dizisine dönüştürür. Bunu, JavaScript kodu tarafından sağlanan değerleri ayrıştırmak için kullanırız. Bu işlev, Rust'ın dizileri ve vektörleri nasıl işlediği nedeniyle karmaşıktır.
<const N: usize> ifadesine jenerik (opens in a new tab) denir. N, döndürülen dizinin uzunluğunu kontrol eden bir parametredir. Fonksiyon aslında str_to_array::<n> olarak adlandırılır, burada n dizi uzunluğudur.
Dönüş değeri Option<[u8; N]>'dir, bu da döndürülen dizinin isteğe bağlı (opens in a new tab) olduğu anlamına gelir. Bu, Rust'ta başarısız olabilecek fonksiyonlar için tipik bir kalıptır.
Örneğin, str_to_array::10("bad060a7") çağırırsak, fonksiyonun on değerli bir dizi döndürmesi gerekir, ancak girdi yalnızca dört bayttır. Fonksiyonun başarısız olması gerekir ve bunu None döndürerek yapar. str_to_array::4("bad060a7") için dönüş değeri Some<[0xba, 0xd0, 0x60, 0xa7]> olacaktır.
1 // decode, Result<Vec<u8>, _> döndürür2 let vec = decode(s).ok()?;hex::decode (opens in a new tab) fonksiyonu bir Result<Vec<u8>, FromHexError> döndürür. Result (opens in a new tab) türü, başarılı bir sonuç (Ok(değer)) veya bir hata (Err(hata)) içerebilir.
.ok() yöntemi, Result'ı bir Option'a dönüştürür; değeri başarılıysa Ok() değeri, değilse None'dur. Son olarak, soru işareti operatörü (opens in a new tab), Option boşsa mevcut fonksiyonları durdurur ve bir None döndürür. Aksi takdirde, değeri açar ve onu döndürür (bu durumda, vec'e bir değer atamak için).
Bu, hataları işlemek için garip bir şekilde karmaşık bir yöntem gibi görünüyor, ancak Result ve Option, tüm hataların bir şekilde ele alınmasını sağlar.
1 if vec.len() != N { return None; }Bayt sayısı yanlışsa, bu bir başarısızlıktır ve None döndürürüz.
1 // try_into, vec'i tüketir ve [u8; N] oluşturmaya çalışır2 let array: [u8; N] = vec.try_into().ok()?;Rust'ta iki dizi türü vardır. Diziler (opens in a new tab) sabit bir boyuta sahiptir. Vektörler (opens in a new tab) büyüyebilir ve küçülebilir. hex::decode bir vektör döndürür, ancak eth_stealth_addresses kütüphanesi dizileri almak ister. .try_into() (opens in a new tab), bir değeri başka bir türe, örneğin bir vektörü bir diziye dönüştürür.
1 Some(array)2}Rust, bir fonksiyonun sonunda bir değer döndürürken return (opens in a new tab) anahtar kelimesini kullanmanızı gerektirmez.
1#[wasm_bindgen]2pub fn wasm_generate_stealth_address(stealth_address: &str) -> Option<String> {Bu fonksiyon, hem Vpub hem de Kpub'ı içeren açık bir meta adres alır. Gizli adresi, yayımlanacak açık anahtarı (Rpub) ve yayımlanan adreslerden hangilerinin Alice'e ait olabileceğinin tanımlanmasını hızlandıran tek baytlık bir tarama değerini döndürür.
Tarama değeri, ortak sırrın bir parçasıdır (S = GRprivVpriv). Bu değer Alice için mevcuttur ve onu kontrol etmek, f(Kpub+G*hash(S))'nin yayımlanan adrese eşit olup olmadığını kontrol etmekten çok daha hızlıdır.
1 let (address, r_pub, scan) = 2 generate_stealth_address(&str_to_array::<66>(stealth_address)?);Kütüphanenin generate_stealth_address (opens in a new tab) fonksiyonunu kullanıyoruz.
1 format!("{{\"address\":\"{}\",\"rPub\":\"{}\",\"scan\":\"{}\"}}",2 encode(address),3 encode(r_pub),4 encode(&[scan])5 ).into()6}JSON kodlu çıktı dizesini hazırlayın.
1#[wasm_bindgen]2pub fn wasm_compute_stealth_key(3 address: &str, 4 bill_pub_key: &str, 5 view_private_key: &str,6 spend_private_key: &str 7) -> Option<String> {8 .9 .10 .11}Tümünü gösterBu fonksiyon, adresten (Rpriv) çekim yapmak için özel anahtarı hesaplamak üzere kütüphanenin compute_stealth_key (opens in a new tab) fonksiyonunu kullanır. Bu hesaplama şu değerleri gerektirir:
- Adres (Adres=f(Ppub))
- Bill tarafından oluşturulan açık anahtar (Rpub)
- Görünüm özel anahtarı (Vpriv)
- Harcama özel anahtarı (Kpriv)
1#[wasm_bindgen(start)]#[wasm_bindgen(start)] (opens in a new tab), fonksiyonun WASM kodu başlatıldığında yürütüldüğünü belirtir.
1pub fn main() {2 console_error_panic_hook::set_once();3}Bu kod, panik çıktısının JavaScript konsoluna gönderileceğini belirtir. Çalışırken görmek için, uygulamayı kullanın ve Bill'e geçersiz bir meta-adres verin (sadece bir onaltılık basamağı değiştirin). JavaScript konsolunda şu hatayı göreceksiniz:
1rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/subtle-2.6.1/src/lib.rs:701:9:2assertion `left == right` failed3 left: 04 right: 1Ardından bir yığın izlemesi gelir. Ardından Bill'e geçerli meta adresi verin ve Alice'e ya geçersiz bir adres ya da geçersiz bir açık anahtar verin. Şu hatayı göreceksiniz:
1rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/eth-stealth-addresses-0.1.0/src/lib.rs:78:9:2keys do not generate stealth addressYine, ardından bir yığın izlemesi gelir.
Kullanıcı arayüzü
Kullanıcı arayüzü React (opens in a new tab) kullanılarak yazılmıştır ve Vite (opens in a new tab) tarafından sunulmaktadır. Onlar hakkında bu öğreticiyi kullanarak bilgi edinebilirsiniz. Burada WAGMI (opens in a new tab)'ye gerek yoktur çünkü doğrudan bir blokzincir veya cüzdan ile etkileşimde bulunmuyoruz.
Kullanıcı arayüzünün tek bariz olmayan kısmı WASM bağlantısıdır. İşte nasıl çalıştığı.
vite.config.js
Bu dosya Vite yapılandırmasını (opens in a new tab) içerir.
1import { defineConfig } from 'vite'2import react from '@vitejs/plugin-react'3import wasm from "vite-plugin-wasm";45// https://vite.dev/config/6export default defineConfig({7 plugins: [react(), wasm()],8})İki Vite eklentisine ihtiyacımız var: react (opens in a new tab) ve wasm (opens in a new tab).
App.jsx
Bu dosya uygulamanın ana bileşenidir. İki bileşen içeren bir kapsayıcıdır: Alice ve Bill, bu kullanıcılar için kullanıcı arayüzleridir. WASM için ilgili kısım başlatma kodudur.
1import init from './rust-wasm/pkg/rust_wasm.js'wasm-pack (opens in a new tab) kullandığımızda, burada kullandığımız iki dosya oluşturur: gerçek kodu içeren bir wasm dosyası (burada, src/rust-wasm/pkg/rust_wasm_bg.wasm) ve onu kullanmak için tanımları içeren bir JavaScript dosyası (burada, src/rust-wasm/pkg/rust_wasm.js). Bu JavaScript dosyasının varsayılan dışa aktarımı, WASM'ı başlatmak için çalışması gereken koddur.
1function App() {2 .3 .4 .5 useEffect(() => {6 const loadWasm = async () => {7 try {8 await init();9 setWasmReady(true)10 } catch (err) {11 console.error('Wasm yüklenirken hata:', err)12 alert("Wasm hatası: " + err)13 }14 }1516 loadWasm()17 }, []18 )Tümünü gösteruseEffect kancası (opens in a new tab), durum değişkenleri değiştiğinde yürütülen bir işlevi belirtmenize olanak tanır. Burada, durum değişkenleri listesi boştur ([]), bu nedenle bu işlev sayfa yüklendiğinde yalnızca bir kez yürütülür.
Etki fonksiyonu hemen geri dönmelidir. WASM init gibi eşzamansız kodu kullanmak için (.wasm dosyasını yüklemesi gerektiği ve dolayısıyla zaman aldığı için) dahili bir async (opens in a new tab) fonksiyonu tanımlar ve onu bir await olmadan çalıştırırız.
Bill.jsx
Bu, Bill için kullanıcı arayüzüdür. Alice tarafından sağlanan gizli meta adrese dayalı olarak bir adres oluşturma eylemi olmak üzere tek bir eylemi vardır.
1import { wasm_generate_stealth_address } from './rust-wasm/pkg/rust_wasm.js'Varsayılan dışa aktarmaya ek olarak, wasm-pack tarafından oluşturulan JavaScript kodu, WASM kodundaki her bir işlev için bir işlevi dışa aktarır.
1 <button onClick={() => {2 setPublicAddress(JSON.parse(wasm_generate_stealth_address(stealthMetaAddress)))3 }}>WASM işlevlerini çağırmak için, wasm-pack tarafından oluşturulan JavaScript dosyası tarafından dışa aktarılan işlevi çağırmamız yeterlidir.
Alice.jsx
Alice.jsx'teki kod benzerdir, ancak Alice'in iki eylemi vardır:
- Bir meta adres oluşturun
- Bill tarafından yayımlanan bir adres için özel anahtarı alın
Sonuç
Gizli adresler her derde deva değildir; doğru kullanılmaları gerekir. Ancak doğru kullanıldığında, halka açık bir blokzincirde gizliliği sağlayabilirler.
Çalışmalarımdan daha fazlası için buraya bakın (opens in a new tab).
Sayfanın son güncellenmesi: 14 Kasım 2025