Memahami Cara Kerja Blockchain Menggunakan Php Dan Json
Artikel ini dimaksudkan sebagai pengantar pertama untuk prinsip-prinsip dasar blockchain untuk pengembang (web) yang tidak berpengalaman di bidang ini. Mari kita lihat struktur blockchain yang sangat sederhana dengan membangun blockchain menggunakan Json dan skrip Php kecil.
Pada akhir tutorial ini, blockchain akan disimpan di sistem Anda dan halaman web pengujian akan dibuat yang dapat Anda gunakan untuk memposting blok baru ke rantai.
Mengontrol pembuatan blok baru melalui pembuktian konsep, menyiapkan blockchain terdistribusi, dan tugas lanjutan lainnya berada di luar cakupan artikel pengantar ini.
1. Struktur Blockchain
Mari kita mulai dengan definisi dasar blockchain:
Pada catatan digital bookyang dapat diakses publik, yang mencatat semua transaksi dalam mata uang tertentu dalam urutan kronologis.
Seperti yang kita ketahui saat ini, blockchain dapat digunakan untuk menyimpan berbagai data maupun transaksi ekonomi. Selain itu, sistem blockchain yang paling menarik menggunakan arsitektur terdistribusi dan tidak ada yang benar-benar memiliki log.
Bagaimanapun, sebagai langkah pertama ke dunia blockchain, saya ingin menjaga hal-hal sesederhana mungkin: blok terpusat (tidak terdistribusi) yang memungkinkan kita untuk mencatat transaksi yang dilakukan di PippoCoin. Buat rantai. tutorial.
Di blockchain, setiap data baru (transaksi) disimpan di blok yang ditambahkan ke ujung rantai. Untuk menambah rantai, blok terakhir ini menggunakan beberapa informasi dari blok sebelumnya untuk memastikan integritas dan kekekalan log.
Tujuan pertama kami adalah membentuk blockchain dengan mendefinisikan struktur blok. Pilih untuk menggunakan file json sederhana untuk menyimpan blockchain. Json adalah format terkenal yang dapat dengan mudah dibaca dan ditulis menggunakan Php, bahasa skrip yang digunakan untuk memanipulasi data.
Pertama, mari kita buat blockchain dasar yang berisi blok pertama dalam file baru bernama chain.json.
{"chain":
[{
"index":0,
"hashid":"first-block-doesnt-need-it",
"timestamp":1541152127213,
"proof-of-work":"xyz",
"content":
{
"from":"network",
"to":"simone",
"amount":1
}
}]
}
Blockchain untuk mengelola transaksi PippoCoin dibuat oleh blok, dan setiap blok memiliki atribut berikut:
Index: ID integer bilangan bulat unik yang sederhana mulai dari 0 (bertambah 1). Menjaga ini tetap sederhana akan membantu Anda dengan mudah menghitung total blok dalam rantai kapan saja.
Hashid: Pilih nilai apa saja untuk blok pertama ini. Blok berikutnya menggunakan fungsi khusus untuk menghitung nilai atribut hashid. Fungsi ini menggunakan beberapa data yang disimpan di blok sebelumnya untuk mendapatkan nilai yang unik dan konsisten.
Timestamp: Tanggal blok dibuat. Dalam hal ini, saya menggunakan cap waktu Unix sederhana (dalam milidetik).
prof of work: Sistem blockchain yang berfungsi penuh membutuhkan bukti kerja untuk membuat blok baru di dalam rantai. Proof of work biasanya merupakan solusi untuk masalah kriptografi yang kompleks, tetapi bisa berupa apa saja, tergantung pada lingkungan blockchain yang Anda rancang. Misalnya, Anda dapat menggunakan PippoCoins untuk membangun lingkungan blockchain yang memberi penghargaan kepada pengguna yang berlangganan buletin kami. Dalam hal ini, Bukti Kerja mungkin merupakan ID langganan yang valid untuk buletin Anda. Untuk ikhtisar tentang blockchain yang sangat mendasar ini, kami tidak memikirkan Proof of Work. Atribut Proof of Work diatur ke "xyz" di semua blok dalam rantai.
content: Atribut ini menyimpan informasi terstruktur tentang transaksi itu sendiri. Dalam bentuknya yang paling sederhana, transaksi keuangan diidentifikasi oleh pengirim (dari), penerima (ke), dan kuantitas (jumlah) mata uang yang dipertukarkan.
Pengirim transaksi pertama ini adalah sistem itu sendiri (jaringan), penerima adalah pengguna yang disebut simone, dan jumlah yang ditukar adalah 1 PippoCoin.
Jika Anda membaca blockchain ini, Anda dapat melihat bahwa pengguna "simone" telah memperoleh satu PippoCoin dari sistem PippoCoin yang diidentifikasi oleh pengguna khusus bernama "jaringan". Pengguna khusus ini adalah satu-satunya pengguna yang dapat membuat PippoCoin baru. Pengguna lain dapat mengubah PippoCoin satu sama lain.
Sebagai aturan dasar dari lingkungan PippoCoin, semua pengguna lain dalam sistem hanya dapat menukar koin jika mereka memilikinya (disediakan oleh jaringan atau pengguna lain).
Bagaimana pengguna bisa mendapatkan PippoCoins dari jaringan? Dengan melakukan beberapa pekerjaan dan menunjukkan bukti pekerjaan ke jaringan.
2. Baca blockchainnya
Setelah struktur dasar blockchain ditentukan, Anda dapat mulai mengkodekan objek akses data dasar di Php. Objek kita harus dapat:
- Baca blockchain kami
- Baca data tentang blok terakhir di blockchain
- Menghitung hash valid yang digunakan di blok baru dan memasukkannya ke dalam blockchain
Kode berikut akan ditempatkan di include/dao.php
<?php
class DAO {
function read_all() {
try {
$jsondata = file_get_contents(dirname(dirname(__FILE__))."/chain.json");
$arr_data = json_decode($jsondata, true);
return $arr_data;
}
catch(Exception $e) {
echo "Error: " . $e->getMessage();
exit();
}
}
function get_previous_hashid($chain){
$lastEl = array_values(array_slice($chain, -1))[0];
return $lastEl["hashid"];
}
function get_previous_index($chain){
$lastEl = array_values(array_slice($chain, -1))[0];
return $lastEl["index"];
}
function get_new_hashid($previous_hashid,$index,$timestamp,$content){
$full_string = $previous_hashid.$index.$timestamp.$content;
$hash = hash('sha256',$full_string);
return $hash;
}
function read_content($content) {
$arr_content = json_decode($content);
return $arr_content;
}
}
?>
Fungsi pertama read_all() membaca seluruh blockchain dan menempatkannya dalam array multidimensi. Berguna untuk menguji prototipe kecil ini, tetapi jelas tidak boleh digunakan di lingkungan produksi di mana blockchain dapat tumbuh hingga gigabyte data.
Fungsi berikut get_previous_hashid() dan get_previous_index() membantu untuk mendapatkan nilai indeks dan nilai ID hash dari blok yang terakhir dimasukkan dalam rantai. Anda memerlukan data ini untuk menghitung ID hash yang benar yang akan digunakan di blok berikutnya yang Anda tambahkan.
Setiap sistem menetapkan aturannya sendiri untuk menghitung data di blok baru. Sebagai aturan umum, sistem PippoCoin mengharuskan setiap blok baru untuk menyertakan atribut yang disebut hashid, yang merupakan hash dari empat string (sha256) dari ID hash, indeks, stempel waktu, dan konten blok baru, yang diambil dari blok sebelumnya. blok Saya menilai bahwa ada. saya sedang membuat. Sekarang Anda dapat lebih memahami mengapa blok pertama tidak memiliki ID hash yang dihitung.
Fungsi terakhir di dao.php, read_content(), membantu untuk menyimpan konten blok (pengirim, penerima, dan jumlah) dalam array multidimensi. Ini membuat tugas-tugas itu lebih mudah ketika Anda nanti membuat blok baru.
3. Buat blok baru
Sekarang setelah Anda memiliki objek akses data, Anda dapat menulis skrip sederhana untuk mulai mencoba prototipe blockchain. Buat file baru bernama chain.php di root folder aplikasi Anda dan mulailah menulis kode berikut. Ini memungkinkan Anda untuk membaca dan memvisualisasikan seluruh konten blockchain Anda.
<?php
// including basic configuration file and Data Access Object class
include_once("./includes/config.php");
include_once("./includes/dao.php");
// initializing the class
$dao = new DAO();
// loading the full blockchain in an array and showing it as output on the webpage
$full_chain = $dao->read_all();
echo "full blockchain loaded:<br />";
echo '<pre>',print_r($full_chain["chain"],1),'</pre>';
echo "<hr />";
<p>Kode berikut membantu membaca indeks dan ID hash dari blok terakhir di blockchain.</p>
<?php
// reading last block's hash id
$previous_hashid = $dao->get_previous_hashid($full_chain["chain"]);
echo "reading last block's hash id:<br />";
echo $previous_hashid;
echo "<hr />";
// reading last block's index to calculate next index
$previous_index = $dao->get_previous_index($full_chain["chain"]);
$next_index = $previous_index+1;
echo "reading last block's index to calculate next index:<br />";
echo "Last: " .$previous_index. " | Next: ".$next_index;
echo "<hr />";
Sekarang Anda dapat menghitung nilai blok baru.
Mendapatkan indeks blok baru sangat mudah. Di lingkungan PippoCoin, indeksnya adalah bilangan bulat, hanya indeks blok sebelumnya yang bertambah 1.
ID hash baru dihitung menggunakan metode get_new_hashid() dari kelas DAO. Ini akan menjadi hash baru (sha256) berdasarkan rangkaian berikutnya.
- Hash id dari blok terakhir +
- Index blok baru +
- timetamps blok baru +
- content blok baru
<?php
echo "New hashid:<br />";
$timestamp = round(microtime(true) * 1000);
// example content
// $content = '{"from": "network","to": "simone","amount": 1000}';
$content = $_POST["json_data"];
$new_hashid = $dao->get_new_hashid($previous_hashid,$next_index,$timestamp,$content);
echo $new_hashid;
echo "<hr />";
Anda mungkin memperhatikan bahwa variabel $content, yang seharusnya berisi data yang berarti untuk transaksi, memiliki nilai variabel POST "json_data". Untuk menguji dan mencoba lingkungan blockchain kecil, buat file baru bernama post.php dan letakkan di folder yang sama. Ini adalah form sederhana yang memungkinkan Anda untuk POST data json Anda ke skrip chain.php. Anda dapat memverifikasi bahwa setiap blok baru ditambahkan dengan benar dengan memposting transaksi baru secara manual ke blockchain.
File post.php adalah:
<form action="chain.php" method="post">
<textarea name="json_data">
{
"from": "network",
"to": "simone",
"amount": 1
}
</textarea>
<input type="submit">
</form>
Seperti yang Anda lihat, formulir ini mengirimkan data json mentah ke chain.php. Mengubah nilai From, To, dan Amount akan menghasilkan berbagai transaksi yang terdaftar di blockchain.
Jelas, ini adalah prototipe yang sangat sederhana yang membantu menguji fungsionalitas dasar PippoCoin dan berfokus pada struktur dan aturannya.