Categories
Blockchain

Cơ chế của Bitcoin 1: Giao dịch Bitcoin

Chương này nói về cơ chế của Bitcoin. Trong khi cuộc thảo luận trong hai chương đầu tiên tương đối khái quát, bây giờ chúng ta đi sâu vào chi tiết. Chúng ta sẽ xem xét các cấu trúc dữ liệu thực, các tập lệnh thực và tìm hiểu các chi tiết và ngôn ngữ của Bitcoin một cách chính xác để thiết lập cuộc thảo luận trong phần còn lại của cuốn sách này. Chương này là một thách thức, bởi vì nó được định hướng chi tiết và chúng ta bao gồm rất nhiều cơ sở. Bạn sẽ tìm hiểu các chi tiết cụ thể và những điều kỳ quặc tạo nên Bitcoin.

Để tóm tắt lại nơi chúng ta đã dừng lại ở Chương 2, cơ chế đồng thuận Bitcoin cung cấp cho chúng ta một sổ cái chỉ thêm, một cấu trúc dữ liệu mà chúng ta chỉ có thể ghi vào. Một khi dữ liệu được ghi vào nó, nó sẽ ở đó mãi mãi. Một giao thức phi tập trung thiết lập sự đồng thuận về giá trị của sổ cái đó và các thợ đào sử dụng giao thức và xác thực các giao dịch. Giao thức và thợ đào cùng nhau đảm bảo rằng các giao dịch được hình thành tốt, rằng bitcoin liên quan chưa được chi tiêu và sổ cái và mạng có thể hoạt động như một loại tiền tệ. Đồng thời, chúng ta giả định rằng một loại tiền tệ tồn tại để thúc đẩy những người khai thác này. Trong chương này, chúng ta sẽ xem xét các chi tiết về cách thiết kế tiền tệ đó để thúc đẩy các thợ đào, những người thực hiện toàn bộ quá trình này.

3.1. Giao dịch Bitcoin

Hãy bắt đầu với các giao dịch, khối xây dựng cơ bản của Bitcoin. Hiện tại, chúng ta sử dụng một mô hình sổ cái đơn giản hóa. Thay vì các khối, hãy giả sử từng giao dịch riêng lẻ được thêm vào sổ cái tại một thời điểm.

Làm thế nào chúng ta có thể xây dựng một loại tiền tệ dựa trên một sổ cái như vậy? Mô hình đầu tiên bạn có thể nghĩ đến, thực sự là mô hình tinh thần mà nhiều người có về cách Bitcoin hoạt động, là một hệ thống dựa trên tài khoản. Bạn có thể thêm một số giao dịch tạo tiền mới và ghi có cho ai đó. Và sau đó bạn có thể chuyển tiền. Một giao dịch sẽ giống như “chuyển 17 đồng từ Alice sang Bob” và nó sẽ được ký bởi Alice. Đó là tất cả thông tin trong sổ cái về giao dịch. Trong hình 3.1, sau khi Alice nhận được 25 đồng trong giao dịch đầu tiên và sau đó chuyển 17 đồng cho Bob trong lần thứ hai, cô ấy sẽ còn lại 8 bitcoin trong tài khoản của mình.

Nhược điểm của cách làm này thì ai muốn xác định liệu một giao dịch có hợp lệ hay không sẽ phải theo dõi các số dư tài khoản này. Hãy xem hình 3.1. Alice có 15 đồng xu mà cô ấy đang cố gắng chuyển cho David không? Để tìm ra điều này, bạn phải theo dõi mọi giao dịch ảnh hưởng đến Alice quay ngược thời gian để xác định xem số dư ròng của cô ấy khi cô ấy cố gắng chuyển 15 đồng cho David có lớn hơn 15 đồng hay không. Tất nhiên, chúng ta có thể làm cho điều này hiệu quả hơn một chút với một số cấu trúc dữ liệu theo dõi số dư của Alice sau mỗi giao dịch. Nhưng điều đó sẽ đòi hỏi nhiều công việc quản lý hơn bên cạnh sổ cái.

HÌNH 3.1. Sổ cái dựa trên tài khoản.

HÌNH 3.1. Sổ cái dựa trên tài khoản.

Vì những nhược điểm này, Bitcoin không sử dụng mô hình dựa trên tài khoản. Thay vào đó, Bitcoin sử dụng một sổ cái chỉ theo dõi các giao dịch, tương tự như Scroogecoin trong Phần 1.5.

Các giao dịch chỉ định một số đầu vào và một số đầu ra (nhớ lại PayCoins trong Scroogecoin). Bạn có thể coi đầu vào là tiền xu đang được tiêu thụ (được tạo trong một giao dịch trước đó) và đầu ra là tiền xu đang được tạo ra. Đối với các giao dịch trong đó tiền tệ mới đang được đúc, không có đồng xu nào được sử dụng (nhớ lại CreateCoins trong Scroogecoin). Mỗi giao dịch có một mã định danh duy nhất. Đầu ra được lập chỉ mục bắt đầu bằng 0, vì vậy chúng ta gọi đầu ra đầu tiên là “đầu ra 0.”

Bây giờ chúng ta hãy làm việc theo cách của chúng ta qua Hình 3.2. Giao dịch 1 không có đầu vào, bởi vì giao dịch này đang tạo ra các đồng tiền mới và nó có đầu ra là 25 đồng tiền cho Alice. Ngoài ra, vì đây là một giao dịch mà các đồng tiền mới đang được tạo nên không cần chữ ký. Bây giờ, giả sử rằng Alice muốn gửi một số đồng xu đó cho Bob. Để làm như vậy, cô ấy tạo một giao dịch mới, giao dịch 2 trong ví dụ của chúng ta. Trong giao dịch, cô ấy phải đề cập rõ ràng đến giao dịch trước đó nơi mà những đồng tiền này đến từ chúng. Ở đây, cô ấy đề cập đến đầu ra 0 của giao dịch 1 (thực sự là đầu ra duy nhất của giao dịch 1), đã gán 25 bitcoin cho Alice. Cô ấy cũng phải chỉ định địa chỉ đầu ra trong giao dịch. Trong ví dụ này, Alice chỉ định hai đầu ra, 17 đồng cho Bob và 8 đồng cho Alice. Và tất nhiên, toàn bộ nội dung của giao dịch được ký bởi Alice, để chúng ta biết rằng Alice thực sự cho phép nó.

Thay đổi địa chỉ. Tại sao Alice phải gửi tiền cho chính mình trong ví dụ này? Cũng giống như các đồng tiền trong Scroogecoin là bất biến, trong Bitcoin, tất cả hoặc không một đầu ra giao dịch nào phải được sử dụng bởi một giao dịch khác. Alice chỉ muốn trả 17 bitcoin cho Bob, nhưng số lượng mà cô ấy sở hữu trị giá 25 bitcoin. Vì vậy, cô ấy cần tạo một đầu ra mới, nơi 8 bitcoin được gửi lại cho chính mình. Nó có thể là một địa chỉ khác với người sở hữu 25 bitcoin, nhưng nó sẽ phải thuộc sở hữu của cô ấy. Đây được gọi là địa chỉ thay đổi.

HÌNH 3.2. Sổ cái dựa trên giao dịch.

HÌNH 3.2. Sổ cái dựa trên giao dịch. Đây là loại sổ cái được sử dụng bởi Bitcoin.

Xác minh hiệu quả. Khi một giao dịch mới được thêm vào sổ cái, làm thế nào dễ dàng để kiểm tra xem nó có hợp lệ hay không? Trong ví dụ này, chúng ta cần tra cứu kết quả giao dịch mà Alice đã tham chiếu, đảm bảo rằng nó có giá trị là 25 bitcoin và nó chưa được chi tiêu. Việc tra cứu kết quả giao dịch rất dễ dàng, vì chúng ta đang sử dụng con trỏ băm. Để đảm bảo nó chưa được chi tiêu, chúng ta cần quét chuỗi khối giữa giao dịch được tham chiếu và khối mới nhất. Chúng ta không cần phải quay trở lại phần đầu của chuỗi khối và nó không yêu cầu giữ bất kỳ cấu trúc dữ liệu bổ sung nào (mặc dù, như chúng ta sẽ thấy, cấu trúc dữ liệu bổ sung sẽ tăng tốc độ).

Hợp nhất các quỹ. Như trong Scroogecoin, vì các giao dịch có thể có nhiều đầu vào và nhiều đầu ra, nên việc tách và hợp nhất giá trị rất dễ dàng. Ví dụ: giả sử Bob nhận được tiền trong hai giao dịch khác nhau—17 bitcoin trong một giao dịch và 2 trong một giao dịch khác. Bob có thể muốn có một đầu ra giao dịch duy nhất có sẵn sau này để anh ta có thể chi tiêu tất cả 19 bitcoin mà anh ta kiểm soát. Điều đó thật dễ dàng—anh ta tạo một giao dịch bằng cách sử dụng hai đầu vào và một đầu ra, với địa chỉ đầu ra là địa chỉ mà anh ta sở hữu. Điều đó cho phép anh ta hợp nhất hai giao dịch đó.

Thanh toán chung. Tương tự, các khoản thanh toán chung cũng dễ dàng thực hiện. Giả sử Carol và Bob đều muốn trả tiền cho David. Họ có thể tạo một giao dịch với hai đầu vào và một đầu ra, nhưng với hai đầu vào thuộc sở hữu của hai người khác nhau. Và sự khác biệt duy nhất so với ví dụ trước là vì hai đầu ra từ các giao dịch trước đó đang được xác nhận ở đây là từ các địa chỉ khác nhau, giao dịch cần hai chữ ký riêng biệt—một của Carol và một của Bob.

Cú pháp giao dịch. Về mặt khái niệm, đó thực sự là tất cả những gì cần có đối với một giao dịch Bitcoin. Bây giờ chúng ta hãy xem nó được thể hiện như thế nào ở mức thấp trong Bitcoin. Cuối cùng, mọi cấu trúc dữ liệu được gửi trên mạng là một chuỗi các bit. Những gì được hiển thị trong Hình 3.3 là mức thấp, nhưng điều này được biên dịch thêm thành một định dạng nhị phân nhỏ gọn mà con người không thể đọc được.

Như bạn có thể thấy trong Hình 3.3, một giao dịch bao gồm ba phần: một số siêu dữ liệu, một loạt đầu vào và một loạt đầu ra:

HÌNH 3.3. Nội dung của một giao dịch Bitcoin thực tế.

HÌNH 3.3. Nội dung của một giao dịch Bitcoin thực tế.

  • Siêu dữ liệu. Một số thông tin quản lý hiện có—kích thước của giao dịch, số lượng đầu vào và số lượng đầu ra. Băm của toàn bộ giao dịch được cung cấp, đóng vai trò như một ID duy nhất cho giao dịch. Đó là những gì cho phép chúng ta sử dụng con trỏ băm để tham chiếu các giao dịch. Và một trường lock_time được cung cấp, chúng ta sẽ quay lại sau.
  • Đầu vào. Các đầu vào giao dịch tạo thành một mảng và mỗi đầu vào có cùng một dạng. Một đầu vào chỉ định một giao dịch trước đó, vì vậy nó chứa một hàm băm của giao dịch đó, hoạt động như một con trỏ băm tới nó. Đầu vào cũng chứa chỉ mục của các kết quả đầu ra của giao dịch trước đó đang được xác nhận quyền sở hữu. Và sau đó là một chữ ký. Hãy nhớ rằng chúng ta phải ký để chứng tỏ rằng chúng ta thực sự có khả năng yêu cầu các kết quả giao dịch trước đó.
  • Kết quả đầu ra. Kết quả đầu ra lại là một mảng. Mỗi đầu ra chỉ có hai trường. Mỗi trường đều có một giá trị và tổng của tất cả các giá trị đầu ra phải nhỏ hơn hoặc bằng tổng của tất cả các giá trị đầu vào. Nếu tổng các giá trị đầu ra nhỏ hơn tổng các giá trị đầu vào, thì sự chênh lệch là phí giao dịch thuộc về người khai thác xuất bản giao dịch này.

Và sau đó có một dòng vui nhộn trông giống như những gì chúng ta muốn là địa chỉ người nhận. Mỗi đầu ra được cho là đi đến một khóa công khai cụ thể và thực sự, có gì đó trong trường đó trông giống như đó là hàm băm của khóa công khai. Nhưng cũng có những thông tin khác giống như một tập hợp các lệnh. Thật vậy, trường này là một tập lệnh, và chúng ta sẽ thảo luận về các tập lệnh tiếp theo.

Leave a Reply

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