Smart Contract

Smart contract trong Fabric chính là các quy luật nghiệp vụ (business rule) giữa các tổ chức khác nhau được định nghĩa dưới dạng mã nguồn có thể thực thi. Các ứng dụng của client gọi thực thi smart contract để tạo ra các transaction nhằm cập nhật ledger:

Trong hình trên, ta thấy rằng tổ chức ORG1 và ORG2 định nghĩa contract car để query, transferupdate thông tin của các chiếc xe. Các client application của hai tổ chức sẽ gọi thực thi smart contract để hoàn thành một nghiệp vụ nào đó, chẳng hạn như chuyển giao quyền sở hữu một chiếc xe cụ thể từ ORG1 sang ORG2.

Cụ thể hơn, trong network của Fabric, người dùng sẽ không thể trực tiếp thay đổi state của ledger mà cần phải thông qua các smart contract để gọi đến ordering service nhằm tạo ra các block và phân phối đến các peer:

Smart contract trong Fabric còn có các tính chất sau:

  • Chạy trong môi trường container để đảm bảo sự cô lập.
  • Có thể được viết bởi các ngôn ngữ lập trình general-purpose chẳng hạn như Java, Go hoặc Node.js.
    • Điểm mạnh: quen thuộc hơn các DSL và có thể có những tool verify có sẵn.
    • Điểm yếu: không đảm bảo được tính tất định và smart contract được viết ra có thể không an toàn kể cả thay đổi cách thực thi.
  • Sử dụng gRPC để giao tiếp với các node.

Chaincode

Chaincode là tập hợp các smart contract được đóng gói và cài đặt ở trên các peer:

Ta có thể dùng khái niệm chaincode và smart contract thay thế cho nhau.

Endorsement

Mỗi chaincode đều cần phải có một endorsement policy áp dụng cho tất cả các smart contract bên trong chaincode đó. Endorsement policy sẽ quy định những tổ chức nào trong network cần phải ký vào transaction được tạo ra bởi việc giả lập thực thi smart contract nhằm đảm bảo transaction đó là hợp lệ. Tất cả các transaction, bao gồm cả hợp lệ và không hợp lệ, đều sẽ được thêm vào ledger. Tuy nhiên, chỉ có những transction nào hợp lệ mới được dùng để cập nhật trạng thái của ledger.

Trong hình trên, phương thức transfer của contract car cần phải được thực thi và ký bởi cả ORG1 và ORG2.

Valid Transactions

Smart contract sẽ được thực thi bởi các peer của các tổ chức trong blockchain network. Contract sẽ nhận vào một tập các đối số (transaction proposal) và kết hợp với logic của contract để đọc và ghi ledger. Kết quả của quá trình thực thi là các transaction proposal response (hoặc transaction response) bao gồm các trạng thái của ledger được đọc và các trạng thái mới của ledger sau khi được ghi nếu transaction là hợp lệ (ta gọi tập các trạng thái này là read-write set).

Attention

Chú ý rằng world state của ledger không được cập nhật khi smart contract được thực thi.

Có thể thấy, mỗi transaction đều có một identifier, một proposal và một response được ký bởi một tập các tổ chức. Cụ thể hơn, proposal (input) của smart contract được ký bởi client application của ORG1 và response (output) của smart contract được ký bởi cả ORG1 và ORG2 dựa trên endorsement policy.

Channels

Các tổ chức có thể tham gia vào nhiều channel. Trong hình dưới, tổ chức bán xe (ORG1) vừa tham gia vehicle channel với tổ chức mua xe (ORG2) vừa tham gia insurance channel với tổ chức bảo hiểm (ORG3):

Các thành viên trong channel không thể thực thi smart contract nếu chaincode definition chưa được chấp thuận. Chaincode definition là một struct bao gồm các tham số quy định cách smart contract được thực thi. Một số tham số quan trọng:

  • Tên của chaincode
  • Version của chaincode
  • Endorsement policy

Mỗi thành viên trong channel cần phải chấp thuận chaincode definition. Khi có đủ số lượng các tổ chức chấp thuận chaincode definition (theo mặc định là đa số), nó sẽ được commit xuống ledger channel. Sau đó, các thành viên trong channel có thể thực thi các smart contract trong channel dựa theo endorsement policy có trong chaincode definition.

Info

Các smart contract có thể gọi thực thi các smart contract trong cùng channel hoặc ở channel khác.

Architecture

Order-Execute Architecture

Đa số các blockchain hỗ trợ smart contract hiện tại sử dụng kiến trúc order-execute. Kiến trúc này gồm hai bước như sau:

  1. Các validator xác thực và sắp xếp các transaction của smart contract (bản chất là các lời gọi hàm) rồi broadcast cho các node khác.
  2. Mỗi node thực thi các transaction một cách tuần tự.

Summary

Tóm lại, smart contract sẽ được xác thực rồi mới được thực thi.

Các smart contract thực thi trên các blockchain có kiến trúc order-execute cần phải có tính tất định. Điều này giúp đảm bảo output của mỗi lần thực thi transaction ở các node khác nhau là như nhau. Để giải quyết các vấn đề bất định, một số blockchain quy định smart contract cần phải được viết bằng một ngôn ngữ non-standard hoặc domain specific language (DSL) chẳng hạn như Solidity. Việc dùng các ngôn ngữ DSL khiến cho các developer phải học thêm một ngôn ngữ mới và dễ dẫn đến các lỗi lập trình.

Ngoài ra, do thực thi các transaction một cách tuần tự nên hiệu năng bị giới hạn.

Execute-Order-Validate Architecture

Trong khi đó, smart contract của Fabric sử dụng kiến trúc execute-order-validate, chia việc xử lý transaction ra làm 3 phần như sau:

  1. Thực thi transaction (chứng thực - endorse).
  2. Ordering service sắp xếp các transaction theo thời gian thông qua một consensus protocol (có thể là CFT hoặc BFT)1.
  3. Xác thực transaction dựa theo các chính sách xác thực cụ thể của ứng dụng (application-specific endorsement policy) trước khi commit xuống ledger.

Application-Specific Endorsement Policy

Trong Fabric, một application-specific endorsement policy sẽ chỉ định những node nào hoặc số lượng node cần xác thực tính đúng đắn của việc thực thi transaction cho một smart contract nào đó. Bằng cách này, mỗi transaction chỉ cần được thực thi bởi một lượng node dựa trên policy thay vì bởi toàn bộ các node. Điều này giúp tăng hiệu năng.

Summary

Tóm lại, các transaction của smart contract trong Fabric sẽ được giả lập thực thi (không thay đổi trạng thái của ledger), được sắp xếp và được xác thực rồi mới được commit xuống ledger.

System Chaincode

Ngoài những chaincode giúp hiện thực các logic nghiệp vụ thì còn có những chaincode hệ thống hoạt động ở mức thấp:

  • Chaincode _lifecycle: chạy ở tất cả các peer và được dùng để cài đặt chaincode lên các peer, chấp thuận chaincode defintion và commit chaincode definition xuống các channel.
  • Configuration system chaincode (CSCC): chạy ở tất cả các peer và được dùng để cập nhật cấu hình của channel chẳng hạn như cập nhật policy.
  • Query system chaincode (QSCC): chạy ở tất cả các peer và cung cấp ledger API giúp truy vấn block, transaction, …
  • Endorsement system chaincode (ESCC): chạy ở tất cả các endorsing peer để ký lên các transaction response.
  • Validation system chaincode (VSCC): dùng để validate transaction (bao gồm kiểm tra endorsement policy và tính nhất quán của read-write set).
list
from outgoing([[Hyperledger Fabric - Chaincode]])
sort file.ctime asc

Resources

Footnotes

  1. xem thêm Ordering Service Implementations