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 (inafunguka katika kichupo kipya) ina suluhisho. ERC hii inaeleza jinsi ya kutumia anwani fiche (inafunguka katika kichupo kipya) 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) (inafunguka katika kichupo kipya) 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 (inafunguka katika kichupo kipya).
Zana
Kuna maktaba ya anwani fiche ya TypeScript (inafunguka katika kichupo kipya) ambayo tungeweza kutumia. Hata hivyo, shughuli za kriptografia zinaweza kutumia CPU sana. Ninapendelea kuzitekeleza katika lugha iliyokusanywa (compiled language), kama vile Rust (inafunguka katika kichupo kipya), na kutumia WASM (inafunguka katika kichupo kipya) kuendesha msimbo kwenye kivinjari.
Tutatumia Vite (inafunguka katika kichupo kipya) na React (inafunguka katika kichupo kipya). 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 (inafunguka katika kichupo kipya) na Node (inafunguka katika kichupo kipya).
-
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 (inafunguka katika kichupo kipya). 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 (inafunguka katika kichupo kipya) ili kuhakikisha ufunguo wa siri unalingana na anwani.
Jinsi programu inavyofanya kazi
Kijenzi cha WASM
Msimbo wa chanzo unaokusanywa kuwa WASM umeandikwa katika Rust (inafunguka katika kichupo kipya). Unaweza kuuona katika src/rust_wasm/src/lib.rs (inafunguka katika kichupo kipya). Msimbo huu kimsingi ni kiolesura kati ya msimbo wa JavaScript na maktaba ya eth-stealth-addresses (inafunguka katika kichupo kipya).
Cargo.toml
Cargo.toml (inafunguka katika kichupo kipya) katika Rust inafanana na package.json (inafunguka katika kichupo kipya) 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 (inafunguka katika kichupo kipya) 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 (inafunguka katika kichupo kipya) 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 (inafunguka katika kichupo kipya).
use eth_stealth_addresses::{
generate_stealth_meta_address,
generate_stealth_address,
compute_stealth_key
};
Vitendaji (functions) tunavyohitaji kutoka kwenye maktaba ya eth-stealth-addresses (inafunguka katika kichupo kipya).
use hex::{decode,encode};
Rust kwa kawaida hutumia safu (inafunguka katika kichupo kipya) za baiti ([u8; <size>]) kwa thamani. Lakini katika JavaScript, kwa kawaida tunatumia mifuatano ya heksadesimali. Maktaba ya hex (inafunguka katika kichupo kipya) 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 (inafunguka katika kichupo kipya) inarejesha nyanja tatu:
- Anwani-meta (Kpub na Vpub)
- Ufunguo wa siri wa kutazama (Vpriv)
- Ufunguo wa siri wa kutumia (Kpriv)
Sintaksia ya tuple (inafunguka katika kichupo kipya) 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! (inafunguka katika kichupo kipya) kuzalisha mfuatano uliosimbwa kwa JSON. Tumia hex::encode (inafunguka katika kichupo kipya) 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) (inafunguka katika kichupo kipya). 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) (inafunguka katika kichupo kipya). 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 (inafunguka katika kichupo kipya) kinarejesha Result<Vec<u8>, FromHexError>. Aina ya Result (inafunguka katika kichupo kipya) 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 (inafunguka katika kichupo kipya) 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) (inafunguka katika kichupo kipya) zina ukubwa usiobadilika. Vekta (Vectors) (inafunguka katika kichupo kipya) zinaweza kukua na kupungua. hex::decode inarejesha vekta, lakini maktaba ya eth_stealth_addresses inataka kupokea safu. .try_into() (inafunguka katika kichupo kipya) inabadilisha thamani kuwa aina nyingine, kwa mfano, vekta kuwa safu.
Some(array)
}
Rust haikuhitaji kutumia neno kuu la return (inafunguka katika kichupo kipya) 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 (inafunguka katika kichupo kipya) 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 (inafunguka katika kichupo kipya) 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)] (inafunguka katika kichupo kipya) 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 (inafunguka katika kichupo kipya) na kutolewa na Vite (inafunguka katika kichupo kipya). Unaweza kujifunza kuzihusu kwa kutumia mafunzo haya. Hakuna haja ya Wagmi (inafunguka katika kichupo kipya) 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 (inafunguka katika kichupo kipya).
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 (inafunguka katika kichupo kipya) na wasm (inafunguka katika kichupo kipya).
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 (inafunguka katika kichupo kipya), 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 (inafunguka katika kichupo kipya) 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 (inafunguka katika kichupo kipya) 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.
Tazama hapa kwa kazi zangu zaidi (inafunguka katika kichupo kipya).