В этом посте я попытаюсь изложить обоснование и конкретную работу, необходимую для нескольких независимых цепей, которые разделяют хэш силы. Я также опишу, как позволить людям платить за вещи на альтернативных цепочках с Bitcoins.
обоснование
Блок цепь большая, сложная структура данных разделен между многими людьми. Проверка ее целостности требует много медленных (и, следовательно, дорогие) операций, как ECDSA поверки и диск стремится.
Каждый, кто принимает участие в Bitcoin сегодня работает узел, и, таким образом, поддерживает все это. В то время как в будущих конечных пользователях, вероятно, будет использовать более эффективный, но немного менее безопасный режим (SPV), торговец и шахтер, вероятно, всегда платить полную стоимость за содержание этой общей структуры данных. Все эти люди сегодня объединены общим интересом в новой форме платежей. Они могут или не могут быть заинтересованы в схемах для распределенного DNS, SSL сертификатов, голосования, безопасных и временных меток так далее.
Таким образом, одна из причин, чтобы держать Bitcoin цепи для финансов это несправедливо по отношению к экстернализации затрат несвязанных схем на человек, которые заинтересованы только в платежах - канонический пример того продавцы. Увеличение стоимости принятия Bitcoins товаров и услуг наносит вред всем, кто использует систему за счет сокращения числа торговцев или увеличения их стоимости.
Другая причина заключается в том, что это просто плохая инженерия втиснуть все возможные распределенные правомочную в проектных ограничения Bitcoin. Формат транзакции Bitcoin использует гибкий, но в конечном счете, предназначены для финансирования. Вы не можете оставить из "стоимость" поле. Это всегда есть, даже если он не сделал бы никакого смысла для вашего конкретного применения.
Одна последняя причина в том, что Satoshi был против сдачи, не связанных с Bitcoin данных в основной цепи. Как создатель этой системы, по его мнению, должен нести много веса с любым серьезным о его продлении.
К счастью, мы можем иметь наш торт и съесть его.
Проектирование новой системы
Для того, чтобы создать новую сеть, которая использует Накамото блочные цепи, вы должны начать с определения того, что означает, что сделка в новой сети. Bitcoin сделки разделить и объединить значения с помощью сценариев, но у вас не делать этого. Они могли бы быть что угодно. Вот пример простого стиля DNS "сделка" описывается с помощью буферы протокола Google синтаксис.
Код:
сообщение NameTx {
требуется имя строки = 1;
повторные байтов ip_addresses = 2;
требуемые байты Публичных = 3;
перечисление ClaimType {
НОВОЕ ИМЯ,
ПЕРЕВОД
}
Требуемый тип ClaimType = 4;
// Используется только если тип == TRANSFER. Новый владелец имя и подпись доказав текущего владельца.
дополнительный байт dest_pubkey = 5;
необязательный байт подпись = 6;
}
требуется имя строки = 1;
повторные байтов ip_addresses = 2;
требуемые байты Публичных = 3;
перечисление ClaimType {
НОВОЕ ИМЯ,
ПЕРЕВОД
}
Требуемый тип ClaimType = 4;
// Используется только если тип == TRANSFER. Новый владелец имя и подпись доказав текущего владельца.
дополнительный байт dest_pubkey = 5;
необязательный байт подпись = 6;
}
Это очень отличается от сделки Bitcoin стиля. Там нет понятия входов, выходов, адреса, значения или сценариев. Он получил то, что нужно для очень простой схемы типа DNS (что не хватает контроля злоупотреблений и т.д.), и ничего больше. Там также нет понятия "coinbase" сделка.
Определение блока также зависит от вас. Он не должен быть отформатирован таким же образом, как и выбрала Satoshi, но вам нужно большинство из одних и тех же концептуальных частей. Кроме того, необходимо хранить что-то еще, некоторые данные из Bitcoin - мы получим, почему в данный момент. Вот минимальный пример того, что нужно:
Код:
сообщение NameBlock {
требуемый байт prev_block_hash = 1;
требуется uint32 трудность = 2;
Требуемое время uint32 = 3;
повторные операции NameTx = 4;
}
сообщение NameSuperBlock {
требуется NameBlock name_data = 1;
требуется BitCoinData bitcoin_data = 2;
}
требуемый байт prev_block_hash = 1;
требуется uint32 трудность = 2;
Требуемое время uint32 = 3;
повторные операции NameTx = 4;
}
сообщение NameSuperBlock {
требуется NameBlock name_data = 1;
требуется BitCoinData bitcoin_data = 2;
}
Важно заметить, что мы не имеем, а также то, что мы делаем. Мы не имеют следующие поля из формата Satoshis:
- версия: protobufs обрабатывает управление версиями двоичных форматов данных для нас
- Merkle корень: Вы можете организовать свои операции в Merkle корень, если вам нравится, так что вы можете использовать один и тот же диск пространство мелиоративного трюк Satoshi сделал. Но это строго по желанию. Если вы хотите упростить вещи вниз, вы можете пропустить его.
- нонс: ненужный, мы увидим, почему в данный момент.
Обмен работы
Bitcoin_data поля, как вы разделяете работу с шахтерами сегодня (при условии, что они выбирают в установкой программного обеспечения наряду с их Bitcoin узла). Он определяется следующим образом:
Код:
сообщение BitCoinData {
// Заголовок формат блока Bitcoin. Потому что в Satoshis пользовательский формат представим это в виде массива байтов.
требуется байтов заголовка = 1;
// Первая транзакция из блока.
требуется байты coinbase_tx = 2;
// Merkle ветвь связывающей coinbase транзакции в заголовок.
требуемый байт merkle_branch = 3;
}
// Заголовок формат блока Bitcoin. Потому что в Satoshis пользовательский формат представим это в виде массива байтов.
требуется байтов заголовка = 1;
// Первая транзакция из блока.
требуется байты coinbase_tx = 2;
// Merkle ветвь связывающей coinbase транзакции в заголовок.
требуемый байт merkle_branch = 3;
}
Вы можете просто хранить весь блок. Но это неэффективно. Все, что вам нужно разделить работу это вышеупомянутые три вещи.
Вот краткое замечание о последнем поле. Merkle дерево представляет собой структуру данных, в которой каждый узел в дереве является хэш. Узлы листьев являются хэш вещей, которые вы хотите включить в дереве. Внутренние узлы хэшей в сочленениях дочерних узлов. Википедия имеет более подробно, если вам это нужно. Merkle филиал является частью Merkle дерева, которое позволяет криптографически доказать, что что-то вы данное было в дереве, без необходимости все, что было в дереве. Они рассчитываются с помощью функции CBlock :: GetMerkleBranch () в коде Bitcoin.
Merkle филиал связывает coinbase_tx в заголовке блока, так что вы можете доказать, что это было в этом блоке. Coinbase TX является постоянным Bitcoin coinbase (что делает новые монеты и утверждает, что сборы), за исключением scriptSig на его входе содержит дополнительный элемент, что сегодняшние scriptSigs не делают. Это дополнительный элемент является хэш структуры NameBlock. В coinbase scriptSig сегодня отформатирован следующим образом:
Код:
аннулированию IncrementExtraNonce (CBlock * pblock, CBlockIndex * pindexPrev, неподписанных Int& nExtraNonce, int64& nPrevTime)
{
.....
pblock->VTX [0] .vin [0] = .scriptSig CScript () << pblock->Nbits << CBigNum (nExtraNonce);
.....
}
{
.....
pblock->VTX [0] .vin [0] = .scriptSig CScript () << pblock->Nbits << CBigNum (nExtraNonce);
.....
}
Просто сложности биты и "дополнительный одноразовый", Но это на самом деле может содержать что-либо, пока это не слишком большое. Так что в ваших новых блоках было бы:
Чтобы получить NameBlock хэш в Bitcoin вы хотите добавить новую команду RPC, "setextrahashes" или что-то подобное. Это было бы просто обновить глобальный список и функция IncrementExtraNonce будет включать дополнительные хэш, когда scriptSig построен. Это очень простое изменение Bitcoin.
Более сложное изменение другой новый RPC. Потому что у вас есть своя сеть, он имеет свои собственные трудности. Скорее всего, это будет отличаться от Bitcoins самостоятельно. Таким образом, вам нужен способ, чтобы сказать Bitcoin "когда вы найдете блок, совпадающий с extradifficulty, пожалуйста, дайте мне знать," - как висящая RPC или, возможно, Bitcoin может сделать запрос HTTP сам по себе. "getwork" Протокол, используемый распределенных рабочих, возможно, также должны быть обновлены так шахтеры могут быть предоставлены многочисленные трудности, чтобы проверить ... или, возможно, Bitcoin может просто делать то, что Slushs бассейн уже делает и продажную работа мин (Bitcoin трудности, дополнительные трудности), а затем игнорировать найденные блоки которые не соответствуют Bitcoins собственных трудностей.
Программное обеспечение Независимого узла
Ваша новая сеть имеет свою собственную кодовую. Она может быть написана на любом языке вы хотите, используйте любой P2P протокол вы хотите, хранить свои данные, как вам нравится, и так далее.
Когда узел в сети получает сообщение, информирующее его о новой сделке, она проверяет, что сделка соответствует правилам вашей сети. Для того, чтобы использовать наш простой пример DNS это проверить бы, что если вы претендуя на новое имя, оно уже не существует, и если вы переносите имя, что подписи являются правильными.
Если сделка действительно, он добавляется к текущему сообщению NameBlock. Это сообщение сериализации к бинарным (protobufs делает это для вас), перемешанный, а затем ваш узел делает RPC для Bitcoin говорить ему, что текущий дополнительный хэш. Когда Bitcoin находит Bitcoin блок правой трудности для вашей сети, он сообщает свое программное обеспечение и передает блок заголовок, coinbase ОГО и Merkle ветвь к нему. Ваш узел объединяет их вместе в сообщение BitCoinData, который затем склеен с NameBlock. Эта "суперблок" затем транслируются через вашу независимую сеть P2P.
Когда NameNode получает новый суперблок он делает следующие вещи:
- Проверяется содержание NameBlock правильно, то есть, что сделки следовать правилам.
- Проверяется, что предыдущая хэш NameBlocks делает его пригодным где-то в цепи и что трудность правильно.
- Хэш структуры NameBlock, а затем проверяет, что хэш появляется в BitCoinData coinbase scriptSig, в нужном месте.
- Извлекает корень Merkle из формата блока Bitcoin из заголовка, а затем проверяет, что coinbase ТХ при условии, действительно, на самом деле, существуют в этом блоке (с помощью ветви, корень, TX и заголовок вместе).
- Проверяется, что хэш заголовка формата блок Биткойна ниже трудности, находящейся в структуре NameBlock.
Теперь вы убедились, что достаточно веское доказательство работы было сделано за содержание структуры NameBlock. Ваш узел теперь может передать вновь найденный блок (или, если вы не используете P2P сети делает его доступным на сервере, и т.д.).
С другой стороны, когда Bitcoin находит блок, который является правильным для сети Bitcoin и цепи, он передает его и, очевидно, хэш вашего NameBlock включен. К счастью, это всего лишь дополнительные 33 байт накладные расходы, так что никто не заботится о ней - "загрязнение" финансовой цепи как тривиальное и постоянная.
Обработка вашего нового блока цепи
Вы должны обращаться с реорганизаций. Это стандартная часть алгоритма блок-цепи. Когда происходит повторный орг вы должны убедиться, что состояние вашего мира все еще имеет смысл. Например, в новой сети может быть, кто-то в настоящее время владеет имя, которое вы думали, вы владели. Это до вас, как информировать пользователей об этих событиях и что приложение конкретных логика здесь уместно.
Вы можете выбрать свои собственные параметры для новой цепи. В качестве примера, Сатоши выбрал целевой один новый блок каждые десять минут, как компромисс между временем ожидания и впустую работы. Вы можете выбрать что-то гораздо больше (часы, дни) или гораздо быстрее, если вы готовы терпеть больше расколов из-за блоки были обнаружены одновременно. Bitcoin перенаправляет сложности примерно каждые две недели. Вы можете выбрать какой-либо другой отрезок времени.
Класс BlockChain в BitCoinJ показывает, как реализовать эти алгоритмы - это не сложно. Код в значительной степени зависит от формата сделки Bitcoin, так что, возможно, можно было бы использовать в новых сетях.
Чтобы сохранить блок цепи, Satoshi решил использовать Berkeley DB как способ индексировать от операций с блоками они появились в (среди прочего). Вы можете использовать любую базу данных понравившихся.
Плата за альтернативные ресурсы с Bitcoins
Примечание: я переписал этот раздел позже, чтобы удалить разговоры о горящих монетах, как это не нужно
Часто приводимая причина для ввода данных, относящихся к DNS в Bitcoin желание платить за имена с Bitcoins. Вы можете сделать это с независимой цепи тоже, потому что вы делаете правила и может связать две цепи вместе, как вы считаете нужным.
Для реализации этого мы продолжим наше сообщение сделки, как это:
Код:
сообщение NameTx {
требуется имя строки = 1;
повторные байтов ip_addresses = 2;
требуемые байты Публичных = 3;
перечисление ClaimType {
НОВОЕ ИМЯ,
ПЕРЕВОД
}
Требуемый тип ClaimType = 4;
// Используется только если тип == TRANSFER. Новый владелец имя и подпись доказав текущего владельца.
дополнительный байт dest_pubkey = 5;
необязательный байт подпись = 6;
// Используется только если тип == NEW_NAME.
дополнительный байт purchase_pubkey = 7;
дополнительный байт purchase_signature = 8;
}
требуется имя строки = 1;
повторные байтов ip_addresses = 2;
требуемые байты Публичных = 3;
перечисление ClaimType {
НОВОЕ ИМЯ,
ПЕРЕВОД
}
Требуемый тип ClaimType = 4;
// Используется только если тип == TRANSFER. Новый владелец имя и подпись доказав текущего владельца.
дополнительный байт dest_pubkey = 5;
необязательный байт подпись = 6;
// Используется только если тип == NEW_NAME.
дополнительный байт purchase_pubkey = 7;
дополнительный байт purchase_signature = 8;
}
Для того, чтобы купить имя, которое стоит 10 BTC, пользователь нажимает "купить имя" Кнопка в их DnsCoin GUI. Он разговаривает с их локальным узлом Bitcoin через RPC и выполняет следующие функции:
- Создает новый Bitcoin адрес (ключ).
- Посылает 10 BTC на новый адрес (а транзакция отправки в себя).
- Извлечение ключа из Bitcoin, не означает, что он больше не доступен, чтобы провести в вашем бумажнике. Я думаю, что сип есть патчи, которые позволяют эту функцию - это не возможно с сегодняшним программным обеспечением, хотя.
- Сохраняет ключ в файле данных DnsCoin где-то.
- Устанавливает поле purchase_pubkey в публичной форме ключа (ECDSA pubkeys получены из закрытых ключей).
- Наборы purchase_signature нуля, знаки, которые копируют в NameTx, затем ставят свою подпись в поле purchase_signature.
Сделка о покупке имя теперь связано с адресом Bitcoin 10 BTC, в crytographically доказательно. Другие узлы DNS убедитесь, что сделка Bitcoin существует и подтверждается, прежде чем они согласны теперь вы владеете именем.
Для того, чтобы освободить имя, которое вы повторно импортировать ключ обратно в Bitcoin и тратить монеты. Поскольку DNS-узлы связаны с узлами Bitcoin, они быстро узнают, что монеты были потрачены и сделать имя для вновь покупки.
Другие схемы возможны, как заплатить, чтобы шахтер, если вы хотите, чтобы ваша сеть, чтобы взаимодействовать с Bitcoin по-другому.