Tìm hiểu về Proof-of-work trong Blockchain

Trong bài viết trước Xây dựng một block chain cơ bản trong .net core  chúng ta đã biết cách tạo được 1 blockchain. Tuy nhiên nhược điểm của nó là bạn có thể cập nhật giá trị lại cho 1 block và tiến hành tính toán lại hash của tất cả các block khác thì việc validation không hề có tác dụng. Điều này trở nên đáng lo ngại trong thực tế vì việc tính toán tất cả các block có thể thực hiện được trong thời gian ngắn với các máy tính hiện đại (siêu máy tính..). Vì vậy chúng ta cần tìm 1 giải pháp để ngăn chặn điều này. Trong bài viết này chúng ta sẽ tìm hiểu về 1 phương pháp đơn giản mà hiệu quả,  đó chính là Proof-Of-Work.

Proof of Work là gì ?

Proof of work là một cách thức được sử dụng để sinh ra các block mới của blockchain. Nó đòi hỏi đáng kể khối lượng công việc và thời gian tính toán để tạo ra các mẩu thông tin cho block mới. Thông tin được sinh ra phải đơn giản và có thể kiểm chứng được. Do đó nó có thể dễ dàng xác minh bởi bất kỳ node nào trong network. Thông tin được tạo ra là bằng chứng cho thấy block này là hợp lệ và một số công việc đã được thực hiện để tạo ra nó. Thuật toán được sử dụng để implement Proof-Of-Work là thuật toán băm, phổ biến nhất là SHA-256.

Việc sinh ra một mã băm theo định dạng cụ thể, trong trường hợp này là các số 0 đằng trước mã băm đòi hỏi khá nhiều thời gian tính toán. Nhưng thời gian để verify mã băm đó là không đáng kể. Chúng ta có thể làm điều này bằng cách sử dụng nonce, đây là 1 thuộc tính kiểu int của class Block, bằng cách tăng giá trị của nonce chúng ta sẽ có các mã băm khác nhau. Quá trình sẽ kết thúc khi mã băm được sinh ra phù hợp với yêu cầu.

Mining

Việc implement Proof-Of-Work được gọi là mining (khai thác), giống như việc khai thác khoáng sản ngoài thực tế thì đây là một quá trình tìm thứ gì đó có giá trị với 1 nỗ lực lớn (thời gian tính toán). Trong Blockchain thì mining được hiểu là tìm được mã băm đúng (right hash) với một lượng lớn thời gian tính toán

Tiến hành viết code

Class Block

chúng ta thêm 1 thuộc tính mới là nonce,

Update phương thức CalculateHash

tạo thêm phương thức mới là Mine, tham số đầu vào là difficulty. Difficulty là một số nguyên, chính là số lượng các số 0 đằng trước mã băm được sinh ra. Difficulty càng cao thì thời gian tính toán càng lâu

Class BlockChain

Thêm thuộc tính mới là Difficulty. Chúng ta sẽ gán mặc định là 2, điều này có nghĩa là mã băm sinh ra phải có 2 số 0 đằng trước, bạn có thể tăng difficulty lên để kiểm tra thời gian tính toán

Update lại phương thức AddBlock

Program

Sau khi thay đổi mã nguồn như trên, bạn hãy chạy lại chương trình để xem thời gian tính toán mất bao lâu nhé

Tổng kết

Proof-Of-Work đòi hỏi 1 lượng lớn thời gian để thêm các khối mới (bao gồm cả việc update lại giá trị hash của các khối cũ), điều này khiến cho việc giả mạo các block gần như là không thể. Hacker cần một lượng lớn thời gian/máy tính/sức mạnh tính toán để update lại tất cả các blocks. Điều này rất khó bởi vì các blocks được sinh ra không ngừng. Một câu hỏi đặt ra là Proof-Of-WOrk đòi hỏi một lượng lớn thời gian tính toán như vậy thì tại sao người ta lại sẵn sàng kết nối máy tính của mình tới blockchain network để thực hiện quá trình mining? Chúng ta sẽ tìm hiểu điều này trong bài viết lần sau.

Tham khảo https://www.c-sharpcorner.com/article/building-a-blockchain-in-net-core-proof-of-work/