Mỗi ledger trong Fabric bao gồm hai thành phần:
- World state: là một tập các trạng thái của ledger tại một thời điểm nào đó. Mặc định, world state được lưu dưới dạng key-value của LevelDB.
- Transaction log (hay blockchain): là danh sách các transaction đã được thực thi và làm thay đổi trạng thái của ledger thành giá trị hiện tại của world state. Nói cách khác, transaction log chính là blockchain.
Có thể xem ledger tương tự như tài khoản ngân hàng: số dư hiện tại là world state và danh sách các giao dịch là transaction log.
World State
Mỗi trạng thái trong world state sẽ chứa các thuộc tính về một đối tượng nghiệp vụ (business object) nào đó.
Có thể thấy, hình trên có 2 state tương ứng với 2 business object:
- Giá trị của state có thể đơn giản chẳng hạn như
Audi
hoặc phức tạp như{ type:BMW, color=red, owner=Jane }
. - Cả hai state trên đều có version là 0. Giá trị này được dùng để đảm bảo không xảy ra concurrent update.
World state được lưu ở trong database bởi vì các DBMS cung cấp các cách thức lưu trữ và truy xuất dữ liệu hiệu quả. Hơn thế nữa, Hyperledger Fabric còn hỗ trợ nhiều kiểu DBMS khác nhau.
Ngoài DBMS mặc định là LevelDB, Fabric còn hỗ trợ CouchDB:
- LevelDB hỗ trợ lưu dữ liệu dưới dạng key-value và chạy trên từng peer.
- CouchDB hỗ trợ lưu dữ liệu dưới dạng JSON và chạy ở một hệ điều hành khác nhưng có liên kết với peer.
Blockchain
Blockchain ở trong ledger của Fabric được lưu ở trong một file bởi vì các thao tác thực hiện trên blockchain là rất ít. Cụ thể, các thao tác được thực hiện trên blockchain chỉ có thêm mới và việc truy vấn dữ liệu thường được thực hiện ở trên world state hơn là ở blockchain.
Cấu trúc của blockchain ở trong ledger tương tự như các blockchain truyền thống:
Genesis block sẽ chứa cấu hình của channel1.
Block
Có thể thấy trong hình trên, so với Bitcoin thì cấu trúc của một block ở trong Fabric đơn giản hơn.
Header
Trong header của mỗi block sẽ chứa cryptographic hash của tất cả các transaction trong block đó cũng như là hash của block trước đó.
Với block number là một số nguyên tăng dần mỗi khi có một block được thêm vào. Block number có giá trị là 0 tại genesis block.
Transactions
Phần data của mỗi block sẽ gồm một danh sách các transaction đã được sắp thứ tự bởi ordering service:
Số lượng transaction trong mỗi block sẽ phụ thuộc vào kích thước block và thời gian tối đa dành cho một block ở trong channel configuration (tham số BatchSize
and BatchTimeout
)2.
Mỗi transaction bao gồm các thành phần sau:
- Header (H4): gồm các metadata về transaction chẳng hạn như tên và phiên bản của chaincode liên quan.
- Signature (S4): bao gồm cryptographic signature được tạo bởi client application. Field này giúp đảm bảo nội dung của transaction không bị chỉnh sửa bởi vì muốn chỉnh sửa thì cần phải có private key để tạo ra signature hợp lệ (public key có thể giải mã được).
- Proposal (P4): bao gồm các input parameter gửi đến cho smart contract từ client application nhằm thực hiện cập nhật world state.
- Response (R4): ghi nhận lại giá trị trước và sau khi được cập nhật của world state dưới dạng read-write set. Nói cách khác, nó là output của smart contract và sẽ được dùng để cập nhật world state nếu transaction là hợp lệ.
- Endorsements (E4): là một danh sách các response đã được ký bởi các endorsing peer.
Metadata
Block metadata chứa các thành phần sau:
- Chứng chỉ và chữ ký số của block creator dùng cho việc xác thực bởi các peer trong mạng.
- Một bitmap được thêm vào bởi block committer cho biết trạng thái của mỗi transaction là valid hay invalid.
- Giá trị hash của các thao tác cập nhật state cho đến block hiện tại. Giá trị này được dùng để phát hiện state fork3.
Khác với block header và block data, block metadata không được dùng để tính block hash.
Asset
Tất cả các tài sản có giá trị tiền tệ đều có thể được lưu ở trong ledger của Fabric, bao gồm tài sản tangible (có thể thay thế được, ví dụ như bất động sản và phần cứng) và tài sản intangible (không thay thế được chẳng hạn như các hợp đồng và tài sản trí tuệ).
Tài sản có thể được thể hiện dưới dạng các cặp key-value, dạng nhị phân hoặc dạng JSON và cần phải thông qua chaincode để cập nhật trạng thái của tài sản.
Ví dụ, ledger bên dưới lưu trữ state của 4 asset là 4 chiếc xe:
Related
Resources
- https://hyperledger-fabric.readthedocs.io/en/latest/blockchain.html
- https://hyperledger-fabric.readthedocs.io/en/latest/fabric_model.html#assets
- https://hyperledger-fabric.readthedocs.io/en/latest/ledger/ledger.html