Pointer Hash
Kita telah sampai pada pembahasan tentang pointer hash dan pengaplikasiannya di dalam bitcoin. Pointer hash adalah struktur data yang berguna dalam banyak sistem. Sebuah pointer hash berfungsi seperti sebuah pointer pada umumnya, menunjukkan dimana informasi itu disimpan, bersama-sama dengan informasi hashnya. Pointer hash juga menunjukkan cara untuk mengambil informasi tersebut, dan juga cara untuk memverifikasi informasi tersebut agar tidak berubah.
Sebuah pointer hash adalah pointer yang menunjukkan ke mana data itu disimpan bersama-sama dengan hash dari nilai data pada waktu tertentu.
Kita bisa menggunakan pointer hash untuk membangun semua jenis struktur data. Kita juga dapat mengambil struktur data yang menggunakan pointer seperti list link atau pohon pencarian binary dan kemudian menerapkannya dengan pointer hash, tidak seperti pointer yang biasanya digunakan.
Blockchain
Gambar itu adalah list link menggunakan sebuah pointer hash. Selanjutnya struktur data ini disebut dengan Block chain. Secara umum, list link ini memiliki serangkaian blok. Setiap blok memiliki data dan pointer yang menuju ke blok sebelumnya pada list. Pada block chain, blok sebelumnya akan diganti dengan pointer hash. Sehingga pada setiap blok, tidak hanya memberikan kita dimana nilai blok sebelumnya saja, tapi juga mempunyai nilai yang memungkinkan kita untuk memverifikasi nilai itu agar tidak bisa berubah, setelah diverifikasi.
Block chain akan berfungsi sebagai tamper-evident log. Sehingga struktur data tersebut menyimpan begitu banyak data. Dan memungkinkan untuk menambahkan data di akhir log. Jika kemudian ada seseorang yang mengubah data sebelumnya, maka akan bisa dideteksi.
Untuk mengetahui mengapa block chain bisa menjadi tamper-evident log, misalnya ada seorang pengganggu yang ingin mengubah data pada bagian tengah block chain. Secara khusus tentu orang tersebut sudah mengetahui bahwa pointer hash dibagian kepala saja yang tidak bisa mendeteksi gangguan itu. Kemudian orang tersebut mengubah beberapa data di blok k. Karena data terebut telah berubah, hash di blok menjadi k+1. Sedangkan hash tersebut merupakan hash dari seluruh blok k, sehingga menjadi tidak akan cocok.
Perlu diingat adalah, bahwa hash baru itu tidak akan cocok dengan konten yang baru saja dirubah sejak fungsi hash menjadi collision-resistant. Perubahan itu akan bisa dideteksi di antara data baru di blok k dan pointer hash yang berada di blok k+1. Untuk menutupi hal ini, maka perusuh tersebut harus mengubah hash blok berikutnya juga, dan akan terus melakukan hal ini. Strategi orang tersebut akan gagal ketika sudah mencapai puncak list. Secara khusus, selama kita menyimpan pointer hash di bagian kepala daftar list, dan orang tersebut tidak bisa mengubahnya tanpa terdeteksi.
Maka, jika seseorang ingin mengutak-atik data di bagian mana saja di seluruh rantai data ini, agar perubahan data yang dilakukan itu menjadi konsisten, maka dia harus mengubah juga semua hash dari awal. Pada akhirnya, orang itu akan banyak mengalami hambatan, karena tidak akan mampu mengutak-atik induk list tersebut. Itulah mengapa hanya dengan menaruh pointer hash tunggal ini, maka akan menjadi tamper-evident log seluruhnya. Sehingga kita bisa membuat rangkaian block chain yang bisa terdiri dari sebanyak blok yang diinginkan.
Selanjutnya mari kita menengok kembali pada awal list blok yang dikenal dengan genesis block. Kita akan mengingat bahwa pembangunan rantai blok ini mirip dengan kontruksi Merkle-Damgard yang sudah dijelaskan sebelumnya. Keduanya memang cukup mirip, dan memiliki argumen keamanan yang berlaku juga di keduanya.
Gambar tersebut, jika seseorang merubah data di blok mana saja dalam rantai tersebut, maka akan mengakibatkan keselahan pointer hash di blok berikutnya. Jika kita menyimpan pointer hash di kepala daftar, dan kemudian seseorang memodifikasi semua pointer agar bisa konsisten dengan data yang dirubah, maka pointer di bagian kepala list blok akan mengalami kesalahan. Sehingga itu data yang tidak konsisten tersebut akan bisa dideteksi.
Struktur Data
Merkle Tree
Struktur data lainnya yang berguna dan bisa kita buat menggunakan pointer hash adalah binary tree. Struktur data binary tree yang mempunyai pointer hash, disebut dengan Merkle Tree, yang ditemukan oleh Ralph Merkle. Misalnya kita memiliki sejumlah blok yang memiliki sejumlah data. Kemudian, blok ini tersusun menggunakan merkle tree. Kemudian mengklasifikasikan data blok-blok tersebut menjadi dua pasang. Setiap pasangnya dibuat struktur data yang mempunyai hash pointer, satu pada setiap blok.
Struktur data ini membuat tingkatan berikutnya pada struktur pohonnya. Lantas pada setiap pasangan, membuat struktur data baru yang mempunyai hash pada masing-masingnya. Hal ini dilakukan terus menerus hingga mencapai satu blok, yang menjadi ujung pangkal (root).
Pada Merkle Tree, data blok dikelompokkan berpasangan, hash pada masing-masing blok disimpan pada node induk. Selanjutnya, node induk akan dikelompokkan lagi berpasangan, dan hash akan disimpan lagi di level berikutnya. Hal ini dilakukan secara terus-menerus hingga mencapai simpul akar.
Sebelumnya, kita tentu masih mengingat bahwa hanya pointer hash yang ditempatkan di kepala pohon yang tidak bisa dirubah bukan? Sehingga jika ada beberapa bagian di bawah pohon, akan menyebabkan pointer hash di satu titik dengan titik lain diatasnya menjadi tidak cocok. Jika pengubahan data ini terus dilakukan, pada akhirnya juga akan merambah di bagian atas pohon, dimana orang tersebut pun tidak akan bisa mengutak-atik, dan akan terdeteksi hanya dengan menambatkan pointer hash di bagian atas.
Proof of Membership (bukti keanggotaan)
Ada sebuah fitur lain dalam Merkle yang cukup berguna. Namun tidak seperti pada rantai blok yang kita bahas sebelumnya. Dengan fitur ini memungkinkan untuk membuat ringkasan keanggotaan. Sehingga data itu menjadi lebih pendek dan tidak terlalu panjang. Sebagai contoh, katakanlah ada seseorang yang ingin memberikan bukti bahwa data blok tertentu merupakan bagian dari Merkle Tree. Selanjutnya yang perlu diingat hanyalah root saja. Kemudian ornag tersebut perlu untuk menunjukkan data bloknya, dan data blok tersebut akan berjalan sesuai dengan urutan data bloknya hingga menuju ke akar. Kita bisa mengabaikan sisa bagian pohon itu, karena jalur pohon akan memungkinkan dalam memverifikasi hash hingga mencapai akar pohon.
Pada gambar itu, untuk bisa membuktikan bahwa data blok termasuk dalam anggota merkle, maka yang dibutuhkan hanya menunjukkan blok tersebut pada jalur yang bisa mencapai ke akar.
Sorted Merkle Tree
Sorted Merkle Tree adalah sebuah Merkle tree dimana kita mengambil blok pada bagian bawah, kemudian mengurutkannya dengan beberapa fungsi. Bisa berupa abjad, urutan leksikografis, numerik, atau lainnya.
Proof of Non-Membership
Merkle Tree yang sudah diurutkan tadi, maka memungkinkan untuk melakukan verifikasi non-membership. Artinya, bisa dibuktikan bahwa ada blok tertentu yang tidak menjadi bagian dari Merkle Tree. Caranya, adalah dengan menunjukkan jalur pada item tersebut tepat sebelum item itu dipertanyakan, dan juga menunjukkan jalur item itu tepat setelahnya. Jika dua item tersebut ada berturut-turut dalam merkle, maka bisa dijadikan bukti bahwa item itu tidak menjadi bagian merkle. Jika kedua item itu dimasukkan bagian merkle, maka dua item itu harus ditampilkan juga, sedangkan tidak ada ruang karena keduanya ada secara berturut-turut.