Kutumia Anwani Fiche
Wewe ni Bill. Kwa sababu ambazo hatutazijadili, unataka kuchangia kampeni ya "Alice for Queen of the World" na unataka Alice ajue ulichangia ili akupe tuzo akishinda. Kwa bahati mbaya, ushindi wake hauna uhakika. Kuna kampeni shindani, "Carol for Empress of the Solar System". Ikiwa Carol atashinda, na agundue ulichangia kwa Alice, utakuwa matatani. Kwa hivyo huwezi tu kuhamisha 200 ETH kutoka kwenye akaunti yako kwenda kwa Alice.
ERC-5564 (opens in a new tab) ina suluhisho. ERC hii inaeleza jinsi ya kutumia anwani fiche (opens in a new tab) kwa hamisho lisilojulikana.
Onyo: Kriptografia iliyo nyuma ya anwani fiche, kwa kadiri tujuavyo, ni thabiti. Hata hivyo, kuna uwezekano wa mashambulizi ya kando (side-channel attacks). Hapa chini, utaona kile unachoweza kufanya ili kupunguza hatari hii.
Jinsi anwani fiche zinavyofanya kazi
Makala haya yatajaribu kueleza anwani fiche kwa njia mbili. Ya kwanza ni jinsi ya kuzitumia. Sehemu hii inatosha kuelewa makala yaliyosalia. Kisha, kuna maelezo ya hisabati iliyo nyuma yake. Ikiwa unavutiwa na kriptografia, soma sehemu hii pia.
Toleo rahisi (jinsi ya kutumia anwani fiche)
Alice anaunda funguo za siri mbili na kuchapisha funguo za umma zinazolingana (ambazo zinaweza kuunganishwa kuwa anwani-meta moja yenye urefu maradufu). Bill pia anaunda ufunguo wa siri na kuchapisha ufunguo wa umma unaolingana.
Kwa kutumia ufunguo wa umma wa upande mmoja na ufunguo wa siri wa upande mwingine, unaweza kupata siri ya pamoja inayojulikana tu na Alice na Bill (haiwezi kupatikana kutoka kwa funguo za umma pekee). Kwa kutumia siri hii ya pamoja, Bill anapata anwani fiche na anaweza kutuma rasilimali kwake.
Alice pia anapata anwani kutoka kwa siri ya pamoja, lakini kwa sababu anajua funguo za siri za funguo za umma alizochapisha, anaweza pia kupata ufunguo wa siri unaomruhusu kutoa kutoka kwa anwani hiyo.
Hisabati (kwa nini anwani fiche hufanya kazi hivi)
Anwani fiche za kawaida hutumia kriptografia ya mkunjo wa duaradufu (ECC) (opens in a new tab) ili kupata utendaji bora na biti chache za ufunguo, huku zikidumisha kiwango kile kile cha usalama. Lakini kwa sehemu kubwa tunaweza kupuuza hilo na kujifanya tunatumia hisabati ya kawaida.
Kuna nambari ambayo kila mtu anaijua, G. Unaweza kuzidisha kwa G. Lakini kwa sababu ya asili ya ECC, haiwezekani kabisa kugawanya kwa G. Jinsi kriptografia ya ufunguo wa umma inavyofanya kazi kwa ujumla katika Ethereum ni kwamba unaweza kutumia ufunguo wa siri, Ppriv, kutia saini miamala ambayo kisha inathibitishwa na ufunguo wa umma, Ppub = GPpriv.
Alice anaunda funguo za siri mbili, Kpriv na Vpriv. Kpriv itatumika kutumia pesa kutoka kwenye anwani fiche, na Vpriv kutazama anwani zinazomilikiwa na Alice. Kisha Alice anachapisha funguo za umma: Kpub = GKpriv na Vpub = GVpriv
Bill anaunda ufunguo wa siri wa tatu, Rpriv, na kuchapisha Rpub = GRpriv kwenye sajili kuu (Bill angeweza pia kumtumia Alice, lakini tunachukulia 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*heshi(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 kuthibitisha rasilimali zilitoka kwake.
Alice anakokotoa RpubVpriv = GRprivVpriv. Hii inampa siri ya pamoja ileile, S. Kwa sababu anajua ufunguo wa siri, Kpriv, anaweza kukokotoa Ppriv = Kpriv+heshi(S). Ufunguo huu unamruhusu kufikia rasilimali katika anwani inayotokana na Ppub = GPpriv = GKpriv+G*heshi(S) = Kpub+G*heshi(S).
Tuna ufunguo tofauti wa kutazama ili kumruhusu Alice kumpa kandarasi Dave's World Domination Campaign Services. Alice yuko tayari kumruhusu Dave ajue anwani za umma na kumjulisha wakati pesa zaidi zinapatikana, lakini hataki atumie pesa zake za kampeni.
Kwa sababu kutazama na kutumia kunatumia 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*heshi(S)). Lakini bila Kpriv Dave hawezi kupata ufunguo wa siri.
Kwa muhtasari, hizi ndizo thamani zinazojulikana na washiriki tofauti.
| Alice | Iliyochapishwa | 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*heshi(S) | - | Ppub = Kpub+G*heshi(S) | Ppub = Kpub+G*heshi(S) |
| Anwani=f(Ppub) | - | Anwani=f(Ppub) | Anwani=f(Ppub) |
| Ppriv = Kpriv+heshi(S) | - | - | - |
Wakati anwani fiche zinapoenda kombo
Hakuna siri kwenye mnyororo wa vitalu. Ingawa anwani fiche zinaweza kukupa faragha, faragha hiyo inaweza kuathiriwa na uchanganuzi wa trafiki. Ili kuchukua mfano rahisi, fikiria kwamba Bill anafadhili anwani na mara moja anatuma muamala ili kuchapisha thamani ya Rpub. Bila Vpriv ya Alice, hatuwezi kuwa na uhakika kwamba hii ni anwani fiche, lakini huo ndio uwezekano mkubwa. Kisha, tunaona muamala mwingine unaohamisha ETH zote kutoka kwa anwani hiyo hadi kwenye anwani ya mfuko wa kampeni ya Alice. Huenda tusiweze kuthibitisha, lakini kuna uwezekano mkubwa kwamba Bill amechangia kampeni ya Alice. Carol bila shaka angefikiria hivyo.
Ni rahisi kwa Bill kutenganisha uchapishaji wa Rpub na ufadhili wa anwani fiche (kufanya hivyo kwa nyakati tofauti, kutoka kwa anwani tofauti). Hata hivyo, hiyo haitoshi. Mtindo ambao Carol anautafuta ni kwamba Bill anafadhili anwani, na kisha mfuko wa kampeni wa Alice unatoa pesa kutoka kwayo.
Suluhisho moja ni kwa kampeni ya Alice kutotoa pesa moja kwa moja, bali kuzitumia kulipa mtu wa tatu. Ikiwa kampeni ya Alice itatuma 10 ETH kwa Dave's World Domination Campaign Services, Carol anajua tu kwamba Bill alichangia kwa 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 iliyoheshishwa pamoja na malipo, na kisha kumpa Dave taswira ya awali (preimage), ili kuthibitisha kwamba 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 kujali kuhusu usiri wakati usiri huo unamnufaisha Bill. Alice anaweza kutaka kudumisha sifa yake ili rafiki wa Bill, Bob, pia amchangie. Lakini pia inawezekana kwamba hangejali kumfichua Bill, kwa sababu basi atakuwa na hofu ya kile kitakachotokea ikiwa Carol atashinda. Bill anaweza kuishia kumpa Alice msaada zaidi.
Kutumia tabaka nyingi fiche
Badala ya kumtegemea Alice kuhifadhi faragha ya Bill, Bill anaweza kufanya hivyo mwenyewe. Anaweza kuunda anwani-meta nyingi kwa watu wa kubuniwa, Bob na Bella. Kisha Bill anatuma ETH kwa Bob, na "Bob" (ambaye kwa kweli ni Bill) anatuma kwa Bella. "Bella" (pia Bill) anatuma kwa Alice.
Carol bado anaweza kufanya uchanganuzi wa trafiki na kuona mtiririko wa Bill-kwa-Bob-kwa-Bella-kwa-Alice. Hata hivyo, ikiwa "Bob" na "Bella" pia wanatumia ETH kwa madhumuni mengine, haitaonekana kwamba Bill alihamisha chochote kwa Alice, hata kama Alice atatoa mara moja kutoka kwa anwani fiche hadi kwenye anwani yake ya kampeni inayojulikana.
Kuandika programu ya anwani fiche
Makala haya yanaeleza programu ya anwani fiche inayopatikana kwenye GitHub (opens in a new tab).
Zana
Kuna maktaba ya anwani fiche ya TypeScript (opens in a new tab) ambayo tungeweza kutumia. Hata hivyo, shughuli za kriptografia zinaweza kutumia CPU sana. Ninapendelea kuzitekeleza katika lugha iliyokusanywa (compiled language), 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 kiwango cha sekta; ikiwa hufahamu kuzitumia, unaweza kutumia mafunzo haya. Ili kutumia Vite, tunahitaji Node.
Tazama anwani fiche zikifanya kazi
-
Sakinisha zana zinazohitajika: Rust (opens in a new tab) na Node (opens in a new tab).
-
Nakili (clone) hazina ya GitHub.
git clone https://github.com/qbzzt/251022-stealth-addresses.git cd 251022-stealth-addresses -
Sakinisha mahitaji ya awali na ukusanye (compile) msimbo wa Rust.
cd src/rust-wasm rustup target add wasm32-unknown-unknown cargo install wasm-pack wasm-pack build --target web -
Anzisha seva ya wavuti.
cd ../.. npm install npm run dev -
Vinjari hadi kwenye 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 Bill. Fremu hizi mbili haziwasiliani; ziko kwenye ukurasa mmoja tu kwa urahisi.
-
Kama Alice, bofya Generate a Stealth Meta-Address. Hii itaonyesha anwani fiche mpya na funguo za siri zinazolingana. Nakili anwani-meta fiche kwenye ubao wa kunakili (clipboard).
-
Kama Bill, bandika anwani-meta fiche mpya na ubofye Generate an address. Hii inakupa anwani ya kufadhili kwa ajili ya Alice.
-
Nakili anwani na ufunguo wa umma wa Bill na uzibandike katika eneo la "Private key for address generated by Bill" kwenye kiolesura cha mtumiaji cha Alice. Mara tu sehemu hizo zitakapojazwa, utaona ufunguo wa siri wa kufikia rasilimali kwenye anwani hiyo.
-
Unaweza kutumia kikokotoo cha mtandaoni (opens in a new tab) ili kuhakikisha ufunguo wa siri unalingana na anwani.
Jinsi programu inavyofanya kazi
Kijenzi cha WASM
Msimbo wa 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 taarifa za kifurushi, matamko ya utegemezi, n.k.
[package]
name = "rust-wasm"
version = "0.1.0"
edition = "2024"
[dependencies]
eth-stealth-addresses = "0.1.0"
hex = "0.4.3"
wasm-bindgen = "0.2.104"
getrandom = { version = "0.2", features = ["js"] }
Kifurushi cha getrandom (opens in a new tab) kinahitaji kuzalisha thamani nasibu. Hilo haliwezi kufanywa kwa njia za kialgoriti pekee; inahitaji ufikiaji wa mchakato wa kimaumbile kama chanzo cha Entropi. Ufafanuzi huu unabainisha kwamba tutapata Entropi hiyo kwa kuuliza kivinjari tunachoendesha.
console_error_panic_hook = "0.1.7"
Maktaba hii (opens in a new tab) inatupa jumbe za makosa zenye maana zaidi wakati msimbo wa WASM unapoingiwa na hofu (panics) na hauwezi kuendelea.
[lib]
crate-type = ["cdylib", "rlib"]
Aina ya pato inayohitajika ili kuzalisha msimbo wa WASM.
lib.rs
Huu ndio msimbo halisi wa Rust.
use wasm_bindgen::prelude::*;
Ufafanuzi wa kuunda kifurushi cha WASM kutoka kwa Rust. Zimeandikwa hapa (opens in a new tab).
use eth_stealth_addresses::{
generate_stealth_meta_address,
generate_stealth_address,
compute_stealth_key
};
Vitendaji (functions) tunavyohitaji kutoka kwenye maktaba ya eth-stealth-addresses (opens in a new tab).
use hex::{decode,encode};
Rust kwa kawaida hutumia safu (opens in a new tab) za baiti ([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.
#[wasm_bindgen]
Zalisha vifungo (bindings) vya WASM ili kuweza kuita kitendaji hiki kutoka kwenye JavaScript.
pub fn wasm_generate_stealth_meta_address() -> String {
Njia rahisi zaidi ya kurejesha kipengee (object) chenye nyanja nyingi ni kurejesha mfuatano wa JSON.
let (address, spend_private_key, view_private_key) =
generate_stealth_meta_address();
generate_stealth_meta_address (opens in a new tab) inarejesha nyanja tatu:
- Anwani-meta (Kpub na Vpub)
- Ufunguo wa siri wa kutazama (Vpriv)
- Ufunguo wa siri wa kutumia (Kpriv)
Sintaksia ya tuple (opens in a new tab) inaturuhusu kutenganisha thamani hizo tena.
format!("{{\"address\":\"{}\",\"view_private_key\":\"{}\",\"spend_private_key\":\"{}\"}}",
encode(address),
encode(view_private_key),
encode(spend_private_key)
)
}
Tumia makro ya format! (opens in a new tab) kuzalisha mfuatano uliosimbwa kwa JSON. Tumia hex::encode (opens in a new tab) kubadilisha safu kuwa mifuatano ya heksi (hex strings).
fn str_to_array<const N: usize>(s: &str) -> Option<[u8; N]> {
Kitendaji hiki hubadilisha mfuatano wa heksi (uliotolewa na JavaScript) kuwa safu ya baiti. Tunakitumia kuchanganua thamani zilizotolewa na msimbo wa JavaScript. Kitendaji hiki ni kigumu kwa sababu ya jinsi Rust inavyoshughulikia safu na vekta.
Usemi wa <const N: usize> unaitwa kijeneriki (generic) (opens in a new tab). N ni kigezo kinachodhibiti urefu wa safu iliyorejeshwa. Kitendaji hiki kwa kweli kinaitwa str_to_array::<n>, ambapo n ni urefu wa safu.
Thamani ya kurejesha ni Option<[u8; N]>, ambayo inamaanisha safu iliyorejeshwa ni ya hiari (optional) (opens in a new tab). Huu ni mtindo wa kawaida katika Rust kwa vitendaji ambavyo vinaweza kushindwa.
Kwa mfano, ikiwa tutaita str_to_array::10("bad060a7"), kitendaji kinapaswa kurejesha safu ya thamani kumi, lakini ingizo ni baiti nne tu. Kitendaji kinahitaji kushindwa, na kinafanya hivyo kwa kurejesha None. Thamani ya kurejesha kwa str_to_array::4("bad060a7") itakuwa Some<[0xba, 0xd0, 0x60, 0xa7]>.
// decode inarejesha Result<Vec<u8>, _>
let vec = decode(s).ok()?;
Kitendaji cha hex::decode (opens in a new tab) kinarejesha Result<Vec<u8>, FromHexError>. Aina ya Result (opens in a new tab) inaweza kuwa na matokeo yaliyofaulu (Ok(value)) au kosa (Err(error)).
Mbinu ya .ok() inabadilisha Result kuwa Option, ambayo thamani yake ni thamani ya Ok() ikiwa imefaulu au None ikiwa sivyo. Hatimaye, kiendeshaji cha alama ya kuuliza (opens in a new tab) kinasitisha vitendaji vya sasa na kurejesha None ikiwa Option ni tupu. Vinginevyo, inafungua (unwraps) thamani na kurejesha hiyo (katika kesi hii, ili kugawa thamani kwa vec).
Hii inaonekana kama mbinu ngumu isivyo kawaida ya kushughulikia makosa, lakini Result na Option zinahakikisha kwamba makosa yote yanashughulikiwa, kwa njia moja au nyingine.
if vec.len() != N { return None; }
Ikiwa idadi ya baiti si sahihi, hilo ni kosa, na tunarejesha None.
// try_into inatumia vec na kujaribu kutengeneza [u8; N]
let array: [u8; N] = vec.try_into().ok()?;
Rust ina aina mbili za safu. Safu (Arrays) (opens in a new tab) zina ukubwa usiobadilika. Vekta (Vectors) (opens in a new tab) zinaweza kukua na kupungua. hex::decode inarejesha vekta, lakini maktaba ya eth_stealth_addresses inataka kupokea safu. .try_into() (opens in a new tab) inabadilisha thamani kuwa aina nyingine, kwa mfano, vekta kuwa safu.
Some(array)
}
Rust haikuhitaji kutumia neno kuu la return (opens in a new tab) unapokurejesha thamani mwishoni mwa kitendaji.
#[wasm_bindgen]
pub fn wasm_generate_stealth_address(stealth_address: &str) -> Option<String> {
Kitendaji hiki kinapokea anwani-meta ya umma, ambayo inajumuisha Vpub na Kpub. Inarejesha anwani fiche, 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 kuiangalia ni haraka zaidi kuliko kuangalia ikiwa f(Kpub+G*heshi(S)) inalingana na anwani iliyochapishwa.
let (address, r_pub, scan) =
generate_stealth_address(&str_to_array::<66>(stealth_address)?);
Tunatumia generate_stealth_address (opens in a new tab) ya maktaba.
format!("{{\"address\":\"{}\",\"rPub\":\"{}\",\"scan\":\"{}\"}}",
encode(address),
encode(r_pub),
encode(&[scan])
).into()
}
Andaa mfuatano wa pato uliosimbwa kwa JSON.
#[wasm_bindgen]
pub fn wasm_compute_stealth_key(
address: &str,
bill_pub_key: &str,
view_private_key: &str,
spend_private_key: &str
) -> Option<String> {
.
.
.
}
Kitendaji hiki kinatumia compute_stealth_key (opens in a new tab) ya maktaba kukokotoa ufunguo wa siri wa kutoa kutoka kwenye anwani (Rpriv). Ukokotoaji huu unahitaji thamani hizi:
- Anwani (Anwani=f(Ppub))
- Ufunguo wa umma uliotengenezwa na Bill (Rpub)
- Ufunguo wa siri wa kutazama (Vpriv)
- Ufunguo wa siri wa kutumia (Kpriv)
#[wasm_bindgen(start)]
#[wasm_bindgen(start)] (opens in a new tab) inabainisha kwamba kitendaji kinatekelezwa wakati msimbo wa WASM unapoanzishwa.
pub fn main() {
console_error_panic_hook::set_once();
}
Msimbo huu unabainisha kwamba pato la hofu (panic output) litumwe kwenye kiweko (console) cha JavaScript. Ili kuiona ikifanya kazi, tumia programu na umpe Bill anwani-meta batili (badilisha tu tarakimu moja ya heksadesimali). Utaona kosa hili kwenye kiweko cha JavaScript:
rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/subtle-2.6.1/src/lib.rs:701:9:
assertion `left == right` failed
left: 0
right: 1
Ikifuatiwa na ufuatiliaji wa staki (stack trace). Kisha mpe Bill anwani-meta halali, na umpe Alice anwani batili au ufunguo wa umma batili. Utaona kosa hili:
rust_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:
keys do not generate stealth address
Tena, ikifuatiwa na ufuatiliaji wa staki.
Kiolesura cha Mtumiaji
Kiolesura cha mtumiaji kimeandikwa kwa kutumia React (opens in a new tab) na kutolewa 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 vitalu 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).
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import wasm from "vite-plugin-wasm";
// https://vite.dev/config/
export default defineConfig({
plugins: [react(), wasm()],
})
Tunahitaji programu-jalizi (plugins) mbili za Vite: react (opens in a new tab) na wasm (opens in a new tab).
App.jsx
Faili hili ndilo kijenzi kikuu cha programu. Ni kontena linalojumuisha vijenzi viwili: Alice na Bill, violesura vya watumiaji kwa watumiaji hao. Sehemu husika kwa WASM ni msimbo wa kuanzisha.
import init from './rust-wasm/pkg/rust_wasm.js'
Tunapotumia wasm-pack (opens in a new tab), inaunda 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 kulitumia (hapa, src/rust_wasm/pkg/rust_wasm.js). Usafirishaji chaguomsingi (default export) wa faili hilo la JavaScript ni msimbo unaohitaji kuendeshwa ili kuanzisha WASM.
function App() {
.
.
.
useEffect(() => {
const loadWasm = async () => {
try {
await init();
setWasmReady(true)
} catch (err) {
console.error('Error loading wasm:', err)
alert("Wasm error: " + err)
}
}
loadWasm()
}, []
)
Ndoano (hook) ya useEffect (opens in a new tab) inakuruhusu kubainisha kitendaji kinachotekelezwa wakati vigeu vya hali (state variables) vinapobadilika. Hapa, orodha ya vigeu vya hali ni tupu ([]), kwa hivyo kitendaji hiki kinatekelezwa mara moja tu ukurasa unapopakiwa.
Kitendaji cha athari (effect function) kinapaswa kurejesha mara moja. Ili kutumia msimbo usiolingana (asynchronous code), 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. Kina kitendo kimoja, kuunda anwani kulingana na anwani-meta fiche iliyotolewa na Alice.
import { wasm_generate_stealth_address } from './rust-wasm/pkg/rust_wasm.js'
Mbali na usafirishaji chaguomsingi, msimbo wa JavaScript uliotengenezwa na wasm-pack unasafirisha kitendaji kwa kila kitendaji katika msimbo wa WASM.
<button onClick={() => {
setPublicAddress(JSON.parse(wasm_generate_stealth_address(stealthMetaAddress)))
}}>
Ili kuita vitendaji vya WASM, tunaita tu kitendaji kilichosafirishwa na faili la JavaScript lililoundwa na wasm-pack.
Alice.jsx
Msimbo katika Alice.jsx unafanana, isipokuwa kwamba Alice ana vitendo viwili:
- Kuzalisha anwani-meta
- Kupata ufunguo wa siri kwa anwani iliyochapishwa na Bill
Hitimisho
Anwani fiche si suluhisho la kila kitu; zinapaswa kutumiwa kwa usahihi. Lakini zinapotumiwa kwa usahihi, zinaweza kuwezesha faragha kwenye mnyororo wa vitalu wa umma.