Uji Umum: Privasi Ethereum sareng Solusi Skalabilitas

Blockchain mangrupa téhnologi inovatif anu janji pikeun ngaronjatkeun loba widang kahirupan manusa. Mindahkeun prosés sareng produk nyata kana rohangan digital, mastikeun kagancangan sareng réliabilitas transaksi kauangan, ngirangan biayana, sareng ogé ngamungkinkeun anjeun nyiptakeun aplikasi DAPP modéren nganggo kontrak pinter dina jaringan desentralisasi.

Dibikeun seueur mangpaat sareng rupa-rupa aplikasi blockchain, sigana héran yén téknologi anu ngajangjikeun ieu henteu acan dugi ka unggal industri. Masalahna nyaéta yén blockchains desentralisasi modern kakurangan skalabilitas. Ethereum prosés ngeunaan 20 transaksi per detik, nu teu cukup pikeun minuhan kaperluan bisnis dinamis kiwari. Dina waktos anu sami, perusahaan anu nganggo téknologi blockchain ragu-ragu pikeun ngantunkeun Ethereum kusabab tingkat panyalindunganna anu luhur tina hacking sareng gagal jaringan.

Pikeun mastikeun desentralisasi, kaamanan sareng skalabilitas dina blockchain, ku kituna ngarengsekeun Scalability Trilemma, tim pamekaran. Kasempetan nyiptakeun Plasma Cash, ranté cabangna diwangun ku kontrak pinter jeung jaringan pribadi dumasar kana Node.js, nu périodik mindahkeun kaayaan na kana ranté root (Ethereum).

Uji Umum: Privasi Ethereum sareng Solusi Skalabilitas

Prosés konci dina Plasma Cash

1. Pangguna nyauran fungsi kontrak pinter `deposit`, ngalebetkeun kana jumlah ETH anu anjeunna hoyong deposit kana token Plasma Cash. Fungsi kontrak pinter nyiptakeun token sareng ngahasilkeun acara ngeunaan éta.

2. Plasma Cash titik ngalanggan acara kontrak pinter narima hiji acara ngeunaan nyieun deposit sarta nambahan urus ngeunaan nyieun token ka kolam renang.

3. Périodik, titik Plasma Cash husus nyandak sakabeh transaksi ti kolam renang (nepi ka 1 juta) sarta ngabentuk blok ti aranjeunna, ngitung tangkal Merkle na, sasuai, Hash nu. Blok ieu dikirim ka titik anu sanés pikeun verifikasi. Titik mariksa naha Hash Merkle sah sareng naha transaksina sah (contona, naha pangirim token mangrupikeun anu gaduhna). Saatos pariksa blok, titik éta nyauran fungsi `submitBlock` tina kontrak pinter, anu ngahémat nomer blok sareng hash Merkle kana ranté tepi. Kontrak pinter ngahasilkeun acara anu nunjukkeun tambihan suksés tina blok. Transaksi dikaluarkeun tina kolam renang.

4. Titik anu nampi acara pangiriman blok ngawitan nerapkeun transaksi anu ditambahkeun kana blok.

5. Di sawatara titik, nu boga (atawa non-boga) token nu hayang mundur tina Plasma Cash. Jang ngalampahkeun ieu, anjeunna nelepon `startExit` fungsi, ngalirkeun kana eta informasi ngeunaan panungtungan 2 transaksi on token nu, nu mastikeun yén manéhna téh nu boga token nu. Kontrak pinter, ngagunakeun Hash Merkle, pariksa ayana transaksi di blok jeung ngirim token pikeun ditarikna, anu bakal lumangsung dina dua minggu.

6. Lamun operasi ditarikna token lumangsung kalawan palanggaran (token ieu spent sanggeus prosedur ditarikna dimimitian atawa token geus batur saméméh ditarikna), nu boga token bisa refute ditarikna dina dua minggu.

Uji Umum: Privasi Ethereum sareng Solusi Skalabilitas

Privasi kahontal ku dua cara

1. Ranté akar henteu terang nanaon ngeunaan transaksi anu dibangkitkeun sareng diteruskeun dina ranté anak. Inpormasi ngeunaan saha anu nyimpen sareng ngaluarkeun ETH tina Plasma Cash tetep umum.

2. Ranté anak ngamungkinkeun transaksi anonim ngagunakeun zk-SNARKs.

Téknologi tumpukan

  • NodeJS
  • Redis
  • Étilium
  • Sild

Tés

Nalika ngembangkeun Plasma Cash, kami nguji laju sistem sareng nampi hasil ieu:

  • nepi ka 35 transaksi per detik ditambahkeun kana kolam renang nu;
  • nepi ka 1 transaksi bisa disimpen dina blok a.

Tés dilaksanakeun dina 3 server ieu:

1. Intel Core i7-6700 Quad-Core Skylake incl. NVMe SSD - 512 GB, 64 GB DDR4 RAM
3 validating titik Plasma Cash diangkat.

2. AMD Ryzen 7 1700X Octa-Core "Summit Ridge" (Zen), SATA SSD - 500 GB, 64 GB DDR4 RAM
Titik Ropsten testnet ETH diangkat.
3 validating titik Plasma Cash diangkat.

3. Intel Core i9-9900K Octa-Core incl. NVMe SSD - 1 TB, 64 GB DDR4 RAM
1 Node kiriman Plasma Cash diangkat.
3 validating titik Plasma Cash diangkat.
Tés diluncurkeun pikeun nambihan transaksi kana jaringan Plasma Cash.

total: 10 titik Plasma Cash dina jaringan pribadi.

Tés 1

Aya wates 1 juta transaksi per blok. Ku alatan éta, 1 juta transaksi digolongkeun kana 2 blok (saprak sistem junun nyandak bagian tina transaksi sarta ngirimkeun bari maranéhna keur dikirim).


kaayaan awal: blok panungtungan # 7; 1 juta transaksi sareng token disimpen dina pangkalan data.

00:00 - ngamimitian naskah generasi transaksi
01:37 - 1 juta transaksi dijieun tur ngirim ka titik dimimitian
01:46 - ngalebetkeun node nyandak 240k transaksi ti kolam renang sareng ngabentuk blok #8. Urang ogé nempo yén 320k transaksi ditambahkeun kana kolam renang dina 10 detik
01:58 — blok #8 ditandatanganan sareng dikirim pikeun validasi
02:03 — blok #8 disahkeun sareng fungsi `submitBlock` tina kontrak pinter disebut nganggo hash Merkle sareng nomer blok
02:10 - skrip demo réngsé damel, anu ngirim 1 juta transaksi dina 32 detik
02:33 - titik mimiti nampa informasi yén blok #8 ditambahkeun kana ranté root, sarta mimiti ngalakukeun 240k transaksi
02:40 - 240k transaksi dikaluarkeun tina kolam renang, nu geus di blok # 8
02:56 - ngalebetkeun node nyandak sésana 760k transaksi tina kolam renang sareng mimiti ngitung hash Merkle sareng blok nandatanganan #9
03:20 - sadaya titik ngandung 1 juta 240k transaksi sareng token
03:35 - blok #9 ditandatanganan sareng dikirim pikeun validasi ka titik sanés
03:41 - kasalahan jaringan lumangsung
04:40 — ngantosan validasi blok #9 parantos tamat
04:54 - ngalebetkeun node nyandak sésana 760k transaksi tina kolam renang sareng mimiti ngitung hash Merkle sareng blok nandatanganan #9
05:32 - blok #9 ditandatanganan sareng dikirim pikeun validasi ka titik sanés
05:53 - blok #9 disahkeun sareng dikirim ka ranté akar
06:17 - titik mimiti nampi inpormasi yén blok #9 ditambahkeun kana ranté akar sareng mimiti ngalakukeun transaksi 760k
06:47 - kolam renang parantos ngabersihkeun transaksi anu aya di blok #9
09:06 - sadaya titik ngandung 2 juta transaksi sareng token

Tés 2

Aya wates 350k per blok. Hasilna, urang gaduh 3 blok.


kaayaan awal: blok panungtungan # 9; 2 juta transaksi sareng token disimpen dina pangkalan data

00:00 — skrip generasi transaksi parantos diluncurkeun
00:44 - 1 juta transaksi dijieun tur ngirim ka titik dimimitian
00:56 - ngalebetkeun node nyandak 320k transaksi ti kolam renang sareng ngabentuk blok #10. Urang ogé nempo yén 320k transaksi ditambahkeun kana kolam renang dina 10 detik
01:12 — blok #10 ditandatanganan sareng dikirim ka titik sanés pikeun validasi
01:18 - skrip demo réngsé damel, anu ngirim 1 juta transaksi dina 34 detik
01:20 - blok #10 disahkeun sareng dikirim ka ranté akar
01:51 - sadaya titik nampi inpormasi tina ranté akar anu meungpeuk #10 ditambahkeun sareng ngawitan nerapkeun transaksi 320k
02:01 - kolam renang geus diberesihan pikeun 320k transaksi nu ditambahkeun kana blok #10
02:15 - ngalebetkeun node nyandak 350k transaksi tina kolam renang sareng ngabentuk blok #11
02:34 - blok #11 ditandatanganan sareng dikirim ka titik sanés pikeun validasi
02:51 - blok #11 disahkeun sareng dikirim ka ranté akar
02:55 - titik panungtungan réngsé transaksi ti blok #10
10:59 - urus sareng kiriman blok #9 nyandak waktos anu lami pisan dina ranté akar, tapi parantos réngsé sareng sadaya titik nampi inpormasi ngeunaan éta sareng mimiti ngalaksanakeun 350k transaksi
11:05 - kolam renang geus diberesihan pikeun 320k transaksi nu ditambahkeun kana blok #11
12:10 - sadaya titik ngandung 1 juta 670k transaksi sareng token
12:17 - ngalebetkeun node nyandak 330k transaksi ti kolam renang sareng ngabentuk blok #12
12:32 - blok #12 ditandatanganan sareng dikirim ka titik sanés pikeun validasi
12:39 - blok #12 disahkeun sareng dikirim ka ranté akar
13:44 - sadaya titik nampi inpormasi tina ranté akar anu meungpeuk #12 ditambahkeun sareng ngawitan nerapkeun 330k transaksi
14:50 - sadaya titik ngandung 2 juta transaksi sareng token

Tés 3

Dina server kahiji jeung kadua, hiji titik validating diganti ku titik ngirimkeun.


kaayaan awal: blok panungtungan # 84; 0 transaksi sareng token disimpen dina pangkalan data

00:00 - 3 naskah parantos diluncurkeun anu ngahasilkeun sareng ngirim 1 juta transaksi masing-masing
01:38 - 1 juta transaksi diciptakeun sareng ngirim pikeun ngirim titik #3 dimimitian
01:50 - ngalebetkeun node #3 nyandak 330k transaksi tina kolam renang sareng ngabentuk blok #85 (f21). Urang ogé nempo yén 350k transaksi ditambahkeun kana kolam renang dina 10 detik
01:53 - 1 juta transaksi diciptakeun sareng ngirim pikeun ngirim titik #1 dimimitian
01:50 - ngalebetkeun node #3 nyandak 330k transaksi tina kolam renang sareng ngabentuk blok #85 (f21). Urang ogé nempo yén 350k transaksi ditambahkeun kana kolam renang dina 10 detik
02:01 - ngalebetkeun titik #1 nyandak 250k transaksi ti kolam renang sareng ngabentuk blok #85 (65e)
02:06 - blok #85 (f21) ditandatanganan sareng dikirim ka titik sanés pikeun validasi
02:08 - skrip demo server #3, anu ngirim 1 juta transaksi dina 30 detik, réngsé damel
02:14 - blok #85 (f21) disahkeun sareng dikirim ka ranté akar
02:19 — blok #85 (65e) ditandatanganan sareng dikirim ka titik sanés pikeun validasi
02:22 - 1 juta transaksi diciptakeun sareng ngirim pikeun ngirim titik #2 dimimitian
02:27 - blok # 85 (65e) disahkeun tur dikirim ka ranté root
02:29 - ngalebetkeun titik #2 nyandak 111855 transaksi ti kolam renang na formulir blok #85 (256).
02:36 — blok #85 (256) ditandatanganan sareng dikirim ka titik sanés pikeun validasi
02:36 - skrip demo server #1, anu ngirim 1 juta transaksi dina 42.5 detik, réngsé damel
02:38 - blok #85 (256) disahkeun sareng dikirim ka ranté akar
03:08 — skrip server #2 réngsé damel, anu ngirim 1 juta transaksi dina 47 detik
03:38 - sadaya titik nampi inpormasi tina ranté akar anu meungpeuk # 85 (f21), # 86 (65e), # 87 (256) ditambahkeun sareng mimiti nerapkeun transaksi 330k, 250k, 111855
03:49 - kolam renang ieu diberesihan dina 330k, 250k, 111855 transaksi nu ditambahkeun kana blok #85 (f21), #86(65e), #87(256)
03:59 - ngalebetkeun node #1 nyandak 888145 transaksi ti kolam renang sareng ngabentuk blok #88 (214), ngalebetkeun node #2 nyandak 750k transaksi ti kolam renang sareng ngabentuk blok #88 (50a), ngalebetkeun node #3 nyandak 670k transaksi ti kolam renang sareng bentuk blok #88 (d3b)
04:44 — blok #88 (d3b) ditandatanganan sareng dikirim ka titik sanés pikeun validasi
04:58 — blok #88 (214) ditandatanganan sareng dikirim ka titik sanés pikeun validasi
05:11 — blok #88 (50a) ditandatanganan sareng dikirim ka titik sanés pikeun validasi
05:11 — blok #85 (d3b) disahkeun sareng dikirim ka ranté akar
05:36 - blok #85 (214) disahkeun sareng dikirim ka ranté akar
05:43 - sadaya titik nampi inpormasi tina ranté akar anu meungpeuk #88 (d3b), #89(214) parantos ditambihan sareng mimiti nerapkeun 670k, 750k transaksi
06:50 - kusabab gagal komunikasi, blok #85 (50a) henteu disahkeun
06:55 — ngalebetkeun node #2 nyandak 888145 transaksi ti kolam renang sareng ngabentuk blok #90 (50a)
08:14 — blok #90 (50a) ditandatanganan sareng dikirim ka titik sanés pikeun validasi
09:04 - blok #90 (50a) disahkeun sareng dikirim ka ranté akar
11:23 - sadaya titik nampi inpormasi tina ranté akar anu meungpeuk # 90 (50a) ditambahkeun, sareng ngawitan nerapkeun 888145 transaksi. Dina waktos anu sami, server #3 parantos nerapkeun transaksi ti blok #88 (d3b), #89(214)
12:11 - kabéh pools kosong
13:41 - sadaya titik server #3 ngandung 3 juta transaksi sareng token
14:35 - sadaya titik server #1 ngandung 3 juta transaksi sareng token
19:24 - sadaya titik server #2 ngandung 3 juta transaksi sareng token

Halangan

Nalika ngembangkeun Plasma Cash, urang mendakan masalah-masalah ieu, anu laun-laun direngsekeun sareng direngsekeun:

1. Konflik dina interaksi rupa-rupa fungsi sistem. Contona, fungsi nambahkeun transaksi ka kolam renang nu diblokir karya ngirimkeun sarta validating blok, sarta sabalikna, nu ngarah ka serelek di speed.

2. Henteu écés langsung kumaha cara ngirim sajumlah ageung transaksi bari ngaminimalkeun biaya transfer data.

3. Teu jelas kumaha sareng dimana nyimpen data pikeun ngahontal hasil anu luhur.

4. Teu jelas kumaha ngatur jaringan antara titik, sabab ukuran blok kalayan 1 juta transaksi nyandak sakitar 100 MB.

5. Gawé dina mode single-threaded megatkeun sambungan antara titik nalika itungan lila lumangsung (contona, ngawangun tangkal Merkle jeung ngitung Hash na).

Kumaha urang nungkulan sagala ieu?

Versi munggaran tina Plasma Cash node mangrupikeun gabungan anu tiasa ngalakukeun sadayana dina waktos anu sami: nampi transaksi, ngalebetkeun sareng validasi blok, sareng nyayogikeun API pikeun ngaksés data. Kusabab NodeJS asli single-threaded, fungsi itungan tangkal Merkle beurat diblokir fungsi tambah transaksi. Kami ningali dua pilihan pikeun ngarengsekeun masalah ieu:

1. Jalankeun sababaraha prosés NodeJS, anu masing-masing ngalaksanakeun fungsi khusus.

2. Paké worker_threads sarta mindahkeun palaksanaan bagian kode kana threads.

Hasilna, kami nganggo dua pilihan dina waktos anu sami: kami sacara logis ngabagi hiji titik kana 3 bagian anu tiasa dianggo nyalira, tapi dina waktos anu sami.

1. Kaluman titik, nu narima transaksi kana kolam renang jeung nyieun blok.

2. Hiji titik validasi nu mariksa validitas titik.

3. API titik - nyadiakeun API pikeun ngakses data.

Dina hal ieu, anjeun bisa nyambung ka unggal titik ngaliwatan stop kontak unix maké cli.

Urang mindahkeun operasi beurat, kayaning ngitung tangkal Merkle, kana thread misah.

Ku kituna, kami geus ngahontal operasi normal sadaya fungsi Plasma Cash sakaligus tur tanpa gagal.

Sakali sistem éta fungsional, urang mimiti nguji speed na, hanjakalna, nampi hasil unsatisfactory: 5 transaksi per detik sarta nepi ka 000 transaksi per blok. Kuring kungsi angka kaluar naon ieu dilaksanakeun leres.

Pikeun mimitian, urang mimiti nguji mékanisme komunikasi sareng Plasma Cash pikeun mendakan kamampuan puncak sistem. Kami nyerat sateuacana yén titik Plasma Cash nyayogikeun antarmuka soket unix. Mimitina éta dumasar kana téks. objék json dikirim ngagunakeun `JSON.parse()` jeung `JSON.stringify()`.

```json
{
  "action": "sendTransaction",
  "payload":{
    "prevHash": "0x8a88cc4217745fd0b4eb161f6923235da10593be66b841d47da86b9cd95d93e0",
    "prevBlock": 41,
    "tokenId": "57570139642005649136210751546585740989890521125187435281313126554130572876445",
    "newOwner": "0x200eabe5b26e547446ae5821622892291632d4f4",
    "type": "pay",
    "data": "",
    "signature": "0xd1107d0c6df15e01e168e631a386363c72206cb75b233f8f3cf883134854967e1cd9b3306cc5c0ce58f0a7397ae9b2487501b56695fe3a3c90ec0f61c7ea4a721c"
  }
}
```

Kami ngukur laju mindahkeun objék sapertos kitu sareng mendakan ~ 130k per detik. Urang diusahakeun ngaganti fungsi baku pikeun gawé bareng json, tapi kinerja teu ningkat. Mesin V8 kedah dioptimalkeun saé pikeun operasi ieu.

Kami damel sareng transaksi, token, sareng blok ngaliwatan kelas. Nalika nyiptakeun kelas sapertos kitu, pagelaran turun 2 kali, anu nunjukkeun yén OOP henteu cocog pikeun urang. Kuring kungsi nulis balik sagalana kana pendekatan murni hanca.

Ngarékam dina pangkalan data

Mimitina, Redis dipilih pikeun neundeun data salaku salah sahiji solusi anu paling produktif anu nyugemakeun sarat urang: neundeun konci-nilai, damel sareng tabel hash, set. Kami ngaluncurkeun redis-benchmark sareng ngagaduhan ~ 80k operasi per detik dina 1 mode pipelining.

Pikeun pagelaran anu luhur, kami nyetél Redis langkung saé:

  • Sambungan stop kontak unix parantos didamel.
  • Urang ditumpurkeun nyimpen kaayaan ka disk (pikeun reliabiliti, anjeun tiasa nyetél replica sarta simpen ka disk dina Redis misah).

Di Redis, kolam renang mangrupikeun méja hash sabab urang kedah tiasa nyandak sadaya transaksi dina hiji pamundut sareng ngahapus transaksi hiji-hiji. Kami nyobian nganggo daptar biasa, tapi langkung laun nalika ngabongkar sadaya daptar.

Nalika nganggo NodeJS standar, perpustakaan Redis ngahontal prestasi 18k transaksi per detik. Laju turun 9 kali.

Kusabab patokan nunjukkeun kami kamungkinan jelas 5 kali langkung ageung, kami mimiti ngaoptimalkeun. Urang ngarobah perpustakaan kana ioredis sarta ngagaduhan kinerja 25k per detik. Kami nambihan transaksi hiji-hiji nganggo paréntah `hset`. Janten kami ngahasilkeun seueur patarosan di Redis. Ide timbul pikeun ngagabungkeun transaksi kana bets sareng ngirimkeunana nganggo hiji paréntah `hmset`. Hasilna nyaéta 32k per detik.

Kanggo sababaraha alesan, anu bakal dijelaskeun di handap, urang damel sareng data nganggo `Buffer` sareng, sakumaha tétéla, upami anjeun ngarobih kana téks (`buffer.toString('hex')`) sateuacan nyerat, anjeun tiasa nampi tambahan. kinerja. Ku kituna, laju ngaronjat nepi ka 35k per detik. Di momen, urang mutuskeun pikeun ngagantungkeun optimasi salajengna.

Urang kedah ngalih ka protokol binér sabab:

1. Sistem sering ngitung hashes, tanda tangan, sareng sajabana, sareng pikeun ieu peryogi data dina `Buffer.

2. Nalika dikirim antara jasa, data binér beuratna kirang ti téks. Salaku conto, nalika ngirim blok kalayan 1 juta transaksi, data dina téks tiasa nyandak langkung ti 300 megabyte.

3. Terus ngarobah data mangaruhan kinerja.

Ku alatan éta, urang nyandak salaku dasar protokol binér urang sorangan pikeun nyimpen jeung ngirimkeun data, dimekarkeun dina dasar perpustakaan `binér-data` éndah.

Hasilna, urang ngagaduhan struktur data ieu:

- Transaksi

  ```json
  {
    prevHash: BD.types.buffer(20),
    prevBlock: BD.types.uint24le,
    tokenId: BD.types.string(null),
    type: BD.types.uint8,
    newOwner: BD.types.buffer(20),
    dataLength: BD.types.uint24le,
    data: BD.types.buffer(({current}) => current.dataLength),
    signature: BD.types.buffer(65),
    hash: BD.types.buffer(32),
    blockNumber: BD.types.uint24le,
    timestamp: BD.types.uint48le,
  }
  ```

- Token

  ```json
  {
    id: BD.types.string(null),
    owner: BD.types.buffer(20),
    block: BD.types.uint24le,
    amount: BD.types.string(null),
  }
  ```

-Blok

  ```json
  {
    number: BD.types.uint24le,
    merkleRootHash: BD.types.buffer(32),
    signature: BD.types.buffer(65),
    countTx: BD.types.uint24le,
    transactions: BD.types.array(Transaction.Protocol, ({current}) => current.countTx),
    timestamp: BD.types.uint48le,
  }
  ```

Kalayan paréntah biasa `BD.encode(blok, Protokol).slice();` jeung `BD.decode(panyangga, Protokol)` urang ngarobah data kana `Buffer` pikeun nyimpen dina Redis atawa diteruskeun ka titik sejen tur retrieving data deui.

Urang ogé gaduh 2 protokol binér pikeun nransferkeun data antara jasa:

- Protokol pikeun interaksi sareng Plasma Node via stop kontak unix

  ```json
  {
    type: BD.types.uint8,
    messageId: BD.types.uint24le,
    error: BD.types.uint8,
    length: BD.types.uint24le,
    payload: BD.types.buffer(({node}) => node.length)
  }
  ```

dimana:

  • `tipe` — lampah anu bakal dilakukeun, contona, 1 — sendTransaction, 2 — getTransaction;
  • `payload` - data anu kedah dikirimkeun ka fungsi anu luyu;
  • `messageId` - id pesen supados résponna tiasa diidentifikasi.

- Protokol pikeun interaksi antara titik

  ```json
  {
    code: BD.types.uint8,
    versionProtocol: BD.types.uint24le,
    seq: BD.types.uint8,
    countChunk: BD.types.uint24le,
    chunkNumber: BD.types.uint24le,
    length: BD.types.uint24le,
    payload: BD.types.buffer(({node}) => node.length)
  }
  ```

dimana:

  • `kode` - kode pesen, contona 6 - PREPARE_NEW_BLOCK, 7 - BLOCK_VALID, 8 - BLOCK_COMMIT;
  • `versionProtocol` - versi protokol, saprak titik kalawan versi béda bisa diangkat dina jaringan sarta aranjeunna tiasa dianggo béda;
  • `seq` - identifier pesen;
  • `countChunk` и `CunkNumber` diperlukeun pikeun ngabagi pesen badag;
  • `panjang` и `payload` panjang jeung data sorangan.

Kusabab kami tos ngetik data, sistem ahirna langkung gancang tibatan perpustakaan `rlp` Ethereum. Hanjakalna, urang henteu acan tiasa nampik éta, sabab kedah ngabéréskeun kontrak pinter, anu urang badé laksanakeun di hareup.

Lamun urang junun ngahontal speed 35 000 transaksi per detik, urang ogé kudu ngolah aranjeunna dina waktos optimal. Kusabab perkiraan waktos formasi blok butuh 30 detik, urang kedah kalebet kana blok 1 000 000 transaksi, nu hartina ngirim leuwih 100 MB data.

Mimitina, kami nganggo perpustakaan `ethereumjs-devp2p` pikeun komunikasi antara titik, tapi éta henteu tiasa nanganan seueur data. Hasilna, kami nganggo perpustakaan `ws` sareng ngonpigurasikeun ngirim data binér via websocket. Tangtosna, urang ogé mendakan masalah nalika ngirim pakét data ageung, tapi kami ngabagi kana sakumpulan sareng ayeuna masalah ieu parantos musna.

Ogé ngabentuk tangkal Merkle jeung ngitung Hash nu 1 000 000 transaksi merlukeun ngeunaan 10 detik itungan kontinyu. Salila ieu, sambungan sareng sadaya titik tiasa putus. Ieu mutuskeun pikeun mindahkeun itungan ieu ka thread misah.

conclusions:

Kanyataanna, papanggihan urang henteu anyar, tapi pikeun sababaraha alesan loba ahli poho ngeunaan aranjeunna nalika ngembangkeun.

  • Ngagunakeun Pemrograman Fungsional tinimbang Pemrograman Berorientasi Obyék ningkatkeun produktivitas.
  • Monolith langkung parah tibatan arsitektur jasa pikeun sistem NodeJS anu produktif.
  • Ngagunakeun `worker_threads` pikeun komputasi beurat ngaronjatkeun responsif sistem, utamana lamun kaayaan operasi i/o.
  • stop kontak unix leuwih stabil sarta leuwih gancang ti requests http.
  • Lamun perlu gancang nransper data badag ngaliwatan jaringan, eta leuwih hade migunakeun websockets tur ngirim data binér, dibagi kana sakumpulan, nu bisa diteruskeun lamun maranéhna teu datang, lajeng digabungkeun kana hiji pesen.

Urang ngajak anjeun nganjang GitHub proyék: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Artikel ieu co-ditulis ku Alexander Nashivan, pamekar senior Solusi palinter Nyarita.

sumber: www.habr.com

Tambahkeun komentar