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.
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.
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:
L'articulu hè statu co-scrittu da Alexander Nashivan, sviluppatore senior
Source: www.habr.com