Il trend della blockchain continua a guadagnare slancio. Sempre più esperti prevedono un adattamento universale di questa tecnologia nel prossimo futuro. Al momento, rimangono irrisolti alcuni problemi che ostacolano tutto ciò.
Prima di tutto, i moderni sistemi blockchain hanno una cattiva scalabilità. Ad esempio, la capacità di elaborazione di Ethereum è di sole 20 transazioni al secondo e, nonostante i numerosi vantaggi, non è adatta per le grandi imprese.
Allo stesso tempo, Ethereum è apprezzato per la sua potente protezione contro hack e malfunzionamenti della rete. Quindi non dovremmo scartarlo del tutto. È molto più sensato correggere le carenze di Ethereum e trasformarle in vantaggi.

Plasma Cash come soluzione per la privacy e la scalabilità in Ethereum
Plasma è una tecnologia presentata da Vitalik Buterin, co-fondatore del progetto Ethereum, alla conferenza EthCC a Parigi nel 2018. È stato sviluppato insieme a Joseph Poon, co-fondatore di Lightning Network, ed è stato dichiarato come una soluzione per aumentare la potenza computazionale della blockchain di Ethereum. Le prime notizie su Plasma sono trapelate nei media nel 2017.
Questa piattaforma rappresenta un livello esterno di smart contract capaci di interagire con la blockchain principale, alleggerendo così la catena principale, riducendo le spese di transazione per gli smart contract e le applicazioni decentralizzate (DApps).
Informazioni dettagliate sullo sviluppo sono state descritte nel documento «», datato agosto 2017.
Buterin ha riconosciuto che Plasma presenta problemi di scalabilità: ogni utente deve caricare e verificare l'autenticità di ogni blocco Plasma, il che impedisce uno scaling esponenziale.
Per correggere questo difetto, è stata sviluppata Plasma Cash: una sidechain composta da uno smart contract e una rete privata basata su Node.js, che trasferisce periodicamente il suo stato nella catena principale (Ethereum). Essa garantisce decentralizzazione, sicurezza e scalabilità nella blockchain, affrontando così la Trilemma della Scalabilità.
Un importante vantaggio di Plasma Cash rispetto a Plasma è che attira l'attenzione degli utenti solo su quei blocchi che contengono le monete di loro interesse:
«Ora gli utenti devono verificare la disponibilità e la correttezza della catena Plasma solo per un indice speciale legato alle monete che intendono spendere, di cui sono proprietari e che li interessano», ha affermato Buterin.
Secondo gli sviluppatori, Plasma Cash è una soluzione efficace contro gli attacchi nel mondo di Ethereum. Ogni moneta Plasma ha un proprietario ed è unica. Nessuno può appropriarsi delle monete di un altro utente senza il suo consenso. Il detentore della moneta può prevenire un potenziale prelievo fraudolento tramite un sistema di «denunce» presentando i propri «dati di prova» nella storia della propria moneta.
Test di Plasma Cash in Mongo Atlas
A causa della sua novità, Plasma Cash rimane ancora poco studiata. Gli esperti di blockchain stanno attivamente testando la sua interazione con vari servizi cloud e database, registrando difetti e trovando modi per correggerli. In particolare, i test in Mongo Atlas hanno messo in evidenza i seguenti vantaggi nell'uso di Plasma:
- Affidabile protezione contro la perdita di dati, poiché ci sono più repliche che si sincronizzano tra loro nel cluster.
- Accesso rapido, poiché il cluster può essere creato su tre delle piattaforme cloud più popolari: Amazon, Google, Azure. Di conseguenza, un nodo Plasma Cash può essere distribuito in molti data center situati vicino a Mongo Atlas. È stato dimostrato che la velocità non diminuisce notevolmente, anche se i nodi Plasma vengono distribuiti in data center più remoti.
- I nodi Plasma, utilizzati solo in modalità lettura, possono essere collegati a un unico cluster Mongo e situati in diverse parti del mondo, il che migliora la geoscalabilità (i nodi si trovano più vicini agli utenti).
- Distribuire un nuovo nodo è semplice, poiché non è necessario risincronizzare completamente. È possibile semplicemente collegarsi a un cluster Mongo esistente o creare rapidamente una copia e configurare la connessione.
- Scalare il database è facile. Con il tempo i dati aumentano e si possono aumentare le dimensioni dei nodi nel cluster secondo necessità.

Abbiamo utilizzato i seguenti server per condurre i test:
- 3 server Azure virtuali Standard E4s v3 (4 vcpus, 32 GiB di memoria). Su ciascun server sono attive 3 nodi. Uno di questi può inviare blocchi nella catena principale.
- Ogni nodo è collegato al proprio cluster Mongo Atlas M50, che contiene 3 nodi in modalità replica.
Test 1
3 nodi ricevono 100k transazioni ciascuno. In totale, ci sono 300k transazioni e token in tutte e 9 i nodi.

Stato iniziale: blocco finale #213; nel database sono salvate 0 transazioni e token.
00:00 — Avviati 3 script che generano e inviano 100k transazioni ciascuno
00:29 — Iniziato l'invio di 100k transazioni ai nodi #1 e #2
00:32 — Iniziato l'invio di 100k transazioni al nodo #3
00:32 — Il nodo #1 ha preso dal pool 11703 transazioni e sta formando il blocco #214 (9fb)
00:34 — Il nodo #2 ha preso dal pool 27088 transazioni e sta formando il blocco #214 (ef4)
00:34 — Il blocco #214 (9fb) è stato firmato e inviato agli altri nodi per la validazione
00:36 — Il nodo #3 ha preso dal pool 11900 transazioni e sta formando il blocco #214 (983)
00:37 — Il blocco #214 (9fb) è stato validato e inviato alla catena principale
00:38 — Il blocco #214 (983) è stato firmato e inviato agli altri nodi per la validazione
00:38 — Il blocco #214 (ef4) è stato firmato e inviato agli altri nodi per la validazione
00:40 — Il blocco #214 (983) è stato validato e inviato alla catena principale
00:41 — Tutti i nodi hanno ricevuto dalla catena principale l'informazione che il blocco #214 (9fb) è stato aggiunto e iniziano ad applicare 11703 transazioni
00:45 — Tutti i nodi hanno ricevuto dalla catena principale l'informazione che il blocco #215 (983) è stato aggiunto e iniziano ad applicare 11900 transazioni
00:51 — Il blocco #214 (ef4) è stato validato e inviato alla catena principale
00:52 — Il nodo #1 ha preso dal pool 51469 transazioni e sta formando il blocco #216 (ea0)
00:56 — Il nodo #3 ha preso dal pool 55102 transazioni e sta formando il blocco #216 (f75)
00:58 — Lo script demo ha completato il suo lavoro per il nodo #2
00:58 — Il blocco #216 (ea0) è stato firmato e inviato agli altri nodi per la validazione
00:58 — Tutti i nodi hanno ricevuto dalla catena principale l'informazione che il blocco #216 (ef4) è stato aggiunto e iniziano ad applicare 27088 transazioni
01:04 — Il blocco #216 (f75) è stato firmato e inviato agli altri nodi per la validazione
01:14 — Il nodo #2 ha preso dal pool 72912 transazioni e sta formando il blocco #217 (f85)
01:15 — Lo script demo ha completato il suo lavoro per i nodi #1 e #2
01:17 — I blocchi #216 (f75) e #216 (ea0) sono stati validati e inviati alla catena principale
01:21 — Il blocco #217 (f85) è stato firmato e inviato agli altri nodi per la validazione
01:26 — I blocchi #217 (f75) e #218 (ea0) sono stati aggiunti alla catena principale e i nodi iniziano ad applicare rispettivamente 51469 e 55102 transazioni
01:27 — Il blocco #217 (a85) è stato validato e inviato alla catena principale
01:41 — Il nodo #1 ha preso dal pool 36828 transazioni e sta formando il blocco #219 (46f)
01:41 — Il nodo #3 ha preso dal pool 32998 transazioni e sta formando il blocco #219 (bb3)
01:43 — Tutti i nodi hanno ricevuto dalla catena principale informazioni che il blocco #219 (a85) è stato aggiunto e iniziano a elaborare 72912 transazioni
01:46 — Il blocco #219 (46f) è stato firmato e inviato ad altri nodi per la validazione
01:46 — Il blocco #219 (bb3) è stato firmato e inviato ad altri nodi per la validazione
01:53 — Il nodo #2 ha elaborato tutte le 100k transazioni che erano nel pool
02:37 — Il blocco #219 (bb3) è stato validato e inviato alla catena principale
02:41 — Il blocco #219 (46f) è stato validato e inviato alla catena principale
02:48 — I blocchi #220 (bb3) e #221 (46f) sono stati aggiunti alla catena principale e i nodi iniziano a elaborare 32998 e 36828 transazioni rispettivamente
02:54 — Il nodo #1 ha elaborato tutte le 100k transazioni che erano nel pool
02:55 — Il nodo #3 ha elaborato tutte le 100k transazioni che erano nel pool
04:12 — Tutti i nodi contengono 300k transazioni e token dell'ultimo blocco #221
Test 2
3 nodi ricevono 1kk transazioni ciascuno. In totale, ci sono 3kk transazioni e token in tutti e 9 i nodi.

Stato iniziale: blocco finale #213; nel database sono salvate 0 transazioni e token.
00:00 — Avviati 3 script che generano e inviano 1kk transazioni ciascuno
02:29 — Ha avuto inizio l'invio di 1kk transazioni ai nodi #1 e #2
02:33 — Il nodo #1 ha prelevato dal pool 11668 transazioni e sta formando il blocco #222 (510)
02:35 — Il blocco #222 (510) è stato firmato e inviato ad altri nodi per la validazione
02:37 — Il blocco #222 (510) è stato validato e inviato alla catena principale
02:38 — Il nodo #2 ha prelevato dal pool 46378 transazioni e sta formando il blocco #222 (a9d)
02:38 — Ha avuto inizio l'invio di 1kk transazioni al nodo #3
02:41 — Il nodo #3 ha prelevato dal pool 5504 transazioni e sta formando il blocco #222 (387)
02:42 — Il blocco #222 (387) è stato firmato e inviato ad altri nodi per la validazione
02:44 — Il blocco #222 (a9d) è stato firmato e inviato ad altri nodi per la validazione
02:44 — Il blocco #222 (387) è stato validato e inviato alla catena principale
02:49 — Il blocco #222 (a9d) è stato validato e inviato alla catena principale
02:56 — I blocchi #222 (510), #223 (387) e #224 (a9d) sono stati aggiunti alla catena principale e i nodi iniziano a elaborare 11668, 5504 e 46378 transazioni rispettivamente
03:09 — Il nodo #1 ha prelevato dal pool 177170 transazioni e sta formando il blocco #225 (e50)
03:09 — Il nodo #3 ha prelevato dal pool 119327 transazioni e sta formando il blocco #225 (ccc)
03:10 — Il nodo #2 ha prelevato dal pool 149772 transazioni e sta formando il blocco #225 (404)
03:26 — Il blocco #225 (ccc) è stato firmato e inviato ad altri nodi per la validazione
03:32 — Il blocco #225 (404) è stato firmato e inviato ad altri nodi per la validazione
03:33 — Il blocco #225 (e50) è stato firmato e inviato ad altri nodi per la validazione
03:53 — Il blocco #225 (ccc) è stato validato e inviato alla catena principale
04:03 — Blocco #225 (e50) validato e inviato nella catena principale
04:04 — Blocco #225 (404) validato e inviato nella catena principale
04:06 — Tutti i nodi hanno ricevuto dalla catena principale informazioni che il blocco #225 (ccc) è stato aggiunto e iniziano ad applicare 119327 transazioni
04:14 — Tutti i nodi hanno ricevuto dalla catena principale informazioni che il blocco #226 (404) è stato aggiunto e iniziano ad applicare 149772 transazioni
04:16 — Tutti i nodi hanno ricevuto dalla catena principale informazioni che il blocco #227 (e50) è stato aggiunto e iniziano ad applicare 177170 transazioni
04:32 — Nodo #3 ha prelevato dal pool 209436 transazioni e sta formando il blocco #228 (1e9)
04:40 — Nodo #2 ha prelevato dal pool 212669 transazioni e sta formando il blocco #228 (e38)
04:40 — Nodo #1 ha prelevato dal pool 190144 transazioni e sta formando il blocco #228 (861)
05:02 — Blocco #228 (1e9) firmato e inviato ad altri nodi per la validazione
05:08 — Blocco #228 (861) firmato e inviato ad altri nodi per la validazione
05:10 — Blocco #228 (e38) firmato e inviato ad altri nodi per la validazione
06:13 — Blocco #228 (1e9) validato e inviato nella catena principale
06:13 — Blocco #228 (861) validato e inviato nella catena principale
06:13 — Blocco #228 (e38) validato e inviato nella catena principale
06:39 — I blocchi #228 (861), #229 (1e9) e #230 (e38) sono stati aggiunti nella catena principale e i nodi iniziano ad applicare 190144, 209436 e 212669 transazioni rispettivamente
07:07 — Nodo #1 ha prelevato dal pool 199770 transazioni e sta formando il blocco #231 (e04)
07:09 — Nodo #2 ha prelevato dal pool 190473 transazioni e sta formando il blocco #231 (36e)
07:09 — Nodo #3 ha prelevato dal pool 178807 transazioni e sta formando il blocco #231 (f43)
07:34 — Blocco #231 (e04) firmato e inviato ad altri nodi per la validazione
07:37 — Blocco #231 (36e) firmato e inviato ad altri nodi per la validazione
07:37 — Blocco #231 (f43) firmato e inviato ad altri nodi per la validazione
08:49 — Blocco #231 (e04) validato e inviato nella catena principale
08:51 — Blocco #231 (f43) validato e inviato nella catena principale
08:52 — Blocco #231 (36e) validato e inviato nella catena principale
09:47 — I blocchi #231 (e04), #232 (f43) e #233 (36e) sono stati aggiunti nella catena principale e i nodi iniziano ad applicare 199770, 178807 e 190473 transazioni rispettivamente
10:16 — Nodo #1 ha prelevato dal pool 153075 transazioni e sta formando il blocco #234 (e04)
10:16 — Nodo #2 ha prelevato dal pool 168035 transazioni e sta formando il blocco #234 (36e)
10:16 — Nodo #3 ha prelevato dal pool 166685 transazioni e sta formando il blocco #234 (f43)
10:42 — Blocco #234 (56d) firmato e inviato ad altri nodi per la validazione
11:59 — Blocco #234 (1bb) è stato validato e inviato alla catena principale
12:02 — Blocco #234 (58a) è stato validato e inviato alla catena principale
12:02 — Blocco #234 (56d) è stato validato e inviato alla catena principale
12:48 — I blocchi #234 (1bb), #235 (58a) e #236 (56d) sono stati aggiunti alla catena principale e i nodi iniziano ad applicare rispettivamente 153075, 168035 e 166685 transazioni
13:14 — Nodo #1 ha prelevato dal pool 112226 transazioni e sta formando il blocco #237 (5c0)
13:16 — Nodo #2 ha prelevato dal pool 87550 transazioni e sta formando il blocco #234 (58a)
13:16 — Nodo #3 ha prelevato dal pool 99594 transazioni e sta formando il blocco #234 (56d)
13:30 — Blocco #237 (5c0) è stato firmato e inviato ad altri nodi per la validazione
13:32 — Blocco #237 (58a) è stato firmato e inviato ad altri nodi per la validazione
13:34 — Blocco #237 (56d) è stato firmato e inviato ad altri nodi per la validazione
14:47 — Blocco #237 (58a) è stato validato e inviato alla catena principale
14:53 — Blocco #237 (5c0) non è stato validato entro il tempo specificato
14:53 — Tutti i nodi hanno ricevuto dalla catena principale informazioni sul fatto che il blocco #237 (58a) è stato aggiunto e iniziano ad applicare 87550 transazioni
14:54 — Blocco #237 (56d) è stato validato e inviato alla catena principale
15:02 — Nodo #1 ha prelevato dal pool 181206 transazioni e sta formando il blocco #238 (c5f)
15:06 — Tutti i nodi hanno ricevuto dalla catena principale informazioni sul fatto che il blocco #238 (56d) è stato aggiunto e iniziano ad applicare 99594 transazioni
15:12 — Nodo #2 ha prelevato dal pool 51990 transazioni e sta formando il blocco #239 (ad8)
15:20 — Blocco #239 (ad8) è stato firmato e inviato ad altri nodi per la validazione
15:25 — Nodo #3 ha prelevato dal pool 46685 transazioni e sta formando il blocco #239 (857)
15:30 — Blocco #238 (c5f) è stato firmato e inviato ad altri nodi per la validazione
15:34 — Blocco #239 (857) è stato firmato e inviato ad altri nodi per la validazione
16:32 — Blocco #239 (857) è stato validato e inviato alla catena principale
16:42 — Tutti i nodi hanno ricevuto dalla catena principale informazioni sul fatto che il blocco #239 (857) è stato aggiunto e iniziano ad applicare 46685 transazioni
16:42 — Blocco #238 (c5f) è stato validato e inviato alla catena principale
16:42 — Blocco #239 (ad8) non è stato validato entro il tempo specificato
16:54 — Nodo #2 ha prelevato dal pool 96882 transazioni e sta formando il blocco #240 (e6e)
16:56 — Nodo #3 ha prelevato dal pool 39704 transazioni e sta formando il blocco #240 (a47)
17:02 — Blocco #240 (a47) è stato firmato e inviato ad altri nodi per la validazione
17:02 — Blocco #240 (e6e) è stato firmato e inviato ad altri nodi per la validazione
17:18 — Tutti i nodi hanno ricevuto dalla catena principale l'informazione che il blocco #240 (c5f) è stato aggiunto e iniziano a elaborare 181206 transazioni
17:45 — Il blocco #240 (a47) è stato convalidato e inviato alla catena principale
17:47 — Il nodo #1 ha prelevato 54956 transazioni dal pool e sta formando il blocco #241 (170)
17:59 — Il blocco #241 (170) è stato firmato e inviato ad altri nodi per la convalida
18:09 — Tutti i nodi hanno ricevuto dalla catena principale l'informazione che il blocco #241 (a47) è stato aggiunto e iniziano a elaborare 181206 transazioni
18:20 — Il nodo #3 ha prelevato 39104 transazioni dal pool e sta formando il blocco #242 (955)
18:24 — Il blocco #240 (e6e) è stato convalidato e inviato alla catena principale
18:28 — Il blocco #242 (955) è stato firmato e inviato ad altri nodi per la convalida
18:09 — Tutti i nodi hanno ricevuto dalla catena principale l'informazione che il blocco #242 (e6e) è stato aggiunto e iniziano a elaborare 96882 transazioni
19:06 — Lo script dimostrativo ha terminato il suo lavoro per il nodo #1
19:08 — Lo script dimostrativo ha terminato il suo lavoro per il nodo #2
19:08 — Il nodo #2 ha prelevato 48241 transazioni dal pool e sta formando il blocco #243 (fde)
19:14 — Il blocco #243 (fde) è stato firmato e inviato ad altri nodi per la convalida
19:18 — Il blocco #241 (170) non è stato convalidato entro il tempo indicato
19:28 — Il nodo #1 ha prelevato 86967 transazioni dal pool e sta formando il blocco #243 (37c)
19:35 — Il blocco #242 (955) è stato convalidato e inviato alla catena principale
19:40 — Il blocco #243 (37c) è stato firmato e inviato ad altri nodi per la convalida
20:05 — Tutti i nodi hanno ricevuto dalla catena principale l'informazione che il blocco #243 (955) è stato aggiunto e iniziano a elaborare 39104 transazioni
20:15 — Il blocco #243 (fde) è stato convalidato e inviato alla catena principale
20:19 — Il nodo #3 ha prelevato 42981 transazioni dal pool e sta formando il blocco #244 (9b5)
20:26 — Il blocco #244 (9b5) è stato firmato e inviato ad altri nodi per la convalida
20:28 — Tutti i nodi hanno ricevuto dalla catena principale l'informazione che il blocco #244 (fde) è stato aggiunto e iniziano a elaborare 48241 transazioni
20:32 — Il nodo #2 ha elaborato tutte le 1k transazioni che erano nel pool
21:05 — Il blocco #243 (37c) non è stato convalidato entro il tempo indicato
21:15 — Il nodo #1 ha prelevato 86967 transazioni dal pool e sta formando il blocco #245 (37c)
21:32 — Il blocco #245 (37c) è stato firmato e inviato ad altri nodi per la convalida
21:42 — Il blocco #244 (9b5) è stato convalidato e inviato alla catena principale
21:50 — Tutti i nodi hanno ricevuto dalla catena principale l'informazione che il blocco #245 (9b5) è stato aggiunto e iniziano a elaborare 42981 transazioni
22:04 — Il nodo #3 ha prelevato 45361 transazioni dal pool e sta formando il blocco #246 (3f9)
22:11 — Il blocco #246 (3f9) è firmato e viene inviato ad altri nodi per la validazione
22:51 — Il blocco #245 (37c) non è stato validato entro il tempo specificato
23:01 — Il nodo #1 ha prelevato dal pool 86967 transazioni e sta formando il blocco #246 (37c)
23:08 — Lo script di demo ha terminato il suo lavoro per il nodo #3
23:15 — Il blocco #246 (37c) è firmato e viene inviato ad altri nodi per la validazione
23:32 — Il blocco #246 (3f9) non è stato validato entro il tempo specificato
23:42 — Il nodo #3 ha prelevato dal pool 52173 transazioni e sta formando il blocco #246 (71d)
23:51 — Il blocco #246 (71d) è firmato e viene inviato ad altri nodi per la validazione
24:38 — Il blocco #246 (37c) non è stato validato entro il tempo specificato
25:01 — Il nodo #1 ha prelevato dal pool 86967 transazioni e sta formando il blocco #246 (37c)
25:06 — Il blocco #246 (71d) è stato validato e inviato nella catena principale
25:12 — Il blocco #246 (37c) è firmato e viene inviato ad altri nodi per la validazione
25:14 — Tutti i nodi hanno ricevuto dalla catena principale informazioni che il blocco #246 (71d) è stato aggiunto e iniziano ad applicare 52173 transazioni
25:29 — Il nodo #3 ha elaborato tutte le 1k transazioni che erano nel pool
26:40 — Il blocco #247 (37c) non è stato validato entro il tempo specificato
26:47 — Il nodo #1 ha prelevato dal pool 86967 transazioni e sta formando il blocco #247 (37c)
27:03 — Il blocco #247 (37c) è firmato e viene inviato ad altri nodi per la validazione
28:29 — Il blocco #247 (37c) non è stato validato entro il tempo specificato
28:35 — Il nodo #1 ha prelevato dal pool 86967 transazioni e sta formando il blocco #247 (37c)
28:49 — Il blocco #247 (37c) è firmato e viene inviato ad altri nodi per la validazione
30:13 — Il blocco #247 (37c) non è stato validato entro il tempo specificato
30:23 — Il nodo #1 ha prelevato dal pool 86967 transazioni e sta formando il blocco #247 (37c)
30:38 — Il blocco #247 (37c) è firmato e viene inviato ad altri nodi per la validazione
32:00 — Il blocco #247 (37c) non è stato validato entro il tempo specificato
32:11 — Il nodo #1 ha prelevato dal pool 86967 transazioni e sta formando il blocco #247 (37c)
32:26 — Il blocco #247 (37c) è firmato e viene inviato ad altri nodi per la validazione
33:49 — Il blocco #247 (37c) non è stato validato entro il tempo specificato
33:59 — Il nodo #1 ha prelevato dal pool 86967 transazioni e sta formando il blocco #247 (37c)
34:12 — Il blocco #247 (37c) è firmato e viene inviato ad altri nodi per la validazione
35:34 — Il blocco #247 (37c) è stato validato e inviato nella catena principale
35:54 — Tutti i nodi hanno ricevuto dalla catena principale informazioni che il blocco #247 (37c) è stato aggiunto e iniziano ad applicare 86967 transazioni
36:11 — Il nodo #1 ha elaborato tutte le 1k transazioni che erano nel pool
55:12 — il primo nodo ha elaborato tutte le 3k transazioni

Conclusioni
È stato riscontrato che i server virtuali Azure hanno una potenza di elaborazione insufficiente per gestire un numero così elevato di transazioni. Tuttavia, per quanto riguarda l'obiettivo principale dei test, ossia dimostrare il funzionamento di Plasma Cash con MongoDB, il sistema ha performato bene.
Ti invitiamo a visitare GitHub progetto:
L'articolo è stato scritto in collaborazione con Alexander Nashivan, sviluppatore senior di .
In precedenza, il team di sviluppo aveva già testato la velocità di Plasma Cash. I risultati sono esposti in .
Fonte: habr.com
