Offentlig test: lösning för privatliv och skalbarhet i Ethereum

Blockchain — en innovativ teknologi som lovar att förbĂ€ttra mĂ„nga aspekter av mĂ€nniskors liv. Den flyttar verkliga processer och produkter till det digitala rummet, sĂ€kerstĂ€ller snabbhet och tillförlitlighet i finansiella transaktioner, sĂ€nker kostnaderna och möjliggör skapandet av moderna DAPP-applikationer med smarta kontrakt i decentraliserade nĂ€tverk.

Med tanke pÄ de mÄnga fördelarna och olika tillÀmpningar av blockchain kan det verka konstigt att denna lovande teknik Ànnu inte har trÀngt in i alla branscher. Problemet Àr att dagens decentraliserade blockchainlösningar saknar skalbarhet. Ethereum hanterar cirka 20 transaktioner per sekund, vilket Àr otillrÀckligt för att möta behoven hos en modern, dynamisk verksamhet. Samtidigt tvekar företag som anvÀnder blockchainteknik att överge Ethereum pÄ grund av dess höga sÀkerhet mot intrÄng och nÀtverksproblem.

För att sĂ€kerstĂ€lla decentralisering, sĂ€kerhet och skalbarhet i blockchain, och dĂ€rmed lösa Skalbarhetsparadoxen, har utvecklarteamet Opporty skapat Plasma Cash — en sidokedja bestĂ„ende av ett smart kontrakt och ett privat nĂ€tverk baserat pĂ„ Node.js, som periodiskt överför sitt tillstĂ„nd till huvudkedjan (Ethereum).

Offentlig test: lösning för privatliv och skalbarhet i Ethereum

Nyckelprocesser i Plasma Cash

1. AnvÀndaren anropar funktionen för det smarta kontraktet `deposit`, och överför det belopp i ETH som han vill placera i Plasma Cash-token. Den smarta kontraktfunktionen skapar token och genererar ett event om detta.

2. Plasma Cash-noder som Àr prenumererade pÄ hÀndelser frÄn det smarta kontraktet fÄr meddelandet om skapandet av en insÀttning och lÀgger till transaktionen om skapandet av token i poolen.

3. Periodiskt tar speciella Plasma Cash-noder alla transaktioner frÄn poolen (upp till 1 miljon) och bildar en block, berÀknar Merkle-trÀdet och dÀrmed hash. Denna block skickas till andra noder för verifiering. Noderna kontrollerar om Merkle-hashen Àr giltig och om transaktionerna Àr giltiga (t.ex. om avsÀndaren av token Àr dess Àgare). Efter verifiering av blocket anropar noden funktionen `submitBlock` i det smarta kontraktet, som sparar blockets nummer och Merkle-hash i huvudkedjan. Det smarta kontraktet genererar ett event om att blocket har lagts till framgÄngsrikt. Transaktionerna tas bort frÄn poolen.

4. Noder som har fÄtt en hÀndelse om blocksubmittering börjar tillÀmpa transaktioner som har lagts till i blocket.

5. Vid nÄgot tillfÀlle vill Àgaren (eller icke-Àgaren) av tokenen ta ut den frÄn Plasma Cash. För detta anropar han funktionen `startExit` och skickar information om de senaste 2 transaktionerna för tokenen, som bekrÀftar att han verkligen Àr Àgaren av tokenen. Smartkontraktet kontrollerar med hjÀlp av Merkle-hashen att transaktionerna finns i blocken och skickar tokenen för uttag, vilket kommer att ske om tvÄ veckor.

6. Om uttaget av tokenen skedde felaktigt (tokenen anvÀndes efter att uttagsförfarandet börjat eller tokenen redan tillhörde nÄgon annan före uttaget), kan tokenÀgarna bestrida uttaget inom tvÄ veckor.

Offentlig test: lösning för privatliv och skalbarhet i Ethereum

Integritet uppnÄs pÄ tvÄ sÀtt

1. Rotkedjan vet ingenting om transaktionerna som bildas och skickas inom underkedjan. Det förblir offentlig information om vem som satt in och tagit ut ETH till/frÄn Plasma Cash.

2. Underkedjan möjliggör anonyma transaktioner med hjÀlp av zk-SNARKs.

Teknikstack

  • NodeJS
  • Redis
  • Etherium
  • Soild

Testning

NÀr vi utvecklade Plasma Cash testade vi systemets hastighet och fick följande resultat:

  • upp till 35 000 transaktioner per sekund lĂ€ggs till i poolen;
  • upp till 1 000 000 transaktioner kan lagras i ett block.

Testerna genomfördes pÄ följande tre servrar:

1. Intel Core i7-6700 Quad-Core Skylake inkl. NVMe SSD – 512 GB, 64 GB DDR4 RAM
Tre validerande Plasma Cash-noder startades.

2. AMD Ryzen 7 1700X Octa-Core "Summit Ridge" (Zen), SATA SSD – 500 GB, 64 GB DDR4 RAM
En Ropsten testnet ETH-nod startades.
Tre validerande Plasma Cash-noder startades.

3. Intel Core i9-9900K Octa-Core inkl. NVMe SSD – 1 TB, 64 GB DDR4 RAM
En submit Plasma Cash-nod startades.
Tre validerande Plasma Cash-noder startades.
Ett test för att lÀgga till transaktioner i Plasma Cash-nÀtverket kördes.

Totalt: 10 Plasma Cash-noder i ett privat nÀtverk.

Test 1

Det finns en grÀns pÄ 1 miljon transaktioner per block. DÀrför hamnar 1 miljon transaktioner i 2 block (eftersom systemet hinner ta en del av transaktionerna och skicka dem innan de skickas).

Spela video

Ursprungligt tillstÄnd: sista blocket #7; 1 miljon transaktioner och tokenen Àr sparad i databasen.

00:00 — skriptet för att generera transaktioner startar
01:37 — 1 miljon transaktioner skapade och började skickas till noden
01:46 — submitnodet tog 240k transaktioner frĂ„n poolen och bildar block #8. Vi ser ocksĂ„ att 320k transaktioner lĂ€ggs till i poolen pĂ„ 10 sekunder.
01:58 — block #8 har signerats och skickats för validering.
02:03 — block #8 har validerats och funktionen `submitBlock` i smartkontraktet har kallats med Merklehash och blocknummer
02:10 — demoskrypten har slutat arbeta, som skickade 1 miljon transaktioner pĂ„ 32 sekunder
02:33 — noderna började fĂ„ information om att block #8 har lagts till i huvudkedjan och började utföra 240k transaktioner
02:40 — 240k transaktioner har tagits bort frĂ„n poolen, som redan finns i block #8
02:56 — submitnodet tog frĂ„n poolen de kvarstĂ„ende 760k transaktionerna och började berĂ€kna Merklehash och signera block #9
03:20 — alla noder innehĂ„ller 1 miljon 240k transaktioner och tokens
03:35 — block #9 har signerats och skickas för validering till andra noder
03:41 — ett nĂ€tverksfel intrĂ€ffade
04:40 — valideringen av block #9 stoppades pĂ„ grund av timeout
04:54 — submitnodet tog frĂ„n poolen de kvarstĂ„ende 760k transaktionerna och började berĂ€kna Merklehash och signera block #9
05:32 — block #9 har signerats och skickas för validering till andra noder
05:53 — block #9 har validerats och skickats till huvudkedjan
06:17 — noderna började fĂ„ information om att block #9 har lagts till i huvudkedjan och började utföra 760k transaktioner
06:47 — poolen har rensats frĂ„n transaktioner som finns i block #9
09:06 — alla noder innehĂ„ller 2 miljoner transaktioner och tokens

Test 2

Det finns en grÀns pÄ 350k per block. Vi har dÀrför 3 block.

Spela video

Ursprungligt tillstÄnd: senaste block #9; det finns 2 miljoner transaktioner och tokens sparade i databasen

00:00 — skriptet för transaktionsgenerering har redan startats
00:44 — 1 miljon transaktioner har skapats och sĂ€ndningen till noden har börjat
00:56 — submitnodet tog frĂ„n poolen 320k transaktioner och formar block #10. Vi ser ocksĂ„ att 320k transaktioner lĂ€ggs till poolen pĂ„ 10 sekunder
01:12 — block #10 har signerats och skickas till andra noder för validering
01:18 — demoskrypten har slutat arbeta, som skickade 1 miljon transaktioner pĂ„ 34 sekunder
01:20 — block #10 har validerats och skickats till huvudkedjan
01:51 — alla noder har fĂ„tt information frĂ„n huvudkedjan om att block #10 har lagts till och börjar applicera 320k transaktioner
02:01 — poolen har rensats pĂ„ 320k transaktioner, som har lagts till i block #10
02:15 — submitnodet tog frĂ„n poolen 350k transaktioner och formar block #11
02:34 — block #11 har signerats och skickas till andra noder för validering
02:51 — block #11 har validerats och skickats till huvudkedjan
02:55 — den sista noden har utfört transaktioner frĂ„n block #10
10:59 - mycket lÀnge högkvalitativa transaktioner med submission av block #9 utfördes i den centrala kedjan, men den blev slutförd och alla noder fick information om detta och började utföra 350k transaktioner.
11:05 - poolen rensades pÄ 320k transaktioner som lades till i block #11.
12:10 - alla noder innehÄller 1 miljon 670k transaktioner och tokens.
12:17 - submissionsnod tog 330k transaktioner frÄn poolen och formar block #12.
12:32 - block #12 har signerats och skickas till andra noder för validering.
12:39 - block #12 har validerats och skickats till den centrala kedjan.
13:44 - alla noder har fÄtt information frÄn den centrala kedjan om att block #12 har lagts till och börjar tillÀmpa 330k transaktioner.
14:50 - alla noder innehÄller 2 miljoner transaktioner och tokens.

Test 3

PÄ den första och andra servern har en validerande nod ersatts med en submissionsnod.

Spela video

Ursprungligt tillstÄnd: senaste block #84; 0 transaktioner och tokens sparades i databasen.

00:00 - Tre skript har startats som genererar och skickar 1 miljon transaktioner vardera.
01:38 - 1 miljon transaktioner har skapats och började skickas till submissionsnod #3.
01:50 - submissionsnod #3 tog 330k transaktioner frÄn poolen och formar block #85 (f21). Vi ser ocksÄ att 350k transaktioner tillkommer i poolen pÄ 10 sek.
01:53 - 1 miljon transaktioner har skapats och började skickas till submissionsnod #1.
01:50 - submissionsnod #3 tog 330k transaktioner frÄn poolen och formar block #85 (f21). Vi ser ocksÄ att 350k transaktioner tillkommer i poolen pÄ 10 sek.
02:01 - submissionsnod #1 tog 250k transaktioner frÄn poolen och formar block #85 (65e).
02:06 - block #85 (f21) har signerats och skickas till andra noder för validering.
02:08 - demo-skriptet för server #3 har avslutats och skickade 1 miljon transaktioner pÄ 30 sekunder.
02:14 - block #85 (f21) har validerats och skickats till den centrala kedjan.
02:19 - block #85 (65e) har signerats och skickas till andra noder för validering.
02:22 - 1 miljon transaktioner har skapats och börjar skickas till submissionsnod #2.
02:27 - block #85 (65e) har validerats och skickats till den centrala kedjan.
02:29 - submissionsnod #2 tog 111855 transaktioner frÄn poolen och formar block #85 (256).
02:36 - block #85 (256) har signerats och skickas till andra noder för validering.
02:36 - demo-skriptet för server #1 har avslutats och skickade 1 miljon transaktioner pÄ 42,5 sekunder.
02:38 - block #85 (256) har validerats och skickats till den centrala kedjan.
03:08 - demo-skriptet för server #2 har avslutats och skickade 1 miljon transaktioner pÄ 47 sekunder.
03:38 - alla noder har fÄtt information frÄn den centrala kedjan om att block #85 (f21), #86 (65e), #87 (256) har lagts till och börjar tillÀmpa 330k, 250k, 111855 transaktioner.
03:49 — poolen har rensats pĂ„ 330k, 250k, 111855 transaktioner som har lagts till i block #85 (f21), #86(65e), #87(256)
03:59 — submit node #1 tog 888145 transaktioner frĂ„n poolen och formar block #88 (214), submit node #2 tog 750k transaktioner frĂ„n poolen och formar block #88 (50a), submit node #3 tog 670k transaktioner frĂ„n poolen och formar block #88 (d3b)
04:44 — block #88 (d3b) har signerats och skickas till andra noder för validering
04:58 — block #88 (214) har signerats och skickas till andra noder för validering
05:11 — block #88 (50a) har signerats och skickas till andra noder för validering
05:11 — block #85 (d3b) har validerats och skickats till huvudkedjan
05:36 — block #85 (214) har validerats och skickats till huvudkedjan
05:43 — alla noder har fĂ„tt information frĂ„n huvudkedjan om att block #88 (d3b), #89(214) har lagts till och börjar applicera 670k, 750k transaktioner
06:50 — pĂ„ grund av förbindelseavbrott har block #85 (50a) inte validerats
06:55 — submit node #2 tog 888145 transaktioner frĂ„n pool och formar block #90 (50a)
08:14 — block #90 (50a) har signerats och skickas till andra noder för validering
09:04 — block #90 (50a) har validerats och skickats till huvudkedjan
11:23 — alla noder har fĂ„tt information frĂ„n huvudkedjan om att block #90 (50a) har lagts till och börjar applicera 888145 transaktioner. Vid detta tillfĂ€lle har server #3 lĂ€nge applicerat transaktioner frĂ„n block #88 (d3b), #89(214)
12:11 — alla pooler Ă€r tomma
13:41 — alla noder pĂ„ server #3 innehĂ„ller 3 miljoner transaktioner och tokens
14:35 — alla noder pĂ„ server #1 innehĂ„ller 3 miljoner transaktioner och tokens
19:24 — alla noder pĂ„ server #2 innehĂ„ller 3 miljoner transaktioner och tokens

Hinder

Under utvecklingen av Plasma Cash stötte vi pÄ följande problem som vi gradvis har löst och fortfarande löser:

1. Konflikt i interaktionen mellan olika funktioner i systemet. Till exempel, funktionen för att lÀgga till transaktioner i poolen blockerade arbetet med submit och validering av block, och vice versa, vilket ledde till en försÀmring av hastigheten.

2. Det var inte klart hur man skulle skicka en stor mÀngd transaktioner och samtidigt minska kostnaderna för datatransmission.

3. Det var oklart hur och var man skulle lagra data för att uppnÄ höga resultat.

4. Det var oklart hur man skulle organisera nÀtverket mellan noderna, eftersom storleken pÄ ett block med 1 miljon transaktioner tar upp ungefÀr 100 MB.

5. Arbete i en enda trÄd bryter anslutningen mellan noderna nÀr det sker lÄnga berÀkningar (till exempel, konstruktionen av Merkle-trÀdet och berÀkningen av dess hash).

Hur hanterade vi allt detta?

Den första versionen av Plasma Cash-noden var en kombination som kunde göra allt pÄ en gÄng: ta emot transaktioner, skicka och validera block, och erbjuda ett API för att fÄ Ätkomst till data. Eftersom NodeJS frÄn början Àr enstaka trÄdar, blockerade den tunga funktionen för att berÀkna Merkle-trÀd funktionen för att lÀgga till transaktioner. Vi sÄg tvÄ lösningar pÄ detta problem:

1. Att köra flera NodeJS-processer, dÀr varje process utför specifika funktioner.

2. AnvÀnda worker_threads och flytta delar av koden till trÄdar.

Till slut anvÀnde vi bÄda alternativen samtidigt: vi delade logiskt upp en nod i tre delar, som kan arbeta oberoende, men samtidigt synkront.

1. En submit-nod, som tar emot transaktioner i poolen och skapar block.

2. En validerande nod, som kontrollerar nodernas giltighet.

3. API-nod — tillhandahĂ„ller ett API för att fĂ„ tillgĂ„ng till data.

Varje nod kan anslutas via unix-socket genom cli.

Tunga operationer, sÄ som berÀkning av Merkle-trÀd, flyttade vi till en separat trÄd.

SÄledes lyckades vi fÄ alla funktioner i Plasma Cash att fungera samtidigt och utan avbrott.

SÄ snart systemet fungerade testade vi hastigheten och, tyvÀrr, fick vi otillfredsstÀllande resultat: 5 000 transaktioner per sekund och upp till 50 000 transaktioner i blocket. Vi var tvungna att ta reda pÄ vad som var implementerat felaktigt.

Först började vi testa kommunikationsmekanismen med Plasma Cash, för att hitta systemets maximala kapacitet. Tidigare nÀmnde vi att Plasma Cash-noden tillhandahÄller en unix-socketgrÀnssnitt. Den var ursprungligen textbaserad. JSON-objekt skickades med hjÀlp av `JSON.parse()` och `JSON.stringify()`.

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

Vi mÀtte hastigheten pÄ överföring av sÄdana objekt och fick ~ 130k per sekund. Vi försökte byta ut standardfunktionerna för JSON-hantering, men prestandan förbÀttrades inte. V8-motorn verkar vara vÀl optimerad för dessa operationer.

Arbetet med transaktioner, tokens och block genomfördes via klasser. NÀr sÄdana klasser skapades försÀmrades prestandan med 50 %, vilket indikerar att OOP inte passar oss. Vi var tvungna att skriva om allt till en ren funktionell metod.

Skrivning till databasen

Inledningsvis valdes Redis som en av de mest prestanda-effektiva lösningarna, som uppfyllde vÄra krav: en key-value lagring, arbete med hash-tabeller och mÀngder. Vi körde redis-benchmark och fick ~80 000 operationer per sekund med 1 pipelining.

För hög prestanda optimerade vi Redis ytterligare:

  • Vi installerade en unix socket-anslutning.
  • Vi stĂ€ngde av lagring av tillstĂ„nd pĂ„ disk (för tillförlitlighet kan en replika konfigureras och lagring pĂ„ disk göras i en separat Redis).

I Redis Àr en pool en hash-tabell, eftersom vi behöver möjligheten att fÄ alla transaktioner med en begÀran och ta bort transaktioner individuellt. Vi försökte anvÀnda en vanlig lista, men den var lÄngsammare vid utvinning av hela listan.

Vid anvÀndning av standard NodeJS-biblioteket Redis fick vi en prestanda pÄ 18 000 transaktioner per sekund. Hastigheten minskade med 9 gÄnger.

Eftersom benchmarken visade att vi har potential att klara av upp till 5 gÄnger mer, började vi optimera. Vi bytte bibliotek till ioredis och fick en prestanda pÄ 25 000 per sekund. Vi lade till transaktioner individuellt med kommandot `hset`. PÄ sÄ sÀtt genererade vi mÄnga begÀrningar till Redis. Idén uppstod att gruppera transaktioner i buntar och skicka dem med ett kommando `hmset`. Resultatet blev 32 000 per sekund.

Av flera skÀl, som vi kommer att beskriva nedan, arbetar vi med data med hjÀlp av `Buffer`, och det visade sig att om vi konverterar det till text (`buffer.toString('hex')`) innan skrivning, kan vi fÄ bÀttre prestanda. PÄ sÄ sÀtt lyckades vi öka hastigheten till 35 000 per sekund. För tillfÀllet har vi beslutat att pausa vidare optimering.

Vi var tvungna att gÄ över till ett binÀrt protokoll eftersom:

1. Systemet berÀknar ofta hash, signaturer osv., och för detta behöver det data i `Buffer.

2. NÀr data skickas mellan tjÀnster vÀger binÀra data mindre Àn text. Till exempel, nÀr vi skickar ett block med 1 miljon transaktioner, kan datan i textform ta upp mer Àn 300 megabyte.

3. StÀndiga datakonverteringar pÄverkar prestandan.

DÀrför har vi baserat oss pÄ vÄrt eget binÀra protokoll för lagring och överföring av data, utvecklat med den fantastiska biblioteken `binary-data`.

Som ett resultat har vi fÄtt följande datatyper:

— Transaktion

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

— Block

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

Genom vanliga kommandon `BD.encode(block, Protocol).slice();` och ` BD.decode(buffer, Protocol)` konverterar vi data till `Buffer` för lagring i Redis eller för att skicka till en annan nod och extrahera data tillbaka.

Vi har ocksÄ 2 binÀra protokoll för dataöverföring mellan tjÀnster:

— Protokoll för interaktion med Plasma Nod via unix socket

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

dÀr:

  • `type` — Ă„tgĂ€rden som ska utföras, till exempel 1 — sendTransaction, 2 — getTransaction;
  • `payload` — data som mĂ„ste skickas till motsvarande funktion;
  • `messageId` — meddelande-id för att kunna identifiera svaret.

— Protokoll för interaktion mellan noder

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

dÀr:

  • `code` — meddelandekod, till exempel 6 — PREPARE_NEW_BLOCK, 7 — BLOCK_VALID, 8 — BLOCK_COMMIT;
  • `versionProtocol` — version av protokollet, dĂ„ det kan finnas noder med olika versioner i nĂ€tverket som kan fungera olika;
  • `seq` — meddelandeidentifierare;
  • `countChunk` och `chunkNumber` Ă€r nödvĂ€ndiga för att dela upp stora meddelanden;
  • `length` och `payload` lĂ€ngd och sjĂ€lva data.

Eftersom vi har typat datan i förvÀg fungerar det slutliga systemet mycket snabbare Àn `rlp`-biblioteket frÄn Ethereum. TyvÀrr har vi Ànnu inte kunnat avstÄ frÄn det, eftersom smartkontraktet behöver förbÀttras, vilket vi planerar att göra i framtiden.

Om vi har lyckats nÄ hastigheten 35 000 transaktioner per sekund, vi behöver ocksÄ bearbeta dem inom en optimal tid. Eftersom den ungefÀrliga tiden för blockgenerering Àr 30 sekunder, behöver vi inkludera i blocket 1 000 000 transaktioner, vilket betyder överföring av mer Àn 100 MB data.

Till en början anvÀnde vi `ethereumjs-devp2p`-biblioteket för att ansluta noder, men det klarade inte av den mÀngden data. DÀrför anvÀnde vi `ws`-biblioteket och stÀllde in överföringen av binÀra data över websocket. SjÀlvklart stötte vi ocksÄ pÄ problem med att överföra stora datapaket, men vi delade upp dem i bitar och nu finns det inga sÄdana problem.

Dessutom tar skapandet av Merkle-trÀdet och berÀkningen av hash 1 000 000 transaktioner omkring 10 sekunders oavbruten berÀkning. Under denna tid hinner kopplingen till alla noder bryta. Det beslutades att flytta denna berÀkning till en separat trÄd.

Slutsatser:

Faktum Àr att vÄra insikter inte Àr nya, men av nÄgon anledning glömmer mÄnga specialister dem vid utveckling.

  • Att anvĂ€nda funktionell programmering istĂ€llet för objektorienterad programmering ökar prestandan.
  • Monolit Ă€r sĂ€mre Ă€n en tjĂ€nsteorienterad arkitektur för ett högpresterande system pĂ„ NodeJS.
  • Att anvĂ€nda `worker_threads` för tunga berĂ€kningar förbĂ€ttrar systemets responsivitet, sĂ€rskilt vid arbete med i/o-operationer.
  • Unix-socket Ă€r mer stabil Ă€n http-förfrĂ„gningar.
  • Om du snabbt behöver överföra stora datamĂ€ngder över nĂ€tet, Ă€r det bĂ€ttre att anvĂ€nda websockets och skicka binĂ€ra data uppdelade i bitar, som kan skickas om de inte nĂ„r fram, och sedan kombineras till ett meddelande.

Vi inbjuder dig att besöka GitHub projektet: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Artikeln skrevs i samarbete med Alexander Nashivan, seniorutvecklare Clever Solution Inc.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster