Bên trong một khối có gì: tiêu đề, chiều cao, kích thước và trợ cấp khối
Một khối gồm một phần đầu (header) nhỏ, cố định và một phần thân chứa các giao dịch. Biết phần nào là phần nào sẽ giải thích việc đào thực sự băm cái gì và vì sao.
Hai phần, và chỉ một phần được băm
Một khối có phần đầu (header) và phần thân. Phần thân là các giao dịch, và nó có thể chỉ vài trăm byte hoặc vài megabyte tùy theo chuỗi bận rộn đến đâu. Header là bản tóm tắt cố định của khối, và trên hầu hết các chuỗi nó dài đúng 80 byte.
Việc đào chỉ băm header và không gì khác. Đó là điều hữu ích nhất trong bài viết này, vì nó giải thích một chuyện tưởng như không thể: một máy đào thử hàng tỷ biến thể mỗi giây, và nó không thể làm vậy nếu mỗi lần thử đều phải băm lại cả một khối đầy giao dịch. Nó không làm vậy. Nó chỉ băm lại 80 byte.
Sáu trường trong header
Header chứa phiên bản (version), hash của khối trước, merkle root, dấu thời gian (timestamp), các bit độ khó và nonce. Trường nào cũng có lý do để tồn tại, và hai trong số đó gánh phần lớn công việc.
Hash của khối trước là thứ làm nên chuỗi. Mỗi header chỉ ra khối đứng trước nó, nên việc viết lại một khối cũ sẽ làm thay đổi hash của khối đó, làm hỏng header tiếp theo, rồi header sau nữa, cho đến tận đỉnh chuỗi. Đó là toàn bộ lập luận bảo mật của proof of work gói gọn trong một trường.
Merkle root là một hash duy nhất tóm tắt mọi giao dịch trong phần thân. Chỉ cần thay đổi một giao dịch, dù chỉ một byte, merkle root sẽ thay đổi, nên header thay đổi, nên mọi hash đã thử đến lúc đó đều vô giá trị. Đây là cách 80 byte có thể đại diện một cách trung thực cho một khối có kích thước bất kỳ.
Các bit độ khó là mục tiêu (target) mà hash phải thấp hơn, ở dạng nén gọn. Timestamp là thời điểm gần đúng khối được tạo ra, và nó được phép chỉ gần đúng. Nonce là trường mà máy đào được tự do thay đổi, và chính điều đó khiến việc tìm kiếm có thể thực hiện được.
Nonce sẽ cạn, và điều đó không sao
Nonce là một bộ đếm nhỏ, và một máy đào hiện đại dùng hết mọi giá trị nó có thể chứa gần như ngay lập tức. Nghe như ngõ cụt nhưng không phải, vì nonce chỉ là thứ tiện thay đổi nhất, chứ không bao giờ là thứ duy nhất.
Khi nonce cạn, máy đào thay đổi một thứ khác góp vào header. Timestamp có thể dịch đi. Giao dịch coinbase có thể được sửa đổi một chút, làm thay đổi merkle root, và tạo ra một header hoàn toàn mới để tìm kiếm. Trên một pool, đây chính là công dụng của extra nonce: nó cho phép pool giao cho mỗi thợ đào một điểm xuất phát khác nhau để không có hai người nào cùng nghiền những con số giống nhau.
Chiều cao là một vị trí, không phải một trường
Chiều cao khối là số khối đứng trước một khối nhất định. Khối genesis có chiều cao bằng không, khối kế tiếp là một, và cứ thế. Đó là con số bạn thấy cạnh mỗi mục trên trang khối của pool và trên bất kỳ trình khám phá khối (block explorer) nào.
Nên biết rằng chiều cao thực ra không được lưu trong header. Nó được suy ra từ vị trí của khối trong chuỗi. Trên hầu hết các chuỗi hiện đại, chiều cao cũng được ghi vào giao dịch coinbase, đây là quy tắc được thêm vào về sau để hai khối ở hai chiều cao khác nhau không bao giờ giống hệt nhau từng byte, nhưng câu trả lời chính xác cho việc một khối cao bao nhiêu vẫn là vị trí của nó.
Đây cũng là lý do chiều cao là cách tự nhiên để nói về số xác nhận. Một giao dịch bị chôn sâu sáu khối là giao dịch có chiều cao khối thấp hơn đỉnh chuỗi sáu đơn vị, và mỗi khối tiếp theo khiến việc viết lại nó càng tốn kém hơn.
Kích thước là phần thân, và đó là thứ bị lấp đầy
Kích thước khối về cơ bản là kích thước phần thân, vì header nhỏ đến mức không đáng kể bên cạnh nó. Khi người ta nói một chuỗi có giới hạn kích thước khối, họ đang nói về số giao dịch có thể chứa được, không phải về header.
Một khối đầy và một khối rỗng cần lượng công việc đào đúng như nhau. Độ khó quyết định một khối khó tìm đến mức nào; kích thước quyết định khối chở được bao nhiêu. Hai thứ không liên quan đến nhau, và nhầm lẫn chúng là nguồn gốc của rất nhiều trực giác sai về phí.
Thứ mà kích thước có ảnh hưởng là thị trường phí. Khi số giao dịch muốn vào nhiều hơn số chỗ, các giao dịch trả phí cao hơn được vào trước, và tổng phí trong khối tăng lên. Phần đó đi thẳng vào số tiền khối trả.
Giao dịch coinbase và trợ cấp khối
Giao dịch đầu tiên trong mỗi khối là một giao dịch đặc biệt. Nó không có người gửi, nó tạo ra coin từ hư không, và trả số coin đó cho người đã tạo ra khối. Nó được gọi là giao dịch coinbase, và chẳng liên quan gì đến sàn giao dịch cùng tên.
Số tiền nó trả là trợ cấp khối cộng với phí của mọi giao dịch khác trong khối. Trợ cấp khối là phần mới được phát hành, do lịch phát hành của chuỗi quy định và giảm dần theo thời gian trên hầu hết các coin. Phí là khoản người dùng gắn vào giao dịch của họ để được đưa vào khối. Cộng lại, chúng là phần thưởng khối.
Trên một pool, coinbase trả cho pool, và pool sau đó chia phần thưởng cho mọi người đã đóng góp share vào vòng đó. Đó không phải là đường vòng: đó là cách một pool có thể trả cho nhiều người từ một phần thưởng đến dưới dạng một khoản thanh toán duy nhất không chia nhỏ được.
Vì sao những điều này quan trọng khi bạn đang đào
Ba điều trở nên hiển nhiên khi bạn đã rõ hình dạng của một khối, và cả ba đều xuất hiện thường xuyên.
- Vì sao một khối mới khiến công việc của bạn mất hiệu lực ngay lập tức. Trường hash của khối trước đã thay đổi, nên header bạn đang tìm không còn tồn tại nữa. Bất cứ thứ gì bạn gửi cho nó sau đó là một share cũ (stale share), và nhanh đến đâu cũng không sửa được điều đó.
- Vì sao pool gửi công việc mới cho bạn thường xuyên đến vậy. Mỗi giao dịch mới mà pool muốn đưa vào đều làm thay đổi merkle root, và một template mới hơn mang nhiều phí hơn, tức là nhiều phần thưởng hơn cho cùng một công sức.
- Vì sao kích thước khối không bao giờ xuất hiện trong ước tính thu nhập. Số bạn kiếm được do độ khó, trợ cấp khối và phí quyết định, không phải do số byte trong phần thân.
Trang khối của pool này hiển thị chiều cao, phần thưởng và thời điểm khối được tìm thấy, tức là phần hữu ích của tất cả những điều trên được gói gọn trong một dòng. Trình khám phá khối sẽ cho bạn thấy phần còn lại, kể cả giao dịch coinbase đã trả cho khối đó.