Я исследовал, как улучшить скорость генерации тщеславия адресов, и я пришел с двумя идеями:
Первым использовал нестандартную кодировку открытого ключа. Например, если вы используете несжатые открытые ключи и вы подушечка х и у значения с от 1 до 10 префиксов нулей, вы можете создать 100 различные адреса, которые при хэшируются по SHA256 / ripemd160 дадут вам 100 различных строк Base58. Над головой каждого Публичным будет ДО 20 байт. Для того, чтобы перечислить эти адреса, нужно только выполнить хэш-функцию, и вам не нужно вычислять эллиптические операции кривых (только один раз в 100 двойных хэш).
Но проблема с этим подходом состоит в том, чтобы выкупить средства предыдущего выпуска, вы должны поместить в сценарии нестандартной кодировки Публичного. Это в свою очередь порождает две проблемы. Во-первых, что вам нужен патч для клиента, чтобы сделать это, или сделать это вручную с помощью интерфейса RPC. Вторая проблема заключается в том, что начиная с версии 0.8.3 клиента Satoshi, открытые ключи проверяются на наличие канонического кодирования. Таким образом, сделка выкупа не будет передана по сети больше. Вы можете отправить его непосредственно на шахтер, но это огромное ограничение.
Я хотел бы сделать это таким образом, что может быть в качестве стандарта, насколько это возможно. Тогда я придумал эту идею:
Вместо того чтобы генерировать нормальный адрес тщеславия, генерируют адрес P2SH тщеславия для сценария, содержащего транзакцию multisig 1-в-2. Первый открытый ключ является пользователя "без vanitized" Ключ Публичный (что будет "vanitized"). Второй Публичных является одноразовым значением, в сжатом формате ключ общественности.
Я называю эти адреса "P2SH / М", Чтобы отличить от всех других форматов. P2SH / M-адрес, так как P2SH адрес, начинается с цифрой base58 "3",
Это, как адрес на самом деле работает в сценариях:
scriptpub: OP_HASH160 [20 байт-хэш-значение] OP_EQUAL
scriptsig: OP_0 [без vanitized-privkey-подпись] {1 [не-vanitized-pubkey1] [Nonce-ключ] 2} OP_CHECKMULTISIG
Здесь [20 байт-хэш-значение] равно RIPEMD-160 (SHA ({1 [pubkey1] [Nonce-ключ] 2 OP_CHECKMULTISIG}))
Если третья сторона генерирует тщеславие адреса, он может сделать на два вещей, чтобы доказать, что он не имеет закрытый ключ, связанный с Нонс-Публичным:
1. Суетности-минер выбирает случайное слово, чтобы быть выше, чем поле значения р.
Он может использовать случайное слово между FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F и 2 ^ 256.
Таким образом, X координата будет некорректное значение поля.
Это когда одноразовое истолковано как pubkeys не будет принята OpenSSL Публичной проверки. Тем не менее, они будут приняты в качестве стандарта Bitcoin клиента 0.8.3 и ранее. Это происходит потому, что IsCanonicalPubKey () не проверяет это.
Тогда тщеславия-шахтер не может создать правильный секретный ключ этого недопустимых Публичный.
Он будет иметь 2 ^ 32 попыток перед необходимостью умножать без vanitized Публичных для того, чтобы иметь возможность сканировать еще 2 ^ 32 элементов.
Я действительно не нравится эта идея, так как, возможно, в будущем команда разработчиков ядра может принять решение, чтобы добавить этот чек IsCanonicalPubKey ()
2. Суетности-минер использует 32-байтовый одноразовый номер, который является хэш-дайджестом известного порядкового номера.
Теперь тщеславие шахтер может доказать, что он не выбрал конкретный нонс Публичного, показывая хэш-прообраз. Чтобы найти личный ключ malicuius тщеславия-шахтер должен был бы сломить сопротивление прообраз хэш-функции или сломаться ECDSA.
одноразовый ключ = HASH (последовательный номер)
После обнаружения, что временное значение хэширует сценарий в P2SH / M туалетным адрес, тщеславие-рудничные проверяет, что сжатый Nonce / точка лежит на эллиптической кривой. Если этого не произойдет, то продолжает пытаться. Если это произойдет, то останавливается. Вероятность не быть в эллиптической кривой равен 1/2.
Этот метод генерирует % Стандартных 100 адресов действительны и навсегда использовать P2SH тщеславие. Нам нужно только, чтобы клиенты эволюционировать немного больше для автоматической обработки платя / приема от P2SH / multisig адресов.
В настоящее время это может быть сделано с клиентом Satoshi и RPC межфазных границ с помощью validateaddress / addmultisigaddress / sendtoaddress / getrawtransaction / createrawtransaction / signrawtransaction.
Кроме того, существование нонса не ухудшает производительность клиента Satoshi при проверке подписей, поскольку scriptsig подпись всегда будет соответствовать первому Публичной, поэтому не требуется проверка против второго Нонса-Публичным.
Накладные расходы по сделке, конечно, очень низкие, около 35 байт.
Я думаю, что текущее убыстрение с использованием GPU помоему P2SH / M является 20X, если вы добыча вашего собственного P2SH / M-адреса или 10Й, если третья сторона мина их для вас (может быть и больше, но это оценка).
Эта последняя идея интересна, так как он может сканировать пространство ключей 32-байтовое только с хэш-операций RIPEMD / SHA, поэтому он может быть эффективно выполнено в FPGA или ASIC, без необходимости в операциях ЕС. Так что, может быть, мы могли бы добывать тщеславие адрес с 2 более выбранными префиксами символов.
С наилучшими пожеланиями, Серхио.