Năm 2021 chắc rằng là một năm bùng nổ của Blockchain, khi tín đồ người nhà nhà có tác dụng Blockchain, game NFT, Token.... Vậy trường hợp Blockchain được trở nên tân tiến trên ngôn từ PHP thì sao?
Blockchain là gì?Blockchain (hay call là cuốn sổ cái) là khối hệ thống cơ sở dữ liệu có thể chấp nhận được lưu trữ với truyền tải các khối thông tin (block). Bọn chúng được links với nhau nhờ mã hóa. Các khối thông tin này hoạt động tự do và hoàn toàn có thể mở rộng lớn theo thời gian. Bọn chúng được cai quản bởi những người tham gia khối hệ thống chứ không thông qua đơn vị trung gian. Nghĩa là lúc một khối tin tức được ghi vào khối hệ thống Blockchain thì không tồn tại cách nào biến hóa được. Chỉ gồm thể bổ sung cập nhật thêm khi dành được sự đồng thuận của toàn bộ mọi người.
Bạn đang xem: Lập trình blockchain php
Tạo một blockChúng ta sẽ khởi tạo 1 class mang tên là Block, Class này sẽ làm trọng trách mã hóa toàn bộ dữ liệu vào thành 1 chuỗi khóa
class Block public $index; //index là key của 1 block public $previousHash; // đấy là hash của block trước public $timeHash; // là thời gian mã hóa của block public $data; // data là của block ( văn bản transaction chẳng hạn ) public $hash; // hash của block này public function __construct($index = 0, $previousHash = "", $timeHash = "", $data = "") $this->index = $index; $this->previousHash = $previousHash; $this->timeHash = $timeHash; $this->data = $data; $this->hash = $this->execHash(); public function execHash() if(is_array($this->data)) $dataContent = json_encode($this->data); else $dataContent = $this->data; return hash("sha256", $this->index . $this->previousHash . $dataContent . $this->timeHash); Tiếp đến họ tạo một class Blockchain
namespace AppServices;use CarbonCarbon;class BlockChain extends Block public $chain = array(); public function __construct() $this->chain<> = $this->createGenesisBlock(); parent::__construct(); public function createGenesisBlock() return new Block(0000,"the first", Carbon::now()->format("d/m/Y H:i:s"), <"from" => "hunghd", "to" => "hunghd2", "amount"=> 3000>); private function getLatestBlock() return $this->chain<(count($this->chain) - 1)>; public function addBlock($index, $timeHash, $data) $previousHash = $this->getLatestBlock()->hash; $newBlock = new Block($index, $previousHash, $timeHash, $data); $this->chain<> = $newBlock; Ở trên đây mình sẽ khởi tạo 1 block khi có một data truyền vào. Trả dụ data là 1 trong những transaction hunghd giữ hộ tiền đến hunghd2 thì từ bây giờ mình sẽ khởi tạo ra 1 Block mới. Block này là block thứ nhất thế đề xuất index = 0 , previousHash = "the first".
Xem thêm: Kỹ Thuật Pgd Là Gì ? Nghĩa Của Từ Pgd Trong Tiếng Việt Tìm Hiểu Thuật Ngữ Pgd Và Pgs Trong Ivf
Và khi gồm thêm transaction hunghd2 gửi mang đến hunghd3 thì block tiếp theo sẽ sở hữu previousHash = mã hash của block trước đó. Từ đó cứ thêm transaction bắt đầu được thêm vào sẽ tạo nên ra thêm 1 block mới nối với các trước đó. Từ bỏ đó họ có một blockchain cơ bản.Đây là code tác dụng khi mình chạy thêm block:public function inValidBlock() for ($i = 1; $i count($this->chain); $i++) $currentBlock = $this->chain<$i>; $previousBlock = $this->chain<$i - 1>; if ($currentBlock->hash !== $currentBlock->execHash()) return false; if ($currentBlock->previousHash !== $previousBlock->hash) return false; return true; Giờ mình đã thử thay đổi 1 block ( chuyển đổi data hoặc hash ) trong chain sẽ có hiệu quả như sau:
$bl = new AppServicesBlockChain();$bl->addBlock(1, Carbon::now()->format("d/m/Y H:i:s"), <"from" => "hunghd2", "to" => "hunghd3", "amount"=> 4000>);$bl->addBlock(2, Carbon::now()->format("d/m/Y H:i:s"), <"from" => "hunghd3", "to" => "hunghd4", "amount"=> 5000>);$bl->addBlock(3, Carbon::now()->format("d/m/Y H:i:s"), <"from" => "hunghd4", "to" => "hunghd", "amount"=> 6000>);$bl->chain<2>->data = < "from" => "hunghd3", "to" => "hunghd", "amount" => 5000>;$bl->chain<2>->hash = $bl->chain<2>->execHash();$bl->invalid = $bl->inValidBlock();Ở trên đây thấy mã hash của block thứ 2 đã bị đổi khác mà block vật dụng 3 đã bảo quản mã hash của block đồ vật 2 trước lúc thay đổi. Nên hiệu quả kiểm tra là false

Nhưng thực tế, hash cùng previousHash khi mọi người có thể biến đổi dữ liệu 1 block rồi thế previousHash cùng hash của các block sau là vẫn tạo ra một chain thích hợp lệ và họ cũng muốn người dùng cùng đề xuất đồng thuận (consensus) về một lịch sử dân tộc duy duy nhất của chain. Cùng proof-of-work thành lập để giải quyết và xử lý vấn đề này.
Nếu bạn có nhu cầu sửa thay đổi 1 block trước đó, bạn sẽ phải mine lại toàn thể các block sau nó. Nó yêu cầu quét một giá bán trị bắt đầu bằng một vài số 0 cố định khi được hash. Quý giá được điện thoại tư vấn là quý hiếm nonce, số bit 0 mở màn được hotline là difficulty. Bằng phương pháp tăng độ khó câu hỏi khai thác, đồng nghĩa rằng bài toán mine sẽ càng ngày càng khó hơn.Chúng ta có thể làm khối hệ thống này bằng cách tạo method mine
Giờ class Block mình sẽ code sau cuối như này:
class Block public $index; public $previousHash; public $timeHash; public $data; public $hash; public $mineVar; public function __construct($index = 0, $previousHash = "", $timeHash = "", $data = "") $this->index = $index; $this->previousHash = $previousHash; $this->timeHash = $timeHash; $this->data = $data; $this->hash = $this->execHash(); $this->mineVar = 0; public function execHash() if(is_array($this->data)) $dataContent = json_encode($this->data); else $dataContent = $this->data; return hash("sha256", $this->index . $this->previousHash . $dataContent . $this->timeHash . $this->mineVar ); public function mine($difficulty) while (!str_starts_with($this->execHash(), str_repeat("0", $difficulty))) $this->mineVar++; $this->hash = $this->execHash(); return $this->mineVar; Trong class Blockchain cũng cần bổ sung cập nhật code như này:
use CarbonCarbon;class BlockChain extends Block public $chain = array(); public $difficulty; public function __construct($difficulty) $this->chain<> = $this->createGenesisBlock(); $this->difficulty = $difficulty; parent::__construct(); public function createGenesisBlock() return new Block(0000,"the first", Carbon::now()->format("d/m/Y H:i:s"), <"from" => "hunghd", "to" => "hunghd2", "amount"=> 3000>); private function getLatestBlock() return $this->chain<(count($this->chain) - 1)>; public function addBlock($index, $timeHash, $data) $previousHash = $this->getLatestBlock()->hash; $newBlock = new Block($index, $previousHash, $timeHash, $data); $newBlock->mine($this->difficulty); $this->chain<> = $newBlock; public function inValidBlock() for ($i = 1; $i count($this->chain); $i++) $currentBlock = $this->chain<$i>; $previousBlock = $this->chain<$i - 1>; if ($currentBlock->hash !== $currentBlock->execHash()) return false; if ($currentBlock->previousHash !== $previousBlock->hash) return false; return true; Ok!! Giờ họ sẽ test chạy coi sao
$bl = new AppServicesBlockChain(4);$bl->addBlock(1, Carbon::now()->format("d/m/Y H:i:s"), <"from" => "hunghd2", "to" => "hunghd3", "amount"=> 4000>);$bl->addBlock(2, Carbon::now()->format("d/m/Y H:i:s"), <"from" => "hunghd3", "to" => "hunghd4", "amount"=> 5000>);$bl->addBlock(3, Carbon::now()->format("d/m/Y H:i:s"), <"from" => "hunghd4", "to" => "hunghd", "amount"=> 6000>);Kết quả bọn họ sẽ có những block tất cả số nonce như ước ao muốn. Để tăng cường mức độ khó là 5 số 0 thì mình chỉ cần thay đổi difficulty = 5.
Đây là bài viết dựa trên sự khám phá của cá thể mình nên có rất nhiều sai sót ước ao được hầu như người góp phần thêm!!!