Mô hình Marlowe

Marlowe được thiết kế để hỗ trợ thực hiện các hợp đồng tài chính trên blockchain và đặc biệt là hoạt động trên Cardano. Hợp đồng được xây dựng bằng cách tập hợp một số lượng nhỏ các cấu trúc có thể được kết hợp để mô tả nhiều loại hợp đồng tài chính khác nhau.

Trước khi chúng tôi mô tả các cấu trúc đó, chúng tôi cần xem xét cách tiếp cận chung của chúng tôi để tạo mô hình hợp đồng trong Marlowe và bối cảnh mà các hợp đồng Marlowe được thực hiện, cụ thể là chuỗi khối Cardano. Khi làm điều này, chúng tôi cũng giới thiệu một số thuật ngữ mà chúng tôi sẽ sử dụng, chỉ ra các định nghĩa bằng chữ in nghiêng .

Hợp đồng

Các hợp đồng trong Marlowe chạy trên một chuỗi khối, nhưng cần phải tương tác với thế giới ngoài chuỗi. Các bên (parties) của hợp đồng, mà chúng tôi còn gọi là những người tham gia (participants), có thể tham gia vào các hành động (actions) khác nhau: họ có thể được yêu cầu gửi tiền (deposit money) hoặc lựa chọn (make a choice) giữa các lựa chọn thay thế khác. Thông báo (notification) là một hình thức đầu vào khác được sử dụng để cho hợp đồng biết rằng một điều kiện nhất định đã được đáp ứng, bất kỳ ai cũng có thể làm điều này và nó chỉ cần thiết vì một khi hợp đồng trở nên ngủ yên (tĩnh lặng), nó không thể tự "thức dậy" , nó chỉ có thể phản hồi các đầu vào. 1

Việc thực hiện hợp đồng cũng có thể tạo ra các tác động (effects) bên ngoài, bằng cách thanh toán cho các bên trong hợp đồng.

Người tham gia, vai trò và khóa công khai

Chúng ta nên tách biệt các khái niệm về người tham gia, vai tròkhóa công khai trong hợp đồng Marlowe. Một người tham gia (hoặc một bên) trong hợp đồng có thể được đại diện bằng role hoặc public key (khóa công khai cuối cùng sẽ được thay thế bằng địa chỉ).

Vai trò (roles) được đại diện bởi các mã thông báo (tokens) và chúng được phân phối đến các địa chỉ tại thời điểm một hợp đồng được triển khai vào blockchain. Sau đó, bất kỳ ai có mã thông báo đại diện cho một vai trò đều có thể thực hiện các hành động được chỉ định cho vai trò đó và nhận các khoản thanh toán được cấp cho vai trò đó.

Điều này cho phép các vai trò trong việc chạy hợp đồng được giao dịch (traded) giữa những người tham gia, thông qua cơ chế mã hóa (tokenisation). Điều này sẽ có sẵn trong quá trình triển khai trên chuỗi của Marlowe nhưng mô phỏng trong Sân chơi Marlowe chỉ đơn giản là trình bày các vai trò hợp đồng.

Các bên khóa công khai (Public key), được đại diện bởi hàm băm của khóa công khai (hoặc cuối cùng là một địa chỉ). Sử dụng khóa công khai để đại diện cho các bên đơn giản hơn vì nó không yêu cầu xử lý mã thông báo, nhưng chúng không thể được giao dịch, bởi vì một khi bạn biết khóa riêng tư (private key) cho một khóa công khai nhất định, bạn không thể chứng minh bạn đã quên nó.

Tài khoản

Mô hình Marlowe cho phép hợp đồng lưu trữ tài sản. Tất cả các bên tham gia hợp đồng đều mặc nhiên sở hữu một tài khoản mang tên họ. Tất cả tài sản được lưu trữ trong hợp đồng phải có trong tài khoản của một trong các bên; theo cách này, khi hợp đồng được kết thúc, tất cả tài sản còn lại trong hợp đồng đều thuộc về một người nào đó và do đó có thể được hoàn lại cho chủ sở hữu tương ứng của họ. Các tài khoản này là cục bộ (local): chúng chỉ tồn tại trong thời gian thực hiện hợp đồng và trong thời gian đó, chúng chỉ có thể truy cập được từ bên trong hợp đồng.

Các bước và trạng thái

Hợp đồng Marlowe mô tả một loạt các bước (steps), thường bằng cách mô tả bước đầu tiên, cùng với một hợp đồng (phụ) khác mô tả những việc cần làm tiếp theo. Ví dụ: hợp đồng Pay a p t v cont có nội dung “thanh toán giá trị v củamã thông báo t cho bên p từ tài khoản a, sau đó thực hiện theo hợp đồng cont”. Chúng tôi gọi cont là sự tiếp tục (continuation) của hợp đồng.

Khi thực hiện hợp đồng, chúng ta cần theo dõi hợp đồng hiện tại (current contract) (nghĩa là phần còn lại của hợp đồng): sau khi thực hiện một bước trong ví dụ trên, hợp đồng hiện tại là phần tiếp tục, cont. Chúng tôi cũng phải theo dõi một số thông tin khác, chẳng hạn như số tiền được giữ trong mỗi tài khoản: chúng tôi gọi thông tin này là trạng thái: điều này cũng có thể thay đổi ở mỗi bước. Một bước cũng có thể thấy một hành động đang diễn ra, chẳng hạn như tiền được gửi hoặc một hiệu ứng (effect) đang được tạo ra, ví dụ như một khoản thanh toán.

Chuỗi khối

Mặc dù Marlowe được thiết kế để hoạt động với các blockchains nói chung, 2 một số chi tiết về cách nó tương tác với blockchain có liên quan khi mô tả ngữ nghĩa và cách triển khai của Marlowe.

Blockchain dựa trên UTxO là một chuỗi các khối (blocks), mỗi khối chứa một tập hợp các giao dịch. Mỗi giao dịch (transaction) có một tập hợp các đầu vào và đầu ra và blockchain được xây dựng bằng cách liên kết các đầu ra giao dịch chưa sử dụng (unspent transaction outputs - UTxO) với các đầu vào của một giao dịch mới. Có thể tạo ra nhiều nhất một khối trong mỗi slot, dài 1 giây.

Ở đây không liên quan đến cơ chế tạo ra các khối này và do ai tạo ra, nhưng các hợp đồng sẽ được thể hiện theo thời gian POSIX.

UTxO, ví và ứng dụng Marlowe Run

Giá trị trên blockchain nằm trong UTxO, được bảo vệ bằng mật mã bằng khóa riêng do chủ sở hữu nắm giữ. Các khóa này có thể được sử dụng để đổi (redeem) đầu ra và do đó, sử dụng chúng làm đầu vào cho các giao dịch mới, có thể được coi là chi tiêu giá trị trong đầu vào. Người dùng thường theo dõi các khóa cá nhân của họ và các giá trị được đính kèm với chúng, trong một chiếc ví (wallet) an toàn bằng mật mã.

Ngoài ra, các UTxO có thể được bảo vệ bởi một tập lệnh (script) và đó về cơ bản là hợp đồng, một tập lệnh bảo vệ một UTxO và nó có thể tự lan truyền trong một chuỗi giao dịch.

Để tương tác với một hợp đồng chạy trên blockchain, người dùng sẽ cần sử dụng ứng dụng máy khách Marlowe Run. Đổi lại, điều này sẽ tương tác với ví của người dùng để xác thực các giao dịch sử dụng tài sản tiền điện tử, vì tiền gửi được thực hiện từ ví của người dùng và các khoản thanh toán mà họ nhận được. Tuy nhiên, lưu ý rằng đây chắc chắn là các hành động ngoài chuỗi (off-chain) cần được bắt đầu bằng mã chạy ngoài chuỗi, thông thường điều này sẽ có trong ứng dụng Marlowe Run: chúng không thể xảy ra bởi chính hợp đồng chạy trên chuỗi.

Mô phỏng toàn diện

Sân chơi Marlowe hỗ trợ mô phỏng hợp đồng. Đây là một mô phỏng toàn diện (omniscient), trong đó người dùng có thể thực hiện bất kỳ hành động nào cho bất kỳ vai trò nào và do đó có thể quan sát việc thực hiện từ quan điểm của tất cả người dùng đồng thời. Điều này trái ngược với trải nghiệm chạy hợp đồng trong Marlowe Run, trong đó mỗi người tham gia nhìn nhận hợp đồng theo quan điểm của riêng họ. Đặc biệt, những người tham gia chỉ có thể tương tác với một hợp đồng đang chạy đang chờ đợi ý kiến ​​đóng góp từ họ; nếu không phải như vậy, thì họ sẽ thấy rằng việc thực hiện hợp đồng đang chờ đợi sự tham gia của người khác.

Giá trị và mã thông báo

Trong các ví dụ trước, giá trị Value làbắt buộc phải có, chúng tôi đã sử dụng cụ thể là ADA. Điều này rất có ý nghĩa, vì ADA là tiền tệ cơ bản được hỗ trợ bởi Cardano.

Tuy nhiên, Marlowe đưa ra một khái niệm tổng quát hơn về giá trị (value), hỗ trợ các mã thông báo gốc (native token) tùy chỉnh, có thể thay thế được (fungible token - FT), không thể thay thế (non-fungible token - NFT) hoặc là hỗn hợp các dạng này. 3 Vậy Value trong Marlowe là ?

newtype Value = Value
    {getValue :: Map CurrencySymbol (Map TokenName Integer)}

Các loại CurrencySymbol TokenName đều là các trình bao bọc đơn giản xung quanh ByteString.

Khái niệm giá trị (value) này bao gồm ADA, mã thông báo có thể thay thế - FT (tương tự như là tiền tệ), mã thông báo không thể thay thế hoặc NFT (mã thông báo tùy chỉnh không thể hoán đổi với các mã thông báo khác) và các trường hợp hỗn hợp kỳ lạ hơn:

  • ADA có empty bytestring CurrencySymbolTokenName.

  • Mã thông báo có thể thay thế được biểu thị bằng một mã CurrencySymbolmà có chính xác một mã TokenNamecó thể có số lượng nguyên không âm tùy ý (trong đó ADA là một trường hợp đặc biệt).

  • Một loại mã thông báo không thể thay thế là một CurrencySymbolvới một số TokenName, mỗi mã có số lượng là một. Mỗi tên trong số này tương ứng với một mã thông báo không thể thay thế duy nhất.

  • Mã thông báo hỗn hợp là những mã có nhiều TokenName số lượng lớn hơn một.

Cardano cung cấp một cách đơn giản để giới thiệu một loại tiền mới bằng cách đúc (minting) chúng sử dụng các tập lệnh chính sách đúc tiền (minting policy scripts). Điều này nhúng hiệu quả các tiêu chuẩn Ethereum ERC-20 / ERC-721 làm giá trị nguyên thủy trong Cardano. Ở Marlowe, chúng tôi sử dụng mã thông báo tùy chỉnh để đại diện cho những người tham gia trong mỗi hợp đồng thực thi trên chuỗi.

Thực hiện hợp đồng Marlowe

Thực thi hợp đồng Marlowe trên chuỗi khối Cardano có nghĩa là ràng buộc các giao dịch do người dùng tạo theo logic của hợp đồng. Nếu, tại một thời điểm thực hiện cụ thể, một hợp đồng yêu cầu Alice đặt cọc 100 ADA, thì chỉ một giao dịch như vậy sẽ thành công, mọi thứ khác sẽ bị từ chối.

Một giao dịch chứa danh sách các đầu vào (inputs) hoặc hành động (actions) được sắp xếp theo thứ tự. Trình thông dịch Marlowe được thực thi trong quá trình xác thực giao dịch. Đầu tiên, nó đánh giá hợp đồng từng bước một (step by step) cho đến khi không thể thay đổi được nữa mà không cần xử lý bất kỳ đầu vào nào, một điều kiện được gọi là tĩnh (quiescent). Ở giai đoạn này, chúng tôi thực hiện qua bất kỳ When khi hết thời gian chờ đã qua, và tất cả If, Let, Pay, Close được cấu trúc mà không tốn bất kỳ đầu vào nào.

Đầu vào đầu tiên sau đó được xử lý, và sau đó hợp đồng được thực hiện lại từng bước cho đến khi ổn định, và quá trình này được lặp lại cho đến khi tất cả các đầu vào được xử lý. Ở mỗi bước, địa chỉ liên hệ hiện tại và trạng thái sẽ thay đổi, một số thông tin đầu vào có thể được xử lý và các khoản thanh toán được thực hiện.

Một giao dịch như vậy, như được hiển thị trong sơ đồ bên dưới, được thêm vào blockchain. Những gì chúng tôi làm tiếp theo là mô tả chi tiết các hợp đồng Marlowe trông như thế nào và chúng được đánh giá từng bước như thế nào.

Chúng tôi đã chỉ ra, 4 rằng hành vi của Marlowe độc ​​lập với cách thu thập đầu vào vào các giao dịch và vì vậy khi mô phỏng hành động của một hợp đồng, chúng ta không cần phải nhóm các đầu vào vào giao dịch một cách rõ ràng. Để rõ ràng, chúng ta có thể nghĩ rằng mỗi giao dịch có nhiều nhất một đầu vào. Mặc dù ngữ nghĩa của hợp đồng độc lập với cách các đầu vào được nhóm thành các giao dịch, nhưng chi phí thực hiện (costs of execution) có thể thấp hơn nếu nhiều đầu vào có thể được nhóm thành một giao dịch duy nhất.

Trong mô phỏng toàn diện có sẵn trong sân chơi Marlowe, chúng ta có thể tách khỏi nhóm giao dịch một cách an toàn, vì việc nhóm không ảnh hưởng đến hành vi của hợp đồng.

Xây dựng giao dịch

[1] Chúng ta có thể coi oracles như một loại bên khác của hợp đồng; dưới chế độ xem này, các thông báo sẽ trở thành lựa chọn của bên đó.

[2] Thật vậy, Marlowe có thể được sửa đổi để chạy ngoài chuỗi khối hoặc hoạt động trên một chuỗi khối được cấp phép.

[3] Điều này phản ánh mô hình giá trị cho Plutus.

[4] Trong bài báo của chúng tôi, Marlowe: thực hiện và phân tích các hợp đồng tài chính trên blockchain

Last updated