ProHoster > Blog > Pentadbiran > Bagaimanakah utusan terdesentralisasi berfungsi pada blockchain?
Bagaimanakah utusan terdesentralisasi berfungsi pada blockchain?
Pada awal tahun 2017, kami mula mencipta utusan pada rantaian blok [nama dan pautan ada dalam profil] dengan membincangkan kelebihan berbanding pemesej P2P klasik.
hilang 2.5 tahun, dan kami dapat mengesahkan konsep kami: aplikasi messenger kini tersedia untuk iOS, Web PWA, Windows, GNU/Linux, Mac OS dan Android.
Hari ini kami akan memberitahu anda cara messenger blockchain berfungsi dan cara aplikasi pelanggan boleh berfungsi dengan APInya.
Satu klik untuk mencipta akaun - tiada telefon atau e-mel, tiada akses kepada buku alamat atau geolokasi.
Interlocutors tidak pernah mewujudkan sambungan langsung; semua komunikasi berlaku melalui sistem nod yang diedarkan. Alamat IP pengguna tidak boleh diakses antara satu sama lain.
Semua mesej disulitkan keluk Hujung ke Hujung25519xsalsa20poly1305. Nampaknya ini tidak akan mengejutkan sesiapa pun, tetapi kod sumber kami terbuka.
Serangan MITM dikecualikan - setiap mesej adalah transaksi dan ditandatangani oleh Ed25519 EdDSA.
Mesej itu berakhir di bloknya sendiri. Konsistensi dan timestamp Anda tidak boleh membetulkan sekatan, dan oleh itu susunan mesej.
"Saya tidak mengatakan itu" tidak akan berfungsi dengan mesej pada rantaian blok.
Tiada struktur pusat yang memeriksa "ketulenan" mesej. Ini dilakukan oleh sistem pengedaran nod berdasarkan konsensus, dan ia dimiliki oleh pengguna.
Kemustahilan penapisan - akaun tidak boleh disekat dan mesej tidak boleh dipadamkan.
Keupayaan untuk mendapatkan semua perbualan anda daripada sebarang peranti pada bila-bila masa bermakna anda tidak perlu menyimpan perbualan secara setempat sama sekali.
Pengesahan penghantaran mesej. Bukan kepada peranti pengguna, tetapi kepada rangkaian. Pada asasnya, ini adalah pengesahan keupayaan penerima untuk membaca mesej anda. Ini adalah ciri yang berguna untuk menghantar pemberitahuan kritikal.
Faedah rantaian blok juga termasuk penyepaduan rapat dengan mata wang kripto Ethereum, Dogecoin, Lisk, Dash, Bitcoin (yang ini masih dalam proses) dan keupayaan untuk menghantar token dalam sembang. Kami juga membuat penukar kripto terbina dalam.
Dan kemudian - bagaimana ia berfungsi.
Mesej adalah transaksi
Semua orang sudah terbiasa dengan fakta bahawa transaksi dalam blockchain memindahkan token (syiling) dari satu pengguna ke pengguna lain. Seperti Bitcoin. Kami mencipta jenis transaksi khas untuk menghantar mesej.
Untuk menghantar mesej dalam messenger pada blockchain, anda perlu melalui beberapa langkah:
Sulitkan teks mesej
Letakkan teks sifir ke dalam transaksi
Tandatangani transaksi
Hantar transaksi ke mana-mana nod rangkaian
Sistem nod yang diedarkan menentukan "ketulenan" mesej
Jika semuanya OK, transaksi dengan mesej disertakan dalam blok seterusnya
Penerima mendapatkan semula transaksi mesej dan menyahsulit
Langkah 1β3 dan 7 dilakukan secara tempatan pada klien, dan langkah 5β6 dilakukan pada hos.
Penyulitan mesej
Mesej disulitkan dengan kunci peribadi pengirim dan kunci awam penerima. Kami akan mengambil kunci awam daripada rangkaian, tetapi untuk ini, akaun penerima mesti dimulakan, iaitu, mempunyai sekurang-kurangnya satu transaksi. Anda boleh menggunakan permintaan REST GET /api/accounts/getPublicKey?address={ADAMANT address}, dan apabila memuatkan sembang, kunci awam pembicara sudah tersedia.
Pengutus menyulitkan mesej menggunakan algoritma curve25519xsalsa20poly1305 (Kotak NaCl). Memandangkan akaun itu mengandungi kunci Ed25519, untuk membentuk kotak, kunci mesti ditukar terlebih dahulu kepada Curve25519 Diffie-Hellman.
Untuk transaksi mesej, perkara yang paling penting ialah asset - anda perlu meletakkan mesej dalam objek chat dengan struktur:
message - simpan mesej yang disulitkan
own_message -tidak pernah
type β jenis mesej
Mesej juga dibahagikan kepada jenis. Pada asasnya, parameter type memberitahu anda bagaimana untuk memahami message. Anda boleh menghantar hanya teks, atau anda boleh menghantar objek dengan perkara yang menarik di dalamnya - contohnya, ini adalah cara penghantar membuat pemindahan mata wang kripto dalam sembang.
Untuk memastikan semua orang yakin dengan ketulenan pengirim dan penerima, masa penghantaran dan kandungan mesej, transaksi ditandatangani. Tandatangan digital membolehkan anda mengesahkan ketulenan transaksi menggunakan kunci awam - kunci peribadi tidak diperlukan untuk ini.
Tetapi tandatangan itu sendiri dilakukan menggunakan kunci peribadi:
Rajah menunjukkan bahawa kami mula-mula mencincang transaksi dengan SHA-256 dan kemudian menandatanganinya Ed25519 EdDSA dan dapatkan tandatangan signature, dan ID transaksi adalah sebahagian daripada cincang SHA-256.
Contoh pelaksanaan:
1 β Bentuk blok data, termasuk mesej
/**
* 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)
}
Sistem nod yang diedarkan, berdasarkan konsensus, menentukan "ketulenan" mesej transaksi. Daripada siapa dan kepada siapa, bila, sama ada mesej itu digantikan dengan yang lain, dan sama ada masa penghantaran ditunjukkan dengan betul. Ini adalah kelebihan rantaian yang sangat penting - tidak ada struktur pusat yang bertanggungjawab untuk pengesahan, dan urutan mesej serta kandungannya tidak boleh dipalsukan.
Pertama, satu nod menyemak ketepatan, dan kemudian menghantarnya kepada orang lain - jika majoriti mengatakan bahawa semuanya teratur, transaksi akan dimasukkan ke dalam blok rantai seterusnya - ini adalah konsensus.
Bahagian kod nod yang bertanggungjawab untuk semakan boleh dilihat di GitHub - validator.js ΠΈ verify.js. Ya, nod berjalan pada Node.js.
Termasuk transaksi dengan mesej dalam blok
Jika konsensus dicapai, transaksi dengan mesej kami akan dimasukkan ke dalam blok seterusnya bersama-sama dengan transaksi sah yang lain.
Blok mempunyai urutan yang ketat, dan setiap blok berikutnya dibentuk berdasarkan cincang blok sebelumnya.
Maksudnya ialah mesej kami juga termasuk dalam urutan ini dan tidak boleh "disusun semula". Jika beberapa mesej jatuh ke dalam blok, pesanan mereka akan ditentukan oleh timestamp mesej.
Membaca mesej
Aplikasi messenger mendapatkan semula transaksi daripada blockchain yang dihantar kepada penerima. Untuk ini kami membuat titik akhir api/chatrooms.
Semua transaksi tersedia untuk semua orang - anda boleh menerima mesej yang disulitkan. Tetapi hanya penerima boleh menyahsulit menggunakan kunci peribadinya dan kunci awam penghantar:
Memandangkan mesej dihantar dengan cara ini dalam masa kira-kira 5 saat - inilah masanya blok rangkaian baharu muncul - kami menghasilkan sambungan soket klien-ke-nod dan nod-ke-nod. Apabila nod menerima transaksi baharu, ia menyemak kesahihannya dan meneruskannya kepada nod lain. Urus niaga tersedia untuk pelanggan messenger walaupun sebelum konsensus berlaku dan dimasukkan ke dalam blok. Dengan cara ini kami akan menghantar mesej serta-merta, sama seperti utusan segera biasa.
Untuk menyimpan buku alamat, kami membuat KVS - Penyimpanan Nilai-Kekunci - ini adalah satu lagi jenis transaksi yang asset ia bukan NaCl-box yang disulitkan, tetapi NaCl-secretbox. Beginilah cara messenger menyimpan data lain.
Pemindahan fail/imej dan sembang kumpulan masih memerlukan banyak kerja. Sudah tentu, dalam format kesilapan-dan-kesilapan ini boleh "diselesaikan" dengan cepat, tetapi kami mahu mengekalkan tahap privasi yang sama.
Ya, masih ada kerja yang perlu dilakukan - idealnya, privasi sebenar mengandaikan bahawa pengguna tidak akan menyambung ke nod rangkaian awam, tetapi akan menaikkan nod mereka sendiri. Berapakah peratusan pengguna yang anda fikir melakukan ini? Betul, 0. Kami dapat menyelesaikan sebahagian isu ini dengan versi Tor utusan.
Kami telah membuktikan bahawa utusan pada blockchain boleh wujud. Sebelum ini, hanya terdapat satu percubaan pada tahun 2012 - bitmessage, yang gagal disebabkan oleh masa penghantaran mesej yang lama, beban CPU dan kekurangan aplikasi mudah alih.
Dan keraguan adalah disebabkan oleh fakta bahawa utusan pada blockchain mendahului masa mereka - orang tidak bersedia untuk bertanggungjawab ke atas akaun mereka, memiliki maklumat peribadi belum lagi menjadi trend, dan teknologi tidak membenarkan kelajuan tinggi pada blockchain. Lebih banyak analog teknologi projek kami akan muncul seterusnya. Anda akan melihat.