Hogyan működik egy decentralizált üzenetküldő a blokkláncon?
2017 elején elkezdtük egy üzenetküldő létrehozását a blokkláncon [név és link a profilban], megvitatva a klasszikus P2P üzenetküldőkkel szembeni előnyöket.
Elmúlt 2.5 évben, és meg tudtuk erősíteni koncepciónkat: a messenger alkalmazások már elérhetőek iOS, Web PWA, Windows, GNU/Linux, Mac OS és Android rendszerekre.
Ma elmondjuk, hogyan működik a blockchain messenger, és hogyan működhetnek az ügyfélalkalmazások az API-jával.
Azt akartuk, hogy a blokklánc megoldja a klasszikus P2P üzenetküldők biztonsági és adatvédelmi problémáit:
Egy kattintással hozhat létre fiókot – nincs telefon vagy e-mail, nincs hozzáférés a címjegyzékekhez vagy a földrajzi helyekhez.
A beszélgetőpartnerek soha nem hoznak létre közvetlen kapcsolatot, minden kommunikáció elosztott csomópontrendszeren keresztül történik. A felhasználók IP-címei nem érhetők el egymás számára.
Minden üzenet titkosított End-to-End curve25519xsalsa20poly1305. Úgy tűnik, ez senkit nem fog meglepni, de a forráskódunk nyitva van.
A MITM támadás kizárt – minden üzenet tranzakció, és az Ed25519 EdDSA aláírja őket.
Az üzenet a saját blokkjába kerül. A következetesség és timestamp Nem tudja javítani a blokkokat, így az üzenetek sorrendjét.
A „nem mondtam ezt” nem működik a blokkláncon lévő üzenetekkel.
Nincs olyan központi struktúra, amely ellenőrizné az üzenet „hitelességét”. Ezt konszenzuson alapuló elosztott csomópontrendszer végzi, és a felhasználók tulajdonában van.
A cenzúra lehetetlensége - a fiókokat nem lehet blokkolni, és az üzeneteket nem lehet törölni.
Az a képesség, hogy az összes beszélgetést bármilyen eszközről bármikor lekérheti, azt jelenti, hogy egyáltalán nem kell helyileg tárolnia a beszélgetéseket.
Az üzenet kézbesítésének megerősítése. Nem a felhasználó eszközére, hanem a hálózatra. Ez lényegében annak megerősítése, hogy a címzett el tudja olvasni az üzenetet. Ez egy hasznos funkció a kritikus értesítések küldéséhez.
A blokklánc előnyei közé tartozik az Ethereum, Dogecoin, Lisk, Dash, Bitcoin kriptovalutákkal való szoros integráció (ez még folyamatban van), valamint a tokenek chatekben történő küldésének lehetősége. Még egy beépített kriptocserélőt is készítettünk.
És akkor – hogyan működik mindez.
Az üzenet tranzakció
Mindenki megszokta már, hogy a blokkláncban végrehajtott tranzakciók tokeneket (érméket) adnak át egyik felhasználótól a másikhoz. Mint a Bitcoin. Létrehoztunk egy speciális tranzakciótípust az üzenetek továbbítására.
Ha üzenetet szeretne küldeni egy messengerben a blokkláncon, több lépést kell végrehajtania:
Üzenet szövegének titkosítása
Helyezzen titkosított szöveget a tranzakcióba
Írja alá a tranzakciót
Tranzakció küldése bármely hálózati csomópontra
A csomópontok elosztott rendszere határozza meg az üzenet „autentikusságát”.
Ha minden rendben van, akkor az üzenetet tartalmazó tranzakció bekerül a következő blokkba
A címzett lekéri az üzenettranzakciót, és visszafejti a titkosítást
Az 1–3. és 7. lépést helyileg a kliensen, az 5–6. lépéseket pedig a gazdagépeken hajtják végre.
Üzenet titkosítás
Az üzenetet a feladó privát kulcsával és a címzett nyilvános kulcsával titkosítják. Elvesszük a nyilvános kulcsot a hálózatból, de ehhez inicializálni kell a címzett fiókját, azaz legalább egy tranzakciót kell végrehajtani. Használhat REST kérést GET /api/accounts/getPublicKey?address={ADAMANT address}, a chatek betöltésekor pedig már elérhetőek lesznek a beszélgetőpartnerek nyilvános kulcsai.
A messenger a curve25519xsalsa20poly1305 algoritmussal titkosítja az üzeneteket (NaCl Box). Mivel a fiók Ed25519 kulcsokat tartalmaz, egy doboz létrehozásához a kulcsokat először Curve25519 Diffie-Hellman formátumra kell konvertálni.
Üzenet-tranzakciónál a legfontosabb az asset - üzenetet kell elhelyezni az objektumban chat szerkezettel:
message - mentse el a titkosított üzenetet
own_message -egyszer sem
type - üzenet típusa
Az üzeneteket szintén típusokra osztják. Lényegében a paraméter type megmondja, hogyan kell megérteni message. Küldhetsz csak egy szöveget, vagy küldhetsz egy objektumot, amiben érdekes dolgok vannak benne - például chaten a messenger kriptovaluta-átutalásokat hajt végre.
Annak érdekében, hogy mindenki biztos legyen a feladó és a címzett hitelességében, a küldés időpontjában és az üzenet tartalmában, a tranzakció aláírásra kerül. A digitális aláírás lehetővé teszi a tranzakció hitelességének ellenőrzését nyilvános kulcs segítségével – ehhez nincs szükség privát kulcsra.
De maga az aláírás a privát kulccsal történik:
A diagram azt mutatja, hogy először kivonatolja a tranzakciót az SHA-256-tal, majd aláírjuk Ed25519 EdDSA és kap egy aláírást signature, és a tranzakcióazonosító az SHA-256 hash része.
Példa megvalósításra:
1 — Adatblokk létrehozása, beleértve az üzenetet
/**
* 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)
}
A csomópontok elosztott rendszere konszenzus alapján határozza meg a tranzakciós üzenet „hitelességét”. Kitől és kinek, mikor, lecserélték-e az üzenetet másikra, helyesen lett-e feltüntetve a küldés időpontja. Ez egy nagyon fontos előnye a blokkláncnak - nincs központi struktúra, amely az ellenőrzésért felelős, és az üzenetek sorozata és azok tartalma nem hamisítható.
Először az egyik csomópont ellenőrzi a pontosságot, majd elküldi másoknak - ha a többség szerint minden rendben van, akkor a tranzakció a lánc következő blokkjába kerül - ez konszenzus.
A csomópont kódjának az ellenőrzésekért felelős része megtekinthető a GitHubon - validator.js и verify.js. Igen, a csomópont Node.js-en fut.
Üzenetet tartalmazó tranzakció blokkba foglalása
Ha konszenzus születik, az üzenetünket tartalmazó tranzakció a többi érvényes tranzakcióval együtt a következő blokkba kerül.
A blokkoknak szigorú sorrendjük van, és minden további blokk az előző blokkok hash-ei alapján jön létre.
A lényeg az, hogy a mi üzenetünk is benne van ebben a sorrendben, és nem lehet „átrendezni”. Ha több üzenet esik egy blokkba, akkor azok sorrendjét a timestamp üzenetek.
Üzenetek olvasása
Az üzenetküldő alkalmazás lekéri a blokkláncból a címzettnek küldött tranzakciókat. Ehhez készítettünk egy végpontot api/chatrooms.
Minden tranzakció mindenki számára elérhető - titkosított üzeneteket fogadhat. De csak a címzett tudja visszafejteni a titkosítást a privát kulcsával és a küldő nyilvános kulcsával:
Mivel az üzenetek így kb. 5 másodperc alatt kézbesítenek – ekkor jelenik meg egy új hálózati blokk –, kitaláltunk egy kliens-csomópont és csomópont-csomópont socket kapcsolatot. Amikor egy csomópont új tranzakciót kap, ellenőrzi annak érvényességét, és továbbítja más csomópontoknak. A tranzakció már a konszenzus létrejötte és a blokkba való felvétel előtt is elérhető a messenger ügyfelek számára. Így azonnal kézbesítjük az üzeneteket, akárcsak a hagyományos azonnali üzenetküldők.
A címjegyzék tárolásához KVS-t készítettünk - Key-Value Storage - ez egy másik típusú tranzakció, amelyben asset nem a NaCl-box titkosított, hanem NaCl-titkosdoboz. A messenger így tárol más adatokat.
A fájl-/képátvitel és a csoportos csevegés még mindig sok munkát igényel. Természetesen a baklövés-badulás formátumban ez gyorsan „elcsavarható”, de szeretnénk megőrizni a magánélet azonos szintjét.
Igen, van még tennivaló – ideális esetben a valódi adatvédelem azt feltételezi, hogy a felhasználók nem csatlakoznak nyilvános hálózati csomópontokhoz, hanem felveszik a sajátjukat. Szerinted a felhasználók hány százaléka csinálja ezt? Igaz, 0. Ezt a problémát részben sikerült megoldanunk a messenger Tor verziójával.
Bebizonyítottuk, hogy létezhet üzenetküldő a blokkláncon. Korábban csak egy próbálkozás volt 2012-ben - bitüzenet, amely a hosszú üzenetkézbesítési idő, a CPU terhelés és a mobilalkalmazások hiánya miatt meghiúsult.
A szkepticizmus pedig annak a ténynek köszönhető, hogy a hírnökök a blokkláncon megelőzik korukat – az emberek nem állnak készen arra, hogy felelősséget vállaljanak a fiókjukért, a személyes adatok birtoklása még nem trend, és a technológia nem teszi lehetővé a nagy sebességet a blokkláncon. Legközelebb projektünk további technológiai analógjai jelennek meg. Látni fogod.