Pull to refresh

Публичное тестирование решения для конфиденциальности и масштабируемости в Эфириуме на облачных платформах

Reading time 11 min
Views 762
Original author: Sergey Grybniak, Oleksandr Nashyvan
Блокчейн тренд продолжает набирать обороты. Все больше экспертов прогнозируют универсальную адаптацию данной технологии в скором будущем. На данный момент нерешенными остаются несколько проблем, препятствующих этому.

Прежде всего, современные блокчейн системы плохо масштабируются. Например, пропускная способность Эфириума составляет всего 20 транзакций в секунду, и, несмотря на многочисленные преимущества, он не подходит для крупного бизнеса.

В то же время, Эфириум ценится за мощную защиту от взлома и сбоев сети. Так что не следует списывать его со счетов. Куда целесообразнее исправить недостатки Эфириума и превратить их в преимущества.



Plasma Cash как решение для конфиденциальности и масштабируемости в Эфириуме


Plasma – технология, представленная Виталиком Бутериным, сооснователем проекта Ethereum, на конференции EthCC в Париже в 2018. Она была разработана совместно с Джозефом Пуном, сооснователем Lightning Network, и заявлена как решение, увеличивающее вычислительную мощность блокчейна Эфириум. Первые новости о Plasma просочились в медиа в 2017.

Данная платформа представляет собой внешний уровень смарт-контрактов, способных взаимодействовать с основным блокчейном, тем самым разгружая корневую цепочку, уменьшая транзакционные сборы за смарт-контракты и децентрализованные приложения (DApps).

Подробная информация о разработке была изложена в документе «Plasma: Scalable Autonomous Smart Contracts», датированном августом 2017-го года.

Бутерин признал, что Plasma присущи проблемы с масштабируемостью: каждый пользователь должен загружать и проверять подлинность каждого блока Plasma, что предотвращает экспоненциальное масштабирование.

Чтобы исправить этот недостаток, была разработана Plasma Cash — дочерняя цепочка, состоящая из смарт-контракта и приватной сети на основе Node.js, периодически передающей свое состояние в корневую цепочку (Эфириум). Она беспечивает децентрализацию, безопасность и масштабируемость в блокчейне, решая тем самым Трилемму Масштабируемости.

Важным преимуществом Plasma Cash на фоне Plasma является то, что она привлекает внимание пользователей только к тем блокам, что содержат интересующие их монеты:
«Теперь пользователям нужно проверять доступность и правильность цепи Plasma только для специального индекса, связанного с монетами, которые они хотят потратить, которыми владеют и которые их интересуют», – сказал Бутерин.

По словам разработчиков, Plasma Cash является эффективным лекарством от взломов в Эфириуме. Каждая монета Plasma имеет владельца и является уникальной. Никто не может завладеть монетами другого пользователя без его ведома. Держатель монеты может предотвратить потенциальный мошеннический вывод средств через систему «жалоб», предъявив свои «данные доказательства» в истории своей монеты.

Тестирование Plasma Cash в Mongo Atlas


В силу своей новизны, Plasma Cash пока остается мало изученной. Блокчейн специалисты активно тестируют ее взаимодействие с различными облачными сервисами и базами данных, фиксируют недостатки и находят пути их исправления. В частности, тесты в Mongo Atlas выявили следующие преимущества при работе с Plasma:

  1. Надежная защита от потери данных, так как несколько реплик синхронизирующихся между собой в кластере.
  2. Быстрый доступ, так как кластер можно создать на трех самых популярных облачных платформах: Amazon, Google, Azure. В результате, Plasma Cash ноду можно развернуть в многих датацентрах, расположенных близко к Mongo Atlas. Нами было доказано, что скорость не сильно падает, даже если Plasma ноды разворачиваются в более удаленных датацентрах.
  3. Plasma ноды, используемые только в режиме чтения, могут быть подключены к одному Mongo кластеру и расположены в разных уголках мира, что улучшает гео-масштабируемость (ноды находятся ближе к пользователям).
  4. Развернуть новую ноду легко, так как не нужно все заново синхронизировать. Можно просто подключится к существующему Mongo кластеру или быстро сделать копию и настроить подключение к ней.
  5. Масштабировать базу данных легко. Со временем данных становится больше, и можно увеличивать размер нод в кластере по мере необходимости.



Мы использовали следующие сервера для проведения тестов:

  • 3 виртуальных Azure сервера Standard E4s v3 (4 vcpus, 32 GiB memory). На каждом сервере поднято 3 ноды. Один из них может сабмитить блоки в корневую цепочку.
  • Каждая нода подключена к своему Mongo Atlas кластеру M50, содержащему 3 ноды в режиме реплики.

Тест 1


3 ноды получают по 100к транзакций. Итого, во всех 9 нодах содержится 300к транзакций и токенов.


Исходное состояние: последний блок #213; в базе сохранено 0 транзакций и токенов.

00:00 — Запущено 3 скрипта, которые генерируют и отправляют по 100к транзакций
00:29 — Началась отправка по 100к транзакций в ноды #1 и #2
00:32 — Началась отправка 100к транзакций ноду #3
00:32 — Нода #1 взяла из пула 11703 транзакций и формирует блок #214 (9fb)
00:34 — Нода #2 взяла из пула 27088 транзакций и формирует блок #214 (ef4)
00:34 — Блок #214 (9fb) подписан и отправляется другим нодам на валидацию
00:36 — Нода #3 взяла из пула 11900 транзакций и формирует блок #214 (983)
00:37 — Блок #214 (9fb) провалидирован и отправлен в корневую цепочку
00:38 — Блок #214 (983) подписан и отправляется другим нодам на валидацию
00:38 — Блок #214 (ef4) подписан и отправляется другим нодам на валидацию
00:40 — Блок #214 (983) провалидирован и отправлен в корневую цепочку
00:41 — Все ноды получили из корневой цепочки информацию о том, что блок #214 (9fb) добавлен и начинают применять 11703 транзакций
00:45 — Все ноды получили из корневой цепочки информацию о том, что блок #215 (983) добавлен и начинают применять 11900 транзакций
00:51 — Блок #214 (ef4) провалидирован и отправлен в корневую цепочку
00:52 — Нода #1 взяла из пула 51469 транзакций и формирует блок #216 (ea0)
00:56 — Нода #3 взяла из пула 55102 транзакций и формирует блок #216 (f75)
00:58 — Демо скрипт закончил свою работу для ноды #2
00:58 — Блок #216 (ea0) подписан и отправляется другим нодам на валидацию
00:58 — Все ноды получили из корневой цепочки информацию о том, что блок #216 (ef4) добавлен и начинают применять 27088 транзакций
01:04 — Блок #216 (f75) подписан и отправляется другим нодам на валидацию
01:14 — Нода #2 взяла из пула 72912 транзакций и формирует блок #217 (f85)
01:15 — Демо скрипт закончил свою работу для ноды #1 и #2
01:17 — Блоки #216 (f75) и #216 (ea0) провалидированы и отправлены в корневую цепочку
01:21 — Блок#217 (f85) подписан и отправляется другим нодам на валидацию
01:26 — Блоки #217 (f75) и #218 (ea0) добавлены в корневую цепочку и ноды начинают применять 51469 и 55102 транзакций соответственно
01:27 — Блок #217 (а85) провалидирован и отправлен в корневую цепочку
01:41 — Нода #1 взяла из пула 36828 транзакций и формирует блок #219 (46f)
01:41 — Нода #3 взяла из пула 32998 транзакций и формирует блок #219 (bb3)
01:43 — Все ноды получили из корневой цепочки информацию о том, что блок #219 (а85) добавлен и начинают применять 72912 транзакций
01:46 — Блок #219 (46f) подписан и отправляется другим нодам на валидацию
01:46 — Блок #219 (bb3) подписан и отправляется другим нодам на валидацию
01:53 — Нода #2 обработала все 100к транзакций, что были в пуле
02:37 — Блок #219 (bb3) провалидирован и отправлен в корневую цепочку
02:41 — Блок#219 (46f) провалидирован и отправлен в корневую цепочку
02:48 — Блоки #220 (bb3) и #221 (46f) добавлены в корневую цепочку и ноды начинают применять 32998 и 36828 транзакций соответственно
02:54 — Нода #1 обработала все 100к транзакций, что были в пуле
02:55 — Нода #3 обработала все 100к транзакций, что были в пуле
04:12 — Все ноды содержат по 300к транзакций и токенов последний блок #221

Тест 2


3 ноды получают по 1кк транзакций. Итого во всех 9 нодах содержится 3кк транзакций и токенов.



Исходное состояние: последний блок #213; в базе сохранено 0 транзакций и токенов.

00:00 — Запущено 3 скрипта, которые генерируют и отправляют по 1кк транзакций
02:29 — Началась отправка по 1кк транзакций в ноды #1 и #2
02:33 — Нода #1 взяла из пула 11668 транзакций и формирует блок #222 (510)
02:35 — Блок #222 (510) подписан и отправляется другим нодам на валидацию
02:37 — Блок #222 (510) провалидирован и отправлен в корневую цепочку
02:38 — Нода #2 взяла из пула 46378 транзакций и формирует блок #222 (a9d)
02:38 — Началась отправка 1кк транзакций ноду #3
02:41 — Нода #3 взяла из пула 5504 транзакций и формирует блок #222 (387)
02:42 — Блок #222 (387) подписан и отправляется другим нодам на валидацию
02:44 — Блок #222 (a9d) подписан и отправляется другим нодам на валидацию
02:44 — Блок #222 (387) провалидирован и отправлен в корневую цепочку
02:49 — Блок #222 (a9d) провалидирован и отправлен в корневую цепочку
02:56 — Блоки #222 (510) #223 (387) и #224 (a9d) добавлены в корневую цепочку и ноды начинают применять 11668, 5504 и 46378 транзакций соответственно
03:09 — Нода #1 взяла из пула 177170 транзакций и формирует блок #225 (e50)
03:09 — Нода #3 взяла из пула 119327 транзакций и формирует блок #225 (ccc)
03:10 — Нода #2 взяла из пула 149772 транзакций и формирует блок #225 (404)
03:26 — Блок #225 (ccc) подписан и отправляется другим нодам на валидацию
03:32 — Блок #225 (404) подписан и отправляется другим нодам на валидацию
03:33 — Блок #225 (e50) подписан и отправляется другим нодам на валидацию
03:53 — Блок #225 (ccc) провалидирован и отправлен в корневую цепочку
04:03 — Блок #225 (e50) провалидирован и отправлен в корневую цепочку
04:04 — Блок #225 (404) провалидирован и отправлен в корневую цепочку
04:06 — Все ноды получили из корневой цепочки информацию о том, что блок #225 (ccc) добавлен и начинают применять 119327 транзакций
04:14 — Все ноды получили из корневой цепочки информацию о том, что блок #226 (404) добавлен и начинают применять 149772 транзакций
04:16 — Все ноды получили из корневой цепочки информацию о том, что блок #227 (e50) добавлен и начинают применять 177170 транзакций
04:32 — Нода #3 взяла из пула 209436 транзакций и формирует блок #228 (1e9)
04:40 — Нода #2 взяла из пула 212669 транзакций и формирует блок #228 (e38)
04:40 — Нода #1 взяла из пула 190144 транзакций и формирует блок #228 (861)
05:02 — Блок #228 (1e9) подписан и отправляется другим нодам на валидацию
05:08 — Блок #228 (861) подписан и отправляется другим нодам на валидацию
05:10 — Блок #228 (e38) подписан и отправляется другим нодам на валидацию
06:13 — Блок #228 (1e9) провалидирован и отправлен в корневую цепочку
06:13 — Блок #228 (861) провалидирован и отправлен в корневую цепочку
06:13 — Блок #228 (e38) провалидирован и отправлен в корневую цепочку
06:39 — Блоки #228 (861) #229 (1e9) и #230 (e38) добавлены в корневую цепочку и ноды начинают применять 190144, 209436 и 212669 транзакций соответственно
07:07 — Нода #1 взяла из пула 199770 транзакций и формирует блок #231 (e04)
07:09 — Нода #2 взяла из пула 190473 транзакций и формирует блок #231 (36e)
07:09 — Нода #3 взяла из пула 178807 транзакций и формирует блок #231 (f43)
07:34 — Блок #231 (e04) подписан и отправляется другим нодам на валидацию
07:37 — Блок #231 (36e) подписан и отправляется другим нодам на валидацию
07:37 — Блок #231 (f43) подписан и отправляется другим нодам на валидацию
08:49 — Блок #231 (e04) провалидирован и отправлен в корневую цепочку
08:51 — Блок #231 (f43) провалидирован и отправлен в корневую цепочку
08:52 — Блок #231 (36e) провалидирован и отправлен в корневую цепочку
09:47 — Блоки #231 (e04) #232 (f43) и #233 (36e) добавлены в корневую цепочку и ноды начинают применять 199770, 178807 и 190473 транзакций соответственно
10:16 — Нода #1 взяла из пула 153075 транзакций и формирует блок #234 (e04)
10:16 — Нода #2 взяла из пула 168035 транзакций и формирует блок #234 (36e)
10:16 — Нода #3 взяла из пула 166685 транзакций и формирует блок #234 (f43)
10:42 — Блок #234 (56d) подписан и отправляется другим нодам на валидацию
11:59 — Блок #234 (1bb) провалидирован и отправлен в корневую цепочку
12:02 — Блок #234 (58a) провалидирован и отправлен в корневую цепочку
12:02 — Блок #234 (56d) провалидирован и отправлен в корневую цепочку
12:48 — Блоки #234 (1bb) #235 (58a) и #236 (56d) добавлены в корневую цепочку и ноды начинают применять 153075, 168035 и 166685 транзакций соответственно
13:14 — Нода #1 взяла из пула 112226 транзакций и формирует блок #237 (5c0)
13:16 — Нода #2 взяла из пула 87550 транзакций и формирует блок #234 (58a)
13:16 — Нода #3 взяла из пула 99594 транзакций и формирует блок #234 (56d)
13:30 — Блок #237 (5c0) подписан и отправляется другим нодам на валидацию
13:32 — Блок #237 (58a) подписан и отправляется другим нодам на валидацию
13:34 — Блок #237 (56d) подписан и отправляется другим нодам на валидацию
14:47 — Блок #237 (58a) провалидирован и отправлен в корневую цепочку
14:53 — Блок #237 (5c0) не был провалидирован за указанное время
14:53 — Все ноды получили из корневой цепочки информацию о том, что блок #237 (58a) добавлен и начинают применять 87550 транзакций
14:54 — Блок #237 (56d) провалидирован и отправлен в корневую цепочку
15:02 — Нода #1 взяла из пула 181206 транзакций и формирует блок #238 (c5f)
15:06 — Все ноды получили из корневой цепочки информацию о том, что блок #238 (56d) добавлен и начинают применять 99594 транзакций
15:12 — Нода #2 взяла из пула 51990 транзакций и формирует блок #239 (ad8)
15:20 — Блок #239 (ad8) подписан и отправляется другим нодам на валидацию
15:25 — Нода #3 взяла из пула 46685 транзакций и формирует блок #239 (857)
15:30 — Блок #238 (c5f) подписан и отправляется другим нодам на валидацию
15:34 — Блок #239 (857) подписан и отправляется другим нодам на валидацию
16:32 — Блок #239 (857) провалидирован и отправлен в корневую цепочку
16:42 — Все ноды получили из корневой цепочки информацию о том, что блок #239 (857) добавлен и начинают применять 46685 транзакций
16:42 — Блок #238 (c5f) провалидирован и отправлен в корневую цепочку
16:42 — Блок #239 (ad8) не был провалидирован за указанное время
16:54 — Нода #2 взяла из пула 96882 транзакций и формирует блок #240 (e6e)
16:56 — Нода #3 взяла из пула 39704 транзакций и формирует блок #240 (a47)
17:02 — Блок #240 (a47) подписан и отправляется другим нодам на валидацию
17:02 — Блок #240 (e6e) подписан и отправляется другим нодам на валидацию
17:18 — Все ноды получили из корневой цепочки информацию о том, что блок #240 (c5f) добавлен и начинают применять 181206 транзакций
17:45 — Блок #240 (a47) провалидирован и отправлен в корневую цепочку
17:47 — Нода #1 взяла из пула 54956 транзакций и формирует блок #241 (170)
17:59 — Блок #241 (170) подписан и отправляется другим нодам на валидацию
18:09 — Все ноды получили из корневой цепочки информацию о том, что блок #241 (a47) добавлен и начинают применять 181206 транзакций
18:20 — Нода #3 взяла из пула 39104 транзакций и формирует блок #242 (955)
18:24 — Блок #240 (e6e) провалидирован и отправлен в корневую цепочку
18:28 — Блок #242 (955) подписан и отправляется другим нодам на валидацию
18:09 — Все ноды получили из корневой цепочки информацию о том, что блок #242 (e6e) добавлен и начинают применять 96882 транзакций
19:06 — Демо скрипт закончил свою работу для ноды #1
19:08 — Демо скрипт закончил свою работу для ноды #2
19:08 — Нода #2 взяла из пула 48241 транзакций и формирует блок #243 (fde)
19:14 — Блок #243 (fde) подписан и отправляется другим нодам на валидацию
19:18 — Блок #241 (170) не был провалидирован за указанное время
19:28 — Нода #1 взяла из пула 86967 транзакций и формирует блок #243 (37c)
19:35 — Блок #242 (955) провалидирован и отправлен в корневую цепочку
19:40 — Блок #243 (37c) подписан и отправляется другим нодам на валидацию
20:05 — Все ноды получили из корневой цепочки информацию о том, что блок #243 (955) добавлен и начинают применять 39104 транзакций
20:15 — Блок #243 (fde) провалидирован и отправлен в корневую цепочку
20:19 — Нода #3 взяла из пула 42981 транзакций и формирует блок #244 (9b5)
20:26 — Блок #244 (9b5) подписан и отправляется другим нодам на валидацию
20:28 — все ноды получили из корневой цепочки информацию о том, что блок #244 (fde) добавлен и начинают применять 48241 транзакций
20:32 — Нода #2 обработала все 1кк транзакций, что были в пуле
21:05 — Блок #243 (37c) не был провалидирован за указанное время
21:15 — Нода #1 взяла из пула 86967 транзакций и формирует блок #245 (37c)
21:32 — Блок #245 (37c) подписан и отправляется другим нодам на валидацию
21:42 — Блок #244 (9b5) провалидирован и отправлен в корневую цепочку
21:50 — Все ноды получили из корневой цепочки информацию о том, что блок #245 (9b5) добавлен и начинают применять 42981 транзакций
22:04 — Нода #3 взяла из пула 45361 транзакций и формирует блок #246 (3f9)
22:11 — Блок #246 (3f9) подписан и отправляется другим нодам на валидацию
22:51 — Блок #245 (37c) не был провалидирован за указанное время
23:01 — Нода #1 взяла из пула 86967 транзакций и формирует блок #246 (37c)
23:08 — Демо скрипт закончил свою работу для ноды #3
23:15 — Блок #246 (37c) подписан и отправляется другим нодам на валидацию
23:32 — Блок #246 (3f9) не был провалидирован за указанное время
23:42 — Нода #3 взяла из пула 52173 транзакций и формирует блок #246 (71d)
23:51 — Блок #246 (71d) подписан и отправляется другим нодам на валидацию
24:38 — Блок #246 (37c) не был провалидирован за указанное время
25:01 — Нода #1 взяла из пула 86967 транзакций и формирует блок #246 (37c)
25:06 — Блок #246 (71d) провалидирован и отправлен в корневую цепочку
25:12 — Блок #246 (37c) подписан и отправляется другим нодам на валидацию
25:14 — Все ноды получили из корневой цепочки информацию о том, что блок #246 (71d) добавлен и начинают применять 52173 транзакций
25:29 — Нода #3 обработала все 1кк транзакций, что были в пуле
26:40 — Блок #247 (37c) не был провалидирован за указанное время
26:47 — Нода #1 взяла из пула 86967 транзакций и формирует блок #247 (37c)
27:03 — Блок #247 (37c) подписан и отправляется другим нодам на валидацию
28:29 — Блок #247 (37c) не был провалидирован за указанное время
28:35 — Нода #1 взяла из пула 86967 транзакций и формирует блок #247 (37c)
28:49 — Блок #247 (37c) подписан и отправляется другим нодам на валидацию
30:13 — Блок #247 (37c) не был провалидирован за указанное время
30:23 — Нода #1 взяла из пула 86967 транзакций и формирует блок #247 (37c)
30:38 — Блок #247 (37c) подписан и отправляется другим нодам на валидацию
32:00 — Блок #247 (37c) не был провалидирован за указанное время
32:11 — Нода #1 взяла из пула 86967 транзакций и формирует блок #247 (37c)
32:26 — Блок #247 (37c) подписан и отправляется другим нодам на валидацию
33:49 — Блок #247 (37c) не был провалидирован за указанное время
33:59 — Нода #1 взяла из пула 86967 транзакций и формирует блок #247 (37c)
34:12 — Блок #247 (37c) подписан и отправляется другим нодам на валидацию
35:34 — Блок #247 (37c) провалидирован и отправлен в корневую цепочку
35:54 — Все ноды получили из корневой цепочки информацию о том, что блок #247 (37c) добавлен и начинают применять 86967 транзакций
36:11 — Нода #1 обработала все 1кк транзакций, что были в пуле
55:12 — первая нода обработала все 3кк транзакций



Итоги


Было выявлено, что виртуальные сервера Azure имеют недостаточную процессорную мощность для обработки такого большого количества транзакций. Но с основной задачей тестов, а именно продемонстрировать работу Plasma Cash с MongoDB, система справилась хорошо.

Приглашаем вас посетить GitHub проекта: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Статья была написана в соавторстве с Александром Нашиваном, старшим разработчиком Clever Solution Inc.

Ранее команда разработчиков Opporty уже тестировала скорость Plasma Cash. Результаты изложены в данной статье.
Tags:
Hubs:
+4
Comments 0
Comments Leave a comment

Articles