Ringkasan
Merkletree banyak digunakan dalam teknologi Bitcoin. Artikel ini bertujuan untuk mengimplementasikan Merkletree sederhana melalui kode dan menghitung treeroot dari Merkle Tree.
Merkle Tree adalah struktur data yang memverifikasi semua jenis data yang disimpan, diproses dan dikirim antar komputer.
Saat ini, tujuan utama pohon Merkle adalah untuk memastikan bahwa blok data yang diterima dari jaringan peer tidak rusak dan tidak berubah, dan untuk memeriksa apakah jaringan peer lainnya tidak berbohong untuk mengirim blok data palsu.
Contoh Aplikasi Pohon Merkle
Bitcoin
Gita
Dinamo Mazon
Gassandra
Aplikasi di Bitcoin
Setiap blok di Bitcoin berisi tanda tangan koleksi dari semua transaksi. Tanda tangan ini diimplementasikan menggunakan Merkle Tree. Pohon Merkle digunakan untuk Bitcoin untuk merangkum semua transaksi di blok, menghasilkan sidik jari digital keseluruhan dari seluruh rangkaian transaksi, dan memberikan proses yang sangat efektif untuk memverifikasi apakah transaksi termasuk dalam blok.
Penggunaan pohon Merkle yang sangat penting adalah untuk memeriksa apakah blok tersebut berisi transaksi yang ditentukan. Pohon Merkle dibangun oleh pasangan node yang hashing secara rekursif sampai hanya ada satu hash.
Implementasi Kode Pohon Merkle
Node Hash Tree disebut Root Merkle. Pohon Merkle dapat memeriksa apakah elemen data termasuk dalam pohon menggunakan kompleksitas waktu log2 (n):
uji paket; impor java.security.messagedigest; import java.util.arraylist; import java.util.list; kelas publik merkletrees {// daftar daftar transaksi <string> txlist; // root root root merkle; / ** * Konstruktor * @param TXlist Daftar Transaksi Transaksi Daftar Transaksi */ Public Merkletrees (Daftar <String> txList) {this.txlist = tXlist; root = ""; } /*** Jalankan merkle_tree dan atur root. */ public void merkle_tree () {list <string> TemptXlist = ArrayList baru <string> (); untuk (int i = 0; i <this.txlist.size (); i ++) {TemptXlist.add (this.txlist.get (i)); } Daftar <String> newTxList = getNewTxList (TemptXlist); while (newtxlist.size ()! = 1) {newtxlist = getNewTxList (newtxlist); } this.root = newtxlist.get (0); } /*** Daftar Hash Node Return. * @param TemptXlist * @Return */ Private List <String> getNewTxList (Daftar <String> TemptXlist) {Daftar <String> newTxList = ArrayList baru <string> (); INT INDEX = 0; while (index <TemptXList.Size ()) {// string kiri kiri = TemptXlist.get (index); indeks ++; // string kanan kanan = ""; if (index! = TemptXlist.size ()) {right = TemptXlist.get (index); } // sha2 hex value string sha2HexValue = getSha2HexValue (kiri + kanan); newtxlist.add (sha2HexValue); indeks ++; } return newtxlist; } / ** * return hex string * @param str * @return * / public string getsha2HexValue (string str) {byte [] cipher_byte; coba {MessageSpingIgest MD = MessageSpetedIgest.getInstance ("SHA-256"); md.update (str.getbytes ()); cipher_byte = md.digest (); StringBuilder SB = StringBuilder baru (2 * cipher_byte.length); untuk (byte b: cipher_byte) {sb.append (string.format ("%02x", b & 0xff)); } return sb.toString (); } catch (Exception e) {E.PrintStackTrace (); } kembali ""; } / ** * Dapatkan root * @return * / public string getRoT () {return this.root; }}Persiapan data
Kami memasukkan data transaksi ke dalam daftar:
Daftar <String> TemptXlist = ArrayList baru <string> (); TemptXlist.Add ("A"); TemptXList.Add ("B"); TemptXList.Add ("C"); TemptXList.Add ("D"); TemptXList.Add ("E");Proses implementasi
Siapkan data transaksi untuk menghitung nilai hash dari setiap data, dan secara bertahap membentuk node kiri dan kanan pohon untuk menjalankan loop untuk mengetahui bahwa hanya satu data yang tersisa pada akhirnya
Daftar Privat <String> getNewTXList (Daftar <String> TemptXList) {List <string> newTxList = ArrayList baru <string> (); INT INDEX = 0; while (index <TemptXList.Size ()) {// string kiri kiri = TemptXlist.get (index); indeks ++; // string kanan kanan = ""; if (index! = TemptXlist.size ()) {right = TemptXlist.get (index); } // sha2 hex value string sha2HexValue = getSha2HexValue (kiri + kanan); newtxlist.add (sha2HexValue); indeks ++; }tes
tes paket; import java.util.arraylist; import java.util.list; aplikasi kelas publik {public static void main (string [] args) {list <ring> temptxlist = arraylist baru <string> (); TemptXlist.Add ("A"); TemptXlist.Add ("B"); TemptXlist.Add ("C"); TemptXlist.Add ("D"); TemptXlist.Add ("E"); Merkletrees Merkletrees = Merkletrees baru (TemptXlist); merkletrees.merkle_tree (); System.out.println ("root:" + merkletrees.getroot ()); }}Hasil eksekusi
Artikel ini mengimplementasikan Merkletree sederhana dari bentuk pohon biner sederhana dan menghitung Treeeroot, tetapi pada kenyataannya, Merkletree tidak konservatif dan pohon biner juga mungkin merupakan pohon multi-alat kelinci.
90% dari artikel ini didasarkan pada terjemahan, alamat asli
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.