Ruka kwenda kwenye maudhui makuu

Kutumia Anwani za Siri

Anwani ya siri
faragha
kriptografia
rust
wasm
Intermediate
Ori Pomerantz
30 Novemba 2025
15 minute read

Wewe ni Bill. Kwa sababu ambazo hatutaziingilia, unataka kuchangia kampeni ya "Alice kwa Malkia wa Dunia" na kumfanya Alice ajue ulichangia ili akuzawadie akishinda. Kwa bahati mbaya, ushindi wake hauna uhakika. Kuna kampeni shindani, "Carol kwa Maliki wa Mfumo wa Jua". Ikiwa Carol atashinda, na akagundua ulichangia kwa Alice, utakuwa matatani. Kwa hivyo huwezi tu kuhamisha ETH 200 kutoka akaunti yako hadi ya Alice.

ERC-5564 (opens in a new tab) ina suluhisho. ERC hii inaeleza jinsi ya kutumia anwani za siri (opens in a new tab) kwa uhamisho usiojulikana.

Onyo: Kriptografia nyuma ya anwani za siri, kwa kadiri tunavyojua, ni thabiti. Hata hivyo, kuna uwezekano wa mashambulizi ya njia za pembeni. Chini, utaona unachoweza kufanya ili kupunguza hatari hii.

Jinsi anwani za siri zinavyofanya kazi

Makala haya yatajaribu kueleza anwani za siri kwa njia mbili. Ya kwanza ni jinsi ya kuzitumia. Sehemu hii inatosha kuelewa sehemu iliyobaki ya makala. Kisha, kuna maelezo ya hisabati nyuma yake. Ikiwa una nia ya kriptografia, soma sehemu hii pia.

Toleo rahisi (jinsi ya kutumia anwani za siri)

Alice huunda funguo mbili za binafsi na kuchapisha funguo za umma zinazolingana (ambazo zinaweza kuunganishwa kuwa anwani-meta moja ya urefu maradufu). Bill pia huunda ufunguo wa binafsi na kuchapisha ufunguo wa umma unaolingana.

Kwa kutumia ufunguo wa umma wa upande mmoja na ufunguo wa binafsi wa mwingine, unaweza kupata siri ya pamoja inayojulikana tu na Alice na Bill (haiwezi kutolewa kutoka kwa funguo za umma pekee). Kwa kutumia siri hii ya pamoja, Bill anapata anwani ya siri na anaweza kutuma mali kwake.

Alice pia hupata anwani kutoka kwa siri ya pamoja, lakini kwa sababu anajua funguo za binafsi za funguo za umma alizochapisha, anaweza pia kupata ufunguo wa binafsi unaomruhusu kutoa pesa kutoka kwa anwani hiyo.

Hisabati (kwa nini anwani za siri hufanya kazi hivi)

Anwani za kawaida za siri hutumia kriptografia ya mzingo duaradufu (ECC) (opens in a new tab) kupata utendakazi bora na biti chache za ufunguo, huku zikidumisha kiwango kile kile cha usalama. Lakini kwa sehemu kubwa tunaweza kupuuza hilo na kujifanya tunatumia hesabu za kawaida.

Kuna nambari ambayo kila mtu anaijua, G. Unaweza kuzidisha kwa G. Lakini kwa sababu ya asili ya ECC, haiwezekani kivitendo kugawanya kwa G. Njia ambayo kriptografia ya ufunguo wa umma hufanya kazi kwa ujumla katika Ethereum ni kwamba unaweza kutumia ufunguo wa binafsi, Ppriv, kusaini miamala ambayo kisha inathibitishwa na ufunguo wa umma, Ppub = GPpriv.

Alice huunda funguo mbili za binafsi, Kpriv na Vpriv. Kpriv itatumika kutumia pesa kutoka kwa anwani ya siri, na Vpriv kuona anwani ambazo ni za Alice. Kisha Alice huchapisha funguo za umma: Kpub = GKpriv na Vpub = GVpriv

Bill huunda ufunguo wa tatu wa binafsi, Rpriv, na kuchapisha Rpub = GRpriv kwenye sajili ya kati (Bill angeweza pia kumtumia Alice, lakini tunadhania Carol anasikiliza).

Bill anakokotoa RprivVpub = GRprivVpriv, ambayo anatarajia Alice pia aijue (imeelezwa hapa chini). Thamani hii inaitwa S, siri ya pamoja. Hii inampa Bill ufunguo wa umma, Ppub = Kpub+G*hashi(S). Kutoka kwa ufunguo huu wa umma, anaweza kukokotoa anwani na kutuma rasilimali zozote anazotaka kwake. Katika siku zijazo, ikiwa Alice atashinda, Bill anaweza kumwambia Rpriv ili kudhibitisha rasilimali zilitoka kwake.

Alice anakokotoa RpubVpriv = GRprivVpriv. Hii inampa siri ileile ya pamoja, S. Kwa sababu anajua ufunguo wa binafsi, Kpriv, anaweza kukokotoa Ppriv = Kpriv+hashi(S). Ufunguo huu unamruhusu kufikia mali katika anwani inayotokana na Ppub = GPpriv = GKpriv+G*hashi(S) = Kpub+G*hashi(S).

Tuna ufunguo tofauti wa kutazama ili kumruhusu Alice kumpa kandarasi ndogo Dave's World Domination Campaign Services. Alice yuko tayari kumruhusu Dave ajue anwani za umma na kumjulisha pesa zaidi zinapopatikana, lakini hataki atumie pesa zake za kampeni.

Kwa sababu kutazama na kutumia hutumia funguo tofauti, Alice anaweza kumpa Dave Vpriv. Kisha Dave anaweza kukokotoa S = RpubVpriv = GRprivVpriv na kwa njia hiyo kupata funguo za umma (Ppub = Kpub+G*hashi(S)). Lakini bila Kpriv Dave hawezi kupata ufunguo wa binafsi.

Kwa muhtasari, hizi ni thamani zinazojulikana na washiriki tofauti.

AliceImechapishwaBillDave
GGGG
Kpriv------
Vpriv----Vpriv
Kpub = GKprivKpubKpubKpub
Vpub = GVprivVpubVpubVpub
----Rpriv--
RpubRpubRpub = GRprivRpub
S = RpubVpriv = GRprivVpriv--S = RprivVpub = GRprivVprivS = RpubVpriv = GRprivVpriv
Ppub = Kpub+G*hashi(S)--Ppub = Kpub+G*hashi(S)Ppub = Kpub+G*hashi(S)
Anwani=f(Ppub)--Anwani=f(Ppub)Anwani=f(Ppub)Anwani=f(Ppub)
Ppriv = Kpriv+hashi(S)------

Wakati anwani za siri zinakwenda kombo

Hakuna siri kwenye mnyororo wa bloku. Wakati anwani za siri zinaweza kukupa faragha, faragha hiyo iko katika hatari ya uchambuzi wa trafiki. Ili kuchukua mfano mdogo, fikiria kwamba Bill anafadhili anwani na mara moja anatuma muamala kuchapisha thamani ya Rpub. Bila Vpriv ya Alice, hatuwezi kuwa na uhakika kwamba hii ni anwani ya siri, lakini hiyo ndiyo njia ya kubashiri. Kisha, tunaona muamala mwingine unaohamisha ETH zote kutoka kwa anwani hiyo hadi kwa anwani ya hazina ya kampeni ya Alice. Huenda tusiweze kuthibitisha, lakini kuna uwezekano kwamba Bill alichangia kampeni ya Alice. Carol bila shaka angefikiria hivyo.

Ni rahisi kwa Bill kutenganisha uchapishaji wa Rpub na ufadhili wa anwani ya siri (kufanya hivyo kwa nyakati tofauti, kutoka kwa anwani tofauti). Hata hivyo, hilo halitoshi. Mtindo ambao Carol anatafuta ni kwamba Bill anafadhili anwani, na kisha hazina ya kampeni ya Alice inatoa pesa kutoka humo.

Suluhisho moja ni kwa kampeni ya Alice kutotoa pesa moja kwa moja, bali kuitumia kumlipa mtu wa tatu. Ikiwa kampeni ya Alice itatuma ETH 10 kwa Dave's World Domination Campaign Services, Carol atajua tu kwamba Bill alimchangia mmoja wa wateja wa Dave. Ikiwa Dave ana wateja wa kutosha, Carol hataweza kujua ikiwa Bill alichangia kwa Alice anayeshindana naye, au kwa Adam, Albert, au Abigail ambao Carol hawajali. Alice anaweza kujumuisha thamani iliyohashishwa na malipo, na kisha kumpa Dave picha ya awali, ili kuthibitisha kuwa ulikuwa mchango wake. Vinginevyo, kama ilivyoelezwa hapo juu, ikiwa Alice atampa Dave Vpriv yake, tayari anajua malipo yalitoka kwa nani.

Tatizo kuu la suluhisho hili ni kwamba linahitaji Alice ajali usiri wakati usiri huo unamnufaisha Bill. Alice anaweza kutaka kudumisha sifa yake ili rafiki yake Bill, Bob, pia amchangie. Lakini inawezekana pia kwamba hatamjali kumfichua Bill, kwa sababu basi ataogopa kitakachotokea ikiwa Carol atashinda. Bill anaweza kuishia kumpa Alice msaada zaidi.

Kutumia tabaka nyingi za siri

Badala ya kumtegemea Alice kulinda faragha ya Bill, Bill anaweza kufanya hivyo mwenyewe. Anaweza kutengeneza anwani-meta nyingi kwa watu wa kubuni, Bob na Bella. Kisha Bill anatuma ETH kwa Bob, na "Bob" (ambaye kwa kweli ni Bill) anaituma kwa Bella. "Bella" (pia Bill) anaituma kwa Alice.

Carol bado anaweza kufanya uchambuzi wa trafiki na kuona bomba la Bill-kwa-Bob-kwa-Bella-kwa-Alice. Hata hivyo, ikiwa "Bob" na "Bella" pia watatumia ETH kwa madhumuni mengine, haitaonekana kwamba Bill alihamisha chochote kwa Alice, hata kama Alice atatoa pesa mara moja kutoka kwa anwani ya siri hadi kwa anwani yake ya kampeni inayojulikana.

Kuandika programu ya anwani ya siri

Makala haya yanaelezea programu ya anwani ya siri inayopatikana kwenye GitHub (opens in a new tab).

Zana

Kuna maktaba ya typescript ya anwani za siri (opens in a new tab) tunayoweza kutumia. Hata hivyo, operesheni za kikriptografia zinaweza kutumia CPU sana. Ninapendelea kuzitekeleza katika lugha iliyokusanywa, kama vile Rust (opens in a new tab), na kutumia WASM (opens in a new tab) kuendesha msimbo kwenye kivinjari.

Tutatumia Vite (opens in a new tab) na React (opens in a new tab). Hizi ni zana za kawaida za tasnia; ikiwa huzifahamu, unaweza kutumia mafunzo haya. Ili kutumia Vite, tunahitaji Node.

Angalia anwani za siri zikifanya kazi

  1. Sakinisha zana zinazohitajika: Rust (opens in a new tab) na Node (opens in a new tab).

  2. Clone hazina ya GitHub.

    1git clone https://github.com/qbzzt/251022-stealth-addresses.git
    2cd 251022-stealth-addresses
  3. Sakinisha mahitaji ya awali na ukusanye msimbo wa Rust.

    1cd src/rust-wasm
    2rustup target add wasm32-unknown-unknown
    3cargo install wasm-pack
    4wasm-pack build --target web
  4. Anzisha seva ya wavuti.

    1cd ../../
    2npm install
    3npm run dev
  5. Vinjari hadi programu (opens in a new tab). Ukurasa huu wa programu una fremu mbili: moja kwa ajili ya kiolesura cha mtumiaji cha Alice na nyingine kwa ajili ya cha Bill. Fremu hizi mbili haziwasiliani; ziko tu kwenye ukurasa mmoja kwa urahisi.

  6. Kama Alice, bofya Tengeneza Anwani-Meta ya Siri. Hii itaonyesha anwani mpya ya siri na funguo za binafsi zinazolingana. Nakili anwani-meta ya siri kwenye ubao wa kunakili.

  7. Kama Bill, bandika anwani-meta mpya ya siri na bofya Tengeneza anwani. Hii inakupa anwani ya kufadhili kwa ajili ya Alice.

  8. Nakili anwani na ufunguo wa umma wa Bill na uvibandike katika eneo la "Ufunguo wa binafsi kwa anwani iliyotengenezwa na Bill" ya kiolesura cha mtumiaji cha Alice. Mara tu sehemu hizo zitakapojazwa, utaona ufunguo wa binafsi wa kufikia mali kwenye anwani hiyo.

  9. Unaweza kutumia kikokotoo cha mtandaoni (opens in a new tab) ili kuhakikisha ufunguo wa binafsi unalingana na anwani.

Jinsi programu inavyofanya kazi

Sehemu ya WASM

Msimbo chanzo unaokusanywa kuwa WASM umeandikwa katika Rust (opens in a new tab). Unaweza kuuona katika src/rust_wasm/src/lib.rs (opens in a new tab). Msimbo huu kimsingi ni kiolesura kati ya msimbo wa JavaScript na maktaba ya eth-stealth-addresses (opens in a new tab).

Cargo.toml

Cargo.toml (opens in a new tab) katika Rust inafanana na package.json (opens in a new tab) katika JavaScript. Ina maelezo ya kifurushi, tamko za utegemezi, n.k.

1[package]
2name = "rust-wasm"
3version = "0.1.0"
4edition = "2024"
5
6[dependencies]
7eth-stealth-addresses = "0.1.0"
8hex = "0.4.3"
9wasm-bindgen = "0.2.104"
10getrandom = { version = "0.2", features = ["js"] }
Onyesha yote

Kifurushi cha getrandom (opens in a new tab) kinahitaji kutengeneza thamani za nasibu. Hilo haliwezi kufanywa kwa njia za kialgoriti pekee; inahitaji ufikiaji wa mchakato halisi kama chanzo cha entropy. Ufafanuzi huu unabainisha kuwa tutapata entropy hiyo kwa kuuliza kivinjari tunachotumia.

1console_error_panic_hook = "0.1.7"

Maktaba hii (opens in a new tab) inatupa ujumbe wa makosa wenye maana zaidi wakati msimbo wa WASM unapokwama na hauwezi kuendelea.

1[lib]
2crate-type = ["cdylib", "rlib"]

Aina ya towe inayohitajika kutengeneza msimbo wa WASM.

lib.rs

Huu ndio msimbo halisi wa Rust.

1use wasm_bindgen::prelude::*;

Ufafanuzi wa kuunda kifurushi cha WASM kutoka kwa Rust. Zimeandikwa hapa (opens in a new tab).

1use eth_stealth_addresses::{
2 generate_stealth_meta_address,
3 generate_stealth_address,
4 compute_stealth_key
5};

Vitendaji tunavyohitaji kutoka kwa maktaba ya eth-stealth-addresses (opens in a new tab).

1use hex::{decode,encode};

Rust kwa kawaida hutumia safu za baiti (arrays (opens in a new tab)) ([u8; <size>]) kwa thamani. Lakini katika JavaScript, kwa kawaida tunatumia mifuatano ya heksadesimali. Maktaba ya hex (opens in a new tab) inatutafsiria kutoka uwakilishi mmoja hadi mwingine.

1#[wasm_bindgen]

Tengeneza viunganishi vya WASM ili kuweza kuita kitendaji hiki kutoka kwa JavaScript.

1pub fn wasm_generate_stealth_meta_address() -> String {

Njia rahisi zaidi ya kurudisha kitu chenye sehemu nyingi ni kurudisha mfuatano wa JSON.

1 let (address, spend_private_key, view_private_key) =
2 generate_stealth_meta_address();

generate_stealth_meta_address (opens in a new tab) inarudisha sehemu tatu:

  • Anwani-meta (Kpub na Vpub)
  • Ufunguo wa binafsi wa kutazama (Vpriv)
  • Ufunguo wa binafsi wa kutumia (Kpriv)

Sintaksia ya tuple (opens in a new tab) inaturuhusu kutenganisha thamani hizo tena.

1 format!("{{\"address\":\"{}\",\"view_private_key\":\"{}\",\"spend_private_key\":\"{}\"}}",
2 encode(address),
3 encode(view_private_key),
4 encode(spend_private_key)
5 )
6}

Tumia macro ya format! (opens in a new tab) kutengeneza mfuatano uliosimbwa kwa JSON. Tumia hex::encode (opens in a new tab) kubadilisha safu kuwa mifuatano ya heksi.

1fn str_to_array<const N: usize>(s: &str) -> Option<[u8; N]> {

Kitendaji hiki hugeuza mfuatano wa heksi (unaotolewa na JavaScript) kuwa safu ya baiti. Tunaitumia kuchanganua thamani zinazotolewa na msimbo wa JavaScript. Kitendaji hiki ni kigumu kwa sababu ya jinsi Rust inavyoshughulikia safu na vekta.

Usemi wa <const N: usize> unaitwa generic (opens in a new tab). N ni kigezo kinachodhibiti urefu wa safu inayorudishwa. Kitendaji hiki kwa kweli kinaitwa str_to_array::<n>, ambapo n ni urefu wa safu.

Thamani ya kurudisha ni Option<[u8; N]>, ambayo inamaanisha safu inayorudishwa ni ya hiari (opens in a new tab). Huu ni mtindo wa kawaida katika Rust kwa vitendaji ambavyo vinaweza kushindwa.

Kwa mfano, tukiiita str_to_array::10("bad060a7"), kitendaji kinatakiwa kurudisha safu ya thamani kumi, lakini ingizo ni baiti nne tu. Kitendaji kinahitaji kushindwa, na hufanya hivyo kwa kurudisha None. Thamani ya kurudisha kwa str_to_array::4("bad060a7") itakuwa Some<[0xba, 0xd0, 0x60, 0xa7]>.

1 // decode returns Result<Vec<u8>, _>
2 let vec = decode(s).ok()?;

Kitendaji cha hex::decode (opens in a new tab) kinarudisha Result<Vec<u8>, FromHexError>. Aina ya Result (opens in a new tab) inaweza kuwa na matokeo ya mafanikio (Ok(value)) au kosa (Err(error)).

Mbinu ya .ok() hubadilisha Result kuwa Option, ambayo thamani yake ni thamani ya Ok() ikiwa imefanikiwa au None ikiwa sivyo. Mwishowe, opereta ya alama ya swali (opens in a new tab) huacha vitendaji vya sasa na kurudisha None ikiwa Option ni tupu. Vinginevyo, hufungua thamani na kuirudisha (katika kesi hii, kugawa thamani kwa vec).

Hii inaonekana kama njia ya kushangaza iliyopotoka ya kushughulikia makosa, lakini Result na Option huhakikisha kuwa makosa yote yanashughulikiwa, kwa njia moja au nyingine.

1 if vec.len() != N { return None; }

Ikiwa idadi ya baiti si sahihi, hilo ni kosa, na tunarudisha None.

1 // try_into consumes vec and attempts to make [u8; N]
2 let array: [u8; N] = vec.try_into().ok()?;

Rust ina aina mbili za safu. Safu (opens in a new tab) zina ukubwa usiobadilika. Vekta (opens in a new tab) zinaweza kukua na kupungua. hex::decode inarudisha vekta, lakini maktaba ya eth_stealth_addresses inataka kupokea safu. .try_into() (opens in a new tab) hubadilisha thamani kuwa aina nyingine, kwa mfano, vekta kuwa safu.

1 Some(array)
2}

Rust haikuhitaji utumie neno kuu la return (opens in a new tab) unaporudisha thamani mwishoni mwa kitendaji.

1#[wasm_bindgen]
2pub fn wasm_generate_stealth_address(stealth_address: &str) -> Option<String> {

Kitendaji hiki kinapokea anwani-meta ya umma, ambayo inajumuisha Vpub na Kpub. Inarudisha anwani ya siri, ufunguo wa umma wa kuchapisha (Rpub), na thamani ya skanisho ya baiti moja ambayo inaharakisha utambuzi wa anwani zilizochapishwa ambazo zinaweza kuwa za Alice.

Thamani ya skanisho ni sehemu ya siri ya pamoja (S = GRprivVpriv). Thamani hii inapatikana kwa Alice, na kuikagua ni haraka zaidi kuliko kuangalia ikiwa f(Kpub+G*hashi(S)) ni sawa na anwani iliyochapishwa.

1 let (address, r_pub, scan) =
2 generate_stealth_address(&str_to_array::<66>(stealth_address)?);

Tunatumia generate_stealth_address (opens in a new tab) ya maktaba.

1 format!("{{\"address\":\"{}\",\"rPub\":\"{}\",\"scan\":\"{}\"}}",
2 encode(address),
3 encode(r_pub),
4 encode(&[scan])
5 ).into()
6}

Andaa mfuatano wa towe uliosimbwa kwa JSON.

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}
Onyesha yote

Kitendaji hiki hutumia compute_stealth_key (opens in a new tab) ya maktaba kukokotoa ufunguo wa binafsi wa kutoa pesa kutoka kwa anwani (Rpriv). Ukokoaji huu unahitaji thamani hizi:

  • Anwani (Anwani=f(Ppub))
  • Ufunguo wa umma uliotengenezwa na Bill (Rpub)
  • Ufunguo wa binafsi wa kutazama (Vpriv)
  • Ufunguo wa binafsi wa kutumia (Kpriv)
1#[wasm_bindgen(start)]

#[wasm_bindgen(start)] (opens in a new tab) inabainisha kuwa kitendaji kinachotekelezwa wakati msimbo wa WASM unapowashwa.

1pub fn main() {
2 console_error_panic_hook::set_once();
3}

Msimbo huu unabainisha kuwa towe la hitilafu litumwe kwenye kiweko cha JavaScript. Ili kuiona ikifanya kazi, tumia programu na mpe Bill anwani-meta isiyo sahihi (badilisha tu tarakimu moja ya heksadesimali). Utaona kosa hili kwenye kiweko cha JavaScript:

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` failed
3 left: 0
4 right: 1

Ikifuatiwa na ufuatiliaji wa mrundikano. Kisha mpe Bill anwani-meta sahihi, na mpe Alice anwani isiyo sahihi au ufunguo wa umma usio sahihi. Utaona kosa hili:

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 address

Tena, ikifuatiwa na ufuatiliaji wa mrundikano.

Kiolesura cha Mtumiaji

Kiolesura cha mtumiaji kimeandikwa kwa kutumia React (opens in a new tab) na kinatolewa na Vite (opens in a new tab). Unaweza kujifunza kuzihusu kwa kutumia mafunzo haya. Hakuna haja ya WAGMI (opens in a new tab) hapa kwa sababu hatuingiliani moja kwa moja na mnyororo wa bloku au mkoba.

Sehemu pekee isiyo dhahiri ya kiolesura cha mtumiaji ni muunganisho wa WASM. Hivi ndivyo inavyofanya kazi.

vite.config.js

Faili hili lina usanidi wa Vite (opens in a new tab).

1import { defineConfig } from 'vite'
2import react from '@vitejs/plugin-react'
3import wasm from "vite-plugin-wasm";
4
5// https://vite.dev/config/
6export default defineConfig({
7 plugins: [react(), wasm()],
8})

Tunahitaji programu-jalizi mbili za Vite: react (opens in a new tab) na wasm (opens in a new tab).

App.jsx

Faili hili ndilo sehemu kuu ya programu. Ni kontena linalojumuisha sehemu mbili: Alice na Bill, violesura vya watumiaji hao. Sehemu muhimu kwa WASM ni msimbo wa uanzishaji.

1import init from './rust-wasm/pkg/rust_wasm.js'

Tunapotumia wasm-pack (opens in a new tab), inatengeneza faili mbili tunazotumia hapa: faili la wasm lenye msimbo halisi (hapa, src/rust-wasm/pkg/rust_wasm_bg.wasm) na faili la JavaScript lenye ufafanuzi wa kuitumia (hapa, src/rust_wasm/pkg/rust_wasm.js). Usafirishaji chaguo-msingi wa faili hilo la JavaScript ni msimbo unaohitaji kuendeshwa ili kuanzisha WASM.

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('Error loading wasm:', err)
12 alert("Wasm error: " + err)
13 }
14 }
15
16 loadWasm()
17 }, []
18 )
Onyesha yote

Ndoano ya useEffect (opens in a new tab) inakuwezesha kubainisha kitendaji kinachotekelezwa wakati vigezo vya hali vinapobadilika. Hapa, orodha ya vigezo vya hali ni tupu ([]), kwa hivyo kitendaji hiki kinachotekelezwa mara moja tu wakati ukurasa unapopakiwa.

Kitendaji cha athari lazima kirudi mara moja. Ili kutumia msimbo wa asinkroni, kama vile init ya WASM (ambayo inapaswa kupakia faili la .wasm na kwa hivyo inachukua muda) tunafafanua kitendaji cha ndani cha async (opens in a new tab) na kukiendesha bila await.

Bill.jsx

Hiki ni kiolesura cha mtumiaji cha Bill. Ina kitendo kimoja, kutengeneza anwani kulingana na anwani-meta ya siri iliyotolewa na Alice.

1import { wasm_generate_stealth_address } from './rust-wasm/pkg/rust_wasm.js'

Mbali na usafirishaji chaguo-msingi, msimbo wa JavaScript uliotengenezwa na wasm-pack husafirisha kitendaji kwa kila kitendaji katika msimbo wa WASM.

1 <button onClick={() => {
2 setPublicAddress(JSON.parse(wasm_generate_stealth_address(stealthMetaAddress)))
3 }}>

Ili kuita vitendaji vya WASM, tunaita tu kitendaji kilichosafirishwa na faili la JavaScript lililotengenezwa na wasm-pack.

Alice.jsx

Msimbo katika Alice.jsx unafanana, isipokuwa kwamba Alice ana vitendo viwili:

  • Tengeneza anwani-meta
  • Pata ufunguo wa binafsi kwa anwani iliyochapishwa na Bill

Hitimisho

Anwani za siri si suluhisho la kila kitu; zinapaswa kutumiwa ipasavyo. Lakini zinapotumiwa ipasavyo, zinaweza kuwezesha faragha kwenye mnyororo wa bloku wa umma.

Tazama hapa kwa kazi zangu zaidi (opens in a new tab).

Ukurasa ulihaririwa mwisho: 14 Novemba 2025

Umesaidika na mafunzo haya?