Test Public: Una Soluzione per a Privacy è Scalabilità in Ethereu

Blockchain hè una tecnulugia innovativa chì prumetti di migliurà parechji spazii di a vita umana. Trasferisce i prucessi reali è i prudutti in u spaziu digitale, assicura a rapidità è a fiducia di e transazzione finanziaria, riduce u so costu, è ancu permette di creà applicazioni DAPP muderne cù cuntratti intelligenti in rete decentralizata.

Dati i numerosi benefici è e diverse applicazioni di blockchain, pò parenu surprisante chì sta tecnulugia promettente ùn hà ancu fattu a so strada in ogni industria. U prublema hè chì i blockchains decentralizati muderni mancanu di scalabilità. Ethereu processa circa 20 transazzione per seconda, chì ùn hè micca abbastanza per risponde à i bisogni di l'imprese dinamichi d'oghje. À u listessu tempu, l'imprese chì utilizanu a tecnulugia di blockchain ùn anu esitatu à abbandunà Ethereu per via di u so altu gradu di prutezzione da i pirate è i fallimenti di a rete.

Per assicurà a decentralizazione, a sicurità è a scalabilità in u blockchain, risolve cusì u Trilemma di Scalabilità, a squadra di sviluppu. Opportunità criatu Plasma Cash, una catena subsidiaria custituita da un cuntrattu intelligente è una reta privata basata nantu à Node.js, chì trasferisce periodicamente u so statu à a catena radicali (Ethereu).

Test Public: Una Soluzione per a Privacy è Scalabilità in Ethereu

I prucessi chjave in Plasma Cash

1. L'utilizatore chjama a funzione di cuntrattu intelligente "depositu", passendu in questu a quantità di ETH chì vole dipositu in u token Plasma Cash. A funzione smart contract crea un token è genera un avvenimentu nantu à questu.

2. I nodi di Plasma Cash abbonati à l'avvenimenti di cuntrattu intelligenti ricevenu un avvenimentu per creà un accontu è aghjunghje una transazzione per creà un token à a piscina.

3. Periodicamente, i nodi Plasma Cash spiciali piglianu tutte e transazzione da a piscina (finu à 1 million) è formanu un bloccu da elli, calculate l'arbulu Merkle è, per quessa, l'hash. Stu bloccu hè mandatu à altri nodi per a verificazione. I nodi verificanu se l'hash Merkle hè validu è se e transazzione sò valide (per esempiu, se u mittente di u token hè u so pruprietariu). Dopu avè verificatu u bloccu, u node chjama a funzione "submitBlock" di u cuntrattu intelligente, chì salva u numeru di bloccu è Merkle hash à a catena di u bordu. U cuntrattu intelligente genera un avvenimentu chì indica l'aghjuntu successu di un bloccu. E transacciones sò eliminate da a piscina.

4. I nodi chì ricevenu l'avvenimentu di sottumissione di u bloccu cumincianu à applicà e transazzione chì sò stati aghjuntu à u bloccu.

5. À un certu puntu, u pruprietariu (o micca u pruprietariu) di u token vole ritirallu da Plasma Cash. Per fà questu, chjama a funzione `startExit`, passendu in questu infurmazione nantu à l'ultimi transacciones 2 nantu à u token, chì cunfirmanu chì ellu hè u pruprietariu di u token. U cuntrattu intelligente, utilizendu l'hash Merkle, verifica a prisenza di e transazzione in i blocchi è manda u token per a retirazzione, chì succede in duie simane.

6. Se l'operazione di retirazzione di u token hè accadutu cù violazioni (u token hè stata spesa dopu à a prucedura di retirazzione principiata o u token era digià di qualcunu altru prima di a retirazzione), u pruprietariu di u token pò refute a retirazzione in duie settimane.

Test Public: Una Soluzione per a Privacy è Scalabilità in Ethereu

A privacy hè ottenuta in dui maneri

1. A catena radicali ùn sapi nunda di e transazzioni chì sò generati è trasmessi in a catena di u zitellu. L'infurmazione nantu à quale hà depositatu è ritiratu ETH da Plasma Cash resta publica.

2. A catena di u zitellu permette transazzione anonima cù zk-SNARKs.

Pila di tecnulugia

  • NodeJS
  • Redis
  • Eteriu
  • Sild

Prucessioni

Durante u sviluppu di Plasma Cash, avemu pruvatu a velocità di u sistema è ottene i seguenti risultati:

  • sin'à 35 000 transazzioni per seconda sò aghjuntu à a piscina;
  • sin'à 1 transazzioni ponu esse guardatu in un bloccu.

I testi sò stati fatti nantu à i seguenti 3 servitori:

1. Intel Core i7-6700 Quad-Core Skylake incl. NVMe SSD - 512 GB, 64 GB DDR4 RAM
3 validazione di i nodi Plasma Cash sò stati risuscitati.

2. AMD Ryzen 7 1700X Octa-Core "Summit Ridge" (Zen), SATA SSD - 500 GB, 64 GB DDR4 RAM
U node Ropsten testnet ETH hè statu risuscitatu.
3 validazione di i nodi Plasma Cash sò stati risuscitati.

3. Intel Core i9-9900K Octa-Core incl. NVMe SSD - 1 TB, 64 GB DDR4 RAM
1 U nodu di sottumissione di Plasma Cash hè statu risuscitatu.
3 validazione di i nodi Plasma Cash sò stati risuscitati.
Una prova hè stata lanciata per aghjunghje transazzione à a reta di Plasma Cash.

Total: 10 nodi Plasma Cash in una reta privata.

Prova 1

Ci hè un limitu di 1 milione di transazzione per bloccu. Per quessa, 1 milione di transazzione cadenu in 2 blocchi (poi u sistema riesce à piglià parte di e transazzione è sottumettenu mentre sò mandati).


Statu iniziale: ultimu bloccu #7; 1 milione di transazzioni è tokens sò almacenati in a basa di dati.

00:00 - principiu di u script di generazione di transazzione
01: 37 - 1 milione di transazzioni sò stati creati è l'inviu à u node cuminciò
01:46 - u nodu di sottumissione hà pigliatu 240k transazzioni da a piscina è u bloccu di forme #8. Avemu vistu ancu chì e transazzioni 320k sò aghjuntu à a piscina in 10 seconde
01:58 - u bloccu #8 hè firmatu è mandatu per a validazione
02:03 - u bloccu #8 hè validatu è a funzione "submitBlock" di u cuntrattu intelligente hè chjamata cù l'hash Merkle è u numeru di bloccu
02:10 - u script demo hà finitu di travaglià, chì hà mandatu 1 milione di transazzione in 32 seconde
02: 33 - i nodi cuminciaru à riceve infurmazioni chì u bloccu #8 hè statu aghjuntu à a catena radicali, è cuminciò à fà transazzioni 240k
02: 40 - 240k transazzioni sò state eliminate da a piscina, chì sò digià in u bloccu #8
02:56 - u nodu di sottumissione hà pigliatu e transazzione 760k restante da a piscina è hà cuminciatu à calculà l'hash Merkle è u bloccu di firma #9
03:20 - tutti i nodi cuntenenu 1 milione di transazzioni 240k è tokens
03:35 - u bloccu #9 hè firmatu è mandatu per a validazione à altri nodi
03:41 - errore di rete hè accadutu
04:40 — aspittendu a validazione di u bloccu #9 hè scadutu
04:54 - u nodu di sottumissione hà pigliatu e transazzione 760k restante da a piscina è hà cuminciatu à calculà l'hash Merkle è u bloccu di firma #9
05:32 - u bloccu #9 hè firmatu è mandatu per a validazione à altri nodi
05:53 - u bloccu #9 hè validatu è mandatu à a catena radicali
06:17 - i nodi cuminciaru à riceve infurmazioni chì u bloccu #9 hè statu aghjuntu à a catena radicali è cuminciaru à fà transazzione 760k
06:47 - a piscina hà sbulicatu e transazzione chì sò in u bloccu #9
09:06 - tutti i nodi cuntenenu 2 milioni di transazzione è tokens

Prova 2

Ci hè un limitu di 350k per bloccu. In u risultatu, avemu 3 blocchi.


Statu iniziale: ultimu bloccu #9; 2 milioni di transazzione è tokens sò almacenati in a basa di dati

00:00 - u script di generazione di transazzione hè digià lanciatu
00: 44 - 1 milione di transazzioni sò stati creati è l'inviu à u node cuminciò
00:56 - u nodu di sottumissione hà pigliatu 320k transazzioni da a piscina è u bloccu di forme #10. Avemu vistu ancu chì e transazzioni 320k sò aghjuntu à a piscina in 10 seconde
01:12 - u bloccu #10 hè firmatu è mandatu à altri nodi per a validazione
01:18 - u script demo hà finitu di travaglià, chì hà mandatu 1 milione di transazzione in 34 seconde
01:20 - u bloccu #10 hè validatu è mandatu à a catena radicali
01: 51 - tutti i nodi anu ricevutu infurmazioni da a catena radicali chì u bloccu #10 hè statu aghjuntu è cumincianu à applicà transazzioni 320k
02:01 - a piscina hè stata liberata per 320k transazzioni chì sò state aghjunte à u bloccu #10
02:15 - u nodu di sottumissione hà pigliatu 350k transazzioni da a piscina è u bloccu di forme #11
02:34 - u bloccu #11 hè firmatu è mandatu à altri nodi per a validazione
02:51 - u bloccu #11 hè validatu è mandatu à a catena radicali
02: 55 - l'ultimu node hà cumpletu transazzione da u bloccu #10
10:59 - a transazzione cù a sottumissione di u bloccu #9 hà pigliatu assai tempu in a catena radicali, ma hè stata cumpletata è tutti i nodi anu ricivutu infurmazioni nantu à questu è cuminciaru à fà transazzione 350k.
11:05 - a piscina hè stata liberata per 320k transazzioni chì sò state aghjunte à u bloccu #11
12:10 - tutti i nodi cuntenenu 1 milione di transazzioni 670k è tokens
12:17 - u nodu di sottumissione hà pigliatu 330k transazzioni da a piscina è u bloccu di forme #12
12:32 - u bloccu #12 hè firmatu è mandatu à altri nodi per a validazione
12:39 - u bloccu #12 hè validatu è mandatu à a catena radicali
13:44 - tutti i nodi anu ricevutu infurmazioni da a catena radicali chì u bloccu #12 hè statu aghjuntu è cumincianu à applicà transazzioni 330k
14:50 - tutti i nodi cuntenenu 2 milioni di transazzione è tokens

Prova 3

In u primu è u sicondu servitore, un nodu di validazione hè statu rimpiazzatu da un nodu di sottumissione.


Statu iniziale: ultimu bloccu #84; 0 transazzioni è tokens salvati in a basa di dati

00:00 - 3 scripts sò stati lanciati chì generanu è mandanu 1 milione di transazzione ognunu
01: 38 - 1 milione di transazzione sò stati creati è l'inviu per mandà u nodu #3 hà iniziatu
01:50 - sottumette u nodu #3 hà pigliatu 330k transazzioni da a piscina è u bloccu di forme #85 (f21). Avemu vistu ancu chì e transazzioni 350k sò aghjuntu à a piscina in 10 seconde
01: 53 - 1 milione di transazzione sò stati creati è l'inviu per mandà u nodu #1 hà iniziatu
01:50 - sottumette u nodu #3 hà pigliatu 330k transazzioni da a piscina è u bloccu di forme #85 (f21). Avemu vistu ancu chì e transazzioni 350k sò aghjuntu à a piscina in 10 seconde
02: 01 - sottumette u nodu # 1 hà pigliatu 250k transazzioni da a piscina è u bloccu di forme # 85 (65e)
02:06 - u bloccu #85 (f21) hè firmatu è mandatu à altri nodi per a validazione
02:08 - script demo di u servitore #3, chì hà mandatu 1 milione di transazzione in 30 seconde, hà finitu di travaglià
02:14 - u bloccu #85 (f21) hè validatu è mandatu à a catena radicali
02:19 - u bloccu #85 (65e) hè firmatu è mandatu à altri nodi per a validazione
02: 22 - 1 milione di transazzione sò stati creati è l'inviu per mandà u nodu #2 hà iniziatu
02:27 - bloccu #85 (65e) validatu è mandatu à a catena radicali
02:29 - sottumette u nodu #2 hà pigliatu 111855 transazzioni da a piscina è u bloccu di forme #85 (256).
02:36 - u bloccu #85 (256) hè firmatu è mandatu à altri nodi per a validazione
02:36 - script demo di u servitore #1, chì hà mandatu 1 milione di transazzione in 42.5 seconde, hà finitu di travaglià
02:38 - u bloccu #85 (256) hè validatu è mandatu à a catena radicali
03:08 - u script di u servitore #2 hà finitu di travaglià, chì hà mandatu 1 milione di transazzione in 47 seconde
03: 38 - tutti i nodi anu ricivutu infurmazioni da a catena radicali chì i blocchi # 85 (f21), # 86 (65e), # 87 (256) sò stati aghjuntu è cuminciaru à applicà 330k, 250k, 111855 transazzioni
03:49 - a piscina hè stata sbulicata à 330k, 250k, 111855 transazzioni chì sò stati aghjuntu à i blocchi #85 (f21), #86(65e), #87(256)
03:59 - sottumette u nodu #1 hà pigliatu 888145 transazzioni da u bloccu di a piscina è u bloccu di forme #88 (214), u nodu di sottumissione n. u bloccu di piscina è forme # 2 (d750b)
04:44 - u bloccu #88 (d3b) hè firmatu è mandatu à altri nodi per a validazione
04:58 - u bloccu #88 (214) hè firmatu è mandatu à altri nodi per a validazione
05:11 - u bloccu #88 (50a) hè firmatu è mandatu à altri nodi per a validazione
05:11 - u bloccu #85 (d3b) hè validatu è mandatu à a catena radicali
05:36 - u bloccu #85 (214) hè validatu è mandatu à a catena radicali
05: 43 - tutti i nodi anu ricivutu infurmazioni da a catena radicali chì i blocchi # 88 (d3b), # 89 (214) sò stati aghjuntu è cumincianu à applicà 670k, 750k transazzioni
06:50 - per via di un fallimentu di cumunicazione, u bloccu #85 (50a) ùn hè statu validatu
06:55 - sottumette u nodu #2 hà pigliatu 888145 transazzioni da a piscina è u bloccu di forme #90 (50a)
08:14 - u bloccu #90 (50a) hè firmatu è mandatu à altri nodi per a validazione
09:04 - u bloccu #90 (50a) hè validatu è mandatu à a catena radicali
11: 23 - tutti i nodi ricivutu infurmazioni da a catena radicali chì u bloccu #90 (50a) hè statu aghjuntu, è cumincianu à applicà 888145 transazzioni. À u listessu tempu, u servitore #3 hà digià applicatu transazzione da i blocchi #88 (d3b), #89(214)
12:11 - tutte e piscine sò viote
13:41 - tutti i nodi di u servitore #3 cuntenenu 3 milioni di transazzione è tokens
14:35 - tutti i nodi di u servitore #1 cuntenenu 3 milioni di transazzione è tokens
19:24 - tutti i nodi di u servitore #2 cuntenenu 3 milioni di transazzione è tokens

Ostaculi

Durante u sviluppu di Plasma Cash, avemu scontru i seguenti prublemi, chì avemu risoltu gradualmente è risolvemu:

1. Cunflittu in l'interazzione di diverse funzioni di u sistema. Per esempiu, a funzione di aghjunghje transacciones à a piscina bluccatu u travagliu di sottumette è di validazione di blocchi, è vice versa, chì hà purtatu à una calata di velocità.

2. Ùn era micca chjaru immediatamente cumu mandà un gran numaru di transazzione mentre minimizeghja i costi di trasferimentu di dati.

3. Ùn era micca chjaru cumu è induve almacenà e dati per ottene risultati elevati.

4. Ùn era micca chjaru cumu urganizà una reta trà i nodi, postu chì a dimensione di un bloccu cù 1 milione di transazzione occupa circa 100 MB.

5. U travagliu in u modu di filu unicu rompe a cunnessione trà i nodi quandu i calculi longu accadenu (per esempiu, custruisce un arbre Merkle è calculà u so hash).

Cumu avemu trattatu tuttu questu?

A prima versione di u node Plasma Cash era un tipu di combinazione chì puderia fà tuttu à u stessu tempu: accettà transazzione, sottumette è validate blocchi, è furnisce una API per accede à e dati. Siccomu NodeJS hè nativu unicu filatu, a funzione di calculu di l'arburu Merkle pesante hà bluccatu a funzione di transazzione aghjunghje. Avemu vistu duie opzioni per risolve stu prublema:

1. Lanciate parechji prucessi NodeJS, ognuna di e quali svolge funzioni specifiche.

2. Aduprate worker_threads è move l'esekzione di parte di u codice in fili.

In u risultatu, avemu usatu e duie opzioni à u stessu tempu: avemu logicamente divisu un node in 3 parti chì ponu travaglià separatamente, ma à u stessu tempu sincronamente.

1. Node di sottumissione, chì accetta transazzione in u pool è crea blocchi.

2. Un nodu di validazione chì verifica a validità di i nodi.

3. Node API - furnisce una API per accede à i dati.

In questu casu, pudete cunnette à ogni node via un socket Unix cù cli.

Avemu spustatu l'operazioni pesanti, cum'è u calculu di l'arburu Merkle, in un filu separatu.

Cusì, avemu ottinutu u funziunamentu normale di tutte e funzioni Plasma Cash simultaneamente è senza fallimenti.

Quandu u sistema era funziunale, avemu cuminciatu à pruvà a veloce è, sfurtunatamenti, hà ricevutu risultati insatisfactori: 5 000 transazzione per seconda è finu à 50 000 transazzione per bloccu. Aviu avutu à capisce ciò chì era implementatu incorrectamente.

Per principià, avemu principiatu à pruvà u mecanismu di cumunicazione cù Plasma Cash per scopre a capacità massima di u sistema. Avemu scrittu prima chì u node Plasma Cash furnisce una interfaccia di socket Unix. Inizialmente era basatu in testu. L'oggetti json sò stati mandati cù `JSON.parse()` è `JSON.stringify()`.

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

Avemu misuratu a velocità di trasferimentu di tali oggetti è truvamu ~ 130k per seconda. Avemu pruvatu à rimpiazzà e funzioni standard per travaglià cù json, ma u rendiment ùn hà micca migliuratu. U mutore V8 deve esse ottimizatu bè per queste operazioni.

Avemu travagliatu cù transazzioni, tokens, è blocchi attraversu classi. Quandu creanu tali classi, u rendiment hè cascatu da 2 volte, chì indica chì OOP ùn hè micca adattatu per noi. Aviu avutu à riscrive tuttu à un approcciu puramente funziunale.

Registrazione in a basa di dati

Inizialmente, Redis hè statu sceltu per l'almacenamiento di dati cum'è una di e soluzioni più produttive chì satisface i nostri bisogni: almacenamentu chjave-valore, travagliendu cù tavule hash, set. Avemu lanciatu redis-benchmark è uttene ~ 80k operazioni per seconda in 1 modu di pipelining.

Per alte prestazioni, avemu sintonizatu Redis più finemente:

  • Una cunnessione socket Unix hè stata stabilita.
  • Avemu disattivatu a salvezza di u statu à u discu (per affidabilità, pudete stabilisce una replica è salvà à u discu in un Redis separatu).

In Redis, una piscina hè una tavola di hash perchè avemu bisognu di pudè ritruvà tutte e transazzione in una dumanda è sguassate e transazzione una per una. Avemu pruvatu à utilizà una lista regulare, ma hè più lenta quandu scaricate a lista sana.

Quandu si usa NodeJS standard, e librerie Redis anu ottinutu un rendimentu di 18k transazzioni per seconda. A velocità hè cascata 9 volte.

Siccomu u benchmark ci hà dimustratu chì e pussibulità eranu chjaramente 5 volte più grande, avemu cuminciatu à ottimisà. Avemu cambiatu a biblioteca in ioredis è ottene un rendimentu di 25k per seconda. Avemu aghjustatu transazzione una per una usendu u cumandimu `hset`. Dunque avemu generatu assai dumande in Redis. L'idea hè nata per cumminà transazzione in batch è mandà li cù un cumandamentu "hmset". U risultatu hè 32k per seconda.

Per parechje ragioni, chì descriveremu quì sottu, travagliemu cù dati cù `Buffer` è, cum'è risulta, se u cunvertisce in testu (`buffer.toString('hex')`) prima di scrive, pudete uttene supplementu. prestazione. Cusì, a vitezza hè stata aumentata à 35k per seconda. À u mumentu, avemu decisu di suspende più ottimisazione.

Avemu avutu à cambià à un protocolu binariu perchè:

1. U sistema spessu calcula hashes, signatures, etc., è per questu hè bisognu di dati in u `Buffer.

2. Quandu mandatu trà servizii, dati binari pesa menu di testu. Per esempiu, quandu invià un bloccu cù 1 milione di transazzione, i dati in u testu ponu piglià più di 300 megabytes.

3. A trasfurmazioni constantemente di dati influenza u rendiment.

Per quessa, avemu pigliatu cum'è una basa u nostru propiu protokollu binariu per almacenà è trasmette dati, sviluppatu nantu à a basa di a maravigliosa biblioteca `binary-data`.

In u risultatu, avemu avutu i seguenti strutture di dati:

- Transazzione

  ```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),
  }
  ```

- Bloccu

  ```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,
  }
  ```

Cù i cumandamenti abituali `BD.encode (block, Protocol).slice ();` è `BD.decode (buffer, Protocol)` cunvertemu i dati in `Buffer` per salvà in Redis o invià à un altru node è ricuperà u dati torna.

Avemu ancu 2 protokolli binari per u trasferimentu di dati trà servizii:

- Protokollu per l'interazzione cù Plasma Node via socket 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)
  }
  ```

induve:

  • 'tipu' - l'azzione per esse realizatu, per esempiu, 1 - sendTransaction, 2 - getTransaction;
  • 'carga utile' - dati chì deve esse passatu à a funzione apprupriata;
  • `messageId` - id missaghju in modu chì a risposta pò esse identificata.

- Protocolu per l'interazzione trà i nodi

  ```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)
  }
  ```

induve:

  • 'codice' - codice missaghju, per esempiu 6 - PREPARE_NEW_BLOCK, 7 - BLOCK_VALID, 8 - BLOCK_COMMIT;
  • `versionProtocol` - versione di protokollu, postu chì i nodi cù diverse versioni ponu esse elevati nantu à a reta è ponu travaglià in modu diversu;
  • 'seq' - identificatore di messagiu;
  • `countChunk` и "Numberu chunk". necessariu per sparte missaghji grossi;
  • 'lunghezza' и 'carga utile' lunghezza è i dati stessi.

Siccomu avemu pre-typed i dati, u sistema finali hè assai più veloce di a biblioteca `rlp` di Ethereu. Sfurtunatamente, ùn avemu ancu pussutu ricusà, postu chì hè necessariu di finalizà u cuntrattu intelligente, chì avemu pensatu à fà in u futuru.

Sè avemu riesciutu à ghjunghje à a vitezza 35 000 transazzione per seconda, avemu ancu bisognu di processà in u tempu ottimali. Siccomu u tempu apprussimativu di furmazione di bloccu dura 30 seconde, avemu bisognu di include in u bloccu 1 000 000 transazzione, chì significa mandà più 100 MB di dati.

Inizialmente, avemu usatu a libreria `ethereumjs-devp2p` per cumunicà trà i nodi, ma ùn pudia trattà tante dati. In u risultatu, avemu usatu a libreria `ws` è cunfigurate l'inviu di dati binari via websocket. Di sicuru, avemu ancu scontru prublemi quandu invià grandi pacchetti di dati, ma l'avemu divisu in pezzi è avà sti prublemi sò andati.

Formendu ancu un arbre Merkle è calculà l'hash 1 000 000 transazzione richiede circa 10 seconde di calculu cuntinuu. Duranti stu tempu, a cunnessione cù tutti i nodi riesce à rompe. Hè statu decisu di trasfurmà stu calculu à un filu separatu.

Conclusioni:

In fatti, i nostri scuperti ùn sò micca novi, ma per qualchì mutivu parechji sperti si scurdanu di elli quandu si sviluppanu.

  • Utilizà a Programmazione Funziunale invece di a Programmazione Orientata à l'Ughjettu migliurà a produtividade.
  • U monolitu hè peghju chè una architettura di serviziu per un sistema NodeJS produtivu.
  • L'usu di `worker_threads' per u calculu pesante migliurà a reattività di u sistema, soprattuttu quandu si tratta di operazioni i/o.
  • Unix socket hè più stabile è più veloce di e richieste http.
  • Sè avete bisognu di trasfiriri rapidamente grandi dati nantu à a reta, hè megliu aduprà websockets è mandà dati binari, divisu in pezzi, chì ponu esse trasmessi s'ellu ùn ghjunghjenu micca, è poi cumminati in un missaghju.

Vi invitemu à visità GitHub prughjettu: https://github.com/opporty-com/Plasma-Cash/tree/new-version

L'articulu hè statu co-scrittu da Alexander Nashivan, sviluppatore senior Clever Solution Inc.

Source: www.habr.com

Add a comment