Перейти к основному содержимому
Блокчейн62ГЛАВА 62Fabric и Ethereum: одна задача, два решенияETHгазпубличноSolidity96830газаFABRICбез платыпо пропускуTypeScript2,1 сна записьодна зачётка, два пути

Fabric и Ethereum: одна задача, два решения

Прочитано0%
Квизы0/4
Тренажёрыне пройден0/1
Уровень 1 · Новичок

Зачем это нужно​

За пять глав про Fabric и двадцать глав про Ethereum накопилось два способа делать одно и то же. На чемпионате может достаться любой, а в жизни выбор придётся обосновывать перед человеком, который спросит «зачем нам блокчейн вообще».

Эта глава — не список «десять отличий». Это одна и та же задача, написанная дважды и запущенная вживую: зачётная книжка на Solidity в сети geth и она же чейнкодом в сети Fabric. Числа ниже сняты в этой же сессии.

Та же зачётка на Solidity​

Вот контракт, который делает ровно то же, что чейнкод из главы про смарт-контракт Fabric:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

contract Zachetka {
struct Ocenka { string predmet; uint8 ball; }
struct Zapis { string fio; string gruppa; bool est; }

mapping(string => Zapis) private zapisi;
mapping(string => Ocenka[]) private ocenki;

event Zavedena(string id, string fio);
event OcenkaPostavlena(string id, string predmet, uint8 ball);

function zavesti(string calldata id, string calldata fio, string calldata gruppa) external {
require(!zapisi[id].est, "Zachetka uzhe zavedena");
zapisi[id] = Zapis(fio, gruppa, true);
emit Zavedena(id, fio);
}

function postavitOcenku(string calldata id, string calldata predmet, uint8 ball) external {
require(zapisi[id].est, "Zachetki net");
require(ball >= 2 && ball <= 5, "Ball vne diapazona 2..5");
ocenki[id].push(Ocenka(predmet, ball));
emit OcenkaPostavlena(id, predmet, ball);
}
}

Сравните построчно с чейнкодом. Проверки те же: «уже заведена», «зачётки нет», «балл вне диапазона». Логика та же. Разница — в четырёх местах:

Нажми на часть выражения

Живой прогон обеих​

Развёртываем контракт в сети geth и проделываем те же операции:

развёртывание: газ 994183 | адрес 0x5FbDB2315678afecb367f032d93F642f64180aa3
завести зачётку: газ 95512
поставить оценку: газ 96830
вторая оценка: газ 79802
чтение (бесплатно): Ковалик Олег | ИС-21 | Базы данных=5, Веб-разработка=4
балл 7: execution reverted: "Ball vne diapazona 2..5"
повторная зачётка: execution reverted: "Zachetka uzhe zavedena"
чужая зачётка: execution reverted: "Zachetki net"
найдено событий: 2 → Базы данных=5, Веб-разработка=4

Те же операции в Fabric:

поставить оценку (с ожиданием записи): real 2.22 / real 2.11 / real 2.12
прочитать зачётку: real 0.06 / real 0.07 / real 0.06
ОДНА ЗАЧЁТКА, ДВЕ РЕАЛИЗАЦИИ — ЖИВОЙ ПРОГОНSolidity + gethЧейнкод + Fabricразвернуть994 183 газапять шагов, газа нетзавести зачётку95 512 газагаза нетпоставить оценку96 830 газагаза нетзапись, времяблок сети2,1 с (таймаут пачки)чтение, времябесплатно, мгновенно0,06 систория полятолько через событияgetHistoryForKeyодинаковые проверки, одинаковые отказы — разная цена и разные встроенные возможности
Одинаковые проверки и отказы, разная цена и разные встроенные возможности

Три наблюдения из этих чисел.

Газ. Каждая запись в Ethereum стоит: почти сто тысяч единиц за постановку одной оценки. В настоящей сети это деньги. В Fabric платы нет вообще — сеть своя, а расходы это расходы на серверы.

Задержка. Fabric пишет за 2,1 секунды, и это почти целиком таймаут пачки блоков (BatchTimeout: 2s). То есть задержкой здесь управляют: уменьшили настройку — стало быстрее. В открытой сети время блока задано снаружи, и повлиять на него нельзя.

Вторая оценка дешевле первой — 79 802 против 96 830. Так работает плата за память в Ethereum: первая запись в пустую ячейку дороже последующих. В Fabric такой арифметики нет вовсе.

Интересный факт

Интересная мелочь: кириллица в данных прошла оба пути нормально. А вот сообщения об отказе в Fabric утилита peer печатает восьмеричными последовательностями, тогда как ethers показывает текст require как есть. Поэтому в чейнкоде тексты ошибок лучше писать латиницей — их читают через CLI.

Отвечено вопросов: 0 из 3
Почему вторая запись оценки в Solidity дешевле первой?
Из чего складываются 2,1 секунды записи в Fabric?
Где находится состояние контракта?
Отвечено верно: 0 из 3

Восемь отличий, из которых следует всё остальное​

ВОСЕМЬ ОТЛИЧИЙ, КОТОРЫЕ РЕШАЮТ ВСЁ ОСТАЛЬНОЕEthereumFabricличностьключ, придуманный самимвыданный сертификаткто читаетвесь миручастники каналаязыкSolidityTypeScript, Go, Javaпорядок работыупорядочить → исполнитьисполнить → упорядочитьокончательностьчерез подтверждениясразуплатагаз в монете сетинетобновление кодановый адрес или проксиномер правки +1состояниеполя контрактаобщее хранилище ключ-значение
Различия не косметические: из них выводятся все остальные особенности
ОсьEthereumFabric
Личностьключ, сгенерированный самимсертификат, выданный организацией
Кто читаетвесь миручастники канала
ЯзыкSolidityTypeScript, Go, Java
Порядок работыупорядочить → исполнитьисполнить → упорядочить → проверить
Окончательностьчерез подтверждениясразу
Платагаз в монете сетинет
Обновление кодановый адрес или прокси-контрактномер правки плюс один
Состояниеполя контрактаобщее хранилище «ключ — значение»

Остановимся на двух строках, потому что из них выводится больше всего.

Порядок работы. В Ethereum узел исполняет транзакции из уже готового блока, строго по очереди. Поэтому недетерминированный код там не проблема — все считают одно и то же в одном порядке. В Fabric код исполняют независимые пиры до всякой очереди, поэтому детерминизм становится жёстким требованием, а состязание за один ключ даёт MVCC_READ_CONFLICT.

Обновление. В Ethereum развёрнутый контракт неизменяем. Чтобы поправить ошибку, разворачивают новый и переводят на него пользователей, либо заранее строят схему с прокси-контрактом — отдельная большая тема со своими уязвимостями. В Fabric обновление — штатная операция: те же пять шагов с номером правки на единицу больше, состояние остаётся на месте.

Важно

Возможность обновлять код — это одновременно и удобство, и потеря гарантии. В открытой сети «код есть закон» работает потому, что код нельзя подменить. В Fabric большинство организаций канала может поменять правила — и это нормально ровно настолько, насколько они связаны договором.

Что осталось одинаковым​

Список различий длинный, и от него легко сделать вывод, что это разные миры. Одинакового не меньше.

  • Цепочка блоков, где каждый ссылается на хеш предыдущего. Переписать прошлое нельзя ни там, ни там.
  • Только дописывание. Ошибочную запись исправляют новой записью, а не правкой старой.
  • Подписи под каждой сделкой и проверка, что подписант имеет право.
  • Код как источник правды: правила применяются одинаково ко всем и выполняются автоматически.
  • Исполнение на нескольких независимых узлах с последующей сверкой.
  • Детерминизм и явные проверки как основа: те же require, те же отказы, та же привычка писать проверку первой строкой функции.
Совет

Поэтому переход между ними — это переучивание инструментов, а не образа мышления. Человек, который разобрал повторный вход и порядок «проверки, запись, вызовы», в Fabric сядет и напишет рабочий чейнкод к вечеру.

Отвечено вопросов: 0 из 3
Почему недетерминированный код не ломает Ethereum?
Как обновляют код в двух системах?
Что осталось одинаковым?
Отвечено верно: 0 из 3

Как выбирать​

ОДИН ВОПРОС РЕШАЕТ ВЫБОРУчастники известны заранее и связаны договором?Нет — открытая сетьтокены, публичные рынки, кошелёк у любогоцена: газ, публичность, чужая скоростьДа — закрытая сетьжурналы, поставки, дипломы, документыцена: своя инфраструктура и договоресли участников нельзя назвать по именам — закрытая сеть не подойдёт, как бы ни хотелось
Всё сводится к одному вопросу про участников

Вопрос ровно один: можно ли назвать участников по именам заранее?

Если нет — открытая сеть. Токены, публичные рынки, обмен без посредника, любой желающий с кошельком. Цена: газ, публичность и чужая скорость.

Если да — закрытая. Журнал дипломов, цепочка поставок, документооборот между филиалами, медицинские записи. Цена: своя инфраструктура и договор между участниками.

И третий, самый частый на практике ответ: блокчейн не нужен вовсе. Если участник один — хватит базы данных с журналом изменений. Блокчейн решает задачу недоверия между несколькими сторонами; там, где сторона одна, он добавляет сложность и ничего не возвращает.

Три признака, что задача действительно для блокчейна:

  • участников несколько, и они не подчиняются друг другу;
  • им нужен общий журнал, а не обмен копиями;
  • никто из них не должен иметь возможности переписать прошлое незаметно для остальных.

Не набралось всех трёх — скорее всего, нужна база данных.

Типичные ошибки​

Ошибка 1. «Fabric — это Ethereum попроще».

Нет. Это ответ на другой вопрос. Из Fabric нельзя сделать открытую сеть, а из Ethereum — закрытую, не выбросив половину смысла.

Ошибка 2. Переносить привычки Solidity в чейнкод.

Самая частая: попытка держать состояние в полях класса. Поля есть, они даже работают между вызовами внутри контейнера, но в реестр не попадают — и на другом пире их не будет.

Ошибка 3. Считать, что закрытая сеть безопаснее.

Закрытая сеть защищена ровно настолько, насколько защищены выданные сертификаты и настроены политики. Ошибка в политике — и одна организация тихо получает право менять всё.

Ошибка 4. Обещать неизменяемость там, где код можно обновить.

В Fabric большинство организаций канала может поменять чейнкод. Формулировка «запись нельзя подделать» верна, «правила нельзя изменить» — нет.

Ошибка 5. Брать блокчейн туда, где участник один.

Самая дорогая. База данных с журналом изменений решит задачу быстрее, дешевле и понятнее.

Отвечено вопросов: 0 из 3
Какой вопрос решает выбор между открытой и закрытой сетью?
Когда блокчейн не нужен вообще?
Верно ли «в Fabric правила нельзя изменить»?
Отвечено верно: 0 из 3

Шпаргалка по главе​

ВопросEthereumFabric
Как войтизавести ключ самомуполучить сертификат
Кто видит записивсеучастники канала
Сколько стоит записьгазнисколько
Когда запись окончательнапосле подтвержденийсразу
Где состояниеполя контрактахранилище «ключ — значение»
История полясобирают из событийgetHistoryForKey
Как обновить кодновый адрес или проксиномер правки + 1
Что проверять после вызовачек транзакциисостояние или --waitForEvent

Словарь главы​

ТерминЧто это
Открытая сетьСеть, куда входят без разрешения; записи видны всем
Закрытая сетьСеть по сертификатам; записи видны участникам канала
ГазПлата за вычисления и память в открытой сети
ОкончательностьМомент, с которого запись точно не исчезнет
Прокси-контрактПриём обновления кода в Ethereum: адрес постоянный, логика заменяемая
Номер правкиСпособ обновления в Fabric: определение с номером на единицу больше
«Код есть закон»Правило открытых сетей, держащееся на невозможности подменить код

Цель: скорость ≥ 95 зн/мин, точность ≥ 88%

require(!zapisi[id].est, "Zachetka uzhe zavedena");

Что должен уметь после главы​

  • написать одну и ту же логику двумя способами и объяснить, чем отличается код;
  • назвать цену записи в обеих системах и объяснить, из чего складывается задержка;
  • перечислить восемь отличий и вывести из них остальные особенности;
  • назвать то, что осталось одинаковым, и объяснить, почему переход несложен;
  • выбрать систему под задачу одним вопросом про участников;
  • честно сказать заказчику, когда блокчейн не нужен вовсе.

Проверка по главе​

Сводная проверка по всей главе: 10 вопросов, 5:00 на всё, без подсказок по ходу. Вопросы показываются по одному, ответ изменить нельзя. Если время выйдет — экзамен завершится с тем, что успел ответить. Пересдавать можно сколько угодно раз.

Экзамен по блоку: Приватный блокчейн: Hyperledger Fabric

Сводная проверка по 6 главам блока: 25 вопросов, 10:00 на всё, по одному вопросу, без возврата. Пересдавать можно сколько угодно раз.

Готовность: экзамены глав сданы 0 из 6. Блок можно сдавать и так, но шанс выше после всех глав.

Куда дальше: проверенные ресурсы​

Видео по теме

ВидеоEthereum vs Hyperledger | Which Blockchain Technology to Choose | Blockchain Training | Edurekaedureka!
ВидеоHyperledger vs Ethereum | Difference between Hyperledger and Ethereum | 101 Blockchains101Blockchains
ВидеоНиколай Ерёмин - Архитектура приватного блокчейн на Hyperledger Fabric. Стачка 18Стачка IT конференция
ВидеоPublic Blockchain vs Private: Which Is Better?On The Block (by Espeo Software)
ВидеоBlockchain Simplified: Public, Private, Consortium & Hybrid Explained | Key DifferencesNeeraj

Комментарии

Обсуждение живёт в GitHub Discussions и грузится с чужого домена — поэтому только по нажатию.