Độ khó (difficulty) của Bitcoin là gì?

Hey, xin chào các bạn. Mình là Hoàn đây, và hôm nay mình sẽ trở lại trong bài viết về độ khó (difficulty) của Bitcoin, bla bla…
Hồi bé chắc ai cũng có chơi cờ cá ngựa nhỉ. Trong trò chơi này, mỗi người khi tới lượt của mình sẽ thảy xúc xắc để ra được số nước đi của quân cờ. Giờ mình với các bạn cũng thử chơi thảy xúc xắc nhé 😀
Giả sử chúng ta có 2 viên xúc xắc. Yêu cầu của trò chơi là sau khi thảy, nếu tổng số nút của 2 viên xúc xắc là nhỏ hơn 10 chúng ta sẽ chiến thắng.
Xem hình trên, thì tổng số cơ hội chiến thắng của chúng ta là 30/36 (phần tô màu xanh), hay tương ứng với xác suất chiến thắng là 83.3% (chà, chơi trò chơi mà tỉ lệ thắng cao thế này thì bán nhà cũng chơi).
Bây giờ luật chơi thay đổi tí ti, là nếu tổng số nút của 2 viên xúc xắc là nhỏ hơn 7 chúng ta mới chiến thắng.
Cơ hội chiến thắng của chúng ta rút xuống còn 15/36 ~ 41.7%
Số 10 hay 7 ở đây chúng ta gọi là mục tiêu hay target. Rõ ràng khi target càng nhỏ thì cơ hội chiến thắng của chúng ta cũng nhỏ theo.

OK, vậy là bạn đã hiểu target là gì rồi ha. Ơ, nhưng mà cái target này thì có liên quan gì tới Bitcoin, hay tới độ khó nhỉ? Nếu bỏ qua tất cả những thứ như là centralize/decentralize hay lý tưởng cao đẹp gì đó thì việc mining bitcoin cũng là một cuộc chơi, trong đó tất cả các miner cùng nhau giải 1 bài toán (thực chất là tính hash của block header). Target của mạng Bitcoin sẽ được tính toán sao cho thời gian trung bình để 1 miner bất kỳ tìm được lời giải và nhận phần thưởng bitcoin là 10 phút.

Theo định nghĩa về Target của mạng Bitcoin trên Bitcoin Wiki thì:

The target is a 256-bit number (extremely large) that all Bitcoin clients share. The SHA-256 hash of a block‘s header must be lower than or equal to the current target for the block to be accepted by the network. The lower the target, the more difficult it is to generate a block.

Nghĩa là, các miner phải thực hiện tính hash của block header, và nếu hash này nhỏ hơn hoặc bằng với target hiện tại thì thì hash đó mới được chấp nhận (cũng đồng nghĩa với việc miner đó được ghi block vào blockchain và nhận phần thưởng bitcoin từ hệ thống). Nó cũng nói rằng, target càng thấp thì càng khó để tạo ra một block ==> có vẻ liên quan tới độ khó rồi ha.

Chúng ta định nghĩa, độ khó (hay difficulty) của mạng Bitcoin là sự thay đổi của target hiện tại so với target gốc.

Công thức: difficulty = original_target / target

original_target: target gốc, là giá trị target lớn nhất của mạng Bitcoin, chính là target trong block 0 của Bitcoin. Giá trị này là cố định.
target: giá trị target của block hiện tại

Như vậy, rõ ràng khi giá trị target (mẫu số) càng nhỏ thì difficulty càng lớn.

Câu hỏi đặt ra là, chúng ta có thể xem được giá trị target hay difficulty hiện tại của mạng Bitcoin ở đâu? Hãy cùng khảo sát cấu trúc header của 1 block Bitcoin:
Trường bits chính là trường lưu trữ giá trị target của block hiện tại. Tuy nhiên, giá trị này được lưu trữ ở dạng nén (compact) vì chỉ có 4 bytes, trong khi target là một số có 32 bytes. Chúng ta sẽ xem xét cách tính từ giá trị bits ra target ngay bên dưới. Nhưng trước tiên, chúng ta thử quan sát các giá trị này trong 1 block thực tế xem nó như thế nào. Hình bên dưới là header của block 528554 được chụp lại từ trang blockchain.info:

Chúng ta thấy nó hiển thị cả giá trị Bits và Difficulty. Thực ra giá trị difficulty là blockchain.info đã tự tính và thêm vào khi hiển thị cho chúng ta, vì rõ ràng không có trường này trong cấu trúc header. Hai giá trị bits và difficulty tương ứng là 389508950 và 5,077,499,034,879.02. Chúng ta sẽ thử tính xem có ra đúng giá trị như vậy không.

Đầu tiên, chúng ta chuyển đổi giá trị bits ra số Hex: 389508950 = 0x17376f56. Giá trị này chúng ta chia làm 2 phần: 17 và 376f56.

17: kích thước của target theo bytes (lưu ý: 0x17 là số Hexa = 23 bytes theo thập phân)
376f56: giá trị 3 bytes đầu tiên của target

Từ đó ta có được giá trị của target là:

target: 376f560000000000000000000000000000000000000000

hoặc nếu ghi đủ 32 bytes:

target: 000000000000000000376f560000000000000000000000000000000000000000

Với cách tương tự, ta có target gốc (original_target) là giá trị target của block 0, bằng:

original_target: 00000000ffff0000000000000000000000000000000000000000000000000000

Dùng Python tính toán thử difficulty bằng cách áp dụng công thức:

Phew, may mà ra giống giá trị mà blockchain.info đã tính 😀

OK. Đọc đến đây là các bạn đã hiểu được difficulty là gì và cách tính như thế nào. Câu hỏi cuối: bao lâu thì giá trị difficulty này thay đổi, và điều gì làm nó thay đổi? Hãy quan sát hình sau:

Ta có thể nhận thấy giá trị Difficulty tăng liên tục và trung bình 14 ngày thay đổi 1 lần. Thực tế thì giá trị Difficulty này sẽ thay đổi sau mỗi 2016 block (trung bình 10 phút/block ~ 20160 phút ~ 14 ngày). Sự thay đổi này dựa theo thời gian tìm ra 2016 block trước đó, nếu thời gian đó ít hơn 20160 phút thì difficulty sẽ tăng, và ngược lại, nếu thời gian đó nhiều hơn 20160 phút thì difficulty sẽ giảm.

Difficulty phụ thuộc vào:

  • Tổng lượng Hashrate của mạng Bitcoin: số lượng miner tham gia càng nhiều thì độ khó càng tăng)
  • Sự may mắn: bởi vì hash là một giá trị ngẫu nhiên không thể tính toán trước được, do đó không có phương pháp nào để tìm được hash thỏa mãn target ngoài phương pháp brute force, tức thử-sai. Nếu 2016 block trước đó, các miner may mắn nhiều, nghĩa là tổng thời gian ít hơn 20160 phút thì độ khó tăng, và ngược lại.

Vâng, bài đến đây là hết rồi. Cám ơn quý vị đã tận tình theo dõi.

2 Comments
  1. toankid nói

    Bài viết rất hay, cảm ơn tác giả, hóng các bài tiếp theo 🙂

  2. ng t61n huê nặng nói

    chào anh HOÀN có bao nhiêu người rành loại toán này .. có cách nào giải thích giản dị hơn . tui có thể dúng thước học trò và compas . chia một góc bất kỳ bằng 3 phần bằng nhau .. mà chả hiểu có chăng độ 1/100 lời anh giải thích . theo tui thuật toán to82n tại và phát triển hơn hẵn bọn quái vật BITCOIN . THUẬT TOÁN TO82N TẠI ….. nhưng BITCOIN cũng có quyền chết mà tui cho rằng nó chắc chết .anh có rảnh d9ie5n thư .. tui kg có web .. chúc anh vui vẻ

Để lại một bình luận

Địa chỉ email của bạn sẽ không được công bố.