Public Test: Usa ka Solusyon alang sa Privacy ug Scalability sa Ethereum

Blockchain maoy usa ka bag-ong teknolohiya nga nagsaad sa pagpalambo sa daghang bahin sa kinabuhi sa tawo. Gibalhin niini ang tinuod nga mga proseso ug mga produkto sa digital nga wanang, gisiguro ang katulin ug kasaligan sa mga transaksyon sa pinansya, gipamenos ang ilang gasto, ug gitugotan ka usab nga maghimo mga modernong aplikasyon sa DAPP gamit ang mga smart nga kontrata sa mga desentralisadong network.

Tungod sa daghang mga benepisyo ug lainlain nga mga aplikasyon sa blockchain, mahimo’g makapahingangha nga kini nga nagsaad nga teknolohiya wala pa nakasulod sa matag industriya. Ang problema mao nga ang mga modernong desentralisadong blockchain kulang sa scalability. Ang Ethereum nagproseso sa mga 20 ka transaksyon kada segundo, nga dili igo aron matubag ang mga panginahanglan sa dinamikong mga negosyo karon. Sa samang higayon, ang mga kompanya nga naggamit sa teknolohiya sa blockchain nagpanuko sa pagbiya sa Ethereum tungod sa taas nga lebel sa proteksyon niini gikan sa pag-hack ug pagkapakyas sa network.

Aron maseguro ang desentralisasyon, seguridad ug scalability sa blockchain, sa ingon masulbad ang Scalability Trilemma, ang development team Oportunidad naghimo sa Plasma Cash, usa ka kadena nga subsidiary nga gilangkuban sa usa ka intelihenteng kontrata ug usa ka pribadong network nga gibase sa Node.js, nga matag karon ug unya nagbalhin sa estado niini sa kadena sa ugat (Ethereum).

Public Test: Usa ka Solusyon alang sa Privacy ug Scalability sa Ethereum

Pangunang mga proseso sa Plasma Cash

1. Gitawag sa user ang smart contract function nga `deposit`, nga gipasa niini ang kantidad sa ETH nga gusto niyang ideposito sa Plasma Cash token. Ang intelihente nga function sa kontrata nagmugna usa ka timaan ug nagmugna usa ka panghitabo bahin niini.

2. Ang Plasma Cash nodes nga nag-subscribe sa mga smart contract nga mga panghitabo makadawat og usa ka panghitabo mahitungod sa paghimo og deposito ug pagdugang og transaksyon mahitungod sa paghimo og token sa pool.

3. Matag karon ug unya, ang mga espesyal nga Plasma Cash node mokuha sa tanan nga mga transaksyon gikan sa pool (hangtod sa 1 milyon) ug maghimo usa ka bloke gikan kanila, kuwentaha ang kahoy nga Merkle ug, sumala niana, ang hash. Kini nga block gipadala ngadto sa ubang mga node para sa verification. Gisusi sa mga node kung ang Merkle hash balido ug kung ang mga transaksyon balido (pananglitan, kung ang nagpadala sa token mao ang tag-iya niini). Human mapamatud-an ang block, ang node nagtawag sa `submitBlock` nga function sa smart contract, nga nagtipig sa block number ug Merkle hash sa edge chain. Ang intelihente nga kontrata nagpatunghag usa ka panghitabo nga nagpaila sa malampuson nga pagdugang sa usa ka bloke. Ang mga transaksyon gikuha gikan sa pool.

4. Ang mga node nga nakadawat sa block submission event nagsugod sa paggamit sa mga transaksyon nga gidugang sa block.

5. Sa usa ka punto, ang tag-iya (o dili tag-iya) sa token gusto nga i-withdraw kini gikan sa Plasma Cash. Aron mahimo kini, gitawag niya ang function nga `startExit`, nga gipasa niini ang kasayuran bahin sa katapusan nga 2 nga mga transaksyon sa token, nga nagpamatuod nga siya ang tag-iya sa token. Ang intelihente nga kontrata, gamit ang Merkle hash, nagsusi sa presensya sa mga transaksyon sa mga bloke ug nagpadala sa token alang sa pag-atras, nga mahitabo sa duha ka semana.

6. Kung ang operasyon sa pag-withdraw sa token nahitabo nga adunay mga paglapas (ang token gigasto pagkahuman nagsugod ang pamaagi sa pag-withdraw o ang token iya na sa uban sa wala pa ang pag-withdraw), ang tag-iya sa token mahimong mobalibad sa pag-atras sulod sa duha ka semana.

Public Test: Usa ka Solusyon alang sa Privacy ug Scalability sa Ethereum

Ang pagkapribado makab-ot sa duha ka paagi

1. Ang kadena sa ugat wala’y nahibal-an bahin sa mga transaksyon nga gihimo ug gipasa sa sulod sa kadena sa bata. Ang kasayuran bahin sa kung kinsa ang nagdeposito ug nag-withdraw sa ETH gikan sa Plasma Cash nagpabilin nga publiko.

2. Gitugotan sa kadena sa bata ang dili mailhan nga mga transaksyon gamit ang zk-SNARKs.

Ang teknolohiya stack

  • NodeJS
  • Redis
  • etherium
  • Sild

Pagsulay

Samtang nagpalambo sa Plasma Cash, gisulayan namon ang katulin sa sistema ug nakuha ang mga musunud nga resulta:

  • hangtod sa 35 ka mga transaksyon matag segundo ang idugang sa pool;
  • hangtod sa 1 nga mga transaksyon mahimong tipigan sa usa ka bloke.

Ang mga pagsulay gihimo sa mosunod nga 3 nga mga server:

1. Intel Core i7-6700 Quad-Core Skylake incl. NVMe SSD - 512 GB, 64 GB DDR4 RAM
3 nga nag-validate sa Plasma Cash nodes gipataas.

2. AMD Ryzen 7 1700X Octa-Core “Summit Ridge” (Zen), SATA SSD – 500 GB, 64 GB DDR4 RAM
Ang Ropsten testnet ETH node gipataas.
3 nga nag-validate sa Plasma Cash nodes gipataas.

3. Intel Core i9-9900K Octa-Core incl. NVMe SSD – 1 TB, 64 GB DDR4 RAM
1 Plasma Cash submission node gipataas.
3 nga nag-validate sa Plasma Cash nodes gipataas.
Usa ka pagsulay ang gilunsad aron makadugang sa mga transaksyon sa Plasma Cash network.

Total: 10 Plasma Cash nodes sa usa ka pribadong network.

Pagsulay 1

Adunay limitasyon sa 1 milyon nga mga transaksyon matag bloke. Busa, ang 1 ka milyon nga mga transaksyon nahulog sa 2 nga mga bloke (tungod kay ang sistema nagdumala sa pag-apil sa mga transaksyon ug pagsumite samtang kini gipadala).


Inisyal nga estado: katapusang block #7; Ang 1 milyon nga mga transaksyon ug mga token gitipigan sa database.

00:00 — pagsugod sa script sa paghimo sa transaksyon
01:37 - 1 milyon nga mga transaksyon ang gihimo ug ang pagpadala sa node nagsugod
01:46 — isumite ang node mikuha sa 240k nga mga transaksyon gikan sa pool ug mga porma block #8. Nakita usab namon nga ang 320k nga mga transaksyon gidugang sa pool sa 10 segundos
01:58 — block #8 gipirmahan ug gipadala para sa validation
02:03 — block #8 gi-validate ug ang `submitBlock` function sa smart contract gitawag uban ang Merkle hash ug block number
02:10 — ang demo script nahuman sa pagtrabaho, nga nagpadala ug 1 ka milyon nga mga transaksyon sa 32 segundos
02:33 - ang mga node nagsugod sa pagdawat sa impormasyon nga ang block #8 gidugang sa root chain, ug nagsugod sa paghimo sa 240k nga mga transaksyon
02:40 - 240k nga mga transaksyon ang gikuha gikan sa pool, nga anaa na sa block #8
02:56 — isumite ang node gikuha ang nahabilin nga 760k nga mga transaksyon gikan sa pool ug gisugdan ang pagkalkulo sa Merkle hash ug pagpirma block #9
03:20 - ang tanan nga mga node adunay 1 milyon nga 240k nga mga transaksyon ug mga token
03:35 — block #9 gipirmahan ug gipadala para sa validation sa ubang mga node
03:41 - nahitabo ang sayup sa network
04:40 — ang paghulat sa block #9 validation natapos na
04:54 — isumite ang node gikuha ang nahabilin nga 760k nga mga transaksyon gikan sa pool ug gisugdan ang pagkalkulo sa Merkle hash ug pagpirma block #9
05:32 — block #9 gipirmahan ug gipadala para sa validation sa ubang mga node
05:53 — ang block #9 gi-validate ug gipadala sa root chain
06:17 - ang mga node nagsugod sa pagdawat sa impormasyon nga ang block #9 gidugang sa root chain ug nagsugod sa paghimo sa 760k nga mga transaksyon
06:47 — ang pool nagtangtang sa mga transaksyon nga naa sa block #9
09:06 - ang tanan nga mga node adunay 2 milyon nga mga transaksyon ug mga token

Pagsulay 2

Adunay limitasyon nga 350k matag bloke. Ingon usa ka sangputanan, kami adunay 3 ka bloke.


Inisyal nga estado: katapusang block #9; Ang 2 milyon nga mga transaksyon ug mga token gitipigan sa database

00:00 — ang script sa paghimo sa transaksyon gilunsad na
00:44 - 1 milyon nga mga transaksyon ang gihimo ug ang pagpadala sa node nagsugod
00:56 — isumite ang node mikuha sa 320k nga mga transaksyon gikan sa pool ug mga porma block #10. Nakita usab namon nga ang 320k nga mga transaksyon gidugang sa pool sa 10 segundos
01:12 — block #10 gipirmahan ug gipadala sa ubang mga node para sa validation
01:18 — ang demo script nahuman sa pagtrabaho, nga nagpadala ug 1 ka milyon nga mga transaksyon sa 34 segundos
01:20 — block #10 gi-validate ug gipadala sa root chain
01:51 - ang tanan nga mga node nakadawat kasayuran gikan sa kadena sa ugat nga gidugang ang block #10 ug nagsugod sa paggamit sa 320k nga mga transaksyon
02:01 - ang pool nakakuha na alang sa 320k nga mga transaksyon nga gidugang sa block #10
02:15 — isumite ang node mikuha sa 350k nga mga transaksyon gikan sa pool ug mga porma block #11
02:34 — ang block #11 gipirmahan ug gipadala sa ubang mga node para sa validation
02:51 — ang block #11 gi-validate ug gipadala sa root chain
02:55 — ang katapusang node nakompleto ang mga transaksyon gikan sa block #10
10:59 — ang transaksyon sa pagsumite sa block #9 dugay kaayo sa kadena sa ugat, apan nahuman kini ug ang tanan nga mga node nakadawat kasayuran bahin niini ug nagsugod sa paghimo sa 350k nga mga transaksyon
11:05 - ang pool nakakuha na alang sa 320k nga mga transaksyon nga gidugang sa block #11
12:10 - ang tanan nga mga node adunay 1 milyon nga 670k nga mga transaksyon ug mga token
12:17 — isumite ang node mikuha sa 330k nga mga transaksyon gikan sa pool ug mga porma block #12
12:32 — ang block #12 gipirmahan ug gipadala sa ubang mga node para sa validation
12:39 — block #12 gi-validate ug gipadala sa root chain
13:44 - ang tanan nga mga node nakadawat kasayuran gikan sa kadena sa ugat nga gidugang ang block #12 ug nagsugod sa paggamit sa 330k nga mga transaksyon
14:50 - ang tanan nga mga node adunay 2 milyon nga mga transaksyon ug mga token

Pagsulay 3

Sa una ug ikaduha nga mga server, usa ka validating node ang gipulihan sa usa ka submitting node.


Inisyal nga estado: katapusang block #84; 0 nga mga transaksyon ug mga token nga gitipigan sa database

00:00 — 3 ka mga script ang gilusad nga nagmugna ug nagpadala ug 1 ka milyon nga mga transaksyon matag usa
01:38 — 1 milyon nga mga transaksyon ang gihimo ug ang pagpadala aron isumite ang node #3 nagsugod
01:50 — isumite ang node #3 mikuha sa 330k nga mga transaksyon gikan sa pool ug mga porma block #85 (f21). Nakita usab namon nga ang 350k nga mga transaksyon gidugang sa pool sa 10 segundos
01:53 — 1 milyon nga mga transaksyon ang gihimo ug ang pagpadala aron isumite ang node #1 nagsugod
01:50 — isumite ang node #3 mikuha sa 330k nga mga transaksyon gikan sa pool ug mga porma block #85 (f21). Nakita usab namon nga ang 350k nga mga transaksyon gidugang sa pool sa 10 segundos
02:01 — isumite ang node #1 mikuha sa 250k nga mga transaksyon gikan sa pool ug mga porma block #85 (65e)
02:06 — block #85 (f21) gipirmahan ug gipadala sa ubang mga node para sa validation
02:08 — demo script sa server #3, nga nagpadala og 1 ka milyon nga mga transaksyon sa 30 segundos, nahuman sa pagtrabaho
02:14 — block #85 (f21) gi-validate ug gipadala sa root chain
02:19 — block #85 (65e) gipirmahan ug gipadala sa ubang mga node para sa validation
02:22 — 1 milyon nga mga transaksyon ang gihimo ug ang pagpadala aron isumite ang node #2 nagsugod
02:27 — block #85 (65e) validated ug gipadala sa root chain
02:29 — isumite ang node #2 nagkuha 111855 nga mga transaksyon gikan sa pool ug mga porma block #85 (256).
02:36 — block #85 (256) gipirmahan ug gipadala sa ubang mga node para sa validation
02:36 — demo script sa server #1, nga nagpadala og 1 ka milyon nga mga transaksyon sa 42.5 segundos, nahuman sa pagtrabaho
02:38 — block #85 (256) gi-validate ug gipadala sa root chain
03:08 — ang server #2 script nahuman na sa pagtrabaho, nga nagpadala ug 1 milyon nga mga transaksyon sa 47 segundos
03:38 - ang tanan nga mga node nakadawat kasayuran gikan sa kadena sa ugat nga nag-block sa #85 (f21), #86(65e), #87(256) gidugang ug nagsugod sa paggamit sa 330k, 250k, 111855 nga mga transaksyon
03:49 - ang pool na-clear sa 330k, 250k, 111855 nga mga transaksyon nga gidugang sa block #85 (f21), #86(65e), #87(256)
03:59 — isumite ang node #1 mikuha sa 888145 ka transaksyon gikan sa pool ug mga porma block #88 (214), isumite ang node #2 mikuha sa 750k nga mga transaksyon gikan sa pool ug mga porma block #88 (50a), isumite ang node #3 mikuha sa 670k nga mga transaksyon gikan sa ang pool ug mga porma block #88 (d3b)
04:44 — block #88 (d3b) gipirmahan ug gipadala sa ubang mga node para sa validation
04:58 — block #88 (214) gipirmahan ug gipadala sa ubang mga node para sa validation
05:11 — block #88 (50a) gipirmahan ug gipadala sa ubang mga node para sa validation
05:11 — block #85 (d3b) gi-validate ug gipadala sa root chain
05:36 — block #85 (214) gi-validate ug gipadala sa root chain
05:43 - ang tanan nga mga node nakadawat kasayuran gikan sa kadena sa ugat nga nag-block sa #88 (d3b), #89(214) gidugang ug nagsugod sa paggamit sa 670k, 750k nga mga transaksyon
06:50 — tungod sa kapakyasan sa komunikasyon, ang block #85 (50a) wala ma-validate
06:55 — isumite ang node #2 gikuha ang 888145 nga mga transaksyon gikan sa pool ug mga porma block #90 (50a)
08:14 — block #90 (50a) gipirmahan ug gipadala sa ubang mga node para sa validation
09:04 — block #90 (50a) gi-validate ug gipadala sa root chain
11:23 - ang tanan nga mga node nakadawat kasayuran gikan sa ugat nga kadena nga gibabagan ang #90 (50a) gidugang, ug nagsugod sa paggamit sa 888145 nga mga transaksyon. Sa samang higayon, ang server #3 nag-apply na sa mga transaksyon gikan sa blocks #88 (d3b), #89(214)
12:11 - walay sulod ang tanang pool
13:41 — ang tanan nga mga node sa server #3 adunay 3 milyon nga mga transaksyon ug mga token
14:35 — ang tanan nga mga node sa server #1 adunay 3 milyon nga mga transaksyon ug mga token
19:24 — ang tanan nga mga node sa server #2 adunay 3 milyon nga mga transaksyon ug mga token

Babag

Atol sa pagpalambo sa Plasma Cash, nasugatan namo ang mosunod nga mga problema, nga anam-anam namong nasulbad ug gisulbad:

1. Ang panagsumpaki sa interaksyon sa lainlaing mga gimbuhaton sa sistema. Pananglitan, ang function sa pagdugang sa mga transaksyon ngadto sa pool gibabagan ang buhat sa pagsumite ug pag-validate sa mga bloke, ug vice versa, nga misangpot sa usa ka drop sa speed.

2. Dili dayon klaro kung giunsa pagpadala ang daghang mga transaksyon samtang gipamubu ang gasto sa pagbalhin sa datos.

3. Dili klaro kung giunsa ug asa ibutang ang datos aron makab-ot ang taas nga mga resulta.

4. Dili klaro kung giunsa ang pag-organisar sa usa ka network tali sa mga node, tungod kay ang gidak-on sa usa ka bloke nga adunay 1 milyon nga mga transaksyon mokabat sa 100 MB.

5. Ang pagtrabaho sa single-threaded mode makaguba sa koneksyon tali sa mga node kung mahitabo ang taas nga mga kalkulasyon (pananglitan, pagtukod og Merkle tree ug pagkalkula sa hash niini).

Giunsa namo pag-atubang kining tanan?

Ang unang bersyon sa Plasma Cash node usa ka matang sa kombinasyon nga makahimo sa tanan sa samang higayon: modawat sa mga transaksyon, mosumite ug mag-validate sa mga bloke, ug maghatag ug API para sa pag-access sa datos. Tungod kay ang NodeJS kay lumad nga single-threaded, ang bug-at nga Merkle tree calculation function nakababag sa add transaction function. Nakita namon ang duha ka kapilian sa pagsulbad niini nga problema:

1. Ilunsad ang ubay-ubay nga mga proseso sa NodeJS, nga ang matag usa adunay mga piho nga gimbuhaton.

2. Gamita ang worker_threads ug ibalhin ang pagpatuman sa bahin sa code ngadto sa mga hilo.

Ingon usa ka sangputanan, gigamit namon ang duha nga mga kapilian sa parehas nga oras: lohikal namon nga gibahin ang usa ka node sa 3 nga mga bahin nga mahimo’g molihok nga gilain, apan sa parehas nga oras dungan.

1. Submission node, nga modawat sa mga transaksyon ngadto sa pool ug maghimo og mga bloke.

2. Usa ka validating node nga nagsusi sa balido sa mga node.

3. API node - naghatag ug API para sa pag-access sa datos.

Sa kini nga kaso, mahimo nimong makonektar ang matag node pinaagi sa usa ka unix socket gamit ang cli.

Among gibalhin ang bug-at nga mga operasyon, sama sa pagkalkula sa Merkle tree, ngadto sa usa ka separado nga hilo.

Sa ingon, nakab-ot namon ang normal nga operasyon sa tanan nga mga function sa Plasma Cash nga dungan ug wala’y mga kapakyasan.

Sa diha nga ang sistema magamit na, nagsugod kami sa pagsulay sa katulin ug, sa walay palad, nakadawat og dili maayo nga mga resulta: 5 ka mga transaksyon kada segundo ug hangtod sa 000 ka mga transaksyon kada block. Kinahanglan nakong mahibal-an kung unsa ang dili husto nga gipatuman.

Sa pagsugod, gisugdan namon ang pagsulay sa mekanismo sa komunikasyon sa Plasma Cash aron mahibal-an ang peak nga kapabilidad sa sistema. Gisulat namon kaniadto nga ang Plasma Cash node naghatag usa ka unix socket interface. Sa sinugdan kini gibase sa teksto. Ang mga butang sa json gipadala gamit ang `JSON.parse()` ug `JSON.stringify()`.

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

Among gisukod ang gikusgon sa pagbalhin sa maong mga butang ug nakit-an nga ~ 130k kada segundo. Among gisulayan ang pag-ilis sa mga standard function para sa pagtrabaho sa json, apan ang performance wala molambo. Ang V8 nga makina kinahanglan nga maayo nga na-optimize alang niini nga mga operasyon.

Nagtrabaho kami sa mga transaksyon, mga token, ug mga bloke sa mga klase. Sa paghimo sa ingon nga mga klase, ang pasundayag nahulog sa 2 ka beses, nga nagpakita nga ang OOP dili angay alang kanamo. Kinahanglan nakong isulat pag-usab ang tanan sa usa ka praktikal nga pamaagi.

Pagrekord sa database

Sa sinugdan, ang Redis gipili alang sa pagtipig sa datos isip usa sa labing produktibo nga mga solusyon nga nagtagbaw sa among mga kinahanglanon: key-value storage, pagtrabaho uban sa hash tables, sets. Naglunsad kami og redis-benchmark ug nakakuha og ~80k nga operasyon kada segundo sa 1 pipelining mode.

Alang sa taas nga pasundayag, among gipahiangay ang Redis nga labi ka maayo:

  • Ang koneksyon sa unix socket natukod.
  • Gipugngan namon ang pag-save sa estado sa disk (alang sa kasaligan, mahimo nimong i-set up ang usa ka kopya ug i-save sa disk sa usa ka lahi nga Redis).

Sa Redis, ang usa ka pool usa ka hash nga lamesa tungod kay kinahanglan naton nga makuha ang tanan nga mga transaksyon sa usa ka pangutana ug tangtangon ang mga transaksyon sa usag usa. Gisulayan namon ang paggamit sa usa ka regular nga lista, apan kini mas hinay kung gidiskarga ang tibuuk nga lista.

Kung gigamit ang standard nga NodeJS, ang mga librarya sa Redis nakab-ot ang usa ka pasundayag nga 18k nga mga transaksyon matag segundo. Ang katulin mikunhod 9 ka beses.

Tungod kay ang benchmark nagpakita kanamo nga ang mga posibilidad klaro nga 5 ka beses nga mas dako, nagsugod kami sa pag-optimize. Gibag-o namon ang librarya sa ioredis ug nakakuha og pasundayag nga 25k matag segundo. Gidugang namo ang mga transaksyon sa usag usa gamit ang `hset` nga sugo. Mao nga naghimo kami daghang mga pangutana sa Redis. Mitumaw ang ideya sa paghiusa sa mga transaksyon ngadto sa mga batch ug ipadala kini sa usa ka command `hmset`. Ang resulta kay 32k kada segundo.

Alang sa daghang mga hinungdan, nga among ihulagway sa ubos, nagtrabaho kami gamit ang datos gamit ang `Buffer` ug, ingon nga kini nahimo, kung imong i-convert kini sa teksto (`buffer.toString('hex')`) sa dili pa magsulat, makakuha ka dugang pasundayag. Sa ingon, ang katulin gipataas sa 35k matag segundo. Sa pagkakaron, nakahukom kami nga suspindihon ang dugang nga pag-optimize.

Kinahanglan namon nga mobalhin sa usa ka binary protocol tungod kay:

1. Ang sistema kanunay nga nagkalkula sa mga hash, pirma, ug uban pa, ug alang niini nanginahanglan kini mga datos sa `Buffer.

2. Kung gipadala tali sa mga serbisyo, ang binary nga datos mas mubu kaysa teksto. Pananglitan, kung magpadala usa ka bloke nga adunay 1 milyon nga mga transaksyon, ang datos sa teksto mahimo’g mokuha labaw sa 300 megabytes.

3. Ang kanunay nga pagbag-o sa datos makaapekto sa performance.

Busa, gibasehan namo ang among kaugalingong binary protocol para sa pagtipig ug pagpasa sa datos, naugmad pinasikad sa nindot nga `binary-data` library.

Ingon nga resulta, nakuha namo ang mosunod nga mga istruktura sa datos:

—Transaksyon

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

Uban sa naandan nga mga sugo `BD.encode(block, Protocol).slice();` ug `BD.decode(buffer, Protocol)` atong gi-convert ang data ngadto sa `Buffer` para sa pagtipig sa Redis o pagpasa ngadto sa laing node ug pagkuha sa data balik.

Adunay usab kami 2 binary nga mga protocol alang sa pagbalhin sa datos tali sa mga serbisyo:

- Protocol alang sa interaksyon sa Plasma Node pinaagi sa 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)
  }
  ```

diin:

  • 'type' — ang aksyon nga ipahigayon, pananglitan, 1 — sendTransaction, 2 — getTransaction;
  • `payload` — datos nga kinahanglan ipasa sa angay nga gimbuhaton;
  • `messageId` — message id aron mailhan ang tubag.

- Protocol alang sa interaksyon tali sa mga node

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

diin:

  • `kodigo` — code sa mensahe, pananglitan 6 — PREPARE_NEW_BLOCK, 7 — BLOCK_VALID, 8 — BLOCK_COMMIT;
  • `versionProtocol` — bersyon sa protocol, tungod kay ang mga node nga adunay lainlaing mga bersyon mahimong mapataas sa network ug mahimo silang molihok nga lahi;
  • `sunod` - identifier sa mensahe;
  • `countChunk` и `chunkNumber` gikinahanglan alang sa pagbahin sa dagkong mga mensahe;
  • `gitas-on` и `payload` gitas-on ug ang datos mismo.

Tungod kay among gi-pre-type ang datos, ang kataposang sistema mas paspas kay sa `rlp` library sa Ethereum. Ikasubo, wala pa kami makabalibad niini, tungod kay gikinahanglan ang pagtapos sa smart nga kontrata, nga among giplano nga buhaton sa umaabot.

Kung kami nakahimo sa pagkab-ot sa gikusgon 35 000 mga transaksyon matag segundo, kinahanglan usab naton nga iproseso kini sa labing maayo nga oras. Tungod kay ang gibanabana nga oras sa pagporma sa bloke mokabat ug 30 segundos, kinahanglan naton iapil sa bloke 1 000 000 mga transaksyon, nga nagpasabot sa pagpadala og dugang 100 MB sa datos.

Sa sinugdan, gigamit namo ang library nga `ethereumjs-devp2p` aron makigkomunikar tali sa mga node, apan dili kini makadumala sa daghan kaayong datos. Ingon usa ka sangputanan, gigamit namon ang librarya nga `ws` ug gi-configure ang pagpadala sa binary data pinaagi sa websocket. Siyempre, nakasugat usab kami og mga problema sa pagpadala sa dagkong mga pakete sa datos, apan among gibahin kini ngadto sa mga tipik ug karon kini nga mga problema wala na.

Naghimo usab usa ka kahoy nga Merkle ug gikalkula ang hash 1 000 000 mga transaksyon nagkinahanglan mahitungod sa 10 segundos sa padayon nga kalkulasyon. Niini nga panahon, ang koneksyon sa tanan nga mga node nakahimo sa pagbungkag. Nakahukom nga ibalhin kini nga kalkulasyon sa usa ka bulag nga hilo.

Mga konklusyon:

Sa tinuud, ang among mga nahibal-an dili bag-o, apan sa pipila ka hinungdan daghang mga eksperto ang nakalimot bahin niini kung nag-uswag.

  • Ang paggamit sa Functional Programming imbes sa Object-Oriented Programming makapauswag sa pagka-produktibo.
  • Ang monolith mas grabe pa sa usa ka arkitektura sa serbisyo alang sa usa ka produktibo nga sistema sa NodeJS.
  • Ang paggamit sa `worker_threads` alang sa bug-at nga pagkalkula nagpauswag sa pagtubag sa sistema, labi na kung nag-atubang sa mga operasyon sa i/o.
  • Ang unix socket mas lig-on ug mas paspas kay sa mga hangyo sa http.
  • Kung kinahanglan nimo nga dali nga ibalhin ang dagkong mga datos sa network, mas maayo nga gamiton ang mga websocket ug ipadala ang binary data, gibahin sa mga tipak, nga mahimong ipasa kung dili sila moabut, ug dayon gihiusa sa usa ka mensahe.

Gidapit ka namo sa pagbisita GitHub proyekto: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Ang artikulo kauban nga gisulat ni Alexander Nashivan, senior nga developer Clever Solution Inc.

Source: www.habr.com

Idugang sa usa ka comment