На будущее: не обязательно использовать сам блокчейн для записи шепота. Для этого подойдет VIZ Hub с поддержкой такой возможности.
Протокол Whisper на VIZ
Удивительное рядом. Вас хотят слышать. Все хотят. А то вдруг, вы шепнете на ухо знакомому в парке мем «Хайль Гидра!»?! Непорядок!
Действительность такова, что шепот в парке никто не услышит, кроме вашего собеседника.
И на кухне ваши разговоры — остаются вашими.
Но в интернете, вдруг, всем нужно знать, что за данные идут от узла А к узлу Б. Да ещё в открытом виде.
Протокол Шепот (Whisper) позволяет реализовать скрытые сообщения от узла А. С одной деталью. Неизвестно какому узлу Б.
Для всех это будет шум с недоказуемым смыслом.
Пока узел Б не попытается разобрать этот шум, а вдруг он предназначен ему.
Шифрование сообщение через shared key существует давно (относительно). Те же заметки к переводам в сети BitShares реализованы через aes-256-cbc, используя в качестве пароля shared key между двумя узлами.
В предлагаемом протоколе VIZ Whisper есть важное отличие. В операции нет конкретного получателя. Более того, отправитель ТОЖЕ может быть скрыт, а кто-то будет использовать промежуточный аккаунт, возможно служебный/общий/анонимный, чтобы доставить шепот в сеть.
Алгоритм работы для отправителя:
- Получение shared key из memo private key и публичного ключа получателя.
- Шифрование сообщения и получение стандартного набора данных, которое можно преобразовать в base58 строку.
- Создание приватного ключа Whisper из строки: "VIZ Whisper" + (unixtime / 10 | 0).
- Получение whisper shared key из полученного whisper private key и публичного ключа получателя.
- Новое шифрование сообщение, используя whisper shared key в качестве пароля, на данном этапе можно дополнить набор данных отправителем, чтобы упростить расшифровку вложенного сообщения.
- Загрузка сообщения в сеть через операцию custom с названием протокола W (сокращаем Whisper для экономии пропускной способности).
Алгоритм работы для получателя:
- Мониторим блоки, ищем custom операции с протоколом W.
- В цикле вычисляем приватный ключ VIZ Whisper" + (block_unixtime / 10 | 0) и пытаемся расшифровать сообщение через общий shared key. Если не подходит отнимаем по 10 секунд у unixtime для каждой попытки (около 3 или 6 хватит, чтобы избежать большого лага у отправителя).
- Если успех, то расшифровываем сообщение внутри по shared key с отправителем транзакции ИЛИ, если в массиве данных присутствует указание на другой аккаунт — с указанным аккаунтом.
- Расшифровываем сообщение и выводим на экране.
Данный протокол успешно скрывает получателя (что не исключает догадку, кто с кем общается, если участников в протоколе несколько) и потенциально — отправителя.
Предлагаю участникам VIZ подключиться к обсуждению протокола, может кто-то захочет разработать экспериментальную версию dapp для тестирования в действующей сети. Ну а пока... Вспомним вселенную Marvel :D
Обновлена библиотека viz-php-lib для поддержки зашифрованных memo: https://github.com/VIZ-Blockchain/viz-php-lib
Дополнено: для большей анонимности и невозможности раскрыть отправителя или получателя методом подбора к публичным ключам всех пользователей в блокчейне — добавление в протокол предложение использовать строку-миксер для формирования whisper ключа в первом сообщении с предложением начать беседу. После чего получатель сообщения становится скрытым (и отправитель в случае использования стороннего поставщика транзакций в сеть).