41 lượt xem

Phát triển Blockchain với PHP|tìm kiểu công nghệ blockchain


Ở bài viết này ilook sẽ hướng dẫn những Phát triển Blockchain trải qua ngôn từ PHP. Hy vọng bài viết sẽ không ít chớp lấy và thực thi được công nghệ tiên tiến blockchainBlockchain lúc bấy giờ đang là xu thế mới, đi đến đâu cũng blockchain, và hầu hết 1 số hội thảo chiến lược công nghệ tiên tiến thì chủ đề blockchain luôn được nhiều những bạn lập trình viên cũng như những nhà quản trị doanh nghiệp đều chăm sóc đến, ở bài viết này mình sẽ hướng dẫn những bạn viết 1 blockchain trong php .
Mình sẽ lướt qua khái niệm về blockchain theo cách mình hiểu 1 chút, để bạn nào chưa biết thì hoàn toàn có thể hiểu qua về nó và bạn nào biết rồi thì cũng hoàn toàn có thể góp phần quan điểm của những bạn ,

Vậy, đầu tiên blockchain là gì ? mà sao đi đâu cũng thấy nhắc đến blockchain? blockchain ra đời khi nào ? Blockchain dùng để làm gì? ứng dụng vào những cái việc gì? nghe thoáng qua ở đâu nói rằng blockchain là bitcoin, hô hố, có phải không nhỉ ?

Bạn tạo 1 thư mục blockchain trong thư mục webservice của bạn nhé, và tạo luôn 1 file index.php để tất cả chúng ta viết code trong đó nhé :
Ban đầu tất cả chúng ta sẽ khởi tạo 1 class có tên là Block, Class này sẽ làm trách nhiệm mã hóa hàng loạt tài liệu vào thành 1 chuỗi khóa, đoạn code sẽ như sau :

Class Block{
 
public $index; // biến này là index key của 1 block dữ liệu, ở ví dụ này của mình, mình sẽ dùng nó là index, nhưng nếu chúng ta áp dụng thực tế, thì chúng ta có thể coi nó như 1 khóa chính, 1 transaction id, để định danh cho 1 block dữ liệu
public $previousHash; // biến này này hash của block trước block này
public $timeHash; // biến này là thời gian mã hóa của block này
public $data; // biến này là data của block này
public $hash; // biến này chính là 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))
        {
            $data_content = json_encode($this->data);
        }else{
            $data_content = $this->data;
        }
         
        return hash('sha256', $this->index.$this->previousHash.$this->timeHash.$data_content);
    }
 
}

Chúng ta chuyển sang tạo Class Blockchain như sau :

Class BlockChain extends Block{
 
    public $chain = array();
 
    public function __construct()
    {
 
    }
 
}

Class Blockchain này sẽ thực thi những công dụng như tạo mới 1 block, check xem blockchain này có bị chỉnh sửa hay chưa ?
Như bên trên những bạn cũng thấy, mình khởi tạo 1 class có tên Blockchian và thừa kế lại class Block bên trên, trong class Blockchain này hiện chưa có gì ngoài biến USD chain đang được khai báo public và 1 hàm __construct ( ), việc tiếp theo tất cả chúng ta sẽ làm là tạo 1 hàm có tính năng khởi tạo block bắt đầu, block khởi đầu này cũng khá quan trọng, nó là 1 block bắt đầu tạo ra hash, những block sau đó sẽ lấy hashkey của block này để triển khai việc mã hóa của mình, vậy mình sẽ tạo hàm này trong class Blockchain

public function createGenesisBlock()
{
    return new Block(0,'hash_dau_tien', time(), 'data');
}

Tiếp theo chúng ta sẽ gọi hàm này trong hàm __construct để khi new Blockchain thì hàm createGenesisBlock sẽ được tự động gọi vào

Class BlockChain extends Block{
 
    public $chain = array();
 
    public function __construct()
    {
        $this->chain[] = $this->createGenesisBlock(); 
    }
}

Tiếp theo tất cả chúng ta tạo 1 hàm có tên getLatestBlock, hàm này sẽ có trách nhiệm get ra block ở đầu cuối trong blockchain, và hàm này có nội dung như sau :

private function getLatestBlock()
    {
        return $this->chain[(count($this->chain) - 1)];
    }

Hàm này thì đơn thuần rồi nên mình sẽ không lý giải thêm về hàm này và đi vào viết 1 hàm tiếp theo, hàm này vô cùng quan trọng, hàm này sẽ giúp tất cả chúng ta thêm vào block những tài liệu mới

public function addaBlock($index, $timeHash, $data)
    {
        $previousHash = $this->getLatestBlock()->hash;
        $this->chain[] = new Block($index, $previousHash, $timeHash, $data);
    }

Ở hàm này, mình phải lấy ra được hash của block trước, lấy nó để làm gì ạ ? thưa rằng bạn nhìn dòng thứ 2 trong hàm này bạn sẽ thấy Class Block cần truyền vào 1 biến có tên USD previousHash, biến này khi triển khai hash nó sẽ giống như 1 key trong hash, sau này cái USD previousHash nó cũng là 1 thành phần để nói rằng block này có hợp lệ không ? block này có bị chỉnh sửa không ?
Okie, có vẻ như gần hoàn hảo rồi, chúng ra review lại class BlockChain 1 chút nhé

Class BlockChain extends Block{
 
    public $chain = array();
 
    public function __construct()
    {
        $this->chain[] = $this->createGenesisBlock(); 
    }
 
    public function createGenesisBlock()
    {
        return new Block(0,'hash_dau_tien', time(), 'data');
    }
 
    private function getLatestBlock()
    {
        return $this->chain[(count($this->chain) - 1)];
    }
 
    public function addaBlock($index, $timeHash, $data)
    {
        $previousHash = $this->getLatestBlock()->hash;
        $this->chain[] = new Block($index, $previousHash, $timeHash, $data);
    }
 
     
}

Tổng cả class Block bên trên tất cả chúng ta sẽ có một code cơ bản và hoàn hảo

index = $index;
        $this->previousHash = $previousHash;
        $this->timeHash = $timeHash;
        $this->data = $data;
        $this->hash = $this->execHash();
    }
 
    public function execHash()
    {
         
        if(is_array($this->data))
        {
            $data_content = json_encode($this->data);
        }else{
            $data_content = $this->data;
        }
         
        return hash('sha256', $this->index.$this->previousHash.$this->timeHash.$data_content);
    }
 
}
 
Class BlockChain extends Block{
 
    public $chain = array();
 
    public function __construct()
    {
        $this->chain[] = $this->createGenesisBlock(); 
    }
 
    public function createGenesisBlock()
    {
        return new Block(0,'hash_dau_tien', time(), 'data');
    }
 
    private function getLatestBlock()
    {
        return $this->chain[(count($this->chain) - 1)];
    }
 
    public function addaBlock($index, $timeHash, $data)
    {
        $previousHash = $this->getLatestBlock()->hash;
        $this->chain[] = new Block($index, $previousHash, $timeHash, $data);
    }
 
}

Chúng ta sẽ thêm đoạn này vào cuối file index.php và chạy thử nó nhé

$bl = new BlockChain();
$bl->addaBlock(1,time(), 'Data thứ 2');
$bl->addaBlock(2,time(), 'Data thứ 3');
$bl->addaBlock(3,time(), 'Data thứ 4');

Sau khi chạy, tất cả chúng ta sẽ có tác dụng như sau :

BlockChain Object
(
    [chain] => Array
        (
            [0] => Block Object
                (
                    [index] => 0
                    [previousHash] => ma_chuoi_dau_tien
                    [timeHash] => 1530436111
                    [data] => data cua toi can tao
                    [hash] => 1067948d9484bb8bf7dcf5a625db12521e8a4f395861dd93b0025aa7714417c6
                )
 
            [1] => Block Object
                (
                    [index] => 1
                    [previousHash] => 1067948d9484bb8bf7dcf5a625db12521e8a4f395861dd93b0025aa7714417c6
                    [timeHash] => 1530436111
                    [data] => Data thứ 2
                    [hash] => 3f4752159b07a36c2bef5feeda6f4eb25a0472e08d9f3ed629ff9b4293a1a776
                )
 
            [2] => Block Object
                (
                    [index] => 2
                    [previousHash] => 3f4752159b07a36c2bef5feeda6f4eb25a0472e08d9f3ed629ff9b4293a1a776
                    [timeHash] => 1530436111
                    [data] => Array
                        (
                            [transaction_id] => 12ewe1e12e12eqwd12e1
                            [content] => test
                        )
 
                    [hash] => be72872e39785b6ccaea102166d278e74ef10b9b7af066edead2a6107e6da27a
                )
 
            [3] => Block Object
                (
                    [index] => 3
                    [previousHash] => be72872e39785b6ccaea102166d278e74ef10b9b7af066edead2a6107e6da27a
                    [timeHash] => 1530436111
                    [data] => Data thứ 4
                    [hash] => 46af491628171e95276986c996e3f5c155642411bfefc7936fc4688e1d088f98
                )
 
        )
)

Như vậy là tất cả chúng ta đã tạo ra được blockchain với php, thật quá đơn thuần phải không những bạn, ở bài sau mình sẽ hướng dẫn những bạn việc kiểm tra xem 1 trong những block trong blockchain đã bị chỉnh sửa hay chưa ?
Thêm phát kết là bitcoin chỉ là 1 loại tiền sử dụng công nghệ tiên tiến blockchain, chứ bitcoin không phải là blockchain, không hề lấy bitcoin làm tên gọi cho blockchain, những bạn đừng nhầm lẫn nhé, ai đang nhầm lẫn thì sửa lại luôn nhé. Hẹn gặp những bạn ở những bài tiếp theo

Source: https://trade.edu.vn
Category: Blockchain

Vote sao

Trả lời

Email của bạn sẽ không được hiển thị công khai.