Прошло
2.5
года, и нам удалось подтвердить свой концепт: сейчас доступны приложения мессенджера для iOS, Web PWA, Windows, GNU/Linux, Mac OS и Android.Сегодня мы расскажем, как устроен мессенджер на блокчейне и как клиентским приложениям работать с его API.
Мы хотели, чтобы блокчейн решил вопросы безопасности и приватности классических P2P-мессенджеров:
- Один клик для создания аккаунта — никаких телефонов и электронных почт, нет доступа к адресным книгам и геолокациям.
- Собеседники никогда не устанавливают прямых соединений, все общение идет через распределенную систему узлов. IP-адресы пользователей недоступны друг другу.
- Все сообщения шифруются End-to-End curve25519xsalsa20poly1305. Вроде бы этим никого не удивишь, но у нас-то исходный код открыт.
- MITM-атака исключена — каждое сообщение является транзакцией и подписывается Ed25519 EdDSA.
- Сообщение попадает в свой блок. Последовательность и
timestamp
блоков не исправишь, а следовательно и порядок сообщений. - “Я этого не говорил” не прокатит с сообщениями в блокчейне.
- Нет центральной структуры, которая делает проверки на “достоверность” сообщения. Это делает распределенная система узлов на основе консенсуса, а она принадлежит пользователям.
- Невозможность цензуры — аккаунты нельзя блокировать, а сообщения удалять.
- Блокчейн 2FA — альтернатива адской 2FA по SMS, поломавшей немало здоровья.
- Возможность получить все свои диалоги с любого устройства в любое время — это возможность не хранить диалоги локально вообще.
- Подтверждение доставки сообщений. Не на устройство пользователя, а в сеть. По сути, это подтверждение возможности получателя прочитать ваше сообщение. Это полезная фича для отправки критических уведомлений.
Из плюшек блокчейна также тесная интеграция с криптовалютами Ethereum, Dogecoin, Lisk, Dash, Bitcoin (этот пока в процессе) и возможность отправки токенов в чатах. Мы даже сделали встроенный крипто-обменник.
А дальше — как все это работает.
Сообщение — это транзакция
Все уже привыкли, что транзакции в блокчейне передают токены (монеты) от одного пользователя другому. Как у биткоина. Мы же создали особый тип транзакций для передачи сообщений.
Чтобы отправить сообщение в мессенджере на блокчейне, нужно пройти несколько этапов:
- Зашифровать текст сообщения
- Поместить зашифрованный текст в транзакцию
- Подписать транзакцию
- Отправить транзакцию на любой узел сети
- Распределенная система узлов определяет “достоверность” сообщения
- Если все ОК — транзакция с сообщением включается в следующий блок
- Получатель извлекает транзакцию с сообщением и расшифровывает
Этапы 1–3 и 7 выполняются локально на клиенте, а 5–6 — на узлах сети.
Шифрование сообщения
Сообщение шифруется приватным ключом отправителя и публичным ключом получателя. Публичный ключ мы возьмем из сети, но для этого аккаунт получателя должен быть инициализирован, то есть иметь хотя бы одну транзакцию. Можно использовать REST-запрос
GET /api/accounts/getPublicKey?address={ADAMANT address}
, а при загрузке чатов публичные ключи собеседников уже будут в наличии.Мессенджер шифрует сообщения алгоритмом curve25519xsalsa20poly1305 (NaCl Box). Поскольку аккаунт содержит ключи Ed25519, для формирования box’а предварительно ключи нужно преобразовать в Curve25519 Diffie-Hellman.
Вот пример на JavaScript’е:
/**
* Encodes a text message for sending to ADM
* @param {string} msg message to encode
* @param {*} recipientPublicKey recipient's public key
* @param {*} privateKey our private key
* @returns {{message: string, nonce: string}}
*/
adamant.encodeMessage = function (msg, recipientPublicKey, privateKey) {
const nonce = Buffer.allocUnsafe(24)
sodium.randombytes(nonce)
if (typeof recipientPublicKey === 'string') {
recipientPublicKey = hexToBytes(recipientPublicKey)
}
const plainText = Buffer.from(msg)
const DHPublicKey = ed2curve.convertPublicKey(recipientPublicKey)
const DHSecretKey = ed2curve.convertSecretKey(privateKey)
const encrypted = nacl.box(plainText, nonce, DHPublicKey, DHSecretKey)
return {
message: bytesToHex(encrypted),
nonce: bytesToHex(nonce)
}
}
Формирование транзакции с сообщением
Транзакция имеет такую общую структуру:
{
"id": "15161295239237781653",
"height": 7585271,
"blockId": "16391508373936326027",
"type": 8,
"block_timestamp": 45182260,
"timestamp": 45182254,
"senderPublicKey": "bd39cc708499ae91b937083463fce5e0668c2b37e78df28f69d132fce51d49ed",
"senderId": "U16023712506749300952",
"recipientId": "U17653312780572073341",
"recipientPublicKey": "23d27f616e304ef2046a60b762683b8dabebe0d8fc26e5ecdb1d5f3d291dbe21",
"amount": 204921300000000,
"fee": 50000000,
"signature": "3c8e551f60fedb81e52835c69e8b158eb1b8b3c89a04d3df5adc0d99017ffbcb06a7b16ad76d519f80df019c930960317a67e8d18ab1e85e575c9470000cf607",
"signatures": [],
"confirmations": 3660548,
"asset": {}
}
Для транзакции-сообщения самое важное значение имеет
asset
— в него нужно разместить сообщение в объекте chat
со структурой:message
— сохраняем зашифрованное сообщениеown_message
— noncetype
— тип сообщения
Сообщения тоже делятся на типы. По сути, параметр
type
сообщает, как понимать message
. Можно отправить просто текст, а можно объект с интересностями внутри — например, так мессенджер делает переводы криптовалют в чатах.В итоге мы формируем транзакцию:
{
"transaction": {
"type": 8,
"amount": 0,
"senderId": "U12499126640447739963",
"senderPublicKey": "e9cafb1e7b403c4cf247c94f73ee4cada367fcc130cb3888219a0ba0633230b6",
"asset": {
"chat": {
"message": "cb682accceef92d7cddaaddb787d1184ab5428",
"own_message": "e7d8f90ddf7d70efe359c3e4ecfb5ed3802297b248eacbd6",
"type": 1
}
},
"recipientId": "U15677078342684640219",
"timestamp": 63228087,
"signature": "тут будет подпись"
}
}
Подпись транзакции
Чтобы все были уверены в достоверности отправителя и получателя, во времени отправки и содержимом сообщения, транзакцию подписывают. Цифровая подпись позволяет проверить достоверность транзакции по публичному ключу — приватный ключ для этого не нужен.
А вот сама подпись как раз выполняется приватным ключом:
Из схемы видно, что транзакцию сначала хешируем SHA-256, а потом подписываем Ed25519 EdDSA и получаем подпись
signature
, а идентификатор транзакции — это часть SHA-256-хэша.Пример реализации:
1 — Формируем блок данных, включая сообщение
/**
* Calls `getBytes` based on transaction type
* @see privateTypes
* @implements {ByteBuffer}
* @param {transaction} trs
* @param {boolean} skipSignature
* @param {boolean} skipSecondSignature
* @return {!Array} Contents as an ArrayBuffer.
* @throws {error} If buffer fails.
*/
adamant.getBytes = function (transaction) {
...
switch (transaction.type) {
case constants.Transactions.SEND:
break
case constants.Transactions.CHAT_MESSAGE:
assetBytes = this.chatGetBytes(transaction)
assetSize = assetBytes.length
break
…
default:
alert('Not supported yet')
}
var bb = new ByteBuffer(1 + 4 + 32 + 8 + 8 + 64 + 64 + assetSize, true)
bb.writeByte(transaction.type)
bb.writeInt(transaction.timestamp)
...
bb.flip()
var arrayBuffer = new Uint8Array(bb.toArrayBuffer())
var buffer = []
for (var i = 0; i < arrayBuffer.length; i++) {
buffer[i] = arrayBuffer[i]
}
return Buffer.from(buffer)
}
2 — Считаем SHA-256 от блока данных
/**
* Creates hash based on transaction bytes.
* @implements {getBytes}
* @implements {crypto.createHash}
* @param {transaction} trs
* @return {hash} sha256 crypto hash
*/
adamant.getHash = function (trs) {
return crypto.createHash('sha256').update(this.getBytes(trs)).digest()
}
3 — Подписываем транзакцию
adamant.transactionSign = function (trs, keypair) {
var hash = this.getHash(trs)
return this.sign(hash, keypair).toString('hex')
}
/**
* Creates a signature based on a hash and a keypair.
* @implements {sodium}
* @param {hash} hash
* @param {keypair} keypair
* @return {signature} signature
*/
adamant.sign = function (hash, keypair) {
return sodium.crypto_sign_detached(hash, Buffer.from(keypair.privateKey, 'hex'))
}
Отправка транзакции с сообщением на узел сети
Поскольку сеть децентрализованная, подойдет любой из узлов с открытым API. Делаем POST-запрос на эндпоинт
api/transactions
:curl 'api/transactions' -X POST -d 'TX_DATA'
В ответ получим ID транзакции типа
{
"success": true,
"nodeTimestamp": 63228852,
"transactionId": "6146865104403680934"
}
Проверка достоверности транзакции
Распределенная система узлов на основе консенсуса определяет “достоверность” транзакции-сообщения. От кого и кому, когда, не заменили ли сообщение другим, а правильное ли указано время отправки. Это очень важное преимущества блокчейна — нет центральной структуры, которая отвечает за проверки, и последовательность сообщений и их содержимое не подделать.
Сначала достоверность проверяет одна нода, а потом рассылает другим — если большинство говорят, что все в порядке, транзакция будет включена в следующий блок цепи — это и есть консенсус.
Часть кода узла, которая отвечает за проверки, можно посмотреть в GitHub — validator.js и verify.js. Ага, узел работает на Node.js.
Включаем транзакцию с сообщением в блок
Если консенсус достигнут, транзакция с нашим сообщением попадет в следующий блок наряду с другими достоверными транзакциями.
Блоки имеют строгую последовательность, и каждый последующий блок формируется на основе хешей предыдущих блоков.
Суть в том, что наше сообщение также включено в эту последовательность и не может быть “переставлено”. Если в блок попадает несколько сообщений, их порядок будет определен по
timestamp
сообщений.Чтение сообщений
Приложение-мессенджер извлекает транзакции из блокчейна, которые отправлены адресату. Для этого мы сделали эндпоинт
api/chatrooms
. Все транзакции доступны для каждого — можно получить зашифрованные сообщения. А вот расшифровать сможет только получатель своим приватным ключом и публичным ключом отправителя:
**
* Decodes the incoming message
* @param {any} msg encoded message
* @param {string} senderPublicKey sender public key
* @param {string} privateKey our private key
* @param {any} nonce nonce
* @returns {string}
*/
adamant.decodeMessage = function (msg, senderPublicKey, privateKey, nonce) {
if (typeof msg === 'string') {
msg = hexToBytes(msg)
}
if (typeof nonce === 'string') {
nonce = hexToBytes(nonce)
}
if (typeof senderPublicKey === 'string') {
senderPublicKey = hexToBytes(senderPublicKey)
}
if (typeof privateKey === 'string') {
privateKey = hexToBytes(privateKey)
}
const DHPublicKey = ed2curve.convertPublicKey(senderPublicKey)
const DHSecretKey = ed2curve.convertSecretKey(privateKey)
const decrypted = nacl.box.open(msg, nonce, DHPublicKey, DHSecretKey)
return decrypted ? decode(decrypted) : ''
}
А что еще?
Поскольку сообщения таким способом доставляются около 5 секунд — это время появления нового блока сети — мы придумали сокет-подключение клиент-узел и узел-узел. Когда узел получает новую транзакцию, он проверяет ее валидность и передает на другие узлы. Транзакция доступна клиентам-мессенджерам еще до наступления консенсуса и включения в блок. Так мы будем доставлять сообщения мгновенно, как и привычные мессенджеры.
Чтобы хранить адресную книгу, мы сделали KVS — Key-Value Storage — это еще один тип транзакций, в которых
asset
шифруется не NaCl-box, а NaCl-secretbox. Так мессенджер хранит и другие данные.Передача файлов/изображений и групповые чаты требуют еще много работы. Конечно, в формате тяп-ляп это можно “прикрутить” быстро, но мы хотим сохранить тот же уровень приватности.
Да, есть еще над чем работать — в идеале реальная приватность предполагает, что пользователи не будут подключаться к публичным узлам сети, а поднимут свои. Как вы думаете, сколько процентов пользователей так делает? Правильно, 0. Частично этот вопрос нам удалось решить Tor-версией мессенджера.
Мы доказали, что мессенджер на блокчейне может существовать. Ранее была только одна попытка в 2012 году — bitmessage, неудавшаяся из-за большого времени доставки сообщений, нагрузки на процессор и отсутствия мобильных приложений.
А скептицизм связан с тем, что мессенджеры на блокчейне опережают время — люди не готовы брать ответственность за свой аккаунт на себя, владение личной информацией пока не в тренде, а технологии не позволяют обеспечить высокие скорости на блокчейне. Следом будут появляться более технологичные аналоги нашего проекта. Вот увидите.
Комментарии (72)
ovsale
19.09.2019 19:12-1я так понимаю сообщения хранятся открыто но зашифрованы? если через 10 лет квантовый компьютер сможет расшифровать? будете убивать историю?
lebedevau
19.09.2019 20:48+1Да, так. Даже если такое будет возможно, расшифровать «все» не получится, а вот переписку между U123456 и U654321 можно будет. Но это минимальная из бед, которые принесет квантовый компьютер. Все-все-все построено на этой криптографии, и не только «компьютерный мир». Вспомните про закон Яровой и аналоги в других странах — весь трафик хранится, и прочитать в таком случае можно будет не только переписку в блокчейн-мессенджере.
Пока это вопрос философский.ovsale
19.09.2019 22:23+1а что дает мессенджеру блокчейн?
JustDeveloper Автор
19.09.2019 22:48В начале статьи есть перечисление «Мы хотели, чтобы блокчейн решил вопросы безопасности и приватности классических P2P-мессенджеров».
Aelliari
20.09.2019 07:09вопросы безопасности и приватности
И как в этом вопросе помогает именно блокчейн? Из статьи я не понял, для большинства перечисленных пунктов он не обязателен.
“Я этого не говорил” не прокатит с сообщениями в блокчейне
Возможность «вечного» хранения рассматриваю как угрозу приватности.JustDeveloper Автор
20.09.2019 09:14Для меня это самое важное:
- Порядок сообщений, их содержимое, факт написания, источник и получателя, дату и время не исправить
- Доступ к сообщениям с любого устройства в любое время
- Можно не хранить сообщения локально, всегда подгружая из блокчейна
- Криптокошельки и криптосервисы типа анонимного обменника
Блокчейн не творит чудеса. Вероятно, эти задачи можно решить другими способами. Мы рассматривали концепт — альтернативный способ переписки. Получили АДАМАНТ. Кому-то понравилась идея, а кому-то нет. Я считаю, что это первый блин, который комом.
WhiteBlackGoose
19.09.2019 23:04Если квантовые компьютеры не будут тратить время на генерацию x и проверку f(x), весь мир временно сломается.
ValdikSS
19.09.2019 19:33Мы доказали, что мессенджер на блокчейне может существовать. Ранее была только одна попытка в 2012 году — bitmessage, неудавшаяся из-за большого времени доставки сообщений, нагрузки на процессор и отсутствия мобильных приложений.
Bitmessage не использует Blockchain.
armid
19.09.2019 19:59Конечно можно просто попробовать, но все таки спрошу, а как быстро сообщения «доставляются»?
lebedevau
19.09.2019 20:49Поскольку сообщения таким способом доставляются около 5 секунд — это время появления нового блока сети — мы придумали сокет-подключение клиент-узел и узел-узел. Когда узел получает новую транзакцию, он проверяет ее валидность и передает на другие узлы. Транзакция доступна клиентам-мессенджерам еще до наступления консенсуса и включения в блок. Так мы будем доставлять сообщения мгновенно, как и привычные мессенджеры.
А потестировать ветку с сокетами уже можно: feat-sockets-branch-adamant-im.surge.shDGN
19.09.2019 21:275 секунд это одно подтверждение, для консенсуса надо сколько? 2-3? Каковы возможности по нагрузке, подозреваю он быстро ляжет в случае популярности.
lebedevau
19.09.2019 21:445 секунд — это и есть консенсус. То есть большинство узлов сети согласились, что блок и все транзакции в нем правильные.
Количество подтверждений — это сколько блоков прошло после «вашего». Имеет значение при переводах больших сумм, а то, мало ли, сеть «откатится».
lebedevau
19.09.2019 21:46А по нагрузке да, сеть будет захлебываться при больших количествах сообщений. Но пока нас это не беспокоит. :)
saege5b
19.09.2019 22:53А при популярности, а если ещё и звук с картинками гонять, то стонать намного раньше будут накопители.
И в минимальных требованиях будет ультрабыстрый твердотельник, на много-много терабайт.lebedevau
19.09.2019 23:52Стоит уточнить, что клиентские приложения, собственно мессенджеры, не требуют никаких хранилищ данных. Они вообще могут не хранить сообщения, а только подгружать в оперативку.
А вот владельцам узлов диски пригодятся — все сообщения/транзакции как раз хранят узлы. Но пока это ~10 ГБ. Картинки и файлы хранить в блокчейне не собираемся, есть мысль использовать инфраструктуру специализированных проектов типа FileCoin или Storj.
JustDeveloper Автор
19.09.2019 22:50Случайно отклонил чей-то комментарий с вопросом, извините, хотел нажать «Ответить». Повторите, если не сложно.
ASCIIst
20.09.2019 09:18Я хотел спросить на каком этапе происходит удаление сообщений. Я с темой мало знаком, но пока создаётся впечатление что сообщения будут храниться всё время существования программы и блокчейн будет постоянно «распухать».
JustDeveloper Автор
20.09.2019 09:26Спасибо!
Удаления сообщений не будет. В этом и смысл использования блокчейна — порядок сообщений, достоверность содержимого, возможность подгрузить их в любой момент с любого устройства.
Адской популярности не предрекаем пока, поэтому узлы сильно не «пухнут». А если такой вопрос встанет, там и подумаем. И еще важный момент: вы видите публичный АДАМАНТ. Но любая организация может поднять «свой АДАМАНТ» и хранить только свои сообщения. — к нам периодически обращаются компании и консультируются по этому поводу.
Num
20.09.2019 00:29Чем вы лучше Briar или Tox?
Как вы проверяете, что собеседник тот, за кого себя выдает? В Briar, например, нужно лично встретиться и сосканировать QR-код.jahr
20.09.2019 09:07Я не автор, но то, что бросается в глаза: есть оффлайновые сообщения и работа на многих девайсах «из коробки». Не знаю, как сейчас с этим в токс, но раньше было не очень.
JustDeveloper Автор
20.09.2019 09:18Я не скажу, что лучше — у всего есть свое применение. Для меня важна целостность блокчейна, достоверность сообщений, возможности не хранить сообщения локально и поменять устройство для доступа к переписке, криптопереводы в чатах. Верю в распространенность криптовалют в будущем ;)
Briar и Tox — отличные мессенджеры. Сам не пользуюсь, потому что «не прижились».
Встретиться и сосканировать код можно и в АДАМАНТе — мы так и пишем в приветственном сообщении, что это лучший способ обменяться контактами.
mwizard
20.09.2019 09:20Я верно понимаю, что в вашем мессенджере нужно платить за каждое отправленное сообщение?
JustDeveloper Автор
20.09.2019 09:32Верно. Цена 0.001 ADM за ~255 символов. Это около 0.1 копейки сейчас.
Это нужно для поддержания сети — чтобы у держателей узлов-валидаторов был стимул.Gurturok
20.09.2019 12:49Ну тоесть ваш im уже не анонимный (хотя это вроде и не заявлено в тексте) т.к. требует привязки к платежному средству?
И если используется blockchain который вместо транзакций хранит сообщения, файл с блокчейном постоянно растет или предусмотрен tail cut?lebedevau
20.09.2019 14:00Не-не. Никаких банковских карт или Яндекс-Денег.
На данный момент можно получить 0.1 ADM бесплатно каждому новому аккаунту; купить ADM анонимно на странице покупки токенов, используя DASH, DOGE, BTC, LTC, ETH, LISK; купить ADM на бирже.
Удаления сообщений не будет. В этом и смысл использования блокчейна — порядок сообщений, достоверность содержимого, возможность подгрузить их в любой момент с любого устройства. Адской популярности не предрекаем пока, поэтому узлы сильно не «пухнут». А если такой вопрос встанет, там и подумаем. И еще важный момент: вы видите публичный АДАМАНТ. Но любая организация может поднять «свой АДАМАНТ» и хранить только свои сообщения. — к нам периодически обращаются компании и консультируются по этому поводу. Пока размер блокчейна ~10 ГБ. Картинки и файлы хранить в блокчейне не собираемся, есть мысль использовать инфраструктуру специализированных проектов типа FileCoin или Storj.Gurturok
20.09.2019 14:12>На данный момент можно получить 0.1 ADM бесплатно каждому новому аккаунту; купить ADM анонимно на странице покупки токенов, используя DASH, DOGE, BTC, LTC, ETH, LISK; купить ADM на бирже.
Анонимно купить другие криптоволюты тоже нельзя, так что сложно но отследить можно, по крайней мере до счета в платежной системе («анонимный» киви-кошелек). И посмотрел на сайт, там таки есть про анонимность.
>Пока размер блокчейна ~10 ГБ.
блокчейн хранится на всех клиентах или только на «нодах»?
>Адской популярности не предрекаем пока, поэтому узлы сильно не «пухнут». А если такой вопрос встанет, там и подумаем.
Это грустно что «там подумаем», вот разработчики BitCoin тоже думали что пишут Proof-of-Concrt и им никто за пределами лабораторий не будет пользоваться, а в итоге блокчейн до сотен гигабайт вырос и ничего с этим поделать не могут.lebedevau
20.09.2019 15:02Анонимно купить другие криптоволюты тоже нельзя, так что сложно но отследить можно, по крайней мере до счета в платежной системе («анонимный» киви-кошелек). И посмотрел на сайт, там таки есть про анонимность.
«Анонимность» используем для «маркетинга». Мессенджер не анонимный, а псевдонимный. Метаданные какой адрес кому писал — доступны всем. Просто «псевдонимность» не все поймут.
блокчейн хранится на всех клиентах или только на «нодах»
Только на нодах. Клиент может не хранить локально даже свои сообщения, подгружая переписку при входе в аккаунт (по-дефолту так).
Это грустно что «там подумаем», вот разработчики BitCoin тоже думали что пишут Proof-of-Concrt и им никто за пределами лабораторий не будет пользоваться, а в итоге блокчейн до сотен гигабайт вырос и ничего с этим поделать не могут.
Согласен. У нас нет возможности (=денег) сейчас заняться этим вопросом.
Suntechnic
21.09.2019 10:54> Анонимно купить другие криптоволюты тоже нельзя
DASH, Monero, Zcash, uPlexa и тысячи их.lebedevau
21.09.2019 12:51Да, но как купить их анонимно? Терминалы Киви скоро перестанут принимать наличку без идентификации даже по-мелочи. А если учесть, что везде камер натыкано…
Suntechnic
21.09.2019 15:29А зачем покупать их анонимно? Покупаете Monero на кошелек White отправляете их на кошелек Grey и с него уже платите.
zzzzzzzzzzzz
20.09.2019 16:51Кстати, а что случится с мессенджером, если курс ADM внезапно упадёт или вырастет на несколько порядков?
lebedevau
20.09.2019 17:16А ничего не случится. Но если курс вырастет, то у нас будет возможность активнее работать над проектом.
zzzzzzzzzzzz
20.09.2019 17:40Если цена сообщения в ADM фиксирована, то при падении курса могут ноды начать разбегаться (место под хранение сообщения стоит дороже, чем получаемая за сохранение сообщения сумма), а при росте курса станет очень дорого отправлять сообщение, и поэтому начнут разбегаться уже потребители. Разве нет?
JustDeveloper Автор
20.09.2019 17:51Разбежавшихся держателей узлов и делегатов заменят другие, кто готов «майнить» на будущее. Это показала практика с АДАМАНТом, биткоином, эфиром, лайткоином.
Люди, которые используют АДАМАНТ нам чаще предъявляют «почему сообщение стоит так дешево, сделайте дороже». Все зависит от целей использования. Если уйдут те, кто использует АДАМАНТ для отправки смайликов, это хорошо — уменьшится нагрузка на сеть.
jahr
20.09.2019 10:14А чей блокчейн в основе? Писали свой с нуля или форкнули чей-то? С ходу понять не удалось даже по гитхабу.)
lebedevau
20.09.2019 11:59+1Форк Lisk'а.
Видимо, вы не заметили:
github.com/Adamant-im/adamant
ADAMANT is decentralized messaging platform based on Lisk codebase and written in JavaScript.
SpiritOfVox
20.09.2019 12:43Хранение сообщений в общей базе это хорошо для возможности вернуть историю и входа с нескольких устройств, но плохо для безопасности из-за увеличения доступа к архиву со 100% узлов.
Постоянное хранение без возможности удалить это удар по безопасности т.к. не позволить стереть опасное перед возможной встречей с мастерами убежать. Не все могут предсказать как их сегодняшнее сообщение скажется на них через 30 лет.
Раз сообщения платные, то нужно их как-то оплачивать соответственно анонимность очень сильно зависит от платежной системы. Кроме того если деньги кончились система бесполезна.
lebedevau
20.09.2019 14:11Про веченое хранение и «квантовый компьютер» для расшифровки в будущем отвечал выше. Чтобы вам не искать:
Даже если такое будет возможно, расшифровать «все» не получится, а вот переписку между U123456 и U654321 можно будет. Но это минимальная из бед, которые принесет квантовый компьютер. Все-все-все построено на этой криптографии, и не только «компьютерный мир». Вспомните про закон Яровой и аналоги в других странах — весь трафик хранится, и прочитать в таком случае можно будет не только переписку в блокчейн-мессенджере.
Пока это вопрос философский.
Еще добавлю: я вижу правильный сценарий использования мессенджера в периодической смене адресов, а еще лучше — отдельный адрес для каждого собеседника. У нас есть в проекте сделать в приложениях поддержку мульти-аккаунтов, чтобы удобно было использовать такой сценарий. Я вообще не сильно верю в шифрование в современном мире и даже без кантовых компьютеров. Государства настолько сильны, что расшуфруют все, что им дужно. Да, есть и «цена вопроса». На эту тему как-то писал статью: Secure Messengers Do Not Exist — They’re Impossible medium.com/adamant-im/secure-messengers-do-not-exist-theyre-impossible-7b2680cd3b36
Для получения токенов нужно иметь какую-то другую криптовалюту для обмена. Или приобрести некоторое количество токенов, потом проголосовать за один из форжинг-пулов сети, и он будет регулярно выплачивать вам свою часть добытого.
На данный момент можно получить 0.1 ADM бесплатно каждому новому аккаунту; купить ADM анонимно на странице покупки токенов, используя DASH, DOGE, BTC, LTC, ETH, LISK; купить ADM на бирже. Никаких банковских карт или Яндекс-Денег, которые знают вашу личность.SpiritOfVox
20.09.2019 15:48Проблема вечного архива не в квантовых компьютерах, а в том, что в вашей истории остаётся нечто чего вы хотели бы не хранить на случай если вы не сможете отказать в просьбе показать предыдущие сообщения. Это не обязательно может быть кто-то с паяльником и битой. Вполне возможно иметь секретики и попроще.
lebedevau
20.09.2019 17:21Понимаю вашу настороженность.
В концепции как раз «пишу — значит отвечаю за свои слова» — это для ваших собеседников.
А если кто-то из третьих лиц заставляет вас показать переписку — это не технический вопрос. И дело не в блокчейне. Вы же не думаете, что удаляя сообщения в Телеграме, они действительно удаляются?
zzzzzzzzzzzz
20.09.2019 12:46+1Спасибо, затея очень нужная!
Из статьи не понял:
— Механизм заинтересованности нод в участии. За отправку сообщений берутся ADM (о чём тоже стоило бы сказать в статье), но кому они дальше уходят? Кто из узлов сформирует блок? Что, если разные узлы сформировали блок одновременно?
— Откуда клиент при запуске берёт адрес ноды, к которой следует подключиться?
— «Подтверждение доставки сообщений. Не на устройство пользователя, а в сеть» — это как? Транзакция попала в блокчейн? А если клиента угораздило подключиться к злонамеренной ноде, та сказала «всё ок», а на самом деле всё не ок?
— Почему идёт речь про библиотеку NaCl, которая для C/C++, если и клиент, и ноды работают на JS?
— Как будут работать групповые чаты? Там ведь всё должно быть гораздо интереснее, чем просто двумя ключами зашифровать…
Что не понравилось в мессенджере:
— Платность сообщений. Да, очень дёшево (пока текст шлёшь, а не картинки), но надо следить за балансом, как-то его пополнять (а у меня криптовалюты вообще нет), в общем, дополнительный геморрой. Было бы лучше, если бы клиент каким-то образом сам потихонечку «майнил».
— Отсутствие «killer feature» для массового потребителя.
— По мелочи касательно конкретной реализации: windows-клиент представляет собой просто браузерчик, в котором запускается web-клиент. (К тому же, он упорно писал мне «invalid passphrase» на фразу, которую сам же только что сгенерировал; потом я догадался, что так он намекает, что ему доступ в сеть не дали)lebedevau
20.09.2019 14:38Спасибо!
Механизм заинтересованности нод в участии. За отправку сообщений берутся ADM (о чём тоже стоило бы сказать в статье), но кому они дальше уходят? Кто из узлов сформирует блок? Что, если разные узлы сформировали блок одновременно?
Это вопросы консенсуса. В блокчейне бывают они разные. У нас вариант Delegated Proof of Stake (dPos) — Fair dPoS. Суть в том, что сеть определяет порядок, кто из делегатов сети формирует следующий блок. А правильность блока определяют не только узлы-делегаты, но и обычные узлы. Если что-то не так с этим блоком, то эстафета переходит к следующему делегату (их 101 активный и остальные запасные). Комиссия за отправку уходит делегатам сети, чтобы мотивировать их поддерживать узлы. Вот где можно посмотреть делегатов: explorer.adamant.im/delegateMonitor
Откуда клиент при запуске берёт адрес ноды, к которой следует подключиться?
В iOS- и Андроид- приложениях есть возможность указать любые ноды, а еще лучше поднять свою: medium.com/adamant-im/how-to-run-your-adamant-node-on-ubuntu-990e391e8fcc. В Web-приложении (+Win, Linux, Mac OS) это сделать в настройках нельзя, из-за CORS. Но можно поднять свой мессенджер на своем домене/IP, и у него уже в настройках указать свою ноду.
«Подтверждение доставки сообщений. Не на устройство пользователя, а в сеть» — это как? Транзакция попала в блокчейн?
Да, транзакция попала в блокчейн. Меня, например, бесит, что никто не знает, доставлено ли СМС или нет… и жмешь «повторить» до посинения. А в нашем примере 2FA 2fa-demo.adamant.im мы точно знаем, что 2FA-код доставлен и его можно извлечь.
А если клиента угораздило подключиться к злонамеренной ноде, та сказала «всё ок», а на самом деле всё не ок?
Блокчейн такого не позволит. Нода говорит «ок», но транзакция не попадет в блок. И отправитель, и получатель об этом знают.
Почему идёт речь про библиотеку NaCl, которая для C/C++, если и клиент, и ноды работают на JS
Есть реализации этой штуки на всех языках программирования.
Как будут работать групповые чаты? Там ведь всё должно быть гораздо интереснее, чем просто двумя ключами зашифровать…
Хороший вопрос. Мы работали над проектом групповых чатов, есть решение. Но до реализации не дошли — нужно много времени (=денег). Возможно изначально сделаем не на уровне блокчейна, а как отдельный сервис. Ваша группа собеседников-участников чата поднимает этот сервис как отдельный адрес U12345. Отправляя в чат с U12345 сообщение, оно транслируется всем участникам. Доступ к сообщениям в групповом чате в таком случае есть у всех участников и у владельца U12345 (это опять же кто-то из участников).
Платность сообщений. Да, очень дёшево (пока текст шлёшь, а не картинки), но надо следить за балансом, как-то его пополнять (а у меня криптовалюты вообще нет), в общем, дополнительный геморрой. Было бы лучше, если бы клиент каким-то образом сам потихонечку «майнил».
Да, без криптовалют получить ADM есть только один сейчас вариант — бесплатные токены. Ну я верю в будущее и распространенность криптовалют.
«Майнил» можно, но не в мессенджере, он-то «легкий» ведь. Узлы могут майнить, если делегатами станут. Но: можно приобрести некоторое количество токенов, потом проголосовать за один из форжинг-пулов сети, и он будет регулярно выплачивать вам свою часть добытого.
Отсутствие «killer feature» для массового потребителя
Не верю в киллер-фичи. Это как вопрос «дорогой, за что ты меня любишь?». Выбор — это всегда совокупность факторов, плюсов и минусов.
По мелочи касательно конкретной реализации: windows-клиент представляет собой просто браузерчик, в котором запускается web-клиент. (К тому же, он упорно писал мне «invalid passphrase» на фразу, которую сам же только что сгенерировал; потом я догадался, что так он намекает, что ему доступ в сеть не дали)
Да, это электрон. У нас нет пока возможности написать отдельное windows-приложение. Но может быть кто-то нам поможет?vitvakatu
20.09.2019 15:12Блокчейн такого не позволит. Нода говорит «ок», но транзакция не попадет в блок. И отправитель, и получатель об этом знают.
Можно подробнее? Как клиент понимает, что он подключился к "правильной" ноде, а не к поддельной? Есть какой-то механизм верификации нод?
Еще интересно, как я могу убедится в том, что история сообщений не была изменена? Для этого мне требуется поднять свою ноду?
JustDeveloper Автор
20.09.2019 15:34При отправке сообщения оно отображается в статусе Pending («часы»). Только когда сообщение попадет в блокчейн, статус поменяется на Delivered («галочка»). Если сообщение не попадет в блок в случае «плохой ноды», вместо статуса Delivered будет Error («крестик»). Получатель же видит сообщения только в статусе Delivered и мы у входящих даже галочки не показываем. Сообщение либо есть в блокчейне, либо его нет.
Еще интересно, как я могу убедится в том, что история сообщений не была изменена? Для этого мне требуется поднять свою ноду?
Блокчейн не позволяет внести изменения в прошлое. Вообще никак. Каждый последующий блок строится на хэше предыдущих. Валидность самого блокчейна можно проверить, установив свою ноду и запустив синхронизацию с нуля — это занимает на данный момент около суток на слабой машине. Каждый блок, каждая транзакция будут проверены.
vitvakatu
20.09.2019 15:44При отправке сообщения оно отображается в статусе Pending («часы»). Только когда сообщение попадет в блокчейн, статус поменяется на Delivered («галочка»). Если сообщение не попадет в блок в случае «плохой ноды», вместо статуса Delivered будет Error («крестик»). Получатель же видит сообщения только в статусе Delivered и мы у входящих даже галочки не показываем. Сообщение либо есть в блокчейне, либо его нет.
Галочки и крестики — это UI. Меня интересует, что меня защищает от злоумышленника, поднявшего собственную ноду с чуть подправленным кодом, которая перехватывает все мои сообщения (расшифровать я полагаю не может, но даже перехват опасен), а мне сообщает, что все ок.
lebedevau
20.09.2019 17:27Это как раз не UI. — через «плохую ноду» сообщение просто не попадет в сеть. То есть это невозможно, как бы вы не правили код.
И перехват ничем не опасен. Более того, все транзакции в блокчейне доступны кому угодно. Ваше сообщение — это транзакция. Если ее получит «плохая нода», и что-то в ней изменит, она не попадет в блокчейн (для этого нужен консенсус многих узлов сети). В худшем случае «плохая нода» не отправит ваше сообщение на другие узлы и оно не будет доставлено. Об этом вас и предупредит UI.
zzzzzzzzzzzz
20.09.2019 16:14сеть определяет порядок, кто из делегатов сети формирует следующий блок
Ой, почитал, всё не просто там получается. Т.е. не каждая нода участвует в генерации блокчейна, а только 101 с наибольшим количеством ADM (из изъявивших желание)? Получается, у остальных нодовладельцев финансовой мотивации держать ноду нет?
Есть реализации этой штуки на всех языках программирования
В репозитории ничего сишного не нашёл…
Не верю в киллер-фичи
Мессенджер — такое ПО, которым не будешь пользоваться в одиночку. И тяжело обосновать постороннему человеку, почему именно в этом мессенджере следует переписываться. Как следствие, мессенджер не выйдет из ниши (утрируя) «нечто для кучки гиков и террористов».lebedevau
20.09.2019 17:38Т.е. не каждая нода участвует в генерации блокчейна, а только 101 с наибольшим количеством ADM (из изъявивших желание)? Получается, у остальных нодовладельцев финансовой мотивации держать ноду нет?
Да, блоки формируют только первые 101 делегатов (но в консенсусе участвуют все ноды). Порядок делегатов в нашем консенсусе Fair dPoS определяется голосованием пользователями с ADM в кошельках. У остальных финансовой мотивации нет, вы правы. Но делегаты могут строить «пулы», распределяя полученные комиссии среди проголосовавших за них пользователей.
В репозитории ничего сишного не нашёл…
Так да, например, Web-мессенджер написан на JS и использует JS-реализацию NaCl:
github.com/Adamant-im/adamant-im/blob/master/src/lib/adamant.js
import nacl from 'tweetnacl/nacl-fast'
tumikosha
20.09.2019 13:03Все сообщения хранить на блокчейне? А что с размерами базы? Вся база хранится на каждой ноде, да? Ну т.е. чтобы стать узлом, мне надо свой датацентр разворачивать? Сколько реально будет нод и кто заинтересован в этом?
lebedevau
20.09.2019 14:44Да, в блокчейне, да, на каждой ноде.
Удаления сообщений не будет. В этом и смысл использования блокчейна — порядок сообщений, достоверность содержимого, возможность подгрузить их в любой момент с любого устройства. Адской популярности не предрекаем пока, поэтому узлы сильно не «пухнут». А если такой вопрос встанет, там и подумаем. И еще важный момент: вы видите публичный АДАМАНТ. Но любая организация может поднять «свой АДАМАНТ» и хранить только свои сообщения. — к нам периодически обращаются компании и консультируются по этому поводу. Пока размер блокчейна ~10 ГБ. Картинки и файлы хранить в блокчейне не собираемся, есть мысль использовать инфраструктуру специализированных проектов типа FileCoin или Storj.
Чтобы стать сейчас узлом, создайте виртуалку с 20 GB места. На полгода-год вперед лучше 25 GB. Вот как это сделать: medium.com/adamant-im/how-to-run-your-adamant-node-on-ubuntu-990e391e8fcc
Статистика по узлам: explorer.adamant.im/networkMonitor
Делегаты сети: explorer.adamant.im/delegateMonitor
Ваша нода — или для себя, чтобы на 100% быть уверенным, что ваш IP известен только вашему узлу. Или становитесь делегатом, и получайте комиссии сети.
Alexus819
20.09.2019 14:17реально ли зарегать 50%+1 пользователя и подписывать блоки как вздумается?
lebedevau
20.09.2019 14:46Нет, чтобы делать «как вздумается» нужно не 51% пользователей, а 51% узлов и делегатов.
Это можно (в теории), просто дорого.
У биткоина и эфира такую штуку не провернули пока. Хотя АДАМАНТ не биткоин и не эфир…
unwrecker
20.09.2019 14:45Цена фиксирована за сообщение? Это хорошо — будет стимулировать думать перед отправкой и писать всё в одном сообщении, а не не нескольких десятках.
А ещё если будете добавлять голосовые сообщения и отправку эмодзи, берите, на них, пожалуйста, по десятикратному тарифу.lebedevau
20.09.2019 14:48Картинки и файлы, голосовые сообщения хранить в блокчейне не собираемся, есть мысль использовать инфраструктуру специализированных проектов типа FileCoin или Storj.
Эмодзи поддерживаются и не стоят плюсом ничего: medium.com/adamant-im/discover-emotions-adamant-introduces-emoji-5adb7ba438b2. Это ж просто текст.
lebedevau
20.09.2019 14:53«Догнал» про голосовые сообщения и эмодзи.
Да, тоже это не люблю голосовые сообщения. Адски не люблю.Zenitchik
20.09.2019 15:20А если цена будет не за символы, а за байты, — мы с удовольствием вспомним навыки начала 2000-х, ))) А то и KOI-8R вспомним )))
JustDeveloper Автор
20.09.2019 15:36По сути так и есть, за байты. ^_^ Нода-то не видит сообщений, видит только шифрованные данные. А комиссию за сообщение считает именно нода (узел сети).
SpiritOfVox
20.09.2019 15:53С вечным хранением без удаления это скорее система для организаций, но там нужны групповые чаты… В результате идея интересная, но пока для энтузиастов.
lebedevau
20.09.2019 17:41Да, компании, которые к нам обращались, в первую очередь говорили про групповые чаты. Что ж, когда-нибудь сделаем.
Sedge
20.09.2019 17:08Блокчейн хорош для верификации данных. В качестве основы хранения информации, часть из которой может быть строго конфиденциальной, он первородное зло. Уязвимости по софту еще никто не отменял, а тут вектор атаки может быть направлен вообще на произвольную ноду, работающую под устаревшим ПО, а то и вовсе поднятую специально для этой задачи. В совокупности с наличием фактически штатной возможности однозначно установить факт передачи сообщения конкретному адресату это означает, что, на мой взгляд, анонимность и безопасность тут крайне иллюзорна.
Но селф-киллер-фича — это, безусловно, платные сообщения…lebedevau
20.09.2019 17:44тут вектор атаки может быть направлен вообще на произвольную ноду, работающую под устаревшим ПО, а то и вовсе поднятую специально для этой задачи
Расскажите, пожалуйста, как вы это видите. На ноду не приходит ничего, кроме того, что и так всем доступно — подписанная шифрованная транзакция. Ваше сообщение — это транзакция. Если ее получит «плохая нода», и что-то в ней изменит, она не попадет в блокчейн (для этого нужен консенсус многих узлов сети). В худшем случае «плохая нода» не отправит ваше сообщение на другие узлы и оно не будет доставлено.
однозначно установить факт передачи сообщения конкретному адресату
Однозначно установить факт передачи сообщения от U12345 к U54321?
Suntechnic
21.09.2019 15:31Мне одно не понятно — зачем вы рекомендуете передавать контакт лично? Лично это условно абсолютно надежный канал связи. Если у меня есть абсолютно надежный канал связи, то зачем этот цирк, с блокчейнами, шифрованием и всем таким, если я могу просто передать закрытый ключ и юзать мессенджер с симметричным шифрованием?
JustDeveloper Автор
21.09.2019 16:37Конечно.
Мессенджер вы можете выбрать любой, которому доверяете.
Voltuss
21.09.2019 16:01Мессенджеры на блокчейне уже существуют. Как пример, Crypviser. Есть уже приложения на Android и iOS. Имеется возможность аудио и видео звонков. Чем ваш мессенджер будет отличаться?
JustDeveloper Автор
21.09.2019 16:05
lostmsu
Что с пуш-нотификациями?
lebedevau
Они есть. Реализованы отдельным сервисом, который мониторит транзакции, и присылает уведомление, которое включает и транзакцию с зашифрованным текстом сообщения. Сообщение расшифровывается локально. Вот: medium.com/adamant-im/push-notifications-friends-or-foes-b118b67ed258