— Увидим, насколько хорошо мы подготовились к тому, что в сети что-нибудь пойдёт не так.
— Я вообще полный ноль в этих твоих криптоделах. Но интересно будет увидеть, что у тебя в итоге получится. Ты ведь говоришь, что такие технологии могут изменить сам принцип работы финансовой системы. Звучит более чем солидно.
Лена хмыкнула и вернулась к чертежу.
За дверью работал телевизор, на кухне гремела посуда. Лена время от времени меняла карандаши, проверяла линии и стирала неудачные участки. Мы болтали о том, о сём, шутили, смеялись.
Вечер шёл спокойно и приятно, и мне не хотелось ничего менять в этом порядке вещей.
На следующий вечер, когда я уже собирался заканчивать работу, телефон завибрировал. Сообщение было от Рудько.
«Исправленное описание по пунктам 4 и 9 получил. Теперь правила сформулированы однозначно. Если пятничный тест пройдёт успешно, хочу запустить ваш клиент на своей машине и подключить его к тестовой сети. Проверю синхронизацию после разрыва связи и выбор цепочки. Это даст независимую проверку не только по журналам, но и на другом узле».
Я перечитал сообщение.
До этого момента мы проверяли Dorcoin сами. Четыре машины, наши собственные журналы, наши же попытки найти слабые места. Теперь человек, который не участвовал в разработке, собирался запустить клиент на своём оборудовании и проверить, как поведёт себя сеть после сбоя. Не просто прочитать наши объяснения и поверить на слово — посмотреть, что произойдёт на практике.
Я откинулся на спинку кресла и невольно улыбнулся. Отлично. Снова посмотрел на сообщение. Пятница обещала быть интересной.
Пятничный тест прошёл нормально. Мы разделили четыре машины на две группы, оборвали связь между ними и дали каждой стороне продолжить работу самостоятельно. В одной ветке прошёл перевод пятидесяти DOR Мише, в другой те же монеты ушли Антону. После восстановления связи клиенты увидели две конкурирующие цепочки с одинаковым объёмом накопленной работы. Программа не зависла: каждый узел сохранил текущую ветку, а после появления нового блока на одной из сторон переключился на цепочку с большей накопленной работой. Мы отдельно проверили, что транзакции из проигравшей ветки проходят повторную проверку: допустимые возвращаются в очередь неподтверждённых, а конфликтующие отбрасываются.
Журналы мы собрали и отправили Рудько. Он поднял клиент на собственной машине, подключил его к тестовой сети и повторил проверку синхронизации после разрыва связи. Его узел получил недостающие блоки, догнал сеть и выбрал ту же цепочку, что и остальные участники. Рудько подтвердил, что исправления работают как задумано. Это ещё не означало, что мы нашли все возможные ошибки, но по крайней мере один из самых неприятных сценариев больше не приводил к зависанию.
Во вторник, второго октября, в десять утра мы запустили публичную цепочку Dorcoin. Монеты из тестовой сети в неё не переехали: у публичной сети была собственная история, начинавшаяся с отдельного начального блока. Тестовые кошельки и файлы данных мы отделили от настоящих так, чтобы их нельзя было перепутать даже спросонья.
Первые два дня мы следили за работой сети: проверяли, как узлы обмениваются блоками, как распространяются транзакции и не возникает ли расхождений между копиями цепочки. Серьёзных проблем не обнаружили. Тогда я решил провести первую настоящую сделку с человеком со стороны.
Анонс ушёл на три профильных форума и по рассылке тем, кто за лето подал заявку через страницу «Платформы распределённых микроплатежей». На странице загрузки и в самом клиенте стояло предупреждение в рамке. Наталья Борисовна правила его не один день: сеть экспериментальная, цепочка может перестроиться, ошибки в программе могут привести к потере средств, необратимость платежей не гарантируется.
Я назначил первую настоящую сделку в четверг, с человеком со стороны. Макс Бурцев, дизайнер-фрилансер из Перми, рисовал иконки для программ и сидел в Dornet под ником из одних цифр. Задача была маленькая: нарисовать иконку для нашего клиента, монету с буквой D, и подготовить четыре варианта размером от 16×16 до 64×64 пикселей. Цену мы назвали в сорок DOR. Макс согласился через минуту.
В четверг в два часа Миша отправил перевод с кошелька команды. Через три минуты Макс написал в Dornet: «Получил что-то». Потом пришло длинное: «У меня в окне строка из тридцати с лишним знаков и слово transaction. Это деньги или нет? Мне так-то через час клиенту в Екатеринбурге макет сдавать, я хочу понять, работаю я сейчас за деньги или за ваше спасибо».
Я начал набирать ответ про блоки и накопленную работу, написал четыре строки и стёр. Человеку в Перми нужно было знать одно: заплатили ему или нет. Лекция про протокол здесь выглядела бы как объяснение устройства карбюратора водителю, у которого заглохла машина посреди перекрёстка.
Я позвонил дизайнеру.
— Макс, это Артём Дорохов, я главный в этом проекте. Давайте без переписки. Скажите мне, что вы видите в окне, своими словами.
— Своими словами? — В трубке было слышно, как он щёлкает мышью. — Список. В нём одна строчка. Слева длинный номер, справа сорок. Шрифт одинаковый, цвет один, серый.
— Внизу есть число?
— Есть. Ноль. Голый, без подписи. У меня в WebMoney написано «зачислено», и я понимаю, что зачислено. А тут строчка и ноль. Я не программист, Артём. Я нарисовал вам четыре картинки и хочу понять, заплатили за них или нет.
— Ноль показывает, сколько у перевода подтверждений. Пока он не попал в блок, подтверждений нет. Когда попадёт, станет единица, потом два, три и так далее. Чем больше блоков будет над блоком с переводом, тем труднее его отменить. Мы ориентируемся на шесть подтверждений, но полной гарантии я вам и после шести не дам. Сеть экспериментальная, это написано на первом экране при установке.
— А до шести?
— Пока подтверждений нет, транзакция видна сети, но ещё не включена в цепочку блоков. После включения её уже можно считать записанной в текущую версию цепочки, хотя при перестройке цепочки ситуация может измениться. Это примерно как платёжное поручение, которое приняли в банке, но по счёту оно ещё не прошло.
— И где это написано?
Я посмотрел на экран собственного клиента. Там, в таком же списке, стояли те же сорок DOR и такой же голый ноль, и что он значит, программа не объясняла.
— Нигде. Это наша ошибка, и я её сегодня исправлю. Макет сдавайте, перевод должен подтвердиться в течение часа. Если подтверждения не будет, я разберусь и компенсирую потерянное время.
— Добро, — сказал он и, помолчав, добавил: — Иконку я, кстати, сделал нормальную. На совесть.
Мы завершили разговор. Макет иконки пришёл следом.
Через пятьдесят минут после нашего разговора перевод получил шестое подтверждение. Макс написал в Dornet одно слово: «Вижу».
Я написал ему: «Не спеши их тратить, Макс. Лучше копи. Может наступить день, когда тебе больше не придётся работать.:)»
— Интерфейс не различает состояния, — сказал я парням. — Отправленная и подтверждённая транзакции выглядят одинаково: одна строка, один шрифт, никакой разницы. Мы привыкли смотреть в журнал и понимаем, что происходит. А человек со стороны видит непонятную запись и голый ноль.
Миша молча грыз колпачок ручки. Повисла пауза, и напряжение словно заполнило всю комнату…
Глава 18
Артём
— Три статуса, — прервал паузу Ярик. — С числом подтверждений у проведённой транзакции. Цветом и словами. Это два дня. Гуд?
— Гуд. И предупреждение рядом с каждой неподтверждённой: перевод может не попасть в итоговую цепочку, если она перестроится. Без слова «окончательно», потому что окончательности у нас пока нет, — ответил я. — Общую инструкцию на одну страницу я напишу сегодня сам. Миша, с тебя раздел про резервную копию: где лежит файл кошелька, как его скопировать на флешку, что будет при потере файла и что при потере пароля от него.