A tendência do blockchain continua em alta. Cada vez mais especialistas preveem a adoção universal dessa tecnologia em um futuro próximo. No momento, algumas questões permanecem não resolvidas, impedindo isso.
Primeiramente, os sistemas de blockchain modernos têm dificuldades de escalabilidade. Por exemplo, a capacidade de transações do Ethereum é de apenas 20 por segundo e, apesar de suas numerosas vantagens, não é adequado para grandes empresas.
Ao mesmo tempo, o Ethereum é valorizado por sua sólida proteção contra invasões e falhas na rede. Portanto, não deve ser descartado. Seria muito mais sensato corrigir as desvantagens do Ethereum e transformá-las em vantagens.

Plasma Cash como solução para privacidade e escalabilidade no Ethereum
Plasma é uma tecnologia apresentada por Vitalik Buterin, co-fundador do projeto Ethereum, na conferência EthCC em Paris em 2018. Ela foi desenvolvida em colaboração com Joseph Poon, co-fundador da Lightning Network, e é apresentada como uma solução que aumenta a capacidade computacional do blockchain Ethereum. As primeiras notícias sobre Plasma vazaram para a mídia em 2017.
Essa plataforma representa um nível externo de contratos inteligentes que podem interagir com o blockchain principal, descarregando assim a cadeia raiz, reduzindo as taxas de transação para contratos inteligentes e aplicativos descentralizados (DApps).
Mais informações sobre o desenvolvimento foram apresentadas no documento "", datado de agosto de 2017.
Buterin reconheceu que a Plasma enfrenta problemas de escalabilidade: cada usuário deve carregar e verificar a autenticidade de cada bloco de Plasma, o que impede a escalabilidade exponencial.
Para corrigir essa deficiência, foi desenvolvida a Plasma Cash — uma cadeia secundária composta por um contrato inteligente e uma rede privada baseada em Node.js, que periodicamente transfere seu estado para a cadeia raiz (Ethereum). Ela garante descentralização, segurança e escalabilidade no blockchain, resolvendo assim a Trilema da Escalabilidade.
Uma vantagem importante do Plasma Cash em relação ao Plasma é que ele atrai a atenção dos usuários apenas para os blocos que contêm as moedas que lhes interessam:
“Agora os usuários precisam verificar a disponibilidade e a validade da cadeia Plasma apenas para um índice especial, relacionado às moedas que desejam gastar, que possuem e que lhes interessam”, disse Buterin.
De acordo com os desenvolvedores, o Plasma Cash é uma solução eficaz contra invasões no Ethereum. Cada moeda Plasma tem um proprietário e é única. Ninguém pode se apropriar das moedas de outro usuário sem o seu consentimento. O detentor da moeda pode evitar a retirada fraudulenta de fundos por meio de um sistema de "contestações", apresentando suas "provas de dados" no histórico de sua moeda.
Teste do Plasma Cash no Mongo Atlas
Devido à sua novidade, o Plasma Cash ainda é pouco estudado. Especialistas em blockchain estão testando ativamente sua interação com vários serviços em nuvem e bancos de dados, registrando deficiências e encontrando maneiras de corrigi-las. Em particular, os testes no Mongo Atlas revelaram as seguintes vantagens ao trabalhar com Plasma:
- Proteção confiável contra perda de dados, uma vez que várias réplicas se sincronizam entre si no cluster.
- Acesso rápido, pois o cluster pode ser criado nas três plataformas de nuvem mais populares: Amazon, Google, Azure. Como resultado, um nó do Plasma Cash pode ser implantado em vários data centers localizados próximos ao Mongo Atlas. Comprovamos que a velocidade não diminui significativamente, mesmo se os nós do Plasma forem implantados em data centers mais distantes.
- Os nós do Plasma, utilizados apenas em modo de leitura, podem ser conectados a um único cluster do Mongo e estar localizados em diferentes partes do mundo, o que melhora a geo-escalabilidade (os nós estão mais próximos dos usuários).
- Implantar um novo nó é fácil, pois não é necessário sincronizar tudo novamente. Pode-se simplesmente conectar a um cluster existente do Mongo ou fazer uma cópia rapidamente e configurar a conexão com ele.
- Escalonar o banco de dados é fácil. Com o tempo, os dados aumentam e é possível aumentar o tamanho dos nós no cluster conforme necessário.

Utilizamos os seguintes servidores para conduzir os testes:
- 3 servidores virtuais Azure Standard E4s v3 (4 vcpus, 32 GiB de memória). Cada servidor roda 3 nós. Um deles pode submeter blocos na cadeia raiz.
- Cada nó está conectado ao seu próprio cluster Mongo Atlas M50, contendo 3 nós em modo de réplica.
Teste 1
3 nós recebem 100 mil transações cada. No total, todos os 9 nós contêm 300 mil transações e tokens.

Estado inicial: último bloco #213; no banco de dados estão armazenadas 0 transações e tokens.
00:00 — Iniciados 3 scripts, que geram e enviam 100 mil transações cada
00:29 — Começou o envio de 100 mil transações para os nós #1 e #2
00:32 — Começou o envio de 100 mil transações para o nó #3
00:32 — O nó #1 pegou do pool 11.703 transações e está formando o bloco #214 (9fb)
00:34 — O nó #2 pegou do pool 27.088 transações e está formando o bloco #214 (ef4)
00:34 — O bloco #214 (9fb) foi assinado e enviado para os outros nós para validação
00:36 — O nó #3 pegou do pool 11.900 transações e está formando o bloco #214 (983)
00:37 — O bloco #214 (9fb) foi validado e enviado para a cadeia raiz
00:38 — O bloco #214 (983) foi assinado e enviado para os outros nós para validação
00:38 — O bloco #214 (ef4) foi assinado e enviado para os outros nós para validação
00:40 — O bloco #214 (983) foi validado e enviado para a cadeia raiz
00:41 — Todos os nós receberam da cadeia raiz a informação de que o bloco #214 (9fb) foi adicionado e começam a aplicar 11.703 transações
00:45 — Todos os nós receberam da cadeia raiz a informação de que o bloco #215 (983) foi adicionado e começam a aplicar 11.900 transações
00:51 — O bloco #214 (ef4) foi validado e enviado para a cadeia raiz
00:52 — O nó #1 pegou do pool 51.469 transações e está formando o bloco #216 (ea0)
00:56 — O nó #3 pegou do pool 55.102 transações e está formando o bloco #216 (f75)
00:58 — O script de demonstração terminou seu trabalho para o nó #2
00:58 — O bloco #216 (ea0) foi assinado e enviado para os outros nós para validação
00:58 — Todos os nós receberam da cadeia raiz a informação de que o bloco #216 (ef4) foi adicionado e começam a aplicar 27.088 transações
01:04 — O bloco #216 (f75) foi assinado e enviado para os outros nós para validação
01:14 — O nó #2 pegou do pool 72.912 transações e está formando o bloco #217 (f85)
01:15 — O script de demonstração terminou seu trabalho para os nós #1 e #2
01:17 — Os blocos #216 (f75) e #216 (ea0) foram validados e enviados para a cadeia raiz
01:21 — O bloco #217 (f85) foi assinado e enviado para os outros nós para validação
01:26 — Os blocos #217 (f75) e #218 (ea0) foram adicionados à cadeia raiz e os nós começam a aplicar 51469 e 55102 transações, respectivamente
01:27 — O bloco #217 (a85) foi validado e enviado à cadeia raiz
01:41 — O nó #1 pegou 36828 transações do pool e está formando o bloco #219 (46f)
01:41 — O nó #3 pegou 32998 transações do pool e está formando o bloco #219 (bb3)
01:43 — Todos os nós receberam da cadeia raiz a informação de que o bloco #219 (a85) foi adicionado e começam a aplicar 72912 transações
01:46 — O bloco #219 (46f) foi assinado e enviado para validação a outros nós
01:46 — O bloco #219 (bb3) foi assinado e enviado para validação a outros nós
01:53 — O nó #2 processou todas as 100k transações que estavam no pool
02:37 — O bloco #219 (bb3) foi validado e enviado à cadeia raiz
02:41 — O bloco #219 (46f) foi validado e enviado à cadeia raiz
02:48 — Os blocos #220 (bb3) e #221 (46f) foram adicionados à cadeia raiz e os nós começam a aplicar 32998 e 36828 transações, respectivamente
02:54 — O nó #1 processou todas as 100k transações que estavam no pool
02:55 — O nó #3 processou todas as 100k transações que estavam no pool
04:12 — Todos os nós contêm 300k transações e tokens do último bloco #221
Teste 2
3 nós recebem 1kk de transações cada. No total, há 3kk de transações e tokens em todos os 9 nós.

Estado inicial: último bloco #213; no banco de dados estão armazenadas 0 transações e tokens.
00:00 — 3 scripts foram iniciados, gerando e enviando 1kk de transações cada
02:29 — O envio de 1kk de transações para os nós #1 e #2 começou
02:33 — O nó #1 pegou 11668 transações do pool e está formando o bloco #222 (510)
02:35 — O bloco #222 (510) foi assinado e enviado para validação a outros nós
02:37 — O bloco #222 (510) foi validado e enviado à cadeia raiz
02:38 — O nó #2 pegou 46378 transações do pool e está formando o bloco #222 (a9d)
02:38 — O envio de 1kk de transações para o nó #3 começou
02:41 — O nó #3 pegou 5504 transações do pool e está formando o bloco #222 (387)
02:42 — O bloco #222 (387) foi assinado e enviado para validação a outros nós
02:44 — O bloco #222 (a9d) foi assinado e enviado para validação a outros nós
02:44 — O bloco #222 (387) foi validado e enviado à cadeia raiz
02:49 — O bloco #222 (a9d) foi validado e enviado à cadeia raiz
02:56 — Os blocos #222 (510), #223 (387) e #224 (a9d) foram adicionados à cadeia raiz e os nós começam a aplicar 11668, 5504 e 46378 transações, respectivamente
03:09 — O nó #1 pegou 177170 transações do pool e está formando o bloco #225 (e50)
03:09 — O nó #3 pegou 119327 transações do pool e está formando o bloco #225 (ccc)
03:10 — O nó #2 pegou do pool 149772 transações e está formando o bloco #225 (404)
03:26 — O bloco #225 (ccc) foi assinado e enviado para outros nós para validação
03:32 — O bloco #225 (404) foi assinado e enviado para outros nós para validação
03:33 — O bloco #225 (e50) foi assinado e enviado para outros nós para validação
03:53 — O bloco #225 (ccc) foi validado e enviado para a cadeia principal
04:03 — O bloco #225 (e50) foi validado e enviado para a cadeia principal
04:04 — O bloco #225 (404) foi validado e enviado para a cadeia principal
04:06 — Todos os nós receberam da cadeia principal a informação de que o bloco #225 (ccc) foi adicionado e começam a aplicar 119327 transações
04:14 — Todos os nós receberam da cadeia principal a informação de que o bloco #226 (404) foi adicionado e começam a aplicar 149772 transações
04:16 — Todos os nós receberam da cadeia principal a informação de que o bloco #227 (e50) foi adicionado e começam a aplicar 177170 transações
04:32 — O nó #3 pegou do pool 209436 transações e está formando o bloco #228 (1e9)
04:40 — O nó #2 pegou do pool 212669 transações e está formando o bloco #228 (e38)
04:40 — O nó #1 pegou do pool 190144 transações e está formando o bloco #228 (861)
05:02 — O bloco #228 (1e9) foi assinado e enviado para outros nós para validação
05:08 — O bloco #228 (861) foi assinado e enviado para outros nós para validação
05:10 — O bloco #228 (e38) foi assinado e enviado para outros nós para validação
06:13 — O bloco #228 (1e9) foi validado e enviado para a cadeia principal
06:13 — O bloco #228 (861) foi validado e enviado para a cadeia principal
06:13 — O bloco #228 (e38) foi validado e enviado para a cadeia principal
06:39 — Os blocos #228 (861), #229 (1e9) e #230 (e38) foram adicionados à cadeia principal e os nós começam a aplicar 190144, 209436 e 212669 transações respectivamente
07:07 — O nó #1 pegou do pool 199770 transações e está formando o bloco #231 (e04)
07:09 — O nó #2 pegou do pool 190473 transações e está formando o bloco #231 (36e)
07:09 — O nó #3 pegou do pool 178807 transações e está formando o bloco #231 (f43)
07:34 — O bloco #231 (e04) foi assinado e enviado para outros nós para validação
07:37 — O bloco #231 (36e) foi assinado e enviado para outros nós para validação
07:37 — O bloco #231 (f43) foi assinado e enviado para outros nós para validação
08:49 — O bloco #231 (e04) foi validado e enviado para a cadeia principal
08:51 — O bloco #231 (f43) foi validado e enviado para a cadeia principal
08:52 — O bloco #231 (36e) foi validado e enviado para a cadeia principal
09:47 — Blocos #231 (e04), #232 (f43) e #233 (36e) adicionados à cadeia raiz, e os nós começam a aplicar 199770, 178807 e 190473 transações, respectivamente
10:16 — O nó #1 pegou do pool 153075 transações e está formando o bloco #234 (e04)
10:16 — O nó #2 pegou do pool 168035 transações e está formando o bloco #234 (36e)
10:16 — O nó #3 pegou do pool 166685 transações e está formando o bloco #234 (f43)
10:42 — O bloco #234 (56d) foi assinado e enviado para outros nós para validação
11:59 — O bloco #234 (1bb) foi validado e enviado para a cadeia raiz
12:02 — O bloco #234 (58a) foi validado e enviado para a cadeia raiz
12:02 — O bloco #234 (56d) foi validado e enviado para a cadeia raiz
12:48 — Os blocos #234 (1bb), #235 (58a) e #236 (56d) foram adicionados à cadeia raiz, e os nós começam a aplicar 153075, 168035 e 166685 transações, respectivamente
13:14 — O nó #1 pegou do pool 112226 transações e está formando o bloco #237 (5c0)
13:16 — O nó #2 pegou do pool 87550 transações e está formando o bloco #234 (58a)
13:16 — O nó #3 pegou do pool 99594 transações e está formando o bloco #234 (56d)
13:30 — O bloco #237 (5c0) foi assinado e enviado para outros nós para validação
13:32 — O bloco #237 (58a) foi assinado e enviado para outros nós para validação
13:34 — O bloco #237 (56d) foi assinado e enviado para outros nós para validação
14:47 — O bloco #237 (58a) foi validado e enviado para a cadeia raiz
14:53 — O bloco #237 (5c0) não foi validado dentro do tempo especificado
14:53 — Todos os nós receberam da cadeia raiz a informação de que o bloco #237 (58a) foi adicionado e começam a aplicar 87550 transações
14:54 — O bloco #237 (56d) foi validado e enviado para a cadeia raiz
15:02 — O nó #1 pegou do pool 181206 transações e está formando o bloco #238 (c5f)
15:06 — Todos os nós receberam da cadeia raiz a informação de que o bloco #238 (56d) foi adicionado e começam a aplicar 99594 transações
15:12 — O nó #2 pegou do pool 51990 transações e está formando o bloco #239 (ad8)
15:20 — O bloco #239 (ad8) foi assinado e enviado para outros nós para validação
15:25 — O nó #3 pegou do pool 46685 transações e está formando o bloco #239 (857)
15:30 — O bloco #238 (c5f) foi assinado e enviado para outros nós para validação
15:34 — O bloco #239 (857) foi assinado e enviado para outros nós para validação
16:32 — O bloco #239 (857) foi validado e enviado para a cadeia raiz
16:42 — Todos os nós receberam da cadeia raiz a informação de que o bloco #239 (857) foi adicionado e começam a aplicar 46685 transações
16:42 — O bloco #238 (c5f) foi validado e enviado para a cadeia raiz
16:42 — O bloco #239 (ad8) não foi validado no tempo especificado
16:54 — O nó #2 pegou 96882 transações do pool e está formando o bloco #240 (e6e)
16:56 — O nó #3 pegou 39704 transações do pool e está formando o bloco #240 (a47)
17:02 — O bloco #240 (a47) foi assinado e enviado para outros nós para validação
17:02 — O bloco #240 (e6e) foi assinado e enviado para outros nós para validação
17:18 — Todos os nós receberam informações da cadeia raiz de que o bloco #240 (c5f) foi adicionado e começam a aplicar 181206 transações
17:45 — O bloco #240 (a47) foi validado e enviado para a cadeia raiz
17:47 — O nó #1 pegou 54956 transações do pool e está formando o bloco #241 (170)
17:59 — O bloco #241 (170) foi assinado e enviado para outros nós para validação
18:09 — Todos os nós receberam informações da cadeia raiz de que o bloco #241 (a47) foi adicionado e começam a aplicar 181206 transações
18:20 — O nó #3 pegou 39104 transações do pool e está formando o bloco #242 (955)
18:24 — O bloco #240 (e6e) foi validado e enviado para a cadeia raiz
18:28 — O bloco #242 (955) foi assinado e enviado para outros nós para validação
18:09 — Todos os nós receberam informações da cadeia raiz de que o bloco #242 (e6e) foi adicionado e começam a aplicar 96882 transações
19:06 — O script de demonstração terminou seu trabalho no nó #1
19:08 — O script de demonstração terminou seu trabalho no nó #2
19:08 — O nó #2 pegou 48241 transações do pool e está formando o bloco #243 (fde)
19:14 — O bloco #243 (fde) foi assinado e enviado para outros nós para validação
19:18 — O bloco #241 (170) não foi validado no tempo especificado
19:28 — O nó #1 pegou 86967 transações do pool e está formando o bloco #243 (37c)
19:35 — O bloco #242 (955) foi validado e enviado para a cadeia raiz
19:40 — O bloco #243 (37c) foi assinado e enviado para outros nós para validação
20:05 — Todos os nós receberam informações da cadeia raiz de que o bloco #243 (955) foi adicionado e começam a aplicar 39104 transações
20:15 — O bloco #243 (fde) foi validado e enviado para a cadeia raiz
20:19 — O nó #3 pegou 42981 transações do pool e está formando o bloco #244 (9b5)
20:26 — O bloco #244 (9b5) foi assinado e enviado para outros nós para validação
20:28 — Todos os nós receberam informações da cadeia raiz de que o bloco #244 (fde) foi adicionado e começam a aplicar 48241 transações
20:32 — O nó #2 processou todas as 1kk transações que estavam no pool
21:05 — O bloco #243 (37c) não foi validado no tempo especificado
21:15 — O nó #1 pegou 86967 transações do pool e está formando o bloco #245 (37c)
21:32 — Bloco #245 (37c) assinado e enviado para validação por outros nós
21:42 — Bloco #244 (9b5) validado e enviado para a cadeia raiz
21:50 — Todos os nós receberam da cadeia raiz a informação de que o bloco #245 (9b5) foi adicionado e começam a aplicar 42981 transações
22:04 — O nó #3 pegou do pool 45361 transações e está formando o bloco #246 (3f9)
22:11 — Bloco #246 (3f9) assinado e enviado para validação por outros nós
22:51 — Bloco #245 (37c) não foi validado no tempo especificado
23:01 — O nó #1 pegou do pool 86967 transações e está formando o bloco #246 (37c)
23:08 — O script de demonstração concluiu seu trabalho para o nó #3
23:15 — Bloco #246 (37c) assinado e enviado para validação por outros nós
23:32 — Bloco #246 (3f9) não foi validado no tempo especificado
23:42 — O nó #3 pegou do pool 52173 transações e está formando o bloco #246 (71d)
23:51 — Bloco #246 (71d) assinado e enviado para validação por outros nós
24:38 — Bloco #246 (37c) não foi validado no tempo especificado
25:01 — O nó #1 pegou do pool 86967 transações e está formando o bloco #246 (37c)
25:06 — Bloco #246 (71d) validado e enviado para a cadeia raiz
25:12 — Bloco #246 (37c) assinado e enviado para validação por outros nós
25:14 — Todos os nós receberam da cadeia raiz a informação de que o bloco #246 (71d) foi adicionado e começam a aplicar 52173 transações
25:29 — O nó #3 processou todas as 1kk transações que estavam no pool
26:40 — Bloco #247 (37c) não foi validado no tempo especificado
26:47 — O nó #1 pegou do pool 86967 transações e está formando o bloco #247 (37c)
27:03 — Bloco #247 (37c) assinado e enviado para validação por outros nós
28:29 — Bloco #247 (37c) não foi validado no tempo especificado
28:35 — O nó #1 pegou do pool 86967 transações e está formando o bloco #247 (37c)
28:49 — Bloco #247 (37c) assinado e enviado para validação por outros nós
30:13 — Bloco #247 (37c) não foi validado no tempo especificado
30:23 — O nó #1 pegou do pool 86967 transações e está formando o bloco #247 (37c)
30:38 — Bloco #247 (37c) assinado e enviado para validação por outros nós
32:00 — Bloco #247 (37c) não foi validado no tempo especificado
32:11 — O nó #1 pegou do pool 86967 transações e está formando o bloco #247 (37c)
32:26 — Bloco #247 (37c) assinado e enviado para validação por outros nós
33:49 — Bloco #247 (37c) não foi validado no tempo especificado
33:59 — O nó #1 pegou do pool 86967 transações e está formando o bloco #247 (37c)
34:12 — Bloco #247 (37c) assinado e enviado para validação por outros nós
35:34 — Bloco #247 (37c) validado e enviado para a cadeia raiz
35:54 — Todos os nós receberam da cadeia raiz a informação de que o bloco #247 (37c) foi adicionado e começaram a processar 86967 transações
36:11 — O nó #1 processou todas as 1kk transações que estavam no pool
55:12 — O primeiro nó processou todas as 3kk transações

Resultados
Foi identificado que os servidores virtuais Azure têm capacidade de processamento insuficiente para lidar com tantas transações. Mas a principal tarefa dos testes, que era demonstrar o funcionamento do Plasma Cash com MongoDB, foi bem-sucedida.
Convidamos você a visitar GitHub do projeto:
O artigo foi escrito em coautoria com Alexander Nashivan, desenvolvedor sênior .
Anteriormente, a equipe de desenvolvimento já havia testado a velocidade do Plasma Cash. Os resultados estão apresentados em .
Fonte: habr.com
