Хорошо известно, что неподтвержденные операции не являются безопасными из-за риск двойных расходов. Ниже приводится предложение, как смягчить (не полностью устранить) этот риск.
Представьте себе, если владелец монеты не были в состоянии использовать свой закрытый ключ более чем один раз, то он не смог бы создать другой конфликтующей расходы. Мы не можем принять эту способность от него, тем не менее, мы можем попытаться создать сильный стимул (Как и все Bitcoin, которая построена на стимулы) не подписывать противоречивую сделку.
Хорошей новостью является то, что это возможно.
ECDSA закрытые ключи Bitcoin могут быть использованы, чтобы подписать любое количество сделок. Если вы используете один и тот же адрес, чтобы получить монеты и платить с этого адреса для нескольких покупок, вы уже на законных основаниях, используя один и тот же секретный ключ, чтобы подписать несколько сделок.
Существует еще один класс схем подписи под названием "Подписи единовременные", Который звучит как именно то, что нам нужно. Лампорт подпись является наиболее известным примером. По характеру Lamport подписи, каждый раз, когда вы что-то подписать вы обнаруживаете часть вашего секретного ключа, а также уровень безопасности вашей второй подписи половина безопасности первой подписи. Вы видите, что, несмотря на название, Лампорт и аналогичные схемы подписи не являются строго единовременным: если взять секретный ключ Лампорта с 128-битной безопасностью, ваша вторая подпись будет иметь уровень безопасности 64 бита, который по-прежнему умеренно безопасный. Такая медленная деградация безопасности не подходит для нашей цели.
Моя идея заключается в том, чтобы изменить обычную старую схему ECDSA подписи и сделать это один раз. Вот как мы можем это сделать.
Стандартный ECDSA подпись зависит от ряда К которые должны храниться в тайне и никогда не использовать повторно. ECDSA предписывает, что это число должно быть сгенерированы заново для каждой новой подписи (случайно или детерминированно в RFC 6979). Если же К используется для подписи двух различных сообщений, закрытый ключ будет обнаружено. Именно это свойство хорошо ECDSA, что я собираюсь использовать: требуют, чтобы каждый подписавшийся обязан К в то же самое время, что он создает свой секретный ключ (и Bitcoin адрес). То есть, сделать К часть закрытого ключа в новой схеме подписи, а также обязательство - часть открытого ключа.
Ниже полное описание единовременного схемы ECDSA подписи.
Генерация ключа:
Генерировать стандартный ECDSA закрытый ключ, как обычно.
Генерация случайных К.
oneTimePrivateKey знак равноstandardPrivateKey, К)
Стандартный открытый ключ Икс-координата точки кривой standardPrivateKey Икс г, где г это генератор, х является точкой умножения.
Кроме расчета р в виде Икс-координата точки кривой К Икс г (Это точно р от стандартной подписи (р, s)).
oneTimePublicKey = (StandardPublicKey, (К Икс г) .x) = (standardPublicKey, р )
oneTimeAddress = Base58 (hash_and_checksum ( oneTimePublicKey ))
Подписание:
Стандартный ECDSA подпись (р, s). р уже известно из открытого ключа. подсчитывать s как обычно. поскольку р уже известно из открытого ключа, мы можем бросить его из подписи и держать только s.
Проверка:
Реконструировать стандартный открытый ключ и подпись, переместив р от открытого ключа подписи и применять стандартную процедуру проверки ECDSA.
Конечный результат, если пользователь попытается подписать вторые неподтвержденные транзакции с одноразовым секретным ключом описаны выше, он будет должны повторно К, следовательно, раскрывать свой закрытый ключ. После того, как его закрытый ключ раскрыт, любой может взять свои монеты, шахтеры, конечно, в лучшем положении, чтобы сделать это (они не будут выполнять операции, которые посылают рассыпавшиеся монеты по любому адресу, но их).
Если первая подпись уже глубоко в blockchain, вторая подпись является безвредной (если пользователь не имел другие неизрасходованные выходы на тот же адрес).
Эта схема подписи разовой является наиболее полезной для обеспечения неподтвержденных транзакций, как любой потенциальный злоумышленник должен учитывать риск, что система наносит ответный удар, и он теряет свои монеты. Тогда все потенциальные злоумышленники, не имеющие доступа к добыче ресурсов, вероятно, из игры.
Очевидно, что это не совместимо с повторным использованием адреса. Кроме того, программное обеспечение бумажник должно быть переработано для лечения создания второй подписи на тот же ключ, как глупо, как разместить закрытый ключ к Facebook. Если не запрещено в программном обеспечении, пользователи могут быть обмануты, чтобы думать их сделка не придет через какое-то причине, нужно отправить его снова ... закрытый ключ разоблачены, монеты потеряли.
Так как сделать адрес повторного использования невозможно в Bitcoin потребуют значительных модификаций, а также потому, что PoW уже решает двойную задачу потратить довольно хорошо, я не вижу подписи единовременных подходят к Bitcoin в ближайшее время. Тем не менее, они могут быть хорошо подходят для altcoins и боковых цепей, особенно те, которые уже есть стелс-адрес.
PoS валюту можно использовать один подпись времени для решения ничего-на-карты вопроса и сделать двойное голосование слишком рискованным (двойное голосование по существу таким же, как двойные расходы). Для того, чтобы подписать более одного блок, можно получить последовательные частные ключи в стиле BIP32 из главного секретного ключа и номера блока.
Я сделал подпись ECDSA один-приуроченную имея подписант обязуются К. Тот же трюк может быть применен к другим схемам подписи, которые включают К, например DSA, Шнорра.
Эта идея не совсем новая, я искал и нашел несколько публикаций, где он также отметил:
http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=057011325AE4FA29DFE5401D31C9AD04?doi=10.1.1.40.2274&Rep = REP1&тип = PDF