Nakamotofamilyfoundation: перевод книги duality (ч. 3)
Итак, завершаем перевод первой версии опубликованной "Сатоши Накамото" (?) книги "Двойственность".
(Перевод - от аналитиков Synergis :: Наталья и Александр).
Принцип peer-to-peer, лежащий в основе биткоина, обеспечил его превосходство над всеми предыдущими попытками (сделать то же самое). Его преимуществом была архитектура сети, которая перераспределяла нагрузку между peer`ами, формируя сеть узлов. Каждый узел способствовал развитию сети, без какой-либо необходимости в центральном управляющем органе или третьей стороне, и без каких-либо серверов. Peer-to-peer был рождён необходимостью децентрализации, в то время ARPANET позволял каждому запрашивать и передавать контент, выйдя за пределы простой маршрутизации. USENET, разработанная в 1979 году была предшественником BBS-подобных систем, позволявших создавать децентрализованные и распределённые системы. Но то, что выделяло USENET среди других BBS или веб-форумов того времени была распределённость - без центральных серверов и доверенных администраторов. Помимо этого USENET была децентрализованной.
Эта ключевая особенность проложила дорогу таким технологиям как P2P обмен файлами, сервисам (таким) как Napster, и впоследствии Bittorent вышедший из Mnet. Mnet был peer-to-peer сервисом обмена данными, использовавшим цифровую валюту Mojo, которая в полностью распределённой сети обеспечивала устойчивость к атакам - и один из первых (типов) “смарт-контрактов”.
Кратко упомянул USENET потому, что когда анонсировал биткоин, некоторые вещи попали в поле моего внимания лишь постфактум, например, такие как Public Time Stamp были не известны мне до релиза. Интернет был настолько широк во всех смыслах, что даже я не знал всего.
Дастин Траммел - один из тех, кто донёс до меня эту содержательную реализацию, несмотря на то, что я изучил каждую базовую область - все ещё оставались вещи для (дальнейшего) изучения. В день публичного анонса биткоина он прислал мне e-mail-письмо, рассказывающее об удивительном использования timestamp без применения USENET. Именно поэтому позже я взял за правило включать существующие идеи, которыми мог пренебречь (на заметку), например, предвестник биткоина - BitGold.
Тем не менее, это опустило меня на землю, показав, что были вещи, которые я ещё не обнаружил. В те дни Дастин продолжил переписываться со мной, делая предложения, которые помогли мне сделать биткоин более презентабельным, менее неуклюжим и намного более функциональным. В течение следующих нескольких дней мы обсуждали пути, как биткоин мог бы завоевать популярность. Что я любил в Дастине - его открытость, нас обоих крайне глубоко интересовала идея денег и криптографии. Люди предположат, что я не был “криптографом”, и в прямом смысле слова я им не был, но это не означало, что я не знал, как установить криптографические ключи в то, во что эволюционировал биткоин.
Джастин также был одним из первых, кто давал мне обратную связь по первой (я её таковой считаю) стабильной версии биткоина, v.0.1.3. Перед этим софт был проверен на баги, и я вычищал их из него ежедневно: часами в первые несколько дней.
Один из наиболее интересных вопросов, которые он поднял, был о том, что произойдёт в случае, если одна нода будет обладать большинством вычислительных мощностей, где один сильнее всех остальных - предположительно он будет получать большинство всех монет. Я объяснил это ему самым простым способом, что мог и всегда делал ранее в прошлом, через аналогию. Так же как я попытался сделать с проблемой Византийских Генералов, я чувствовал, что лучший способ объяснить вещи новым пользователям - применить существующую идею или концепт, которые легко понять и применить к схожим (возможным) сценариям, в данном случае - это соотносилось и с производительностью.
Для новичков я использовал аналогию быстрой машины, чтобы измерить всё в лошадинных силах. Я попросил его подумать об этом (о майнинге), как о гонке: если одна машина в 2 раза быстрее, (предолагается) что она всегда и выиграет. Скорее это SHA-256, которому требуется менее микросекунды, и каждая индивидуальная догадка имеет равный, при том независимый, шанс на успех. Шанс каждого компьютера найти коллизию хэш-функции линейно-пропорционален его вычислительной мощности. Таким образом, хотя компьютер и может быть в 2 раза медленнее,это будет лишь значить, что он получит половину монет, но не ничего. В сети Биткоина, какова он есть изначально, - победитель не сможет получить всю систему (распределения).
Вещь, которую люди должны понять о биткоине: по сути он собирает timestamp всех серверов, обеспечивающих базовую функцию сбора информации в блоки и хеширования последних в цепь.
Биткоин был наиболее уязвим в самом начале, когда общая вычислительная мощность сети была маленькой. Но это компенсировалось фактом его слабой привлекательности для атаки в самом начале.
Думаю, люди могут поинтересоваться, почему биткоин так долго набирал критическую массу: правда в том, что технология способная создать биткоин (как замкнутую сеть), ещё полностью не существует, по крайней мере она ещё не зрелая; тем не мене - в неём было куда больше заинтересованных людей, чем в (криптовалютах) 90-х годов: даже после более чем десятилетия построения провальных систем, основанных на доверии третьей стороне (Digicash, etc.); - они считали её (централизованную систему) бесперспективной. Я боялся, что они (под “они” я имею ввиду крипто-сообщество) не увидят разницы. Но биткоин настолько отличался от всех предыдущих попыток, что я постарался сделать так, чтобы они увидели разницу. Чтобы они осознали, что впервые, насколько я знал, представляется система, полностью построенная на принципе отсутствия доверия (но его обеспечивающая).
Я был настолько увлечен тем, что подумает крипто-сообщество, что в результате я не упомянул ни об одной неудачной попытке:например, о Digicash, (которая была упомянута) в оригинальной версии Белой книги, в качестве предвестника биткоина; из-за страха, что его отвергнут ещё до запуска, и двинулся дальше. И вместо этого я ссылался на преимущества таких идей, как B-money и Hashback proof-of-work system, которые в свою очередь были вдохновлены работами других, на кого Адам ссылается в своих бумагах. Взять лучшие идеи и опустить провальные - по-моему, был единственный путь преуспеть в глазах острых скептиков (возможно “критиков” лучшее слово). В противном случае Digicash была бы упомянута, если бы это не была система, основанная на доверии.
(Хэл назвал бы их крипто-седобороды. У него всегда было хорошее чувство юмора).
Хэл сослался на то, что к 2019 году, когда я напишу это, шанс биткоина и его успеха будет, как у (любой другой) сомнительной инвестиции, другими словами, очень маловероятен. Или он сработает действительно хорошо и завоюет популярность, или же эффектно провалится. И не смотря на то, что я видел множество вариантов использования биткоина вне традиционных, узконаправленных нишах, где классические валюты реально не подходят, таких как - очки наград, пожертвования в токенах, игровые валюты, и тому подобные вещи, я никогда не ожидал, что биткоин станет настолько популярным, как он стал, и что будет напрямую соперничать с фиатными валютами. Но именно это и случилось. (Биткоин) превзошёл (все мои) ожидания.
Биткоин во всех отношениях был построен очень надёжно в плане отказоустойчивости и был рассчитан на долгую службу, тем не менее некоторые ставят под сомнение методы, к которым я пришёл и применил (в его архитектуре).
Многие могут удивиться почему биткоин был разработан на С++, в большей степени ответ относится к использованию памяти. Не имеющей отказоустойчивости и приспосабливаемости. Более всего я был обеспокоен надёжностью и атаками, когда размышлял над тем, какой язык программирования использовать, атаки в сети были главной заботой.
Я сгруппировал атаки в 2 класса:
- Атаки, которые могут быть осуществлены кем-то, кто действительно находится внутри коммуникационной цепи (локальной сети),
- Атаки, которые могут быть реализованы кем-угодно и откуда-угодно через Интернет.
Первый метод атаки сталкивает с одной стороны с людьми в вашем доме или компании, в вашей локальной сети (LAN), администраторами интернет-провайдеров в промежутке (между вами и конечной сетевой точкой), и локальной сетью (LAN) на стороне получателя. А второй (тип) ставит вас перед миллиардами людей, которые могут самопроизвольно решить (как) атаковать и сэкономить (при этом) на эффекте масштаба, когда освоят технику атаки множественных жертв (DDoS в первую очередь).
Второй метод атаки и есть причина, почему биткоин создан на С++. Понимаете, биткоин должен был быть устойчив ко всем формам атак, поскольку имеет большой периметр для атаки (безопасности). Ввиду того, что он открыт Интернету, то должен отвечать жёсткми требованиям по целостности (последовательности). С++ обеспечивает её. Я имею ввиду жёсткий контроль над использованием памяти, который означает, что критически важные для безопасности приложения, как биткоин, который напрямую открыт Интернету, сможет всё также обеспечивать надёжность локальному клиенту, коммуницируя с множеством не доверенных конечных точек. Это требует жёсткого контроля над такими ресурсами как память, с чем успешно справляется С++. В отличие от других языков программирования, С++ обеспечил последовательный контроль за памятью, в то же время оптимизируя скорость и производительность. Каковы же были причины выбора С++? Помимо вышеупомянутых, С++ имел сильную базу и организацию, технология была твёрже камня и постоянно добавлялись новые возможности. Это был очевидный выбор.
Я написал ему это по email, поясняя следующее:
Отправка через IP-запросы нового публично ключа, да - это уязвимость 1го типа - посредник. Если это беспокоит, отправка на биткойн адрес не представляет уязвимости, хотя это небольшой компромисс по части приватности. У меня было ощущение большую часть времени, что люди будут получать биктоин адреса не от SSL-веб-сайтов и не подписанных e-mail`ов без текста, что уже уязвимо для атак 1го и 2го типов через DNS - заражение.
Было единое решение для обоих IP- и Биткоин-адресов при отправке (может быть 1.2.3.4-1Kn8iojk…), где реципиент использует публичный ключ Биткоин адреса для подписи нового публичного ключа, чтобы доказать, что вы отправляете тому, кому думаете. Если система начнет применяться для реальных бизнесс-целей, я точно это применю (думалось мне тогда). Другое решение - использование SSL.
Сейчас довольно очевидно, что если вы отправляете на IP? - вы не получаете никакой идентификационной информации о получателе, и вы, таким образом отправляете вслепую кому бы то ни было, кто ответит по этому IP.
Следующее, что мы рассмотрим - выбор способа, которым шифруется кошелёк.
Здесь хочу уделить некоторое время человеку, которому можно приписать большую часть первоначального успеха, (которому и) способствовала его помощь. Я не сделаю этим ничего особенного или очень мало для этого человека, которого действительно следует поблагодарить.
(Я хочу представить Вас, Хэл, того, кого я считаю другом и первым, кто поверил в то, что я собирался сделать. Хэл, Вы уже (давно) превзошли стадию помощника, и, надеюсь, что преуспеваете, Вы должны знать, что этот отрывок на самом деле называется "Биткоин, я и Хэл Финни").
Гарольд Финни (Хэл, если коротко) был одним из наиболее ярких умов, из которых я когда-либо имел возможность перекинуться словом.
Мало того, что он был человеком, способствующим первому появлению системы PoW (доказательство работы), допускающей дальнейшее её повторное использование, он был по-настоящему квалифицированным специалистом. Он также участвовал в продолжительном развитии PGP (отмечу, что я никогда не собирался на самом деле использовать PGP ни для чего и сомневаюсь, что буду делать это теперь). Я испытывал огромное уважение к нему, и немалое место занимает признание того, что именно он обеспечил выживание биткоина, потому что, даже когда другие проявляли мало интереса к биткоину вначале, Хэл был единственным, кто сохранил сеть вместе со мной.
Некоторое время знал о Хэле только из cypherpunk'овского списка рассылки, и следил за его мыслительным процессом, поскольку он был тем, кто достоин высокого уважения.
Хэл был первым человеком, который основал PoW ( доказательство работы), а также первым, кто придумал метод, допускающий повторное использование доказательства работы. Это было важно для разработки прототипа биткоина, потому что именно его работы над RPOW как электронными деньгами вдохновили меня использовать прежде всего PoW. Возможно, я огорчу кого-то, я все еще верю в достоинства Доказательства Работы (в книге объясню, почему). Хэл утверждал, что величина токена RPOW коррелирует с реальной величиной ресурсов, необходимых для выпуска токена PoW. В этом случае токен PoW был частью Hashcash, который получил развитие в работах Адама Бэка (Adam Back).
Несмотря на то, что его RPOW никогда не привлек внимания и не имел никакого реального использования, это было похоже на биткоин на основе PoW Hashcash, и это означало, что оба имеют одно происхождение, но дали разные результаты. Принимая во внимание, что Хэл RPOW создавал, основываясь на PoW Hashcash, это использовалось в компьютерных вычислениях с функцией, означающей, что компьютер будет последовательно вести себя в (конкретном) ожидаемом случае, и это обеспечивается технически. Биткоин же основывался на децентрализованном протоколе P2P. Биткоин в этом смысле защищён лучше и ему можно больше доверять, потому что поскольку RPOW был защищён частными ключами, сохраняемыми в TPM ( Модуль Платформы, заслуживающий Доверия), любой, держащий его под контролем, был способен подорвать доверие.
Различие с биткоинами заключалось и в том, что они были добыты с использованием функции PoW Hashcash отдельными майнерами и проверены самими узлами (нодами) в сети P2P.
Хэл был также первым человеком, которому я когда-либо отправлял коины, будучи моим первым получателем и первым официальным свидетелем багов, то еть первым человеком, сообщившим об ошибках.
Вначале мои разговоры с Хэлом велись в основном вокруг отладки первой версии
программного обеспечения, v0.1.0 АЛЬФА, и несмотря на то, что я лично не испытал никаких отклонений в использовании программного обеспечения, я знал, что открытие его большему количеству пользователей поможет мне идентифицировать и устранить проблемы, которые я не мог испытать или заметить, работая один.
Биткоин был безопасным приложением для интенсивного использования, в немалой степени из-за того, что находился в Интернете. Для того, чтобы начать работать, было необходимо удалить из программного обеспечения перед запуском все ошибки, которые возможно было найти. Отладка состоит в поиске "багов" в программном обеспечении, пока не определится, где именно происходит отказ, а затем - в определении неправильных параметры или кодов, которые необходимо изменить.
(Дебагер) GDB читает достаточные данные символов, чтобы знать, где найти остальное, когда запрашивается, в то время как GCC избегает выдачу вывода символа отладки для типов, которые не используются в исходном файле, который компилируется.
В случае, если приложение работает в сборке отладки, но не работает в сборке релизов, вероятно, что причиной является оптимизация компилятора, а ошибка - в дефекте исходного кода. В отладке оптимизация включается, а символы не проходятся. Поэтому, чтобы избежать ошибки, вы должны отключить оптимизацию компилятора, пока не сможете найти проблемный файл. В сущности, так работает отладка. (Данный абзац меня не сильно устраивает, но для понимания сути книги он - не самый сущетсвенный - Menaskop)
В случае Хэла - символы не появлялись. Это было связано с тем, что я отключил их, так как иначе размер исполняемого файла увеличился бы почти на 45 Мб. В то время я не мог допустить это, потому что я ещё не сталкивался с какими-либо прямыми исключениями, но потом понял, что это ошибка, поскольку в ПО всё ещё было много ошибок.
В то время Хэл использовал MSVC (Visual Studio для тех, кто не знает), и испытывал сбои при запуске биткойна. При запуске cygwin, командного интерфейса UNIX, который позволяет вам запускать на нём определённые приложения Windows, а в данном случае приложение является биткоином, Хэл не испытывал сбоев.
Это привело меня к воспроизведению ошибки на моей стороне и её изоляции в "mapAddresses.count", что не было существенно для программного обеспечения, и поэтому я был готов просто удалить эту часть и отключить оптимизацию пока не смогу понять, что происходит, потому что я больше не мог воспроизвести (подобного) на своей стороне.
Эта, казалось бы, небольшая проблема беспокоила меня так сильно, что я продолжил работать следующие несколько часов, пытаясь продолжить тестирование программного обеспечения и воссоздать проблему.
Через три часа я наконец понял, в чём проблема. Проблема заключалась в том, что когда я сделал mapAddresses.count, он вызывал нарушение доступа к памяти или https://ru.wikipedia.org/wiki/Ошибка_сегментации (ошибку сегментации). Обычно это происходит, когда программа пытается получить доступ к ячейке памяти, к которой он не разрешён.
Один фрагмент кода, который я добавил, хотя вовсе не нуждался в нём, действительно вызвал у меня беспокойство и разочаровал меня, поэтому я выпустил новую версию v.0.1.1, которая не содержала его. Как только я удалил этот кусочек и строку кода и отключил оптимизацию, всё стало нормально. Переход от утреннего хаоса к моменту “всё в порядке” произошел к концу дня.
Мы продолжали работать над версией** v0.1.2**, которую я отправил ему на тестирование, и у программного обеспечения всё ещё были проблемы, а его узел стал невосприимчивым, и получалось либо ThreadSocketHandler, либо ThreadMessageHandler. Я работал над отладкой, чтобы найти причину, и сужал до (формата) ошибки выбора, которая определяет состояние одного или нескольких сокетов, в частности «select failed: 10038». У меня был такой тяжелый день, я чувствовал себя побеждённым. Я сказал Хэлу, что Интернет - жестокое, грубое и гиблое место. В конце концов я нашел, в чем дело: ошибка “select” сама по себе не была серьёзной проблемой, но она привела к тому, что связь была заблокирована в сокете. Если бы я не исправил эту ошибку, сообщения узла были бы прерывистыми, а порой и вовсе мёртвыми. Соединение было установлено, но данные не проходили.
Вот почему любые сгенерированные блоки не принимались, так как не могли транслироваться , заставляя другие узлы (ноды) покидать ветвь. Из-за этого блок не мог сгенерироваться, так как он не выглядел связанным. К тому времени как отправил ему v0.1.3, всё стало в порядке. В знак моей признательности я отправил Хэлу несколько коинов, чтобы он мог поиграть с ними. В течение нескольких дней я переходил от полной уверенности в том, что первая версия в основном свободна от багов, до того, что всё может быть сломано в течение каких-то считанных минут, и я всё время пытался выяснить способы исправления и заставить её работать.
Хэл хотел отправить мне некоторые из его монет, которые были готовы, но, к сожалению (поскольку порт 8333 на моём конце был закрыт), я не мог получать входящие соединения в том месте, где я был, что осложнило ситуацию. (Я хочу объяснить, что в случае с prebitcoin, был не тот порт, который я выбрал, вместо этого это был порт 2222. То, как работают порты TCP, определяется IANA (Internet Assigned Numbers Authority), объектом, который назначает номера портов. Иными словами, порт 8333 просто стал неофициально назначенным портом для биткоинов по соглашению - он не был никогда зарегистрирован в IANA.)
Поэтому вместо этого я предложил ему отправить на мой адрес, что означало, что я получу платёж в следующий раз, когда буду в сети. Отправка платежей по адресу состояла в том, чтобы отправить его в хэш своего открытого ключа, так что в следующий раз, когда пользователь подключится, он увидит платеж. Это имело недостаток: никакие комментарии не могли отправляться, и если вы хотите сохранить анонимность, адрес может использоваться только один раз. Это полезно, когда получатель не подключен к сети, тогда это просто вопрос ввода своего IP-адреса, получения нового открытого ключа и отправки транзакции с комментариями.
В ту ночь, версия v0.1.3 опять потерпела крах на компьютере Хэла. Похоже, мне было суждено исправлять ошибки без остановок. Я отправил ему дамп отладки, и мы оба пришли к выводу, что виновником был переполненный диск. Я всегда не любил проекты, зависимые от множества факторов, но этого просто не избежать, поскольку каждый из них существенен. Я предложил Хэлу сообщать мне при обнаружении, в результате чего это происходит. Я был озадачен тем, что он думал о других ошибках и не предусмотрел, что диск может (быть) переполнен. Я предположил, что, возможно, это испортило его файл блоков, и предложил удалять немедленно, если проблема повторится. Удаление файлов блоков не происходит насовсем, так как оно будут загружать цепочки блоков. Даже без создания резервной копии всего каталога, включая подкаталог базы данных, самым важным загружаемым файлом является файл wallet.dat, где хранится информация о персональном секретном ключе.
Базе данных очень неудачно было присвоены имена файлов «log.0000000001», что для тех, кто знаком с базами данных, означает «удалить-и-проиграть всё в одном». Я попытался избавиться от этого, поставив их в подкаталог базы данных. Позже я хотел избежать этого, написав код, который будет очищать журналы после каждого изменения кошелька, поэтому wallet.dat будет в безопасности.
Большинство не знает, но это был Хэл, который действительно поддерживал биткойн в первые несколько дней с его единственным узлом (нодой), получающим входящие соединения, и он был основным, если не единственным, который удерживал сеть в первый день или два. Если бы не Хэл, я не знаю, что бы я сделал в эти первые несколько дней.
По сей день я все еще думаю о том, насколько хороший человек Хэл, и как было бы без него: биткоин не преуспел бы так. Когда у меня не было поддержки, когда это был только я, Хэл был единственным, кто верил в то, что я пытался сделать. Если какой-либо человек должен получить награду за биткоин и его первоначальный успех, то именно он. Хэл скончался в августе 2014 года от изнурительной болезни, ALS. Но до самого конца Хэл продолжал борьбу и был так же счастлив, как мог бы (будучи здоровым), несмотря на трудности. Он знал о том, что умрёт, и достойно встретил смерть.
Вот его известная цитата, которая часто приводится, где он объясняет, как он заинтересовался криптографией, и делает акцент на сходных убеждениях, которые мы все разделяем. На причине, которая объединила нас всех.
«Мне это кажется таким очевидным. Мы столкнулись с проблемами потери конфиденциальности, ползучей компьютеризацией, массивными базами данных, большой централизацией - и Chaum предлагает совершенно другое направление, которое отдаёт власть в руки отдельных лиц, а не правительств и корпораций. **Компьютер можно использовать как инструмент для освобождения и защиты людей, а не для их контроля **». -
Finney, “Cypherpunks Mailing List”, 1992г.
Хэл был достаточно умён, чтобы угадать, как может выглядеть будущее криптовалют, правильно догадываясь, что в конечном итоге большинство людей узнает, что это такое, - и это не останется узкой нишей надолго. И, соответственно, 10 лет назад я пришёл к такому же выводу, что мы будем использовать цифровую валюту в той или иной форме, пока другие только воображали, что это может быть использовано. То, что я не ожидал, было как быстро это произойдет, и что биткоин будет тем, что подстегнёт процесс. .
** И вот в чём заключается эта волшебная история, которая вошла в историю….**
Думаю, это достойно продолжения?
До!