Riker, Nxt core-разработчик и проджект-менеджер, решил
ответить на некоторые (базовые) вопросы относительно блокчейна Nxt. Ответы могут быть интересны крипто-новичкам.
В1)
Транзакции - это хорошо, но задокументированы ли где-то их типы, подтипы, ограничения и т.п.? Для меня блокчейн является источником разных схем, но есть ли документация на модели обработки данных в блокчейне? Как на самом деле выглядит транзакция?
О1) Типы, подтипы, ограничения - это внутренняя реализация транзакций в ядре Nxt. Не думаю, что внутреннюю реализацию нужно документировать, любой Jjava- ил JavaScript-разработчик быстро в ней разберётся.
Транзакция состоит из базовой структуры данных, представляющей внутреннюю работу блокчена, включая идентификаторы, подписи и т.д. Дополнительно она может иметь специфические для подтипа вложения, содержащие дополнительные данные, такие как сообщения, удаляемые части, публичный ключ и т.д.
В2) Проверки. Кто и как проверяет транзакции перед подписью блока? Насколько я знаю, один аккаунт получает право и награду за подпись (форжинг) блока, но как проверяются транзакции? Это где-то задокументировано?
О2) Проверки производятся много раз: 1] когда nxt-сервер получает неподтверждённую транзакцию от клиента; 2] когда нода получает неподтверждённую транзакцию от другой ноды; 3] когда аккаунт форжит блок; 4] когда другие ноды проверяют полученный ими вновь сфорженный блок; 5]
фазированные транзакции требуют дополнительный проверок.
В3) Серверное ПО Nxt ведь может быть модифицировано атакующим, и не проводить проверки, например, для двойной траты?
О3) ПО Nxt разработано в предположении, что злонамеренные ноды постоянно и на всех уровнях пытаются нарушить блокчейн, что они посылают некорректные транзакции, форжат незаконные блоки, заполняют блоки бессмысленными данными для вытеснения настоящих транзакций и т.д и т.п. Ноды никогда не доверяют друг другу, они всегда перепроверяют получаемые данные, и отвергают некорректные (нарушающие правила). Пока 50% всех форжащих NXT находятся под контролем честных аккаунтов, двойные траты и прочие попытки обмана отвергаются.
В4) Проверяет ли форжер все транзакции назад аж до генезис блока (или последнего снапшота) ?
О4) Форжер (после загрузки блокчейна) должен иметь актуальный проверенный (во время предыдущих форжингов) блокчейн. Это означает, что форжер имеет самое свежее состояние блокчейна, и проверяет новые транзакции только относительно этого текущего состояния блокчейна.
В5) Это означает, что начальные проверки лежат на совести форжера (который может быть злодеем), и последующие проверки произойдут уже после форжинга блока, то есть нарушения правил в последнем сфорженном блоке (или даже нескольких) могут быть обнаружены позднее?
О5) В принципе в блокчейне всегда есть несогласованности, так называемые "форки", и необязательно из-за злодеев. Нода в Китае может увидеть сфорженный в Китае блок значительно быстрее, чем американская нода, а американская, возможно, уже успела получить корректный блок из Германии. В блокчейне есть правила разрешения таких форков. В Nxt корректным форком считается та цепь, в которую было вложено больше форжинговой мощности. И в конечном итоге все ноды переходят на неё.
В6) "текущее состояние".. как именно оно работает? Все ноды что ли постоянно хранят состояния всех аккаунтов и журналов? Например, нода знает, что аккаунт X имеет баланс Y NXT, и обновляет это знание при получении в очередном блоке транзакции с аккаунтом X? То есть если у нас будет 5 миллионов аккаунтов, то сервер будет вынужден хранить в памяти информацию о каждом из них?
О6) Да, каждая нода в таблицах своей базы данных хранит балансы всех аккаунтов, и ещё много другой информации. Мы называем эти таблицы "производными", потому, что их всегда можно перестроить из блокчейнана, которые содержит только блоки, и транзакции в них. В отличие от Биткоина, который отбрасывает адреса и UNXO, в Nxt аккаунты - это "дорогое" удовольствие, поскольку каждая нода должна хранить информацию о каждом адресе. В целях оптимизации
{в производных таблицах} мы даже удаляем пустые аккаунты (оставляем только их 32-битный публичный ключ).
В7) Итак, моя нода проверяет транзакции другого аккаунта, вычисляет ли она баланс начиная с генезиса, или от снапшота ?
О7) Состояние отслеживается от генезиса. Вы не можете доверять никому, кроме блокчейна.
В8) Просто для уточнения: когда моя нода получает сфорженный блок с 250 транзакциями по 400 аккаунтам, она действительно восстанавливает баланс этих 400 аккаунтов начиная с генезис-блока?
О8) В настоящее время имеется более 50,000 активных аккаунтов, и каждая нода отслеживает баланс каждого из них. И не только баланс NXT, но и ассетов и валют, и некоторых других объектов.