Storan blok ialah kaedah storan data baru muncul yang digunakan secara meluas dalam teknologi blockchain seperti Bitcoin dan Ethereum. Sebagai bahasa pengaturcaraan back-end yang biasa digunakan, PHP mempunyai keupayaan pemprosesan data yang agak berkuasa dan juga boleh melaksanakan fungsi storan blok. Artikel ini akan memperkenalkan cara menggunakan PHP untuk melaksanakan storan blok.
1. Apakah itu storan blok
Storan blok, juga dikenali sebagai pangkalan data teragih, ialah pangkalan data yang terdiri daripada berbilang nod yang bertaburan pada berbilang komputer. Nod ini boleh disambungkan bersama melalui rangkaian seperti Internet dan bekerjasama antara satu sama lain untuk melengkapkan penyimpanan dan perkongsian data. Sebab storan blok lebih selamat dan tidak boleh diusik daripada pangkalan data tradisional ialah ia menggunakan teknologi rantaian cincang untuk memastikan integriti dan kebolehpercayaan data.
2. Langkah untuk melaksanakan storan blok dalam PHP
Tentukan kelas bernama BlockChain dan tetapkan Sifat berikut: $chain , $pending_transactions dan $mining_reward. Antaranya, $chain ialah struktur rantaian yang menyimpan semua blok;
Blok genesis ialah blok pertama blockchain dan perlu ditambah secara manual. Tentukan kaedah bernama create_genesis_block dalam kelas BlockChain untuk mencipta blok genesis.
Tentukan kaedah yang dipanggil add_block dalam kelas BlockChain untuk menambah blok baharu. Fungsi kaedah ini adalah untuk menambah blok baharu pada blockchain dan mengemas kini semua transaksi yang belum selesai. Kodnya adalah seperti berikut:
function add_block($new_block) { $new_block->previous_hash = $this->get_last_block()->hash; $new_block->mine_block($this->mining_reward); array_push($this->chain, $new_block); // Update pending transactions $this->pending_transactions = array(); $this->pending_transactions[] = new Transaction(null, $this->mining_reward); }
Dalam kelas BlockChain, tentukan kelas bernama Block, yang termasuk atribut $index, $timestamp, $transactions , $previous_hash dan $hash.
Dalam kelas Block, laksanakan algoritma perlombongan untuk memastikan keselamatan dan kebolehpercayaan blockchain. Fungsi utama algoritma perlombongan adalah untuk mengira nilai cincang blok dan melaraskan kelajuan perlombongan berdasarkan pekali kesukaran dan bilangan transaksi. Berikut ialah kod pelaksanaan algoritma perlombongan:
function mine_block($mining_reward) { $this->timestamp = time(); $transaction = new Transaction(null, $mining_reward); array_push($this->transactions, $transaction); $this->hash = $this->calculate_hash(); while(substr($this->hash, 0, 4) !== "0000") { $this->nonce++; $this->hash = $this->calculate_hash(); } }
Dalam kelas Block, tentukan kelas bernama Transaction, termasuk $from_address, $to_address dan $jumlah tiga harta. Fungsi teras transaksi adalah untuk memindahkan aset, dan kod pelaksanaannya adalah seperti berikut:
class Transaction { public $from_address; public $to_address; public $amount; public function __construct($from_address, $to_address, $amount) { $this->from_address = $from_address; $this->to_address = $to_address; $this->amount = $amount; } }
Dalam kelas Blok, laksanakan cincang algoritma untuk mengira cincang nilai Harapan blok. Algoritma cincang boleh menggunakan SHA256, dan kod pelaksanaan adalah seperti berikut:
function calculate_hash() { return hash("sha256", $this->index . $this->previous_hash . $this->timestamp . json_encode($this->transactions) . $this->nonce); }
3 Contoh penggunaan PHP untuk melaksanakan storan blok
Contoh blockchain yang mudah diberikan di bawah, yang menunjukkan cara Penggunaan. PHP untuk melaksanakan fungsi storan blok:
index = $index; $this->timestamp = time(); $this->transactions = $transactions; $this->previous_hash = $previous_hash; $this->hash = $this->calculate_hash(); } function calculate_hash() { return hash("sha256", $this->index . $this->previous_hash . $this->timestamp . json_encode($this->transactions) . $this->nonce); } function mine_block($difficulty) { while(substr($this->hash, 0, $difficulty) !== str_repeat("0", $difficulty)) { $this->nonce++; $this->hash = $this->calculate_hash(); } echo "Block mined: " . $this->hash . " "; } } class BlockChain { public $chain; public $difficulty; public $pending_transactions; public $mining_reward; public function __construct() { $this->chain = array(); array_push($this->chain, $this->create_genesis_block()); $this->difficulty = 2; $this->pending_transactions = array(); $this->mining_reward = 100; } function create_genesis_block() { return new Block(0, array(), "0"); } function add_transaction($transaction) { array_push($this->pending_transactions, $transaction); } function get_last_block() { return $this->chain[sizeof($this->chain)-1]; } function mine_pending_transactions($mining_reward_address) { $block = new Block(sizeof($this->chain), $this->pending_transactions, $this->get_last_block()->hash); $block->mine_block($this->difficulty); echo "Block successfully mined! "; array_push($this->chain, $block); $this->pending_transactions = array(); $this->pending_transactions[] = new Transaction(null, $mining_reward_address, $this->mining_reward); } function get_balance($address) { $balance = 0; foreach($this->chain as $block) { foreach($block->transactions as $transaction) { if($transaction->from_address === $address) { $balance -= $transaction->amount; } if($transaction->to_address === $address) { $balance += $transaction->amount; } } } return $balance; } function is_chain_valid() { for($i = 1; $i < sizeof($this->chain); $i++) { $current_block = $this->chain[$i]; $previous_block = $this->chain[$i-1]; if($current_block->hash !== $current_block->calculate_hash() || $current_block->previous_hash !== $previous_block->hash) { return false; } return true; } } } class Transaction { public $from_address; public $to_address; public $amount; public function __construct($from_address, $to_address, $amount) { $this->from_address = $from_address; $this->to_address = $to_address; $this->amount = $amount; } } $blockchain = new BlockChain(); $blockchain->add_transaction(new Transaction("address1", "address2", 100)); $blockchain->add_transaction(new Transaction("address2", "address1", 50)); echo "Starting the miner... "; $blockchain->mine_pending_transactions("miner1"); echo "Balance of miner1 is " . $blockchain->get_balance("miner1") . " "; echo "Balance of address1 is " . $blockchain->get_balance("address1") . " "; echo "Balance of address2 is " . $blockchain->get_balance("address2") . " "; echo "Starting the miner again... "; $blockchain->mine_pending_transactions("miner2"); echo "Balance of miner1 is " . $blockchain->get_balance("miner1") . " "; echo "Balance of address1 is " . $blockchain->get_balance("address1") . " "; echo "Balance of address2 is " . $blockchain->get_balance("address2") . " "; ?>
IV Ringkasan
Artikel ini memperkenalkan kaedah menggunakan PHP untuk melaksanakan storan blok, daripada mencipta kelas blockchain, menambah blok genesis, menambah yang baharu. Sekatan, mencipta struktur data blok, melaksanakan algoritma perlombongan, melaksanakan transaksi, dsb. dijelaskan secara terperinci, dan pelaksanaan kod khusus diberikan. Saya harap artikel ini dapat membantu pengaturcara PHP lebih memahami prinsip dan kaedah pelaksanaan storan blok, dan menggunakannya pada projek sebenar dalam amalan.
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan storan blok menggunakan PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!