Phát triển Blockchain với PHP

Tram Ho

Năm 2021 chắc hẳn là một năm bùng nổ của Blockchain, khi người người nhà nhà làm Blockchain, game NFT, Token…. Vậy nếu Blockchain được phát triển trên ngôn ngữ PHP thì sao?

Blockchain là gì?

Blockchain (hay gọi là cuốn sổ cái) là hệ thống cơ sở dữ liệu cho phép lưu trữ và truyền tải các khối thông tin (block). Chúng được liên kết với nhau nhờ mã hóa. Các khối thông tin này hoạt động độc lập và có thể mở rộng theo thời gian. Chúng được quản lý bởi những người tham gia hệ thống chứ không thông qua đơn vị trung gian. Nghĩa là khi một khối thông tin được ghi vào hệ thống Blockchain thì không có cách nào thay đổi được. Chỉ có thể bổ sung thêm khi đạt được sự đồng thuận của tất cả mọi người.

Tạo một block

Chúng ta sẽ khởi tạo 1 class có tên là Block, Class này sẽ làm nhiệm vụ mã hóa toàn bộ dữ liệu vào thành 1 chuỗi khóa

Tiếp đến chúng ta tạo một class Blockchain

Ở đây mình sẽ tạo 1 block khi có 1 data truyền vào. Giả dụ data là 1 transaction hunghd gửi tiền cho hunghd2 thì lúc này mình sẽ tạo ra 1 Block mới. Block này là block đầu tiên thế nên index = 0 , previousHash = 'the first'. Và khi có thêm transaction hunghd2 gửi cho hunghd3 thì block tiếp theo sẽ có previousHash = mã hash của block trước đó. Từ đó cứ thêm transaction mới được thêm vào sẽ tạo ra thêm 1 block mới nối với các trước đó. Từ đó chúng ta có một blockchain cơ bản. Đây là code kết quả khi mình chạy thêm block:

Kiểm tra chain bị thay đổi hay không

Chúng ta đã tạo được một chain ở phía trên nhưng nếu giờ hacker muốn thay đổi 1 block bất kỳ trong chain thì sẽ như nào? Nếu mà dễ dàng thay đổi thế thì block chain đã không được thịnh hành như bây giờ rồi. Để ngăn chặn việc đó thì mình sẽ phải kiểm tra tính của chain như sau đó là lấy previousHash === hash trước đó.

Giờ mình sẽ thử thay đổi 1 block ( thay đôi data hoặc hash ) trong chain sẽ có kết quả như sau:

Ở đây thấy mã hash của block thứ 2 đã bị thay đổi mà block thứ 3 đã lưu lại mã hash của block thứ 2 trước khi thay đổi. Nên kết quả kiểm tra là false

Proof-of-work

Nhưng thực tế, hash và previousHash khi mọi người có thể thay đổi dữ liệu 1 block rồi thay previousHash và hash của các block sau là vẫn tạo được một chain hợp lệ và chúng ta cũng muốn người dùng cùng phải đồng thuận (consensus) về một lịch sử duy nhất của chain. Và proof-of-work ra đời để giải quyết vấn đề này.

Nếu bạn muốn sửa đổi 1 block trước đó, bạn sẽ phải mine lại toàn bộ các block sau nó. Nó yêu cầu quét một giá trị bắt đầu bằng một số số 0 nhất định khi được hash. Giá trị được gọi là giá trị nonce, số bit 0 đứng đầu được gọi là difficulty. Bằng cách tăng độ khó việc khai thác, đồng nghĩa rằng việc mine sẽ ngày càng khó hơn. Chúng ta có thể làm hệ thống này bằng cách tạo method mine

Giờ class Block mình sẽ code cuối cùng như này:

Trong class Blockchain cũng cần bổ sung code như này:

Ok!! Giờ chúng ta sẽ thử chạy xem sao

Kết quả chúng ta sẽ có các block có số nonce như mong muốn. Để tăng độ khó là 5 số 0 thì mình chỉ cần thay đổi difficulty = 5.

Tuy nhiên bài viết này mang tính cơ bản nên sẽ sử dụng proof-of-work. Trên thực tế công nghệ này đã lỗi thời chậm chạp, tốn tài nguyên và có hại cho môi trường nên các platform hiện nay thường sử dụng proof-of-stake.

Đây là bài viết dựa trên sự tìm hiểu của cá nhân mình nên có nhiều sai sót mong được mọi người đóng góp thêm!!!

Chia sẻ bài viết ngay