Я постараюсь ответить, как я представлял себе, что разыгрывается - это все только предложения. У меня есть достаточно вещей на моей тарелке с BitCoinJ и больше, чтобы держать меня занят на некоторое время.
Мой план состоял в том, чтобы сделать некоторые изменения в официальном кодовую поддержку
порция легкие клиенты, но не на самом деле сделать это будет легкий сам. Основная причина в том, у меня нет достаточной уверенности, чтобы сделать серьезную операцию на код без каких-либо единичных тестов, чтобы поймать ошибки. Другие, которые внесли изменения чаще (как Gavin), может быть в состоянии сделать работу лучше. Satoshi прислал нам частично полный патч, прежде чем он ушел, я не смотрел на то, как она полнее, но я думаю, что он реализует только первоначальную первый запуск загрузку оптимизации, а не все.
Хорошо, с этим, здесь идет. Во-первых, некоторые термины. Я буду называть эти вещи SPV клиентов для "упрощенная проверка оплаты", Заголовки только вроде глотка и "легкий клиент" является слишком расплывчатым, так как есть несколько других конструкций, которые могут быть описаны как легкими, как RPC фронтэнд и Stefans WebCoin API подход.
Какие инженерные предположения мы сделаем, WRT заголовки только для клиентов?
Минимальные аппаратные цели: смартфон (два года назад) или более высокий класс устройств, вплоть до настольных компьютеров. SPV для серверов / торговых узлов может быть интересно в течение нескольких лет, но на данный момент, дополнительные меры безопасности, вероятно, стоит запустить полный узел. Нецелевые: смарт-карта, J2ME моноблок телефоны и т.д.
Что это означает конкретно, использование памяти <16mb общее, время запуска <500msec.
Протокол: слегка расширен (обратная совместимость) существующего протокола P2P. Подключение к новым узлам означает более оптимальный опыт, но в противном случае нет необходимости.
Требуется ли дерево Merkle или любые другие данные, кроме заголовка блока?
В настоящее время SPV клиенты должны загрузить полные блоки с момента создается их кошелек (первый ключ). Причина заключается в том, что это единственный способ открыть для себя новые сделки. getheaders может быть использован в качестве оптимизации для новых пользователей. Это даже не требуется, чтобы загрузить полную цепочку. Вы можете начать с последней контрольной точки и не пройти весь путь обратно к блоку генеза.
Если только заголовок блока, как будет клиент проверить принятый TX? Конечно Merkle дерево, по крайней мере блока требуется?
Вроде. Merkle
дерево Вам не поможет, потому что вы не знаете, какие узлы в дереве ваши. Merkle ветвь с другой стороны ...
Для того, чтобы избежать необходимости загружать полные блоки, простая команда сопоставления может быть добавлена к протоколу. Strawman предложение, добавляется новая команда txmatch. Содержание являются:
- запрос идентификатор
- диапазон номеров блоков для поиска между
- регулярно отформатировано транзакция, за исключением того, что scriptSigs и scriptPubKeys могут содержать шаблон опкодов, используемые в решатель сегодня. Другие поля игнорируются. В SIGHASH флаги могут быть полезны для управления тем, как входы / выходы соответствуют - нужно думать об этом больше.
Полный узел загружает каждый блок в пределах и проверяет каждую сделку на матч. Это может быть довольно интенсивным, поэтому некоторые теряемое сообщение может быть необходимо. Если узел перегружен, клиент может попробовать другой.
Ответ представляет собой "txmatches" сообщение, содержащее один и тот же идентификатор запроса плюс список txmatch структур:
- блок хэш он появился в
- Merkle ветвь связывающая ТХ к заголовку
- Сама сделка данных
Теперь клиент SPV может проверить сервер не лежит к нему, проверяя Merkle ветви против заголовков блоков он загруженные (возможно параллельно с этой операцией).
Как легкий клиент найдет новый TX послал к нему, когда он знает только свои собственные пары ключей? Либо он должен запросить полные блоки W / все TX, либо кто-то запрашивает узлы для Txs / ключей в секретность-хлюпает образом?
Да, в самом деле. Простая сила реализации выбирать между запрашивающими все (Ик) или открывая свои открытые ключи доверенного узла. Есть и другие способы сделать это:
- Продлить шаблон согласования языка опкод, чтобы для префиксов матчей. Выберите короткий префикс. Теперь вы получаете некоторые операции, которые не относятся, но и те, которые. Лучше дизайн может позволить вам обеспечить произвольные фильтры Блума над адресами / pubkeys.
- Разделить ваш запрос по многим узлам, так что любой отдельный узел видит только некоторые из них.
- Есть ли что-то немного, как луковая маршрутизация. Контакты 10 узлов, запросить открытый ключ от них. Теперь подключиться к 10 другим узлам и отправить сообщение txmatch, но в том числе IP-адрес одного из 10 узлов и идентификатора запроса (таким образом они могут быть объединены вместе). Матч модель ТХ шифруется под этим открытым ключом (можно предположить, что есть стабильный ф для отображения Публичных). Теперь это трудно для узлов, чтобы знать, какие компьютеры владеют какие ключи. Они просто получать запросы от случайных IP-адресов.
Я не думал о последней много. Я думаю, что сейчас просто используя кучу доверенных узлов будет работать нормально, вроде как проверка почты. Они могут связать несколько ключей вместе, но не все.
Каковы последствия некоторых узлов сети P2P, имеющих только частичные блоки? Буду ли нам нужно ввести какое-то искать-узлы-с-полноблочные содержаниями логики для легких клиентов, чтобы найти суперузлы?
клиенты SPV не принимают подключения не регистрируют с механизмами обнаружения сверстников. Они не являются действительно участниками сети P2P на всех. P2P трафик действительно только между полными узлами магистрального типа.
Каковы последствия частичных блоков на JSON-RPC API, если таковые имеются?
Пока просто отключить JSON-RPC, если вы не используете полный узел, вероятно, хорошо. Если вы хотите, чтобы добывать или быть купцом, требующий обрабатывать блок цепь не слишком много, чтобы спросить. В будущем это может быть, но такой точки, там будет гораздо больше трудовых ресурсов доступны
Как старые клиенты будут вести себя, столкнувшись с частичными блоками? Конечно, мы хотим, чтобы они продолжать работать?
Они не будут просить их, чтобы переход обратно совместим.
Мои первоначальные мысли поворачиваются в стороне подрезки провели ТЕ, потому что, если вы можете сделать это (и сеть выживает), вы можете обрабатывать частичные блоки.
Я думаю, что два, вероятно, не связаны, хотя и стоит делать. Обрезка действительно об оптимизации полного узла хранения. Дисковое пространство настолько дешево, что это не большое ИМХО дело. В будущем, если узлы начинают регулярно кончаются IOPs тогда люди могут быть вынуждены провести блок цепь в оперативной памяти. В этот момент обрезке бы, безусловно, станет более интересным.