В настоящее время, если кто-то публикует свой адрес Bitcoin (чтобы получать пожертвования, например), любой желающий может узнать, сколько денег он получил. Я предлагаю протокол, который может быть использован для получения пожертвований, не раскрывая все выплаты каждому. Человек, который хочет получить деньги будет генерировать 3 ключа:
1. Открытый ключ может быть использован для отправки денег на человека, но не видеть, когда другие отправить ему деньги.
2. Полу-закрытый ключ может быть использован, чтобы увидеть все входящие транзакции, но не тратить их.
3. Закрытый ключ необходимо тратить деньги.
Ожидается, что пользователь будет публиковать свой открытый ключ, держать Hist полу-закрытый ключ на своем интернет-компьютере, и держать его закрытый ключ в автономном режиме.
Реализация
Я буду использовать строчные буквы для обозначения ECDSA закрытых ключей и соответствующие прописных букв для обозначения соответствующего открытых ключей.
Создание адреса: чтобы создать адрес, пользователь создает для пар ключей ECDSA. Давайте назовем их (, ) а также (б, В). Затем, (, В) Является открытым ключом, (, В) Является полу-закрытый ключ, и (, б) Является частным ключом.
Отправка денег: Предположим, что кто-то хочет отправить деньги на ключ (, В), И некоторые из них в настоящее время принадлежит ключ С. Он выполняет Диффи-Хеллмана обмена ключами между ключами а также С для создания общего секрета dзнак равно*с. Затем он использует тип 2 ключа функции выведения (используется в 2 типа детерминированных кошельков), чтобы создать новый открытый ключ Е из В а также d. Он чем отправляет деньги на адрес генерируется из Е. Обратите внимание, что С должен появиться в одном из входов.
Получение денег: на приемной стороне, пользователь просматривает все транзакции, чтобы убедиться, что они соответствуют его полу-закрытый ключ (, В). Чтобы сделать это, он перебирает все входы, которые соответствуют послать к адресу шаблона. Позволять С быть ключом, который появляется в одном из таких входов. Он вычисляет dзнак равноС* а также Е. Если Е совпадает с адресом деньги был отправлен, то эти деньги были посланы ему.
Тратить деньги: для генерации секретного ключа е, пользователь генерирует d как раньше, и черпает е из б а также d.
Почему это полезно?
Было бы иметь возможность опубликовать адрес таким образом, что никто не сможет увидеть, сколько денег было получено.
Если кто-то хочет отправить деньги, принадлежащие нескольким клавишам, он может отправить его в нескольких операциях, которые не могут быть связаны друг с другом.
Наконец, пользователи не должны иметь много адресов. Они могут посылать изменения в себе, используя ту же самую процедуру.