О фейковых криптовалютах (Ethereum, Tron, Ripple и пр)
В многочисленных популярных роликах и текстах, объясняющих принципы работы криптовалют, это объяснение обычно дается на примере Bitcoin — первой из криптовалют. Биткоин — на самом деле чистая и понятная реализация принципов, необходимых для криптовалюты: открытость истории транзакций, возможность проверки источника денег по цепочке, понятные правила появления денег, понятные правила создания новых транзакций. Новые монеты появляются только в результате майнинга новых блоков, и награда за майнинг постепенно снижается по логарифмическому закону, в результате чего общая сумма выпущеных биткоинов никогда не превысит лимита (21 миллион). Любая трата денег (вход транзакции) должна соответствовать выходу другой транзакции, деньги не могут появиться ниоткуда. Для траты нужно подписать транзакцию приватным ключом. Простой скриптовый язык позволяет делать multisig и всякие другие полезные вещи, в том числе и создавать новые валюты (токены) на базе биткоинового блокчейна (omni layer, так живёт USDT). Центрального узла нет, новый блок определяется консенсусом всех узлов — при наличии нескольких вариантов они принимают ту ветку, в которой сделано максимальное количество вычислений, это формальный критерий, не допускающий разночтений. Собственный узел может запустить любой пользователь, исходный код открыт.
К сожалению, концепция криптовалют, несмотря на своё изящество, не нашла понимания у основной массы пользователей. «Среднему пользователю» неважно, лежат ли его деньги в распределённом блокчейне или на каком-то конкретном сайте. Для него это всё равно «где-то в сети». Когда деньги на сайте — даже спокойнее, потому что понятно, кто за него отвечает, в случае чего можно поругаться или написать в соцсети о том, какие они негодяи, или даже подать в суд, а если деньги «потерялись» в блокчейне, то и пожаловаться некому. Пользователи, покупающие биткоины, не хранят приватные ключи у себя, а в основном делегируют это посторонним сайтам, потому для них разницы действительно нет. А даже если хранят у себя — сначала ведь этот ключ они где-то генерируют, и потом скачивают. Понятно, что это уже не полностью их ключ. В результате распространяются слухи о «взломе биткоина», когда деньги уходят хакерам, и подобные байки. С другой стороны, умные и авторитетные люди объясняют, что блокчейн и построенные на нём криптовалюты — это надёжно и правильно, и не верить им нет оснований.
Это закономерно привело к появлению муляжей криптовалют, которые якобы используют те же технологии, но при этом дают преференции их создателям, т.е. не такие уж децентрализованные. Для пользователей всё равно, а создателям профит. Самый распространённый из таких муляжей — Ethereum.
В нулевом блоке эфира роздано 72_009_995 Ether на 8903 адреса, это больше, чем всего получено наград за майнинг блоков (сначала было 5 Ether за блок, потом сделали 3 Ether, сейчас 2 Ether) за всё время. Ещё раз: более половины всего эфира, который сейчас есть в наличии, был роздан в нулевом блоке при старте этой криптовалюты, а меньшая часть появилась в результате майнинга блоков. Попробуйте нагуглить этот факт в описании этой криптовалюты — скорее всего ничего не выйдет, он не афишируется, и даже скрывается.
Эфирная нода geth эти стартовые транзакции не показывает, как будто их нет. Говорит, что нулевой блок пустой.
Эксплореры либо показывают их существование, но не дают смотреть подробности (etherscan.io, blockchair.com), либо вообще их не показывают, в результате чего история транзакций по адресу выглядит странно: только траты, без прихода, но положительный или нулевой итоговый баланс. Особую пикантность эта информация приобретает в сочетании с декларируемыми планами перехода с proof-of-work к proof-of-stake, т.е. изменение алгоритма консенсуса с «прав тот, кто проделал больше вычислений» на «прав тот, у кого больше денег».
Наличие такого мухлежа в стартовом блоке привело к тому, что эта криптовалюта в принципе не могла быть столь же открытой и прозрачной, как биткоин, иначе эта история была бы сразу всем видна. И если в биткоине для определения баланса адреса достаточно посчитать сумму utxo (неизрасходованных выходов транзакций), то в эфире это намного сложнее: нужно просматривать все транзакции по адресу (траты и поступления), но и этого недостаточно: баланс может измениться в результате работы смартконтракта («internal transactions»), а это бинарный код в теле транзакции. В результате, даже запустив собственную ноду, я не могу посмотреть историю операций по какому-то адресу (даже моему собственному), мне для этого нужно обращаться к сторонним сайтам, работающим на собственном софте, т.е. доверять им: «There’s not currently any way to do this using the web3 API. […] Blockchain explorers like etherscan obtain internal transactions by running a modified node with an instrumented EVM» (1); «The trouble I see with this is that this centralizes that data. If I create that data, how you know I didn’t fake it? I’ve been trying to figure out a way to both index it and decentralize the ‘indexing calculation.’ I know how to decentralize the storage (IPFS), but not how to decentralize the indexing calculation. (2) Историю изменений баланса адреса негде запросить, потому что она просто нигде не хранится: нода хранит только состояние (баланс каждого адреса), а в блокчейне сохраняется контрольная сумма (хеш) от этого состояния, ну и сами транзакции, в виде бинарного кода.
Эфирные сматрконтракты — отдельная песня. По сути это ничем не отличается от выполнения какого-то бинарного файла на вашем компьютере, его код не открыт, а логика работы неизвестна. То, что он находится в блокчейне, а не на чьём-то сайте, ни на что принципиально не влияет, кроме психологии пользователей, доверяющих слову «блокчейн». Что, собственно, и требуется. Стандарт ERC20 определяет «узнаваемые» сигнатуры функций, вроде «передать столько-то токенов от такого-то адреса такому-то», но ERC20 не регламентирует, какие ещё функции могут быть у этого смартконтракта (например, «забрать все токены у всех пользователей»). Код смартконтракта, как и код обычной программы, автор может открыть, но это вопрос доброй воли. Смартконтрактам с открытым кодом, конечно, есть больше оснований доверять — в той же степени, что и обычным программам с открытым кодом. Но многим ли пользователям важно, что у Chromium и у Firefox открытый код, а у Chrome и Safari закрытый?
Поскольку чистота и изящество технической реализации не являлись целью при создании эфира, эти качества по сравнению с биткоином в эфире сильно пострадали. Приведу несколько примеров.
У транзации bitcoin может быть несколько входов и несколько выходов. В результате я могу, например, давать каждому своему контрагенту отдельный адрес для перечисления мне денег, смотреть, когда кто-то из них заплатил, а когда мне самому нужно заплатить — я могу платить с нескольких этих адресов одновременно. А для сдачи сгенерировать какой-то новый адрес. В результате получается определённая степень анонимности: тот, кому я заплатил, не знает, сколько у меня всего денег на других адресах, сколько клиентов, которым я плачу и т.п. Прослеживание истории каждого из входов транзакции, в которой он получил от меня деньги, не даст ему никакой интересной информации.
В эфире у транзакции один вход и один выход. Чтобы заплатить кому-то, если я не хочу платить несколькими частями (на то она и транзакция), мне нужно сначала собрать достаточно денег на одном своём адресе, а потом с него выплатить, причём сдача останется там же. История транзакций по адресу, с которого человек получил от меня платёж, даст много информации обо мне.
И дело не только в приватности. Проводя платёж, я помещаю в блокчейн публичный ключ для этого адреса. Получение приватного ключа по публичному в данный момент малореально, но с появлением квантовых компьютеров всё может быть. У биткоина, как я говорил, сдача идёт на новый адрес (именно так рекомендуют делать), и на тех адресах, с которых произошёл платёж, т.е. публичные ключи которых опубликованы в блокчейне, уже ничего нет, взламывать нечего.
Правила появления новых монет в биткоине заложены со старта — заранее определено, начиная с каких блоков будет производиться «халвинг» (уменьшение награды за блок вдвое), таким образом в коде заложено, сколько всего будет выпущено биткоинов. В эфире ситуация иная: размер премии прописан константой в коде, а код нужно регулярно обновлять, и некоторые обновления изменяют размер награды. Изменение алгоритма ноды с потерей совместимости в биткоине приводит к форку, по сути создаёт другую криптовалюту. Потому что покупая биткоин, я выражаю доверие алгоритму и стартовому блоку (цепочке). В эфире это стандартный процесс «апгрейда», который должны регулярно применять все узлы, иначе они попросту выпадут из сети, потеряв совместимость. Покупая эфир сейчас, я не знаю, по какому протоколу эта валюта будет работать завтра, т.е. я выражаю доверие не открытому протоколу, алгоритму и стартовому блоку, а конкретным людям, которые будут выпускать обновления, никакой децентрализации в этом опять нет.
Комиссия за транзакции (gas) — отдельный адок. Она строится из двух составляющих: цены на «газ», и сколько газа потрачено. Цену на газ устанавливает создатель транзакции исходя из того, насколько быстро он хочет, чтобы его транзакция стала подтверждённой, и текущей «рыночной цены» — это примерно как у биткоина. А вот сколько газа потребуется потратить на транзакцию, заранее неизвестно, отправитель не знает. Даже одна и та же функция одного и того же смартконтракта может потребовать разное количество газа, и не только из-за возможных ветвлений, но и просто в зависимости от amount на адресах в момент её включения в блокчейн. Поэтому отправитель устанавливает максимальное количество газа, которое он готов потратить, а сколько потрачено на самом деле, станет понятно только когда транзакция станет подтверждённой. Соответственно, трудно потратить все деньги, имеющиеся на адресе: комиссия снимается с него же, и если установить большой max_gas, то останется сдача, а если маленький, то его может не хватить.
По той же причине в Ethereum невозможен и «spend unconfirmed», который так удобен и привычен в биткоине. То есть, если есть транзакция получения денег, то я могу создать следующую транзакцию по отправке этих денег куда-то ещё, не дожидаясь, когда первая транзакция станет подтверждённой. Если она отменится — автоматически отменится и вторая. Либо они обе подтвердятся. В эфире так нельзя, потому что пока транзакция не подтверждена, неизвестно, как в её результате изменятся балансы на адресах. Например, если у меня есть адрес с токенами, но без эфира, я не могу потратить эти токены, потому что нужно заплатить комиссию, причём именно с того адреса, с которого отправляются токены. Соответственно, я должен сначала отправить на этот адрес эфир, а потом уже оттуда отправлять токены. И я не могу эти две транзакции отправить подряд — нет, я должен дождаться подтверждения первой транзакции, и только потом отправлять вторую.
Откуда вообще взята идея этого непредсказуемого газа? В биткоине комиссия ставится пропорционально размеру транзакции в байтах. Это логично: размер блока ограничен, и туда можно включить либо одну большую транзакцию, либо на её место десять мелких. В эфире gas определяется количеством и сложностью операций в смартконтракте, и это нелогично: майнящая нода, хоть и должна выполнить этот смартконтракт для включения транзакции в блокчейн, но объём этих вычислений совершенно несравним с вычислениями собственно хеша блока, необходимыми для proof-of-work. Это разные единицы измерения, как метры и килограммы. И майнеру выгоднее включать в блок «дорогие» смартконтрактные транзакции, чем дешёвые простые пересылки, потому что он в таком случае получит больше награду. Вот вам и идея майнера, приносящего большую прибыль. А чтобы простые транзакции всё-таки тоже подтверждались, на них нужно устанавливать больше gas_price — и в итоге придём к тому, что считаем рыночную комиссию за транзакцию (учитывая её размер), потом делим на предполагаемый расходуемый gas, и результат пишем в поле gas_price. Бред ведь?
Но ситуация ещё комичнее. Зачем вообще регистрировать смартконтракт, почему нельзя писать данные в обычную транзакцию? Именно так работает omni layer поверх блокчейна bitcoin, и на нём были запущены USDT. Ведь это лишь вопрос трактовки, и ничто не мешает нам договориться и трактовать определённые данные в eth-транзакциях как пересылку каких-то токенов, оплачивая за это минимальный gas. Есть только одна причина, почему может быть необходима регистрация смартконтракта: если он отправляет кому-то ether, т.е. те самые «internal transactions», от которых столько проблем, и которые разрушают стройность блокчейна. Обычный смартконтракт ERC-20 (которых большинство, это простая реализация другой валюты или токенов) никакой отправки ether средствами смартконтракта не предполагает (хотя и не запрещает), т.е. для них регистрация не нужна, и платить дополнительный gas тоже не нужно. Иными словами, оплатой gas за смартконтрактные транзакции мы оплачиваем не распределённое выполнение этого смартконтракта майнерами и не хранение данных в блокчейне, а лишь используемый алгоритм. Запустим свой, чуть модифицированный алгоритм на том же самом блокчейне эфира — и вуаля, получим токены без дополнительного газа, подобно omni layer в биткоине. Причём нам совершенно не нужно, чтобы этот софт запустили все ноды или даже заметная часть — достаточно чтобы его запустили владельцы токенов, т.е. это может быть просто кошелёк.
Этот список можно продолжать долго, но это уже не так важно. Важно, что Ethereum — это муляж криптовалюты, который паразитирует на идеях децентрализации, распределённости и открытости, реализованных в Bitcoin, но извративший эти идеи ради бизнес-интересов создателей этой валюты.
Ripple, Tron
У них суть похожая. Декларируется децентрализация, распределённость, все дела. Можно ли поднять свою ноду — да, без проблем, вот исходники, любой желающий может поднять.
Но при ближайшем рассмотрении оказывается, что эта нода не участвует в консенсусе, а только получает информацию о транзакциях от других узлов и отправляет другим узлам свои транзакции. Если покопаться глубже, можно найти информацию о том, что поднять майнящую ноду можно, для этого нужно взять другой софт, заплатить кому-то сколько-то денег и подать заявку на рассмотрение. То есть, эти валюты не являются децентрализованными ни административно, ни технически (новый майнящий узел подключается к сети вручную). Вопрос о том, как происходит распределение денег, в такой ситуации уже неважен: понятно, что в любом случае полный контроль за появлением монет, как и за механизмами консенсуса, находится в частных руках.
Такой отказ от децентрализации принципиально упрощает вопросы консенсуса — новый блок можно принимать хоть простым большинством узлов без дорогостоящих вычислений подписи в proof-of-work, а вопрос генерации новых монет и вовсе отпадает — они все изначально принадлежат владельцу валюты и эмитируются только им (или доверенными узлами, что по сути то же самое).
В угоду бизнесу произошёл сдвиг терминологии. Изначально криптовалютами назывались только «настоящие» децентрализованные валюты с полностью открытым и равномерным появлением новых монет, как в Bitcoin, Litecoin и подобных. Потом криптовалютой стали называть Ethereum, который, впрочем, скрывал «особенности» стартовой эмиссии. Дальше — криптовалютой стали смартконтрактные токены, живующие в эфирном блокчейне, даже с закрытым кодом (т.е. с неизвестными правилами). Потом гордое название «криптовалюта» стали носить любые валюты, использующие блокчейн, децентрализация перестала быть обязательной. И, наконец, блокчейн тоже перестал быть необходим: в Ripple его и нет, а просто по сути любые электронные деньги стали называться криптовалютой.
Отдельно стоит упомянуть stablecoins вроде USDT. Они тоже существуют в распределённом блокчейне, как будто настоящие криптовалюты, а отличие их в том, что существует владелец, который может создавать новые монеты в произвольном количестве. Этот владелец декларирует, что выпускает новые монеты ровно в таком количестве, сколько ему заплатили настоящих денег, эти настоящие деньги хранит в сейфе, и таким образом гарантирует, что эти монеты всегда можно будет продать по курсу 1:1 к USD. Пользователям предсказуемость курса удобнее, чем высокая волатильность биткоина, а магические слова «криптовалюта» и «блокчейн» вызывают больше доверия, чем просто чьи-то электронные деньги вроде perfectmoney. Тут достаточно очевидно, что блокчейн в данном случае — не более чем открытый реестр, а владелец имеет полный контроль над валютой. Курс удерживается стабильным постольку, поскольку ему можно не давать расти дополнительной эмиссией, но если он начнёт падать, компенсировать его слишком большими вливаниями владелец вряд ли будет, у него просто закончатся деньги. Ведь вряд ли кто-то на самом деле верит в то, что все полученные деньги они действительно хранят в сейфе и не тратят. Хотя такая декларация, наверное, может быть выгодна в плане уплаты налогов, это ведь получается нулевая прибыль.