Các thức hoạt động của hệ thống Bitcoin - Phần 2
Về cơ bản, có thể hiểu các giao dịch trong hệ thống Bitcoin được tập hợp thành một tập tin kỹ thuật số, trong đó lưu trữ danh sách...
Về cơ bản, có thể hiểu các giao dịch trong hệ thống Bitcoin được tập hợp thành một tập tin kỹ thuật số, trong đó lưu trữ danh sách các tài khoản và số tiền như một sổ cái (ledger). Tập tin này có thể được duy trì trên bất cứ máy tính nào trong hệ thống. Tuy nhiên, tập tin này chỉ cần thiết với những người muốn góp phần duy trì hệ thống, người dùng thông thường (chỉ sử dụng Bitcoin để gửi và nhận tiền) không cần thiết phải lưu trữ nó.
Để thực hiện một cuộc giao dịch chuyển tiền, người dùng phát tán tới mạng lưới Bitcoin một thông điệp thông báo số tiền của mình giảm xuống và số tiền mà những người khác nhận được như là kết quả của một giao dịch (transaction). Các máy tính (hay điểm nút – node) trong mạng lưới sẽ lưu giao dịch này vào bản sao sổ cái của mình, sau đó tiếp tục gửi giao dịch đó đến các máy khác. Bằng cách sử dụng các tính chất bảo mật dựa trên toán học, hệ thống cho phép mạng lưới duy trì chung một sổ cái duy nhất mà không bị bất đồng bộ giữa các nút điểm.
Trên thực tế, các giao dịch được phát tán tới mạng lưới được thu thập vào các khối (block). Các khối này được tạo ra và liên kết theo cơ chế Blockchain và lưu vào sổ cái. Mỗi khối có thể gồm một hoặc nhiều giao dịch và mỗi giao dịch lại gồm một hoặc nhiều đầu vào – input (là đầu ra trong giao dịch trước), một hoặc nhiều đầu ra – output (chứa thông tin giao dịch và một đoạn script chứa các điều kiện giao dịch). Một giao dịch chỉ được mạng lưới coi là hợp lệ khi tổng giá trị đầu ra không cao hơn tổng giá rị đầu vào và đồng thời thỏa mãn các điều kiện kiểm tra trong đoạn mã script.
Cấu trúc chung của một giao dịch:
Cấu trúc chung mỗi đầu vào của một giao dịch:
Cấu trúc chung mỗi đầu ra của một giao dịch:
Ví dụ về một giao dịch đơn giản (một đầu vào và một đầu ra):
Trong giao dịch trên, đầu vào (input) lấy ra 50 BTC từ đầu ra (output) thứ 0 của giao dịch có mã băm là f5d8ee39… b9a6 và đầu ra gửi 50 BTC đến địa chỉ (address) 40437170…549d. Khi người nhận muốn sử dụng số tiền này, anh ta phải tham chiếu đến output thứ 0 của giao dịch này vào input trong giao dịch mới của anh ta.
Khi thực hiện giao dịch cần xử lý các thành phần:
- Inputs (các đầu vào):
+ Một input là một tham chiếu một output từ một giao dịch trước đó và phải là một output chưa được sử dụng (unspent). Mỗi giao dịch có thể có nhiều đầu vào. Tất cả các giá trị input của một giao dịch mới (tức là tất cả số tiền của các output từ các giao dịch trước được tham chiếu đến) được cộng lại thành tổng và tổng này (sau khi trừ đi phí giao dịch – transaction fee) sẽ được sử dụng toàn bộ vào các output.
+ Previous tx: mã băm của giao dịch trước.
+ Index: xác định output trong giao dịch được tham chiếu đến.
+ ScriptSig: nửa đầu của đoạn mã script, bao gồm 2 thành phần là chữ ký (signature) và khóa công khai (public key). Chữ ký được sinh ra dựa trên thuật toán ECDSA khi ký vào mã băm của một phiên bản đơn giản của chính giao dịch mới. Khóa công khai phải thỏa mãn sự tương ứng với mã băm địa chỉ ở output trong giao dịch trước, từ đó xác thực được chữ ký, chứng minh giao dịch thực sự được tạo bởi chủ sở hữu của địa chỉ trên.
- Output (các đầu ra):
+ Một output chỉ ra những thông tin chuyển giao tiền trong giao dịch và có thể có nhiều hơn một output mỗi giao dịch.
+ Value: số lượng tiền theo đơn vị Satoshi (1 BTC = 100,000,000 Satoshi) ứng với mỗi output.
+ ScriptPubKey: nửa sau của đoạn mã script chứa địa chỉ Bitcoin của người nhận thường có dạng “OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG”, với các lệnh để xác thực tính hợp lệ khi dùng ouput này trong các giao dịch sau.
+ Vì mỗi output chỉ có thể được tham chiếu đến bởi một input trong các giao dịch sau này, toàn bộ số tiền trong input phải chuyển thành các output. Trong trường hợp số tiền input là 50 BTC nhưng người gửi chỉ muốn gửi 30 BTC, hệ thống sẽ tạo thêm một output giá trị 20 BTC (được gọi là tiền thừa – change) và gửi lại cho chính người gửi.
+ Ngoài ra, số tiền trong input không được chuyển thành output được coi là phí giao dịch (transaction fee), được chuyển tới tài khoản người tạo ra block chứa giao dịch.
- Verification (xác minh tính hợp lệ):
+ Để xác minh tính hợp lệ của các output được tham chiếu đến trong phần input, Bitcoin sử dụng một hệ thống các mã script tương tự ngôn ngữ Forth.
+ Đầu vào của một quá trình xác thực cơ bản bao gồm có ScriptSig của input và ScriptPubKey của output được tham chiếu đến trong giao dịch trước, từ đó xác định được số tiền trong input là thuộc quyền sở hữu của người gửi chứ không ai khác.
Hình ảnh một giao dịch trong thực tế (có tổng số Amount trong Inputs và Outputs là bằng nhau):
Lưu ý: Trong một giao dịch, số tiền trong input có thể không phải là toàn bộ số tiền trong tài khoản của người thực hiện giao dịch, mà chỉ cần không ít hơn số lượng cần thiết cho các output.
Ví dụ: Alice muốn chuyển cho Bob 10 BTC. Trong tài khoản Alice hiện có các output chưa được sử dụng (unspent) gồm 4 BTC, 7 BTC, 8 BTC. Khi đó giao dịch sẽ được thực hiện như sau:
- Inputs:
+ 4 BTC.
+ 7 BTC.
- Outputs:
+ 10 BTC (đến địa chỉ của Bob).
+ 1 BTC (khoản tiền thừa được chuyển về địa chỉ của Alice)
Sau giao dịch, số tiền trong tài khoản của Alice còn lại gồm 2 output: 8 BTC ban đầu và 1 BTC là số tiền thừa được trả lại trong output của giao dịch vừa thực hiện.
Do mỗi giao dịch có thể có nhiều input và output, việc liên kết giữa các output giao dịch trước và các input giao dịch sau tạo nên một chuỗi các giao dịch (Transaction Chain), thể hiện quyền sở hữu đồng tiền và có thể lần theo để xác thực tới cả những giao dịch đầu tiên (History of Ownership). Cần chú ý là Transaction Chain và Blockchain là 2 khái niệm hoàn toàn khác nhau: Blockchain để sắp xếp các giao dịch theo thứ tự, còn Transaction Chain để theo dõi sự thay đổi quyền sở hữu như thế nào.
Sau khi được xác minh tính hợp lệ, các giao dịch được sắp xếp vào một block mới và đưa vào Blockchain. Mỗi block trong Blockchain tham chiếu đến một block phía trước nó và cứ thế tham chiếu đến tận block chứa các giao dịch đầu tiên được tạo. Các giao dịch trong cùng một block được coi là thực hiện vào cùng một thời điểm, còn các giao dịch chưa được đưa vào block gọi là các giao dịch chưa được xác minh hay chưa được sắp thứ tự (unconfirmed/unordered).
Bất kỳ một máy tính nào trong hệ thống cũng có thể thu thập các giao dịch chưa được xác nhận vào một block và phát tán khối đó lên mạng lưới như là một gợi ý cho block tiếp theo trong chuỗi, từ đó duy trì hệ thống.
Cấu trúc của một block:
Trong đó Blockheader là gồm các trường về Version (phiên bản), hashPrevBlock (256 bit mã băm block trước), hashMerkleRoot (256 bit mã băm của tất cả các giao dịch trong block), Time (dấu thời gian), Bits (số 256 bit thể hiện mục tiêu – target) và Nonce (số 32 bit).
Để phòng tránh việc xảy ra bất đồng bộ do sai lệch về thời gian, vị trí địa lý, thứ tự các khối… có thể dẫn đến sụp đổ toàn bộ hệ thống, Bitcoin sử dụng một phép toán mã hóa áp dụng hàm băm SHA256 với đầu vào là nội dung của Blockheader và một số ngẫu nhiên (số Nonce) sao cho đầu ra thỏa mãn điều kiện tạo ra một số nhỏ hơn target. Một block muốn được mạng lưới chấp nhận thì phải thỏa mãn điều kiện trên (proof of work). Việc tạo ra một block mới hợp lệ tương đương với việc giải bài toán tìm số nonce ngẫu nhiên, và quá trình giải bài toán được gọi là đào bitcoin (Mining).
Mỗi máy tính khi giải block phải sinh ra số nonce liên tục cho đến khi tìm được số thỏa mãn điều kiện nêu trên. Độ phức tạp của bài toán difficulty phụ thuộc vào số target: số target càng nhỏ thì độ khó càng cao, và target cũng được thay đổi sau mỗi 2016 khối được tạo. Độ phức tạp này khiến cho tất cả các máy tính trong mạng lưới Bitcoin cùng lúc liên tục thử các số nonce ngẫu nhiên cũng phải mất khoảng 10 phút để tìm ra số hợp lệ, và với một máy tính đơn lẻ thông thường thì phải mất đến vài năm.
Ví dụ khi băm một block sau khi đã giải được số Nonce có nội dung Blockheader như sau:
Version: 01000000.hashPrevBlock: 81cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000.hashMerkleRoot: e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122b.Time: c7f5d74d.Bits: f2b9441a.Nonce: 42a14695.Khi đó, kết quả băm thu được sẽ được tính như sau:
Do ngày càng có nhiều người tham gia vào mạng lưới hoạt động Bitcoin, số máy trong hệ thống ngày càng nhiều vậy nên để đảm bảo thời gian đào một block không bị quá ngắn dễ bị tấn công, độ khó bài toán phải được tăng dần theo thời gian. Dưới đay là biểu đồ thể hiện độ khó difficulty qua từng thời kỳ:
Khoa học - Công nghệ
/khoa-hoc-cong-nghe
Bài viết nổi bật khác
- Hot nhất
- Mới nhất