Bitcoin – Bài 3: Xác nhận giao dịch và “đào mỏ”

Chắc hẳn mọi người nghe nhiều về việc “đào mỏ” (mining) Bitcoin. Người ta thường nói đây là quá trình “giải 1 bài toán”. Thực chất quá trình này là gì? Tại sao nó lại cần thiết (chẳng lẽ chỉ để cung cấp thêm bitcoin)? Và nó được thực hiện như thế nào?

Nói một cách ngắn gọn, quá trình đào mỏ (hay “giải 1 bài toán” như cách báo chí mô tả) chỉ là quá trình tìm nghiệm của một bất phương trình. Tôi dùng từ “tìm nghiệm” chứ không phải “giải” bất phương trình vì bất phương trình này không có cách giải, mà bắt buộc phải “mò” nghiệm bằng cách thử lần lượt các giá trị 1, 2, 3…. (theo hệ thập lục phân) đến khi nào có số thỏa mãn được bất phương trình thì thôi.

Trước tiên, hãy nói về cách xử lý giao dịch Bitcoin.

Như đã trình bày ở phần trước, các máy tính trong mạng dễ dàng xác định được 1 giao dịch có phải là giả mạo hay không. Nhưng vẫn còn đó rủi ro rằng chủ tài khoản có thể tiêu một đồng tiền của anh ta nhiều lần. Vì thế, cần một cơ chế để ngăn chặn rủi ro này.

Khi bạn sở hữu 1 tài khoản bitcoin, bạn sẽ thấy hiện lên thông báo bạn đang có bao nhiêu đồng. Có thể bạn nghĩ, đây là hệ thống phi tập trung nên số dư phải được lưu ngay trong chính máy mình, trên 1 file nào đó. Và vì lưu trên máy mình, mình có thể mở nó ra, sửa lại số dư (ví dụ: thay 1 bằng 1,000), thế là tài khoản của mình tự tăng lên 999 đồng.

Thực ra, Bitcoin không có 1 file lưu giữ số dư tài khoản của bạn, mà chỉ lưu các giao dịch. Và phần mềm tự động tính ra: ngày 1 bạn tạo tài khoản (mặc định không có đồng nào), ngày 2 nhận được 3 đông (+3), ngày 5 bạn chuyển 1 đồng (-1). Vậy hôm nay bạn đang có 3-1 = 2 đồng. Phần mềm không lưu trữ số 2 này, mà chỉ lưu trữ giao dịch nhận 3 đồng và tiêu 1 đồng kia. Và 2 giao dịch này được xác thực tính hợp lệ (như đã nói ở bài trước). Nếu bạn tự tạo 1 giao dịch giả mạo để thêm 900 đồng, hệ thống sẽ phát hiện và loại bỏ, giao dịch không được xác nhận và không được ghi vào sổ cái.

Vậy hệ thống xác nhận bằng cách nào? Trước tiên, đó phải là giao dịch từ 1 tài khoản do chính chủ tài khoản đó thực hiện, chuyển tới tài khoản khác (như đã nói ở bài trước). Hệ thống sẽ  tính lại số tiền hiện tại mà chủ tài khoản đang có (bằng cách cộng trừ các khoản thu chi từ trước đến giờ), xem họ có đủ tiền để chuyển không. Nếu có, thì mới xử lý bước tiếp theo. Nếu xử lý xong, nó sẽ được cập nhật vào sổ cái hệ thống (lưu tại mọi máy tính người dùng) và sổ cái mới này (đã thêm giao dịch mới) sẽ dùng để kiểm tra giao dịch tiếp theo (bạn còn nhớ ví dụ 3-1=2 bên trên chứ?)

Bây giờ, nếu anh A đang có 3 đồng. Anh A chuyển cho anh B 2 đồng (giao dịch 1), giao dịch này sẽ được đưa vào xử lý. Trong khi nó chưa xử lý xong, anh A thực hiện việc chuyển cho anh C 2 đồng (giao dịch 2). Vì giao dịch 1 chưa được xác nhận, chưa được cập nhật vào sổ cái, nên hệ thống vẫn cho phép phát sinh giao dịch số 2 này và đưa vào xử lý bình thường. Như vậy, nếu máy tính ở Singapore nhận được giao dịch 1 trước, họ sẽ cập nhật giao dịch 1 vào sổ cái, hủy bỏ giao dịch số 2. Máy tính ở Mỹ nhận được giao dịch số 2 trước, họ sẽ cập nhật giao dịch số 2 vào sổ cái, hủy bỏ giao dịch số 1. Như vậy sẽ rất hỗn loạn, vì mỗi máy tính có 1 bản sổ cái khác nhau, và ghi nhận giao dịch hợp lệ khác nhau. Để tránh điều này, hệ thống cần được thiết kế sao cho các giao dịch được sắp xếp theo 1 trình tự thống nhất, đối với tất cả các máy tính.

Cách giải quyết như sau: các giao dịch mới phát sinh sẽ được gom lại với 1 số lượng nhất định (giả sử 100 giao dịch) gọi là block. Máy tính sẽ tính ra 1 con số tương ứng với block này (tạm gọi là hash 1 nhé). Và nó sẽ tìm nghiệm a của bất phương trình f(hash 1, hash previous, a) < target với target là 1 số cho trước. Như đã nói ở phần đầu bài, bất phương trình này không giải được mà phải mò nghiệm bằng cách thử lần lượt từng số cho đến khi tìm ra số a thích hợp. Máy nào tìm ra được a thì sẽ được thưởng 25 bitcoin, và toàn bộ giao dịch trong block đó được đánh dấu là đã xác nhận. Nó sẽ báo kết quả a và nội dung các giao dịch trong block để các máy khác biết. Việc tìm a rất lâu nhưng việc kiểm tra lại rất nhanh. Ví dụ, bảo các bạn giải phương trình [latex]x^5 + 3x – 5 = 252,597 [/latex] thì có lẽ phải mất chút thời gian, chứ nếu bảo bạn kiểm tra xem x=12 có phải là nghiệm của phương trình trên không, thì các bạn chỉ cần thay vào Excel 2 giây là xong. Nếu máy tính được lập trình để kiểm tra thì chỉ cần 1 phần triệu giây. Với các phương trình phức tạp hơn thì việc tìm nghiệm mất thời gian hơn, nhưng việc kiểm tra 1 giá trị có phải là nghiệm không cũng chỉ mất 1 phần triệu giây. Sau khi xác định số a thỏa mãn bất phương trình, các máy tính này sẽ cập nhật vào phiên bản sổ cái mà mình đang lưu trữ. Nếu nó cũng đang giải 1 block có chứa một số giao dịch nằm trong block mới được giải, nó sẽ loại các giao dịch này và chọn các giao dịch khác thay thế vào block đó và tiếp tục giải. Và nó sẽ thông báo với các máy tiếp theo cho đến khi toàn mạng được cập nhật. Bất phương trình trên được thiết kế trên nguyên tắc ngẫu nhiên sao cho khả năng có 2 máy tính tìm ra đáp số tại cùng 1 thời điểm là rất thấp.

Nhưng giả sử có trường hợp A và B gần như cùng lúc giải được block của mình. A sẽ thông báo cho các máy kế tiếp để thêm block của mình vào sổ cái và tìm nghiệm của block kế tiếp. B cũng làm tương tự. Tuy nhiên nếu A tìm ra trước thì số người dựa vào kết quả của A để tính ra block tiếp theo sẽ nhiều hơn của B. Sau vài block, hệ thống sẽ so sánh 2 nhánh A và B, bên nào dài hơn thì chấp nhận bên đó, còn các giao dịch bên nhánh kia sẽ bị loại bỏ, phải đưa về trạng thái unconfirm để xử lý từ đầu. Đây là lý do vì sao người ta thường khuyên phải đợi ít nhất confirm sau 6 block (tương đương khoảng 1 tiếng) thì mới chắc ăn.

Như vậy, quá trình mining thực chất là để sắp xếp các block theo 1 trình tự nhất định theo hướng ưu tiên block nào tìm ra nghiệm trước. Khi đã xếp theo thứ tự, các block khác không thể chen ngang mà phải nối tiếp, do đó các giao dịch đã được xử lý không thể bị sửa đổi (nếu không toàn bộ chuỗi block sẽ không hợp lệ). Để quyết định ai được xếp trước, thì các máy phải tham gia vào 1 cuộc đua “mò nghiệm” như đã nói ở trên để xem ai giành được quyền ghi vào ledger. Và để tưởng thưởng cho công sức đã bỏ ra để xử lý bài toán này (qua đó xác thực và đảm bảo an toàn cho giao dịch), người giải được bài toán sẽ được thưởng 1 số bitcoin nhất định. Ban đầu là 50. Hiện tại là 25, và tương lai sẽ giảm xuống 1 nửa cho đến khi nào hết 21 triệu bitcoin. Vì quá trình này giống như đào mỏ khai thác vàng truyền thống (dùng máy tính tạo thêm bitcoin) nên nó được gọi là Mining – đào mỏ. Và đây cũng là cơ chế phát hành thêm tiền của Bitcoin. Không cần bất cứ ngân hàng trung ương nào. Cũng không phải là người phát minh ra bitcoin hay tổ chức nào có quyền phát hành thêm bitcoin. Mà chính người dùng, nếu giải được bài toán, sẽ được thêm bitcoin cho mình (và toàn hệ thống có thêm 25 bitcoin, coi như là đã phát hành thêm tiền). Đây là sáng tạo tuyệt vời của Satoshi.

Độ khó của bài toán sẽ được tăng lên bằng cách thuật toán sẽ tự động điều chỉnh số target. Nếu năng lực tính toán của máy tính tăng gấp đôi, số target sẽ tự động điều chỉnh giảm còn 1 nửa để bù lại, đảm bảo thời gian xử lý mỗi giao dịch mất khoảng 10 phút. Như thế, không lo tiến bộ công nghệ trong việc phát triển chip CPU hoặc GPU có thể khiến Bitcoin bị “đào” ồ ạt.

Leave a Reply

Your email address will not be published. Required fields are marked *