diff --git a/public/content/translations/sw/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md b/public/content/translations/sw/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md
new file mode 100644
index 00000000000..bba1c7f91c9
--- /dev/null
+++ b/public/content/translations/sw/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md
@@ -0,0 +1,92 @@
+---
+title: Sanidi web3.js ili kutumia mnyororo wa bloku wa Ethereum katika JavaScript
+description: Jifunze jinsi ya kuweka na kusanidi maktaba ya web3.js ili kuingiliana na mnyororo wa bloku wa Ethereum kutoka kwa programu za JavaScript.
+author: "jdourlens"
+tags: [ "web3.js", "javascript" ]
+skill: beginner
+lang: sw
+published: 2020-04-11
+source: EthereumDev
+sourceUrl: https://ethereumdev.io/setup-web3js-to-use-the-ethereum-blockchain-in-javascript/
+address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
+---
+
+Katika somo hili, tutaona jinsi ya kuanza na [web3.js](https://web3js.readthedocs.io/) ili kuingiliana na mnyororo wa bloku wa Ethereum. Web3.js inaweza kutumika katika sehemu zote mbili za mbele na za nyuma ili kusoma data kutoka kwenye mnyororo wa bloku au kufanya miamala na hata kupeleka mikataba-erevu.
+
+Hatua ya kwanza ni kujumuisha web3.js katika mradi wako. Ili kuitumia kwenye ukurasa wa wavuti, unaweza kuagiza maktaba moja kwa moja kwa kutumia CDN kama JSDeliver.
+
+```html
+
+```
+
+Ukipenda kusakinisha maktaba ili kuitumia katika sehemu ya nyuma au mradi wa mbele unaotumia muundo unaweza kuisakinisha kwa kutumia npm:
+
+```bash
+npm install web3 --save
+```
+
+Kisha ili kuagiza Web3.js katika hati ya Node.js au mradi wa mbele wa Browserify, unaweza kutumia mstari ufuatao wa JavaScript:
+
+```js
+const Web3 = require("web3")
+```
+
+Sasa kwa kuwa tumejumuisha maktaba katika mradi tunahitaji kuianzisha. Mradi wako unahitaji kuwa na uwezo wa kuwasiliana na mnyororo wa bloku. Maktaba nyingi za Ethereum huwasiliana na [nodi](/developers/docs/nodes-and-clients/) kupitia simu za RPC. Ili kuanzisha mtoa huduma wetu wa Web3, tutaanzisha mfano wa Web3 kwa kupitisha URL ya mtoa huduma kama kiunda. Ikiwa una nodi au [mfano wa ganache unaoendeshwa kwenye kompyuta yako](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/) itaonekana kama hivi:
+
+```js
+const web3 = new Web3("http://localhost:8545")
+```
+
+Ikiwa ungependa kufikia moja kwa moja nodi iliyohifadhiwa unaweza kupata chaguo kwenye [nodi kama huduma](/developers/docs/nodes-and-clients/nodes-as-a-service).
+
+```js
+const web3 = new Web3("https://cloudflare-eth.com")
+```
+
+Ili kujaribu kwamba tumesanidi mfano wetu wa Web3 ipasavyo, tutajaribu kupata nambari ya bloku ya hivi karibuni kwa kutumia utendaji wa `getBlockNumber`. Utendaji huu unakubali simu ya kurudi kama kigezo na hurudisha nambari ya bloku kama nambari kamili.
+
+```js
+var Web3 = require("web3")
+const web3 = new Web3("https://cloudflare-eth.com")
+
+web3.eth.getBlockNumber(function (error, result) {
+ console.log(result)
+})
+```
+
+Ukiendesha programu hii, itachapisha tu nambari ya bloku ya hivi karibuni: juu ya mnyororo wa bloku. Unaweza pia kutumia miito ya utendaji ya `await/async` ili kuepuka miito ya kurudi iliyopachikwa katika msimbo wako:
+
+```js
+async function getBlockNumber() {
+ const latestBlockNumber = await web3.eth.getBlockNumber()
+ console.log(latestBlockNumber)
+ return latestBlockNumber
+}
+
+getBlockNumber()
+```
+
+Unaweza kuona utendaji wote unaopatikana kwenye mfano wa Web3 katika [nyaraka rasmi za web3.js](https://docs.web3js.org/).
+
+Maktaba nyingi za Web3 hazifanani kwa sababu chinichini maktaba hupiga simu za JSON-RPC kwa nodi ambayo hurudisha matokeo.
+
+
+
+Ikiwa unafanya kazi kwenye kivinjari, baadhi ya pochi huweka mfano wa Web3 moja kwa moja na unapaswa kujaribu kuitumia kila inapowezekana hasa ikiwa unapanga kuingiliana na anwani ya Ethereum ya mtumiaji ili kufanya miamala.
+
+Hii hapa ni sehemu fupi ya kugundua ikiwa pochi ya MetaMask inapatikana na kujaribu kuiwasha ikiwa ipo. Baadaye itakuruhusu kusoma salio la mtumiaji na kuwawezesha kuhalalisha miamala ambayo ungependa wafanye kwenye mnyororo wa bloku wa Ethereum:
+
+```js
+if (window.ethereum != null) {
+ state.web3 = new Web3(window.ethereum)
+ try {
+ // Omba ufikiaji wa akaunti ikiwa inahitajika
+ await window.ethereum.enable()
+ // Akaunti sasa zimefichuliwa
+ } catch (error) {
+ // Mtumiaji amekataa ufikiaji wa akaunti...
+ }
+}
+```
+
+Njia mbadala za web3.js kama [Ethers.js](https://docs.ethers.io/) zipo na pia hutumiwa kwa kawaida. Katika somo linalofuata tutaona [jinsi ya kusikiliza kwa urahisi bloku mpya zinazoingia kwenye mnyororo wa bloku na kuona yaliyomo ndani yake](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/).
diff --git a/public/content/translations/sw/developers/tutorials/short-abi/index.md b/public/content/translations/sw/developers/tutorials/short-abi/index.md
new file mode 100644
index 00000000000..d46d8641b12
--- /dev/null
+++ b/public/content/translations/sw/developers/tutorials/short-abi/index.md
@@ -0,0 +1,585 @@
+---
+title: "ABI Fupi za Uboreshaji wa Calldata"
+description: Kuboresha mikataba-erevu kwa ajili ya Optimistic Rollups
+author: Ori Pomerantz
+lang: sw
+tags: [ "safu ya 2" ]
+skill: intermediate
+published: 2022-04-01
+---
+
+## Utangulizi {#introduction}
+
+Katika makala haya, utajifunza kuhusu [optimistic rollups](/developers/docs/scaling/optimistic-rollups), gharama za miamala juu yao, na jinsi muundo huo tofauti wa gharama unavyotulazimu kuboresha mambo tofauti kuliko kwenye Mtandao Mkuu wa Ethereum.
+Pia utajifunza jinsi ya kutekeleza uboreshaji huu.
+
+### Ufichuzi kamili {#full-disclosure}
+
+Mimi ni mfanyakazi wa muda wote wa [Optimism](https://www.optimism.io/), kwa hivyo mifano katika makala haya itaendeshwa kwenye Optimism.
+Hata hivyo, mbinu iliyoelezwa hapa inapaswa kufanya kazi vizuri vile vile kwa rollups zingine.
+
+### Istilahi {#terminology}
+
+Wakati wa kujadili rollups, neno 'safu ya 1' (L1) hutumika kwa Mtandao Mkuu, mtandao wa uzalishaji wa Ethereum.
+Neno 'safu ya 2' (L2) hutumika kwa rollup au mfumo mwingine wowote unaotegemea L1 kwa usalama lakini hufanya usindikaji wake mwingi nje ya chain.
+
+## Je, tunawezaje kupunguza zaidi gharama ya miamala ya L2? {#how-can-we-further-reduce-the-cost-of-L2-transactions}
+
+[Optimistic rollups](/developers/docs/scaling/optimistic-rollups) zinapaswa kuhifadhi rekodi ya kila muamala wa kihistoria ili mtu yeyote aweze kuzipitia na kuthibitisha kwamba hali ya sasa ni sahihi.
+Njia ya bei nafuu zaidi ya kuingiza data kwenye Mtandao Mkuu wa Ethereum ni kuiandika kama calldata.
+Suluhisho hili lilichaguliwa na [Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-) na [Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups).
+
+### Gharama ya miamala ya L2 {#cost-of-l2-transactions}
+
+Gharama ya miamala ya L2 inaundwa na vijenzi viwili:
+
+1. Usindikaji wa L2, ambao kwa kawaida ni wa bei nafuu sana
+2. Ghala la L1, ambalo limeunganishwa na gharama za gesi za Mtandao Mkuu
+
+Ninapoandika haya, kwenye Optimism gharama ya gesi ya L2 ni 0.001 [Gwei](/developers/docs/gas/#pre-london).
+Gharama ya gesi ya L1, kwa upande mwingine, ni takriban gwei 40.
+[Unaweza kuona bei za sasa hapa](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m).
+
+Baiti moja ya calldata hugharimu gesi 4 (ikiwa ni sifuri) au gesi 16 (ikiwa ni thamani nyingine yoyote).
+Moja ya operesheni za gharama kubwa zaidi kwenye EVM ni kuandika kwenye ghala.
+Gharama ya juu ya kuandika neno la baiti 32 kwenye ghala kwenye L2 ni gesi 22100. Kwa sasa, hii ni gwei 22.1.
+Kwa hivyo ikiwa tunaweza kuokoa baiti moja ya sifuri ya calldata, tutaweza kuandika takriban baiti 200 kwenye ghala na bado tuwe na faida.
+
+### ABI {#the-abi}
+
+Idadi kubwa ya miamala hufikia mkataba kutoka kwa akaunti inayomilikiwa na mtu wa nje.
+Mikataba mingi imeandikwa katika Solidity na kutafsiri uga wao wa data kulingana na [kiolesura cha binary cha programu (ABI)](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding).
+
+Hata hivyo, ABI ilitengenezwa kwa ajili ya L1, ambapo baiti ya calldata hugharimu takriban sawa na operesheni nne za hesabu, sio L2 ambapo baiti ya calldata hugharimu zaidi ya operesheni elfu moja za hesabu.
+Calldata imegawanywa kama ifuatavyo:
+
+| Sehemu | Urefu | Baiti | Baiti zilizopotea | Gesi iliyopotea | Baiti zinazohitajika | Gesi inayohitajika |
+| ------------------------------- | ----: | ----: | ----------------: | --------------: | -------------------: | -----------------: |
+| Kiteuzi cha chaguo za kukokotoa | 4 | 0-3 | 3 | 48 | 1 | 16 |
+| Sifuri | 12 | 4-15 | 12 | 48 | 0 | 0 |
+| Anwani ya mwisho | 20 | 16-35 | 0 | 0 | 20 | 320 |
+| Kiasi | 32 | 36-67 | 17 | 64 | 15 | 240 |
+| Jumla | 68 | | | 160 | | 576 |
+
+Maelezo:
+
+- **Kiteuzi cha chaguo za kukokotoa**: Mkataba una chaguo za kukokotoa chini ya 256, kwa hivyo tunaweza kuzitofautisha kwa baiti moja.
+ Kwa kawaida baiti hizi si sifuri na kwa hivyo [hugharimu gesi kumi na sita](https://eips.ethereum.org/EIPS/eip-2028).
+- **Sifuri**: Baiti hizi daima ni sifuri kwa sababu anwani ya baiti ishirini haihitaji neno la baiti thelathini na mbili ili kuihifadhi.
+ Baiti zinazoshikilia sifuri hugharimu gesi nne ([angalia karatasi ya njano](https://ethereum.github.io/yellowpaper/paper.pdf), Nyongeza G,
+ k. 27, thamani ya `G``txdatazero`).
+- **Kiasi**: Tukichukulia kuwa katika mkataba huu `decimals` ni kumi na nane (thamani ya kawaida) na kiasi cha juu cha tokeni tunachohamisha kitakuwa 1018, tunapata kiasi cha juu cha 1036.
+ 25615 > 1036, kwa hivyo baiti kumi na tano zinatosha.
+
+Upotevu wa gesi 160 kwenye L1 kwa kawaida hauzingatiwi. Muamala hugharimu angalau [gesi 21,000](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed), kwa hivyo 0.8% ya ziada haijalishi.
+Hata hivyo, kwenye L2, mambo ni tofauti. Karibu gharama nzima ya muamala ni kuiandika kwa L1.
+Mbali na calldata ya muamala, kuna baiti 109 za kichwa cha muamala (anwani ya mwisho, saini, n.k.).
+Gharama ya jumla kwa hivyo ni `109*16+576+160=2480`, na tunapoteza takriban 6.5% ya hiyo.
+
+## Kupunguza gharama wakati haudhibiti mwishilio {#reducing-costs-when-you-dont-control-the-destination}
+
+Tukichukulia kuwa huna udhibiti juu ya mkataba wa mwishilio, bado unaweza kutumia suluhisho sawa na [hili](https://github.com/qbzzt/ethereum.org-20220330-shortABI).
+Wacha tupitie faili zinazohusika.
+
+### Token.sol {#token-sol}
+
+[Huu ni mkataba wa mwishilio](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol).
+Ni mkataba wa kawaida wa ERC-20, wenye kipengele kimoja cha ziada.
+Kitendo hiki cha `faucet` humruhusu mtumiaji yeyote kupata tokeni fulani ya kutumia.
+Ingefanya mkataba wa uzalishaji wa ERC-20 usiwe na maana, lakini hurahisisha maisha wakati ERC-20 ipo tu kuwezesha majaribio.
+
+```solidity
+ /**
+ * @dev Gives the caller 1000 tokens to play with
+ */
+ function faucet() external {
+ _mint(msg.sender, 1000);
+ } // function faucet
+```
+
+### CalldataInterpreter.sol {#calldatainterpreter-sol}
+
+[Huu ni mkataba ambao miamala inapaswa kuita na calldata fupi](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol).
+Wacha tuipitie mstari kwa mstari.
+
+```solidity
+//SPDX-License-Identifier: Unlicense
+pragma solidity ^0.8.0;
+
+
+import { OrisUselessToken } from "./Token.sol";
+```
+
+Tunahitaji chaguo za kukokotoa za tokeni ili kujua jinsi ya kuiita.
+
+```solidity
+contract CalldataInterpreter {
+
+ OrisUselessToken public immutable token;
+```
+
+Anwani ya tokeni ambayo sisi ni proksi.
+
+```solidity
+
+ /**
+ * @dev Specify the token address
+ * @param tokenAddr_ The ERC-20 contract address
+ */
+ constructor(
+ address tokenAddr_
+ ) {
+ token = OrisUselessToken(tokenAddr_);
+ } // constructor
+```
+
+Anwani ya tokeni ndiyo kigezo pekee tunachohitaji kubainisha.
+
+```solidity
+ function calldataVal(uint startByte, uint length)
+ private pure returns (uint) {
+```
+
+Soma thamani kutoka kwa calldata.
+
+```solidity
+ uint _retVal;
+
+ require(length < 0x21,
+ "calldataVal length limit is 32 bytes");
+
+ require(length + startByte <= msg.data.length,
+ "calldataVal trying to read beyond calldatasize");
+```
+
+Tutaipakia neno moja la baiti 32 (biti 256) kwenye kumbukumbu na kuondoa baiti ambazo si sehemu ya uga tunaotaka.
+Algorithm hii haifanyi kazi kwa thamani ndefu kuliko baiti 32, na bila shaka hatuwezi kusoma zaidi ya mwisho wa calldata.
+Kwenye L1 inaweza kuwa muhimu kuruka majaribio haya ili kuokoa gesi, lakini kwenye L2 gesi ni nafuu sana, ambayo huwezesha ukaguzi wowote wa kiakili tunaoweza kufikiria.
+
+```solidity
+ assembly {
+ _retVal := calldataload(startByte)
+ }
+```
+
+Tungeweza kunakili data kutoka kwa simu hadi `fallback()` (tazama hapa chini), lakini ni rahisi zaidi kutumia [Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html), lugha ya mkusanyiko ya EVM.
+
+Hapa tunatumia [opcode ya CALLDATALOAD](https://www.evm.codes/#35) kusoma baiti `startByte` hadi `startByte+31` kwenye rundo.
+Kwa ujumla, sintaksia ya opcode katika Yul ni `(,...)`.
+
+```solidity
+
+ _retVal = _retVal >> (256-length*8);
+```
+
+Ni baiti za `urefu` muhimu pekee ndizo sehemu ya uga, kwa hivyo [tunahamisha kulia](https://en.wikipedia.org/wiki/Logical_shift) ili kuondoa thamani zingine.
+Hii ina faida iliyoongezwa ya kuhamisha thamani upande wa kulia wa uga, kwa hivyo ni thamani yenyewe badala ya thamani mara 256kitu.
+
+```solidity
+
+ return _retVal;
+ }
+
+
+ fallback() external {
+```
+
+Wito kwa mkataba wa Solidity usipofanana na saini zozote za chaguo za kukokotoa, huita [chaguo la kukokotoa la `fallback()`](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function) (kwa kudhani kuna moja).
+Katika kisa cha `CalldataInterpreter`, wito _yoyote_ hufika hapa kwa sababu hakuna chaguo zingine za kukokotoa za `external` au `public`.
+
+```solidity
+ uint _func;
+
+ _func = calldataVal(0, 1);
+```
+
+Soma baiti ya kwanza ya calldata, ambayo inatuambia chaguo za kukokotoa.
+Kuna sababu mbili kwa nini chaguo za kukokotoa hazipatikani hapa:
+
+1. Chaguo za kukokotoa ambazo ni `pure` au `view` hazibadilishi hali na hazigharimu gesi (zinapoitwa nje ya chain).
+ Haina maana kujaribu kupunguza gharama yao ya gesi.
+2. Chaguo za kukokotoa zinazotegemea [`msg.sender`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#block-and-transaction-properties).
+ Thamani ya `msg.sender` itakuwa anwani ya `CalldataInterpreter`, si ya mpigaji simu.
+
+Kwa bahati mbaya, [ukiangalia vipimo vya ERC-20](https://eips.ethereum.org/EIPS/eip-20), hii inaacha chaguo moja tu la kukokotoa, `transfer`.
+Hii inatuacha na chaguo mbili tu za kukokotoa: `transfer` (kwa sababu tunaweza kuita `transferFrom`) na `faucet` (kwa sababu tunaweza kuhamisha tokeni kurudi kwa yeyote aliyetuita).
+
+```solidity
+
+ // Call the state changing methods of token using
+ // information from the calldata
+
+ // faucet
+ if (_func == 1) {
+```
+
+Wito kwa `faucet()`, ambayo haina vigezo.
+
+```solidity
+ token.faucet();
+ token.transfer(msg.sender,
+ token.balanceOf(address(this)));
+ }
+```
+
+Baada ya kuita `token.faucet()` tunapata tokeni. Hata hivyo, kama mkataba wa proksi, **hatuhitaji** tokeni.
+EOA (akaunti inayomilikiwa nje) au mkataba uliotuita unahitaji.
+Kwa hivyo tunahamisha tokeni zetu zote kwa yeyote aliyetuita.
+
+```solidity
+ // transfer (assume we have an allowance for it)
+ if (_func == 2) {
+```
+
+Kuhamisha tokeni kunahitaji vigezo viwili: anwani ya mwisho na kiasi.
+
+```solidity
+ token.transferFrom(
+ msg.sender,
+```
+
+Tunawaruhusu tu wapigaji simu kuhamisha tokeni wanazomiliki
+
+```solidity
+ address(uint160(calldataVal(1, 20))),
+```
+
+Anwani ya mwisho huanza kwenye baiti #1 (baiti #0 ni chaguo za kukokotoa).
+Kama anwani, ina urefu wa baiti 20.
+
+```solidity
+ calldataVal(21, 2)
+```
+
+Kwa mkataba huu mahususi tunadhani kwamba idadi ya juu ya tokeni ambazo mtu yeyote angetaka kuhamisha inatoshea katika baiti mbili (chini ya 65536).
+
+```solidity
+ );
+ }
+```
+
+Kwa ujumla, uhamisho unachukua baiti 35 za calldata:
+
+| Sehemu | Urefu | Baiti |
+| ------------------------------- | ----: | ----: |
+| Kiteuzi cha chaguo za kukokotoa | 1 | 0 |
+| Anwani ya mwisho | 32 | 1-32 |
+| Kiasi | 2 | 33-34 |
+
+```solidity
+ } // fallback
+
+} // contract CalldataInterpreter
+```
+
+### test.js {#test-js}
+
+[Jaribio hili la kitengo cha JavaScript](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js) linatuonyesha jinsi ya kutumia utaratibu huu (na jinsi ya kuthibitisha kuwa inafanya kazi ipasavyo).
+Nitachukulia kuwa unaelewa [chai](https://www.chaijs.com/) na [ethers](https://docs.ethers.io/v5/) na nitaelezea tu sehemu zinazohusu mkataba haswa.
+
+```js
+const { expect } = require("chai");
+
+describe("CalldataInterpreter", function () {
+ it("Inapaswa kuturuhusu kutumia tokeni", async function () {
+ const Token = await ethers.getContractFactory("OrisUselessToken")
+ const token = await Token.deploy()
+ await token.deployed()
+ console.log("Anwani ya tokeni:", token.address)
+
+ const Cdi = await ethers.getContractFactory("CalldataInterpreter")
+ const cdi = await Cdi.deploy(token.address)
+ await cdi.deployed()
+ console.log("Anwani ya CalldataInterpreter:", cdi.address)
+
+ const signer = await ethers.getSigner()
+```
+
+Tunaanza kwa kupeleka mikataba yote miwili.
+
+```javascript
+ // Get tokens to play with
+ const faucetTx = {
+```
+
+Hatuwezi kutumia chaguo za kukokotoa za kiwango cha juu ambazo tungetumia kwa kawaida (kama vile `token.faucet()`) kuunda miamala, kwa sababu hatufuati ABI.
+Badala yake, tunapaswa kujenga muamala wenyewe na kisha kuutuma.
+
+```javascript
+ to: cdi.address,
+ data: "0x01"
+```
+
+Kuna vigezo viwili tunavyohitaji kutoa kwa muamala:
+
+1. `to`, anwani ya mwisho.
+ Huu ni mkataba wa mkalimani wa calldata.
+2. `data`, calldata ya kutuma.
+ Katika kesi ya simu ya bomba, data ni baiti moja, `0x01`.
+
+```javascript
+
+ }
+ await (await signer.sendTransaction(faucetTx)).wait()
+```
+
+Tunaita [mbinu ya `sendTransaction` ya mtia saini](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction) kwa sababu tayari tumebainisha lengo (`faucetTx.to`) na tunahitaji muamala utiwe saini.
+
+```javascript
+// Check the faucet provides the tokens correctly
+expect(await token.balanceOf(signer.address)).to.equal(1000)
+```
+
+Hapa tunathibitisha salio.
+Hakuna haja ya kuokoa gesi kwenye chaguo za kukokotoa za `view`, kwa hivyo tunaziendesha kawaida.
+
+```javascript
+// Give the CDI an allowance (approvals cannot be proxied)
+const approveTX = await token.approve(cdi.address, 10000)
+await approveTX.wait()
+expect(await token.allowance(signer.address, cdi.address)).to.equal(10000)
+```
+
+Mpe mkalimani wa calldata posho ili aweze kufanya uhamisho.
+
+```javascript
+// Transfer tokens
+const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d"
+const transferTx = {
+ to: cdi.address,
+ data: "0x02" + destAddr.slice(2, 42) + "0100",
+}
+```
+
+Unda muamala wa uhamisho. Baiti ya kwanza ni "0x02", ikifuatiwa na anwani ya mwisho, na hatimaye kiasi (0x0100, ambayo ni 256 katika desimali).
+
+```javascript
+ await (await signer.sendTransaction(transferTx)).wait()
+
+ // Check that we have 256 tokens less
+ expect (await token.balanceOf(signer.address)).to.equal(1000-256)
+
+ // And that our destination got them
+ expect (await token.balanceOf(destAddr)).to.equal(256)
+ }) // it
+}) // describe
+```
+
+## Kupunguza gharama unapodhibiti mkataba wa mwisho {#reducing-the-cost-when-you-do-control-the-destination-contract}
+
+Ikiwa una udhibiti juu ya mkataba wa mwisho unaweza kuunda chaguo za kukokotoa zinazokwepa ukaguzi wa `msg.sender` kwa sababu zinamuamini mkalimani wa calldata.
+[Unaweza kuona mfano wa jinsi hii inavyofanya kazi hapa, katika tawi la `control-contract`](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract).
+
+Ikiwa mkataba ungekuwa ukijibu tu miamala ya nje, tungeweza kutosheka na kuwa na mkataba mmoja tu.
+Hata hivyo, hilo lingevunja [uwezo wa kutunga](/developers/docs/smart-contracts/composability/).
+Ni bora zaidi kuwa na mkataba unaojibu simu za kawaida za ERC-20, na mkataba mwingine unaojibu miamala yenye data fupi ya simu.
+
+### Token.sol {#token-sol-2}
+
+Katika mfano huu tunaweza kurekebisha `Token.sol`.
+Hii inatuwezesha kuwa na idadi ya chaguo za kukokotoa ambazo proksi pekee inaweza kuita.
+Hapa kuna sehemu mpya:
+
+```solidity
+ // The only address allowed to specify the CalldataInterpreter address
+ address owner;
+
+ // The CalldataInterpreter address
+ address proxy = address(0);
+```
+
+Mkataba wa ERC-20 unahitaji kujua utambulisho wa proksi aliyeidhinishwa.
+Hata hivyo, hatuwezi kuweka kigezo hiki katika mjenzi, kwa sababu hatujui thamani bado.
+Mkataba huu unathibitishwa kwanza kwa sababu proksi inatarajia anwani ya tokeni katika mjenzi wake.
+
+```solidity
+ /**
+ * @dev Calls the ERC20 constructor.
+ */
+ constructor(
+ ) ERC20("Oris useless token-2", "OUT-2") {
+ owner = msg.sender;
+ }
+```
+
+Anwani ya muundaji (inayoitwa `owner`) huhifadhiwa hapa kwa sababu hiyo ndiyo anwani pekee inayoruhusiwa kuweka proksi.
+
+```solidity
+ /**
+ * @dev set the proxy address (CalldataInterpreter).
+ * Can only be called once by the owner
+ */
+ function setProxy(address _proxy) external {
+ require(msg.sender == owner, "Can only be called by owner");
+ require(proxy == address(0), "Proxy is already set");
+
+ proxy = _proxy;
+ } // function setProxy
+```
+
+Proksi ina ufikiaji wa upendeleo, kwa sababu inaweza kukwepa ukaguzi wa usalama.
+Ili kuhakikisha tunaweza kuamini proksi tunamruhusu `mmiliki` pekee kuita chaguo hili la kukokotoa, na mara moja tu.
+Mara `proksi` inapokuwa na thamani halisi (sio sifuri), thamani hiyo haiwezi kubadilika, kwa hivyo hata ikiwa mmiliki ataamua kuwa mhalifu, au mnemonic yake itafichuliwa, bado tuko salama.
+
+```solidity
+ /**
+ * @dev Some functions can only be called by the proxy.
+ */
+ modifier onlyProxy {
+```
+
+Hiki ni kitendakazi cha `kirekebishaji` (https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm), kinarekebisha jinsi vitendakazi vingine vinavyofanya kazi.
+
+```solidity
+ require(msg.sender == proxy);
+```
+
+Kwanza, thibitisha tumeitwa na proksi na si mtu mwingine.
+Ikiwa sivyo, `revert`.
+
+```solidity
+ _;
+ }
+```
+
+Ikiwa ndivyo, endesha kitendakazi tunachorekebisha.
+
+```solidity
+ /* Functions that allow the proxy to act on behalf of accounts */
+
+ function transferProxy(address from, address to, uint256 amount)
+ public virtual onlyProxy() returns (bool)
+ {
+ _transfer(from, to, amount);
+ return true;
+ }
+
+ function approveProxy(address from, address spender, uint256 amount)
+ public virtual onlyProxy() returns (bool)
+ {
+ _approve(from, spender, amount);
+ return true;
+ }
+
+ function transferFromProxy(
+ address spender,
+ address from,
+ address to,
+ uint256 amount
+ ) public virtual onlyProxy() returns (bool)
+ {
+ _spendAllowance(from, spender, amount);
+ _transfer(from, to, amount);
+ return true;
+ }
+```
+
+Hizi ni shughuli tatu ambazo kwa kawaida huhitaji ujumbe kutoka moja kwa moja kutoka kwa huluki inayohamisha tokeni au kuidhinisha posho.
+Hapa tuna toleo la proksi la shughuli hizi ambalo:
+
+1. Hurekebishwa na `onlyProxy()` ili hakuna mtu mwingine anayeruhusiwa kuzidhibiti.
+2. Hupata anwani ambayo kwa kawaida ingekuwa `msg.sender` kama kigezo cha ziada.
+
+### CalldataInterpreter.sol {#calldatainterpreter-sol-2}
+
+Mkalimani wa calldata karibu anafanana na ule ulio juu, isipokuwa kwamba chaguo za kukokotoa zinazowakilishwa hupokea kigezo cha `msg.sender` na hakuna haja ya posho ya `transfer`.
+
+```solidity
+ // transfer (no need for allowance)
+ if (_func == 2) {
+ token.transferProxy(
+ msg.sender,
+ address(uint160(calldataVal(1, 20))),
+ calldataVal(21, 2)
+ );
+ }
+
+ // approve
+ if (_func == 3) {
+ token.approveProxy(
+ msg.sender,
+ address(uint160(calldataVal(1, 20))),
+ calldataVal(21, 2)
+ );
+ }
+
+ // transferFrom
+ if (_func == 4) {
+ token.transferFromProxy(
+ msg.sender,
+ address(uint160(calldataVal( 1, 20))),
+ address(uint160(calldataVal(21, 20))),
+ calldataVal(41, 2)
+ );
+ }
+```
+
+### Test.js {#test-js-2}
+
+Kuna mabadiliko machache kati ya msimbo wa awali wa majaribio na huu.
+
+```js
+const Cdi = await ethers.getContractFactory("CalldataInterpreter")
+const cdi = await Cdi.deploy(token.address)
+await cdi.deployed()
+await token.setProxy(cdi.address)
+```
+
+Tunahitaji kuuambia mkataba wa ERC-20 ni proksi gani ya kuamini
+
+```js
+console.log("CalldataInterpreter address:", cdi.address)
+
+// Need two signers to verify allowances
+const signers = await ethers.getSigners()
+const signer = signers[0]
+const poorSigner = signers[1]
+```
+
+Ili kuangalia `approve()` na `transferFrom()` tunahitaji mtia saini wa pili.
+Tunaiita `poorSigner` kwa sababu haipati tokeni zetu zozote (inahitaji kuwa na ETH, bila shaka).
+
+```js
+// Transfer tokens
+const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d"
+const transferTx = {
+ to: cdi.address,
+ data: "0x02" + destAddr.slice(2, 42) + "0100",
+}
+await (await signer.sendTransaction(transferTx)).wait()
+```
+
+Kwa sababu mkataba wa ERC-20 unaiamini proksi (`cdi`), hatuhitaji posho ya kuwasilisha uhamisho.
+
+```js
+// approval and transferFrom
+const approveTx = {
+ to: cdi.address,
+ data: "0x03" + poorSigner.address.slice(2, 42) + "00FF",
+}
+await (await signer.sendTransaction(approveTx)).wait()
+
+const destAddr2 = "0xE1165C689C0c3e9642cA7606F5287e708d846206"
+
+const transferFromTx = {
+ to: cdi.address,
+ data: "0x04" + signer.address.slice(2, 42) + destAddr2.slice(2, 42) + "00FF",
+}
+await (await poorSigner.sendTransaction(transferFromTx)).wait()
+
+// Check the approve / transferFrom combo was done correctly
+expect(await token.balanceOf(destAddr2)).to.equal(255)
+```
+
+Jaribu chaguo mbili mpya za kukokotoa.
+Kumbuka kwamba `transferFromTx` inahitaji vigezo viwili vya anwani: mtoaji wa posho na mpokeaji.
+
+## Hitimisho {#conclusion}
+
+Wote [Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) na [Arbitrum](https://developer.offchainlabs.com/docs/special_features) wanatafuta njia za kupunguza ukubwa wa calldata iliyoandikwa kwa L1 na kwa hivyo gharama ya miamala.
+Hata hivyo, kama watoa huduma wa miundombinu wanaotafuta suluhisho za jumla, uwezo wetu una mipaka.
+Kama msanidi programu wa mfumo mtawanyo wa kimamlaka, una ujuzi maalum wa programu, ambao unakuwezesha kuboresha calldata yako vizuri zaidi kuliko tunavyoweza katika suluhisho la jumla.
+Tunatumahi, makala haya yanakusaidia kupata suluhisho bora kwa mahitaji yako.
+
+[Tazama hapa kwa kazi zangu zaidi](https://cryptodocguy.pro/).
+
diff --git a/public/content/translations/sw/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/sw/developers/tutorials/smart-contract-security-guidelines/index.md
new file mode 100644
index 00000000000..e26d1fd9f21
--- /dev/null
+++ b/public/content/translations/sw/developers/tutorials/smart-contract-security-guidelines/index.md
@@ -0,0 +1,91 @@
+---
+title: Miongozo ya usalama ya mkataba-erevu
+description: Orodha hakiki ya miongozo ya usalama ya kuzingatia unapojenga dapp yako
+author: "Trailofbits"
+tags: [ "uimara", "mikataba erevu", "usalama" ]
+skill: intermediate
+lang: sw
+published: 2020-09-06
+source: Building secure contracts
+sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md
+---
+
+Fuata mapendekezo haya ya kiwango cha juu ili kujenga mikataba-erevu salama zaidi.
+
+## Miongozo ya usanifu {#design-guidelines}
+
+Usanifu wa mkataba unapaswa kujadiliwa mapema, kabla ya kuandika mstari wowote wa msimbo.
+
+### Nyaraka na vipimo {#documentation-and-specifications}
+
+Nyaraka zinaweza kuandikwa katika viwango tofauti, na zinapaswa kusasishwa wakati wa kutekeleza mikataba:
+
+- **Maelezo ya mfumo kwa Kiingereza rahisi**, yanayoelezea kile ambacho mikataba hufanya na dhana zozote kwenye msingi wa msimbo.
+- **Michoro ya schema na usanifu**, ikiwemo mwingiliano wa mkataba na mashine ya hali ya mfumo. [Vichapishi vya Slither](https://github.com/crytic/slither/wiki/Printer-documentation) vinaweza kusaidia kutengeneza schema hizi.
+- **Nyaraka za msimbo za kina**, umbizo la [Natspec](https://docs.soliditylang.org/en/develop/natspec-format.html) linaweza kutumika kwa ajili ya Solidity.
+
+### Ukokoaji wa Onchain dhidi ya offchain {#onchain-vs-offchain-computation}
+
+- **Weka msimbo mwingi iwezekanavyo offchain.** Weka safu ya onchain iwe ndogo. Chakata awali data na msimbo offchain kwa namna ambayo uthibitishaji kwenye onchain ni rahisi. Je, unahitaji orodha iliyopangwa? Panga orodha offchain, kisha angalia tu mpangilio wake kwenye onchain.
+
+### Uboreshaji {#upgradeability}
+
+Tulijadili suluhisho tofauti za uboreshaji katika [chapisho letu la blogi](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Fanya uamuzi wa makusudi kuunga mkono uboreshaji au la kabla ya kuandika msimbo wowote. Uamuzi utaathiri jinsi unavyounda msimbo wako. Kwa ujumla, tunapendekeza:
+
+- **Pendelea [uhamishaji wa mkataba](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) badala ya uboreshaji.** Mifumo ya uhamishaji ina faida nyingi sawa na ile inayoweza kuboreshwa, bila hasara zake.
+- **Tumia muundo wa kutenganisha data badala ya ule wa delegatecallproxy.** Ikiwa mradi wako una utenganisho wazi wa kimantiki, uboreshaji kwa kutumia utenganishaji wa data utahitaji marekebisho machache tu. Delegatecallproxy inahitaji utaalamu wa EVM na ina uwezekano mkubwa wa kuwa na makosa.
+- **Andika utaratibu wa uhamishaji/usasishaji kabla ya kupeleka.** Ikiwa itakubidi uchukue hatua chini ya shinikizo bila miongozo yoyote, utafanya makosa. Andika utaratibu wa kufuata mapema. Inapaswa kujumuisha:
+ - Wito unaoanzisha mikataba mipya
+ - Mahali ambapo funguo zimehifadhiwa na jinsi ya kuzifikia
+ - Jinsi ya kuangalia upelekaji! Tengeneza na jaribu hati ya baada ya upelekaji.
+
+## Miongozo ya utekelezaji {#implementation-guidelines}
+
+**Jitahidi kuwa na urahisi.** Daima tumia suluhisho rahisi zaidi linalofaa lengo lako. Mwanachama yeyote wa timu yako anapaswa kuwa na uwezo wa kuelewa suluhisho lako.
+
+### Muundo wa kazi {#function-composition}
+
+Usanifu wa msingi wa msimbo wako unapaswa kufanya msimbo wako kuwa rahisi kupitia. Epuka chaguzi za usanifu zinazopunguza uwezo wa kufikiria kuhusu usahihi wake.
+
+- **Gawanya mantiki ya mfumo wako**, ama kupitia mikataba mingi au kwa kuweka pamoja kazi zinazofanana (kwa mfano, uthibitishaji, hesabu, ...).
+- **Andika kazi ndogo, zenye lengo wazi.** Hii itarahisisha upitiaji na kuruhusu upimaji wa vijenzi vya kibinafsi.
+
+### Urithi {#inheritance}
+
+- **Weka urithi uweze kudhibitiwa.** Urithi unapaswa kutumika kugawanya mantiki, hata hivyo, mradi wako unapaswa kulenga kupunguza kina na upana wa mti wa urithi.
+- **Tumia [kichapishi cha urithi cha Slither](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph) kuangalia daraja la mikataba.** Kichapishi cha urithi kitakusaidia kupitia ukubwa wa daraja.
+
+### Matukio {#events}
+
+- **Rekodi shughuli zote muhimu.** Matukio yatasaidia kurekebisha mkataba wakati wa uundaji, na kuufuatilia baada ya kupelekwa.
+
+### Epuka mitego inayojulikana {#avoid-known-pitfalls}
+
+- **Fahamu masuala ya kawaida ya usalama.** Kuna rasilimali nyingi mtandaoni za kujifunza kuhusu masuala ya kawaida, kama vile [Ethernaut CTF](https://ethernaut.openzeppelin.com/), [Capture the Ether](https://capturetheether.com/), au [Not so smart contracts](https://github.com/crytic/not-so-smart-contracts/).
+- **Fahamu sehemu za maonyo katika [nyaraka za Solidity](https://docs.soliditylang.org/en/latest/).** Sehemu za maonyo zitakujulisha kuhusu tabia zisizo dhahiri za lugha.
+
+### Tegemezi {#dependencies}
+
+- **Tumia maktaba zilizojaribiwa vizuri.** Kuingiza msimbo kutoka kwa maktaba zilizojaribiwa vizuri kutapunguza uwezekano wa kuandika msimbo wenye hitilafu. Ikiwa unataka kuandika mkataba wa ERC20, tumia [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20).
+- **Tumia kidhibiti tegemezi; epuka kunakili na kubandika msimbo.** Ikiwa unategemea chanzo cha nje, basi lazima ukiweke kisasa na chanzo asili.
+
+### Upimaji na uthibitishaji {#testing-and-verification}
+
+- **Andika majaribio ya kina ya vipande.** Mkusanyiko mpana wa majaribio ni muhimu ili kujenga programu ya hali ya juu.
+- **Tumia ukaguzi na sifa maalum za [Slither](https://github.com/crytic/slither), [Echidna](https://github.com/crytic/echidna) na [Manticore](https://github.com/trailofbits/manticore).** Zana za kiotomatiki zitasaidia kuhakikisha mkataba wako ni salama. Pitia sehemu iliyobaki ya mwongozo huu ili kujifunza jinsi ya kuandika ukaguzi na sifa zenye ufanisi.
+- **Tumia [crytic.io](https://crytic.io/).** Crytic huunganishwa na GitHub, hutoa ufikiaji wa vigunduzi vya faragha vya Slither, na huendesha ukaguzi wa sifa maalum kutoka Echidna.
+
+### Solidity {#solidity}
+
+- **Pendelea Solidity 0.5 badala ya 0.4 na 0.6.** Kwa maoni yetu, Solidity 0.5 ni salama zaidi na ina mazoea bora yaliyojengwa ndani kuliko 0.4. Solidity 0.6 imeonekana kuwa si thabiti sana kwa uzalishaji na inahitaji muda kukomaa.
+- **Tumia toleo thabiti kwa kuandaa; tumia toleo la hivi karibuni kuangalia maonyo.** Hakikisha msimbo wako hauna masuala yaliyoripotiwa na toleo la hivi karibuni la mkusanyaji. Hata hivyo, Solidity ina mzunguko wa haraka wa matoleo na ina historia ya hitilafu za mkusanyaji, kwa hivyo hatupendekezi toleo la hivi karibuni kwa upelekaji (angalia [pendekezo la toleo la solc la Slither](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33)).
+- **Usitumie uunganishaji wa ndani.** Uunganishaji unahitaji utaalamu wa EVM. Usiandike msimbo wa EVM kama hujai_bobea_ karatasi ya njano.
+
+## Miongozo ya upelekaji {#deployment-guidelines}
+
+Mara mkataba unapokuwa umeundwa na kupelekwa:
+
+- **Fuatilia mikataba yako.** Tazama kumbukumbu, na uwe tayari kuchukua hatua ikiwa kuna ukiukaji wa mkataba au mkoba.
+- **Ongeza maelezo yako ya mawasiliano kwenye [blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts).** Orodha hii husaidia wahusika wengine kuwasiliana nawe ikiwa kasoro ya usalama itagunduliwa.
+- **Linda mikoba ya watumiaji wenye fursa.** Fuata [mazoea yetu bora](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/) ikiwa unahifadhi funguo katika mikoba ya maunzi.
+- **Kuwa na mpango wa kukabiliana na matukio.** Zingatia kuwa mikataba-erevu yako inaweza kuathiriwa. Hata kama mikataba yako haina hitilafu, mshambuliaji anaweza kuchukua udhibiti wa funguo za mmiliki wa mkataba.
diff --git a/public/content/translations/sw/developers/tutorials/stealth-addr/index.md b/public/content/translations/sw/developers/tutorials/stealth-addr/index.md
new file mode 100644
index 00000000000..173d5f4e2de
--- /dev/null
+++ b/public/content/translations/sw/developers/tutorials/stealth-addr/index.md
@@ -0,0 +1,443 @@
+---
+title: "Kutumia Anwani za Siri"
+description: "Anwani za siri huruhusu watumiaji kuhamisha mali bila kujulikana. Baada ya kusoma makala haya, utaweza: Kueleza anwani za siri ni nini na jinsi zinavyofanya kazi, kuelewa jinsi ya kutumia anwani za siri kwa njia ambayo inalinda kutokujulikana, na kuandika programu ya wavuti inayotumia anwani za siri."
+author: Ori Pomerantz
+tags:
+ [
+ "Anwani ya siri",
+ "faragha",
+ "kriptografia",
+ "rust",
+ "wasm"
+ ]
+skill: intermediate
+published: 2025-11-30
+lang: sw
+sidebarDepth: 3
+---
+
+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](https://eips.ethereum.org/EIPS/eip-5564) ina suluhisho. ERC hii inaeleza jinsi ya kutumia [anwani za siri](https://nerolation.github.io/stealth-utils) 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](#go-wrong), utaona unachoweza kufanya ili kupunguza hatari hii.
+
+## Jinsi anwani za siri zinavyofanya kazi {#how}
+
+Makala haya yatajaribu kueleza anwani za siri kwa njia mbili. Ya kwanza ni [jinsi ya kuzitumia](#how-use). Sehemu hii inatosha kuelewa sehemu iliyobaki ya makala. Kisha, kuna [maelezo ya hisabati nyuma yake](#how-math). Ikiwa una nia ya kriptografia, soma sehemu hii pia.
+
+### Toleo rahisi (jinsi ya kutumia anwani za siri) {#how-use}
+
+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) {#how-math}
+
+Anwani za kawaida za siri hutumia [kriptografia ya mzingo duaradufu (ECC)](https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/#elliptic-curves-building-blocks-of-a-better-trapdoor) 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.
+
+| Alice | Imechapishwa | 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\*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 {#go-wrong}
+
+_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 {#multi-layer}
+
+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 {#write-app}
+
+Makala haya yanaelezea programu ya anwani ya siri [inayopatikana kwenye GitHub](https://github.com/qbzzt/251022-stealth-addresses.git).
+
+### Zana {#tools}
+
+Kuna [maktaba ya typescript ya anwani za siri](https://github.com/ScopeLift/stealth-address-sdk) tunayoweza kutumia. Hata hivyo, operesheni za kikriptografia zinaweza kutumia CPU sana. Ninapendelea kuzitekeleza katika lugha iliyokusanywa, kama vile [Rust](https://rust-lang.org/), na kutumia [WASM](https://webassembly.org/) kuendesha msimbo kwenye kivinjari.
+
+Tutatumia [Vite](https://vite.dev/) na [React](https://react.dev/). Hizi ni zana za kawaida za tasnia; ikiwa huzifahamu, unaweza kutumia [mafunzo haya](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/). Ili kutumia Vite, tunahitaji Node.
+
+### Angalia anwani za siri zikifanya kazi {#in-action}
+
+1. Sakinisha zana zinazohitajika: [Rust](https://rust-lang.org/tools/install/) na [Node](https://nodejs.org/en/download).
+
+2. Clone hazina ya GitHub.
+
+ ```sh
+ git clone https://github.com/qbzzt/251022-stealth-addresses.git
+ cd 251022-stealth-addresses
+ ```
+
+3. Sakinisha mahitaji ya awali na ukusanye msimbo wa Rust.
+
+ ```sh
+ cd src/rust-wasm
+ rustup target add wasm32-unknown-unknown
+ cargo install wasm-pack
+ wasm-pack build --target web
+ ```
+
+4. Anzisha seva ya wavuti.
+
+ ```sh
+ cd ../../
+ npm install
+ npm run dev
+ ```
+
+5. Vinjari hadi [programu](http://localhost:5173/). 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](https://iancoleman.net/ethereum-private-key-to-address/) ili kuhakikisha ufunguo wa binafsi unalingana na anwani.
+
+### Jinsi programu inavyofanya kazi {#how-the-program-works}
+
+#### Sehemu ya WASM {#wasm}
+
+Msimbo chanzo unaokusanywa kuwa WASM umeandikwa katika [Rust](https://rust-lang.org/). Unaweza kuuona katika [`src/rust_wasm/src/lib.rs`](https://github.com/qbzzt/251022-stealth-addresses/blob/main/src/rust-wasm/src/lib.rs). Msimbo huu kimsingi ni kiolesura kati ya msimbo wa JavaScript na [maktaba ya `eth-stealth-addresses`](https://github.com/kassandraoftroy/eth-stealth-addresses).
+
+**`Cargo.toml`**
+
+[`Cargo.toml`](https://doc.rust-lang.org/cargo/reference/manifest.html) katika Rust inafanana na [`package.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-json) katika JavaScript. Ina maelezo ya kifurushi, tamko za utegemezi, n.k.
+
+```toml
+[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`](https://docs.rs/getrandom/latest/getrandom/) 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.
+
+```toml
+console_error_panic_hook = "0.1.7"
+```
+
+[Maktaba hii](https://docs.rs/console_error_panic_hook/latest/console_error_panic_hook/) inatupa ujumbe wa makosa wenye maana zaidi wakati msimbo wa WASM unapokwama na hauwezi kuendelea.
+
+```toml
+[lib]
+crate-type = ["cdylib", "rlib"]
+```
+
+Aina ya towe inayohitajika kutengeneza msimbo wa WASM.
+
+**`lib.rs`**
+
+Huu ndio msimbo halisi wa Rust.
+
+```rust
+use wasm_bindgen::prelude::*;
+```
+
+Ufafanuzi wa kuunda kifurushi cha WASM kutoka kwa Rust. Zimeandikwa [hapa](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/index.html).
+
+```rust
+use eth_stealth_addresses::{
+ generate_stealth_meta_address,
+ generate_stealth_address,
+ compute_stealth_key
+};
+```
+
+Vitendaji tunavyohitaji kutoka kwa [maktaba ya `eth-stealth-addresses`](https://github.com/kassandraoftroy/eth-stealth-addresses).
+
+```rust
+use hex::{decode,encode};
+```
+
+Rust kwa kawaida hutumia safu za baiti ([arrays](https://doc.rust-lang.org/std/primitive.array.html)) (`[u8; ]`) kwa thamani. Lakini katika JavaScript, kwa kawaida tunatumia mifuatano ya heksadesimali. [Maktaba ya `hex`](https://docs.rs/hex/latest/hex/) inatutafsiria kutoka uwakilishi mmoja hadi mwingine.
+
+```rust
+#[wasm_bindgen]
+```
+
+Tengeneza viunganishi vya WASM ili kuweza kuita kitendaji hiki kutoka kwa JavaScript.
+
+```rust
+pub fn wasm_generate_stealth_meta_address() -> String {
+```
+
+Njia rahisi zaidi ya kurudisha kitu chenye sehemu nyingi ni kurudisha mfuatano wa JSON.
+
+```rust
+ let (address, spend_private_key, view_private_key) =
+ generate_stealth_meta_address();
+```
+
+[`generate_stealth_meta_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_meta_address.html) inarudisha sehemu tatu:
+
+- Anwani-meta (_Kpub_ na _Vpub_)
+- Ufunguo wa binafsi wa kutazama (_Vpriv_)
+- Ufunguo wa binafsi wa kutumia (_Kpriv_)
+
+Sintaksia ya [tuple](https://doc.rust-lang.org/std/primitive.tuple.html) inaturuhusu kutenganisha thamani hizo tena.
+
+```rust
+ format!("{{\"address\":\"{}\",\"view_private_key\":\"{}\",\"spend_private_key\":\"{}\"}}",
+ encode(address),
+ encode(view_private_key),
+ encode(spend_private_key)
+ )
+}
+```
+
+Tumia macro ya [`format!`](https://doc.rust-lang.org/std/fmt/index.html) kutengeneza mfuatano uliosimbwa kwa JSON. Tumia [`hex::encode`](https://docs.rs/hex/latest/hex/fn.encode.html) kubadilisha safu kuwa mifuatano ya heksi.
+
+```rust
+fn str_to_array(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 `` unaitwa [generic](https://doc.rust-lang.org/book/ch10-01-syntax.html). `N` ni kigezo kinachodhibiti urefu wa safu inayorudishwa. Kitendaji hiki kwa kweli kinaitwa `str_to_array::`, ambapo `n` ni urefu wa safu.
+
+Thamani ya kurudisha ni `Option<[u8; N]>`, ambayo inamaanisha safu inayorudishwa ni ya [hiari](https://doc.rust-lang.org/std/option/). 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]>`.
+
+```rust
+ // decode returns Result, _>
+ let vec = decode(s).ok()?;
+```
+
+Kitendaji cha [`hex::decode`](https://docs.rs/hex/latest/hex/fn.decode.html) kinarudisha `Result, FromHexError>`. Aina ya [`Result`](https://doc.rust-lang.org/std/result/) 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](https://doc.rust-lang.org/std/option/#the-question-mark-operator-) 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.
+
+```rust
+ if vec.len() != N { return None; }
+```
+
+Ikiwa idadi ya baiti si sahihi, hilo ni kosa, na tunarudisha `None`.
+
+```rust
+ // try_into consumes vec and attempts to make [u8; N]
+ let array: [u8; N] = vec.try_into().ok()?;
+```
+
+Rust ina aina mbili za safu. [Safu](https://doc.rust-lang.org/std/primitive.array.html) zina ukubwa usiobadilika. [Vekta](https://doc.rust-lang.org/std/vec/index.html) zinaweza kukua na kupungua. `hex::decode` inarudisha vekta, lakini maktaba ya `eth_stealth_addresses` inataka kupokea safu. [`.try_into()`](https://doc.rust-lang.org/std/convert/trait.TryInto.html#required-methods) hubadilisha thamani kuwa aina nyingine, kwa mfano, vekta kuwa safu.
+
+```rust
+ Some(array)
+}
+```
+
+Rust haikuhitaji utumie neno kuu la [`return`](https://doc.rust-lang.org/std/keyword.return.html) unaporudisha thamani mwishoni mwa kitendaji.
+
+```rust
+#[wasm_bindgen]
+pub fn wasm_generate_stealth_address(stealth_address: &str) -> Option {
+```
+
+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.
+
+```rust
+ let (address, r_pub, scan) =
+ generate_stealth_address(&str_to_array::<66>(stealth_address)?);
+```
+
+Tunatumia [`generate_stealth_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_address.html) ya maktaba.
+
+```rust
+ format!("{{\"address\":\"{}\",\"rPub\":\"{}\",\"scan\":\"{}\"}}",
+ encode(address),
+ encode(r_pub),
+ encode(&[scan])
+ ).into()
+}
+```
+
+Andaa mfuatano wa towe uliosimbwa kwa JSON.
+
+```rust
+#[wasm_bindgen]
+pub fn wasm_compute_stealth_key(
+ address: &str,
+ bill_pub_key: &str,
+ view_private_key: &str,
+ spend_private_key: &str
+) -> Option {
+ .
+ .
+ .
+}
+```
+
+Kitendaji hiki hutumia [`compute_stealth_key`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.compute_stealth_key.html) 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_)
+
+```rust
+#[wasm_bindgen(start)]
+```
+
+[`#[wasm_bindgen(start)]`](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/on-rust-exports/start.html) inabainisha kuwa kitendaji kinachotekelezwa wakati msimbo wa WASM unapowashwa.
+
+```rust
+pub fn main() {
+ console_error_panic_hook::set_once();
+}
+```
+
+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:
+
+```
+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 mrundikano. Kisha mpe Bill anwani-meta sahihi, na mpe Alice anwani isiyo sahihi au ufunguo wa umma usio sahihi. 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 mrundikano.
+
+#### Kiolesura cha Mtumiaji {#ui}
+
+Kiolesura cha mtumiaji kimeandikwa kwa kutumia [React](https://react.dev/) na kinatolewa na [Vite](https://vite.dev/). Unaweza kujifunza kuzihusu kwa kutumia [mafunzo haya](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/). Hakuna haja ya [WAGMI](https://wagmi.sh/) 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](https://vite.dev/config/).
+
+```js
+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 mbili za Vite: [react](https://www.npmjs.com/package/@vitejs/plugin-react) na [wasm](https://github.com/Menci/vite-plugin-wasm#readme).
+
+**`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.
+
+```jsx
+import init from './rust-wasm/pkg/rust_wasm.js'
+```
+
+Tunapotumia [`wasm-pack`](https://rustwasm.github.io/docs/wasm-pack/), 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.
+
+```jsx
+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 ya `useEffect`](https://react.dev/reference/react/useEffect) 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`](https://en.wikipedia.org/wiki/Async/await) 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.
+
+```jsx
+import { 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.
+
+```jsx
+