Struktur Data dari Status Blockchain Cash Plasma



Halo, pengguna Habr sayang! Artikel ini adalah tentang Web 3.0 - Internet terdesentralisasi. Web 3.0 memperkenalkan konsep desentralisasi sebagai dasar Internet modern. Banyak sistem dan jaringan komputer memerlukan fitur keamanan dan desentralisasi untuk memenuhi kebutuhan mereka. Registri terdistribusi menggunakan teknologi blockchain memberikan solusi efisien untuk desentralisasi.

Blockchain adalah registri terdistribusi. Anda dapat menganggapnya sebagai basis data besar yang hidup selamanya, tidak pernah berubah sepanjang waktu. Blockchain menyediakan dasar untuk aplikasi dan layanan web terdesentralisasi.

Namun, blockchain lebih dari sekadar basis data. Ini berfungsi untuk meningkatkan keamanan dan kepercayaan di antara anggota jaringan, meningkatkan transaksi bisnis online.

Konsensus Bizantium meningkatkan keandalan jaringan dan memecahkan masalah konsistensi.

Skalabilitas yang diberikan oleh DLT mengubah jaringan bisnis yang ada.

Blockchain menawarkan manfaat baru yang sangat penting:

  1. Mencegah kesalahan mahal.
  2. Memastikan transaksi transparan.
  3. Mendigitalkan barang nyata.
  4. Menegakkan kontrak yang cerdas.
  5. Meningkatkan kecepatan dan keamanan pembayaran.

Kami telah mengembangkan PoE khusus untuk meneliti protokol kriptografi dan meningkatkan solusi DLT dan blockchain yang ada.

Sebagian besar sistem registri publik tidak memiliki sifat skalabilitas, membuat throughputnya agak rendah. Misalnya, proses Ethereum hanya ~ 20 tx / s.

Banyak solusi dikembangkan untuk meningkatkan skalabilitas sambil mempertahankan desentralisasi. Namun, hanya 2 dari 3 keuntungan - skalabilitas, keamanan, dan desentralisasi - dapat dicapai secara bersamaan.

Penggunaan sidechains menyediakan salah satu solusi paling efektif.

Konsep plasma


Konsep Plasma bermuara pada gagasan bahwa rantai akar memproses sejumlah kecil komitmen dari rantai anak, dengan demikian bertindak sebagai lapisan paling aman dan terakhir untuk menyimpan semua kondisi perantara. Setiap rantai anak berfungsi sebagai blockchainnya sendiri dengan algoritma konsensusnya sendiri, tetapi ada beberapa peringatan penting.

  • Kontrak pintar dibuat dalam rantai root dan bertindak sebagai pos pemeriksaan untuk rantai anak dalam rantai root.
  • Rantai anak dibuat dan berfungsi sebagai blockchainnya sendiri dengan konsensusnya sendiri. Semua negara bagian dalam rantai anak dilindungi oleh bukti penipuan yang memastikan semua transisi antar negara berlaku dan menerapkan protokol penarikan.
  • Kontrak pintar khusus untuk DApp atau logika aplikasi rantai anak dapat digunakan dalam rantai anak.
  • Dana dapat ditransfer dari rantai akar ke rantai anak.

Validator diberikan insentif ekonomi untuk bertindak jujur ​​dan mengirim komitmen ke rantai akar - lapisan penyelesaian transaksi akhir.

Akibatnya, pengguna DApp yang bekerja di rantai anak tidak harus berinteraksi dengan rantai root sama sekali. Selain itu, mereka dapat menempatkan uang mereka di rantai root kapan pun mereka mau, bahkan jika rantai anak diretas. Ini keluar dari rantai anak memungkinkan pengguna untuk menyimpan dana mereka dengan aman dengan bukti Merkle, mengkonfirmasi kepemilikan sejumlah dana tertentu.

Keuntungan utama plasma terkait dengan kemampuannya untuk secara signifikan memfasilitasi perhitungan yang membebani rantai utama. Selain itu, blockchain Ethereum dapat menangani set data yang lebih luas dan paralel. Waktu yang dihapus dari rantai root juga ditransfer ke node Ethereum, yang memiliki persyaratan pemrosesan dan penyimpanan yang lebih rendah.

Plasma Cash memberikan nomor seri unik untuk token online. Keuntungan dari skema ini termasuk tidak perlu konfirmasi, dukungan yang lebih sederhana untuk semua jenis token (termasuk token yang tidak dapat dipertukarkan), dan mitigasi terhadap keluar massa dari rantai anak.

Konsep "keluar massal" dari rantai anak adalah masalah yang dihadapi oleh Plasma. Dalam skenario ini, penarikan secara simultan terkoordinasi dari rantai anak berpotensi menyebabkan daya komputasi tidak memadai untuk menarik semua dana. Akibatnya, pengguna dapat kehilangan dana.

Opsi untuk menerapkan Plasma




Basic Plasma memiliki banyak opsi implementasi.

Perbedaan utama mengacu pada:

  • pengarsipan informasi tentang penyimpanan negara dan metode presentasi;
  • jenis token (habis dibagi, tidak dapat dibagi);
  • keamanan transaksi;
  • jenis algoritma konsensus.

Variasi utama Plasma meliputi:

  • Plasma berbasis UTXO - setiap transaksi terdiri dari input dan output. Suatu transaksi dapat dilakukan dan dibelanjakan. Daftar transaksi yang tidak digunakan adalah status rantai anak itu sendiri.
  • Plasma Berbasis Akun - struktur ini berisi refleksi dan saldo masing-masing akun. Ini digunakan dalam Ethereum, karena setiap akun dapat terdiri dari dua jenis: akun pengguna dan akun kontrak pintar. Kesederhanaan adalah keuntungan penting dari Plasma berbasis akun. Pada saat yang sama, kurangnya skalabilitas merupakan kerugian. Properti khusus, "nonce," digunakan untuk mencegah eksekusi transaksi dua kali.

Untuk memahami struktur data yang digunakan dalam rantai kas Plasma Cash dan bagaimana komitmen bekerja, perlu untuk mengklarifikasi konsep Merkle Tree.

Merkle Trees dan penggunaannya dalam Plasma


Merkle Tree adalah struktur data yang sangat penting di dunia blockchain. Ini memungkinkan kita untuk menangkap kumpulan data tertentu dan menyembunyikan data, namun membuktikan bahwa beberapa informasi ada di dalam kumpulan. Misalnya, jika kita memiliki sepuluh angka, kita dapat membuat bukti untuk angka-angka ini dan kemudian membuktikan bahwa beberapa angka tertentu ada di set ini. Bukti ini akan memiliki ukuran konstan kecil, yang membuatnya tidak mahal untuk dipublikasikan di Ethereum.

Anda dapat menggunakan prinsip ini untuk satu set transaksi, dan membuktikan bahwa transaksi tertentu ada di set ini. Inilah yang dilakukan oleh operator. Setiap blok terdiri dari set transaksi yang berubah menjadi Merkle Tree. Akar pohon ini adalah bukti yang diterbitkan dalam Ethereum bersama dengan setiap blok Plasma.

Pengguna harus dapat menarik dana mereka dari rantai Plasma. Untuk ini, mereka mengirim transaksi "keluar" ke Ethereum.

Plasma Cash menggunakan Pohon Merkle khusus yang menghilangkan kebutuhan untuk memvalidasi seluruh blok. Cukup untuk memvalidasi hanya cabang-cabang yang sesuai dengan token pengguna.

Untuk mentransfer token, perlu untuk menganalisis riwayatnya dan memindai hanya token yang dibutuhkan pengguna tertentu. Saat mentransfer token, pengguna cukup mengirimkan seluruh riwayat ke pengguna lain, yang kemudian dapat mengotentikasi seluruh riwayat dan, yang paling penting, melakukannya dengan sangat cepat.



Struktur data Plasma Cash untuk penyimpanan status dan riwayat


Dianjurkan untuk hanya menggunakan Merkle Trees yang dipilih, karena itu perlu untuk mendapatkan bukti inklusi dan non-inklusi untuk transaksi dalam satu blok. Sebagai contoh:

  • Pohon merkle jarang
  • Pohon patricia

Kami telah mengembangkan implementasi Sparse Merkle Tree dan Patricia Tree kami sendiri untuk klien kami.

Pohon Merkle Jarang mirip dengan Pohon Merkle standar, kecuali bahwa datanya diindeks, dan setiap titik data ditempatkan pada daun yang sesuai dengan indeks titik data ini.

Misalkan kita memiliki Pohon Merkle empat daun. Mari kita isi pohon ini dengan huruf A dan D, untuk demonstrasi. Huruf A adalah huruf alfabet pertama, jadi kita akan meletakkannya di daun pertama. Demikian pula, kita akan menempatkan D pada daun keempat.

Jadi apa yang terjadi pada daun kedua dan ketiga? Mereka harus dibiarkan kosong. Lebih tepatnya, nilai khusus (misalnya, nol) digunakan sebagai pengganti surat.

Pohon itu akhirnya terlihat seperti ini:



Bukti inklusi bekerja dengan cara yang sama seperti pada Pohon Merkle biasa. Apa yang terjadi jika kita ingin membuktikan bahwa C bukan bagian dari Merkle Tree ini? SD! Kita tahu bahwa jika C adalah bagian dari pohon, itu akan berada di daun ketiga. Jika C bukan bagian dari pohon, maka daun ketiga harus nol.

Semua yang diperlukan adalah bukti inklusi Merkle standar yang menunjukkan bahwa daun ketiga adalah nol.

Fitur terbaik dari Sparse Merkle Tree adalah ia menyediakan repositori untuk nilai-nilai kunci di dalam Merkle Tree!

Bagian dari kode protokol PoE membangun Sparse Merkle Tree:

class SparseTree { //... buildTree() { if (Object.keys(this.leaves).length > 0) { this.levels = [] this.levels.unshift(this.leaves) for (let level = 0; level < this.depth; level++) { let currentLevel = this.levels[0] let nextLevel = {} Object.keys(currentLevel).forEach((leafKey) => { let leafHash = currentLevel[leafKey] let isEvenLeaf = this.isEvenLeaf(leafKey) let parentLeafKey = leafKey.slice(0, -1) let neighborLeafKey = parentLeafKey + (isEvenLeaf ? '1' : '0') let neighborLeafHash = currentLevel[neighborLeafKey] if (!neighborLeafHash) { neighborLeafHash = this.defaultHashes[level] } if (!nextLevel[parentLeafKey]) { let parentLeafHash = isEvenLeaf ? ethUtil.sha3(Buffer.concat([leafHash, neighborLeafHash])) : ethUtil.sha3(Buffer.concat([neighborLeafHash, leafHash])) if (level == this.depth - 1) { nextLevel['merkleRoot'] = parentLeafHash } else { nextLevel[parentLeafKey] = parentLeafHash } } }) this.levels.unshift(nextLevel) } } } } 

Kode ini cukup sepele. Kami memiliki repositori kunci-nilai dengan bukti inklusi / non-inklusi.

Di setiap iterasi, level spesifik dari pohon final diisi, dimulai dengan yang terakhir. Bergantung pada apakah kunci daun saat ini genap atau ganjil, kami mengambil dua daun yang berdekatan dan menghitung hash tingkat saat ini. Jika kita mencapai akhir, kita akan menuliskan satu merkleRoot - hash umum.

Anda harus memahami bahwa pohon ini diisi dengan nilai yang awalnya kosong. Jika kami menyimpan sejumlah besar token ID, kami akan memiliki ukuran pohon yang besar, dan itu akan lama!

Ada banyak solusi untuk non-optimasi ini, tetapi kami telah memutuskan untuk mengubah pohon ini menjadi Pohon Patricia.

Patricia Tree adalah kombinasi Radix Tree dan Merkle Tree.

Kunci data Radix Tree menyimpan jalur ke data itu sendiri, yang memungkinkan kami untuk membuat struktur data yang dioptimalkan untuk memori.



Berikut adalah implementasi yang dikembangkan untuk klien kami:

 buildNode(childNodes, key = '', level = 0) { let node = {key} this.iterations++ if (childNodes.length == 1) { let nodeKey = level == 0 ? childNodes[0].key : childNodes[0].key.slice(level - 1) node.key = nodeKey let nodeHashes = Buffer.concat([Buffer.from(ethUtil.sha3(nodeKey)), childNodes[0].hash]) node.hash = ethUtil.sha3(nodeHashes) return node } let leftChilds = [] let rightChilds = [] childNodes.forEach((node) => { if (node.key[level] == '1') { rightChilds.push(node) } else { leftChilds.push(node) } }) if (leftChilds.length && rightChilds.length) { node.leftChild = this.buildNode(leftChilds, '0', level + 1) node.rightChild = this.buildNode(rightChilds, '1', level + 1) let nodeHashes = Buffer.concat([Buffer.from(ethUtil.sha3(node.key)), node.leftChild.hash, node.rightChild.hash]) node.hash = ethUtil.sha3(nodeHashes) } else if (leftChilds.length && !rightChilds.length) { node = this.buildNode(leftChilds, key + '0', level + 1) } else if (!leftChilds.length && rightChilds.length) { node = this.buildNode(rightChilds, key + '1', level + 1) } else if (!leftChilds.length && !rightChilds.length) { throw new Error('invalid tree') } return node } 

Kami bergerak secara rekursif dan membangun sub pohon yang terpisah kiri dan kanan. Kunci dibangun sebagai jalur di pohon ini.

Solusi ini bahkan lebih sepele. Ini dioptimalkan dengan baik dan bekerja lebih cepat. Bahkan, Pohon Patricia dapat lebih dioptimalkan dengan memperkenalkan tipe simpul baru - simpul ekstensi, simpul cabang, dan sebagainya, seperti yang dilakukan dalam protokol Ethereum. Tetapi implementasi saat ini memenuhi semua persyaratan kami - kami memiliki struktur data yang cepat dan dioptimalkan memori.

Dengan menerapkan struktur data ini dalam proyek klien kami, kami telah memungkinkan penskalaan Plasma Cash. Ini memungkinkan kami untuk memeriksa riwayat token dan inklusi / non-inklusi token di pohon, sangat mempercepat validasi blok dan Rantai Anak Plasma itu sendiri.

Tautan:


  1. Plasma kertas putih
  2. Git hub
  3. Gunakan case dan deskripsi arsitektur
  4. Kertas jaringan petir

Source: https://habr.com/ru/post/id455988/


All Articles