Skip to content

Instantly share code, notes, and snippets.

@kirushik
Last active June 28, 2021 13:14
Show Gist options
  • Star 22 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save kirushik/0e11cd261c8a6e762c3310cef24af692 to your computer and use it in GitHub Desktop.
Save kirushik/0e11cd261c8a6e762c3310cef24af692 to your computer and use it in GitHub Desktop.
Баллада о Бравом Блокчейне

Баллада о Бравом Блокчейне

Автор — kirill@pimenov.cc
Лицензия — CC BY-SA 4.0, https://creativecommons.org/licenses/by-sa/4.0/deed.ru

Во-первых, гит — это тоже такой себе блокчейн.

Собственно блок-чейн, цепочка блоков — это структура, где каждое текущее положение определяется хешем, который вычисляется из прошлого по функции new_block = hash(old_block+metadata+data)

Где data — это собственно полезная нагрузка, скажем информация из каких файлов в какие какие строки переместились, или с каких кошельков на какие деньги переводятся.

metadata — это типа сообщение коммита, подпись "здесь был Вася" или ещё что-нибудь не очень нужное, типа передовицы Таймс (погуглите, почему она вставлена в метадату первого aka genesis блока Биткоина на досуге).

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

Такой торрентовый гитхаб.

Дальше вопрос — а вот я и Михаил договорились оба про какой-то old_block, потом каждый из нас вычислил свой собственный new_block, мы оба запушили в торренто-гит каждый свой блок.

Как понять, чей блок это новая ветка master, а у кого форк голимый, который даже чекаутить не надо?

Есть более-менее три механизма:

1) PoA, Proof of Authority.

Мы все вначале договариваемся, что Яндекс, Гугл, Байду, Эпл и лично товарищ Столлман являются для нас авторитетами

Соответственно, на чьём блоке есть больше их цифровых подписей — тот и папка.

И можно даже ещё придумать механизм, по которому кворумом эти ребята могут кого-то исключать или включать к себе в гаранты.

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

Ну вот а тут то же самое, только голосованием

2) PoS, Proof of Stake.

Это всё то же самое, просто голосуют все владельцы кошельков, голосуют пропорционально тому сколько у них бабок. В случае если какая-то из черепашек пиздит и подписывает "списать у Васи 100, но Пете приписать 400", его не только позором изгоняют из племени, но ещё и кошелёк отдают под фанфары тому, кто нашёл нескладушку.

Но тут опять-таки, кто из нас с Мишей первый успел на блок подписей собрать — тот и майнер.

3) PoW, Proof of Work.

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

В итоге каждый из нас сидит и дрочит часами "aaaaa", "aaaab" и так далее в коммит-мессадже. Пока хеш не сойдётся.

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

То есть у Миши есть типа десять минут чтобы всем рассказать, какой он молодец и нашёл новый блок до того, как я найду свой такой же с дофига нулей.

Вот, собственно, и весь криптоблокчейн. В каждой из систем блоки готовить сложнее/рискованнее, чем проверять. Соответственно, можно эффективно вычислять и отбрасывать те, в которых транзакции неправильные, или есть какие-то денежные переводы, которые не подписаны должным образом

Транзакция — это всего лишь текст "я обладатель приватного ключа А, хочу перевести 70 теньге на счёт Б", подписанный приватным ключом А.

1) Очевидно, что в системе PoA эти самые авторити и должны хранить всю историю транзакций. А что там на остальных нодах — пофигу по сути. Соответственно, есть несколько сущностей, рубящих бабло (или иной профит) на майнинге — вот они пусть и покупают терабайты дисков, сети до этого дела нет. Всегда можно Авторити спросить "а сколько там бабла на кошельке Икс", мы же всё равно им доверяем быть арбитрами всех транзакций. Собственно, всё ровно как сейчас с ПэйПэлом, только авторитетов больше одного

2) В системе PoS врать совсем невыгодно — за любую провинность расстрел и отъём денег.

Соответственно, можно равномерным образом размазать базу блоков по узлам, и пусть конкретный блок будет только на 10 случайных узлах из 1000, но этого достаточно чтобы мне было у кого его спросить. (Спросить три раза, и потом покарать лжеца на деньги, если где-то что-то не сойдётся)

3) Остаётся PoW, где действительно все узлы должны хранить весь стейт.

И развесистое дерево транзакций (aka перетасовываний строк) в наших блоках-файлах можно нарубать на кусочки. Тремя способами.

Во-первых, можно просто раз в сколько-то времени договариваться о сбросе истории.

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

Но в принципе регулярная смена эпох позволит хранить только последнюю эпоху, а в предыдущих пусть отдельные археологи копаются, можно их просто стереть

Второй способ — а можно нарубить транзакции "по вертикали".

То есть вместо одного блокчейна иметь несколько параллельных. И каждый новый узел будет висеть в двух-трёх случайных. Соответственно, транзакции бывают двух типов, внутри ствола и в соседний ствол.

При этом стволов может быть дофига, скажем 300. Но конкретному узлу надо хранить только свои три. И ещё надо найти узлов, которые могут работать мостиками между твоим стволом, и стволом получателя.

Но эти все вещи в общем решаются точно так же как и в торрентах, можно погуглить по ключевым словам DHT (Distributed Hash Table) и Kademlia (наиболее простой из DHT-протоколов, на котором в своё время eMule работал)

Третий способ — постепенно забывать блоки из прошлого, каким-то таким образом что чем дальше в прошлое, тем менее густо блоки по узлам распределены (но чтобы хотя бы несколько узлов с каждым блоком оставались)

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment