Marlowe được thiết kế để tạo ra các block building hợp đồng tài chính: thanh toán và đặt cọc từ người tham gia, lựa chọn của người tham gia và thông tin thế giới thực.

Marlowe là một ngôn ngữ nhỏ, với một số cấu trúc khác nhau, đối với mỗi hợp đồng, mô tả hành vi liên quan đến một nhóm vai trò cố định, hữu hạn. Khi một hợp đồng được chạy, các vai trò mà nó liên quan được thực hiện bởi những người tham gia, đó là danh tính trên blockchain. Mỗi vai trò được đại diện bởi một token trên chuỗi và các vai trò có thể được chuyển giao trong quá trình thực hiện hợp đồng, nghĩa là về cơ bản chúng có thể được giao dịch.

Hợp đồng có thể đượ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 này kết hợp với nhau có thể được sử dụng để mô tả và mô hình hóa nhiều loại hợp đồng tài chính khác nhau. Một số ví dụ bao gồm hợp đồng đang chạy có thể thực hiện thanh toán cho một vai trò hoặc cho khóa công khai, một hợp đồng có thể chờ một hành động của một trong các vai trò, chẳng hạn như đặt cọc tiền hoặc một lựa chọn từ một tập hợp các tùy chọn. Xem Sample Escrow Contract (Hợp đồng ký quỹ mẫu) bên dưới.

Điều quan trọng, hợp đồng không thể chờ đợi vô thời hạn cho một hành động: nếu không có hành động nào được thực hiện trong một thời gian nhất định (thời gian chờ), thì hợp đồng sẽ tiếp tục với một hành vi thay thế, ví dụ: thực hiện một hành động khắc phục như hoàn trả bất kỳ khoản tiền nào trong hợp đồng.

Các hợp đồng Marlowe có thể phân nhánh dựa trên các lựa chọn thay thế và có thời gian tồn tại hữu hạn, khi kết thúc số tiền còn lại sẽ được trả lại cho những người tham gia. Tính năng này có nghĩa là tiền không thể bị giữ mãi trong một hợp đồng. Tùy thuộc vào trạng thái hiện tại của hợp đồng, nó có thể đưa ra lựa chọn giữa hai quy trình hành động thay thế trong tương lai, bản thân chúng là hợp đồng. Khi không cần thực hiện thêm hành động nào, hợp đồng sẽ đóng và bất kỳ đơn vị tiền tệ nào còn lại trong hợp đồng sẽ được hoàn lại.

Sử dụng các Haskell type

Các  Haskell type được sử dụng để đại diện cho các thành phần khác nhau của hợp đồng, bao gồm tài khoản, giá trị, observation (quan sát)hành động. Các yếu tố Marlowe này được sử dụng để cung cấp thông tin bên ngoài và đầu vào cho một hợp đồng đang chạy để kiểm soát nó sẽ phát triển như thế nào.

Trong mô hình hóa các phần cơ bản của Marlowe, kết hợp các Haskell data type được sử dụng để xác định các type mới và các type từ đồng nghĩa tạo tên mới cho một type hiện có.

Ngoài việc viết hợp đồng trong phiên bản văn bản của Marlowe, bạn cũng có thể sử dụng một trong các môi trường lập trình trực quan sau:

  1. Sử dụng Blockly
  2. Sử dụng JavaScript
  3. Sử dụng Haskell

Về hợp đồng Marlowe

Một hợp đồng được xây dựng ở Marlowe bằng cách kết hợp một số lượng nhỏ các block building để mô tả nhiều loại hợp đồng tài chính khác nhau, như thanh toán, observation, đợi cho đến khi một điều kiện nhất định trở thành sự thật, v.v. Sau đó, hợp đồng được chạy trên một blockchain, như Cardano và tương tác với thế giới bên ngoài.

Bản thân Marlowe được nhúng trong Haskell và được mô hình hóa như một tập hợp các kiểu dữ liệu đại số trong Haskell, với các hợp đồng được xác định bởi loại Hợp đồng:

data Contract = Close
              | Pay Party Payee Token Value Contract
              | If Observation Contract Contract
              | When [Case] Timeout Contract
              | Let ValueId Value Contract
              | Assert Observation Contract

Marlowe có sáu cách xây dựng hợp đồng. Năm trong số các phương pháp này – Pay, Let, If, WhenAssert – xây dựng một hợp đồng phức tạp từ các hợp đồng đơn giản hơn và phương pháp thứ sáu, Close, là một hợp đồng đơn giản. Tại mỗi bước thực hiện, cũng như trả về trạng thái mới và hợp đồng tiếp tục, có thể các hiệu ứng – thanh toán – và cảnh báo cũng có thể được tạo ra.

Pay (tiền lương)

Hợp đồng thanh toán Pay a p t v cont sẽ thực hiện thanh toán giá trị v của token t từ tài khoản a cho người nhận thanh toán p, người này sẽ là một trong những người tham gia hợp đồng hoặc một tài khoản khác trong hợp đồng. Cảnh báo sẽ được tạo nếu giá trị v không dương hoặc nếu tài khoản không có đủ tiền để thực hiện thanh toán đầy đủ (ngay cả khi có số dư dương của các token khác trong tài khoản). Trong trường hợp thứ hai, thanh toán một phần (tất cả số tiền hiện có) được thực hiện. Hợp đồng tiếp tục là hợp đồng được đưa ra trong hợp đồng: cont.

Close (đóng hợp đồng)

Hợp đồng Close quy định hợp đồng được đóng (hoặc chấm dứt). Hành động duy nhất mà nó thực hiện là cung cấp tiền hoàn lại cho chủ sở hữu tài khoản có số dư dương. Điều này được thực hiện một tài khoản mỗi bước, nhưng tất cả các tài khoản sẽ được hoàn lại trong một giao dịch duy nhất.

Trước khi chuyển sang các hình thức hợp đồng khác, chúng ta cần phác thảo các giá trị, observation hành động:

  • Giá trị – bao gồm các đại lượng thay đổi theo thời gian, bao gồm “the current slot interval” (khoảng thời gian hiện tại), “số dư hiện tại của một số token trong tài khoản” và bất kỳ lựa chọn nào đã được thực hiện (giá trị biến động). Các giá trị cũng có thể được kết hợp bằng cách sử dụng phép cộng, phép trừ và phủ định và có thể có điều kiện đối với một observation.
  • Các observation – là các giá trị boolean có được bằng cách so sánh các giá trị và có thể được kết hợp bằng cách sử dụng các toán tử boolean tiêu chuẩn. Cũng có thể quan sát xem có lựa chọn nào đã được thực hiện hay không (đối với một lựa chọn đã được xác định cụ thể). Các observation sẽ có một giá trị ở mỗi bước thực hiện.
  • Các hành động – xảy ra tại các điểm cụ thể trong quá trình thực thi, ví dụ:
  • Dipositing money (gửi tiền)
  • đưa ra lựa chọn giữa các lựa chọn thay thế khác nhau, bao gồm một giá trị oracle
  • thông báo cho hợp đồng về một observation đã trở thành sự thật
  • Oracles – đang được phát triển cho Cardano blockchian và sẽ có sẵn để sử dụng trong Marlowe trên Cardano. Cho đến lúc đó, chúng tôi đã giới thiệu một oracle prototype, được thực hiện trong Marlowe Playground. Chúng tôi lập mô hình oracle dưới dạng các lựa chọn được thực hiện bởi một người tham gia có vai trò Oracle role, “kraken”.

If

Điều kiện If obs cont1 cont2 sẽ tiếp tục như cont1 hoặc cont2, tùy thuộc vào giá trị boolean của observation obs khi cấu trúc này được thực thi.

When

Đây là hàm tạo phức tạp nhất cho các hợp đồng, với dạng When cases timeout cont. Đó là một hợp đồng được kích hoạt dựa trên các hành động, có thể xảy ra hoặc không xảy ra tại bất kỳ slot cụ thể nào: điều gì xảy ra khi các hành động khác nhau xảy ra được mô tả bởi các trường hợp trong hợp đồng.

Trong hợp đồng When cases timeout cont, các trường hợp danh sách chứa một tập hợp các trường hợp. Mỗi trường hợp có dạng Case ac co trong đó ac là một hành động và co là một phần tiếp theo (một hợp đồng khác). Khi một hành động cụ thể, ví dụ, ac, xảy ra, trạng thái được cập nhật tương ứng và hợp đồng sẽ tiếp tục như là đồng co tương ứng.

Để đảm bảo rằng hợp đồng có tiến độ cuối cùng, hợp đồng When cases timeout cont, cont sẽ tiếp tục như một timeout, một số slot, đạt được.

Let

Hợp đồng Let id val cont cho phép hợp đồng ghi lại một giá trị, tại một thời điểm cụ thể, và đặt tên cho nó bằng cách sử dụng một định danh. Trong trường hợp này, biểu thức val được đánh giá và được lưu trữ với tên id. Hợp đồng sau đó tiếp tục như cont.

Ngoài việc cho phép chúng tôi sử dụng các từ viết tắt, cơ chế này cũng có nghĩa là chúng tôi có thể nắm bắt và lưu các giá trị biến động có thể thay đổi theo thời gian, ví dụ: giá dầu hiện tại, hoặc số slot hiện tại, tại một thời điểm cụ thể trong quá trình thực hiện hợp đồng, sẽ được sử dụng sau này trong quá trình thực hiện hợp đồng.

Assert (Xác nhận)

Hợp đồng assert (xác nhận) Assert obs cont không có bất kỳ ảnh hưởng nào đến trạng thái của hợp đồng, nó ngay lập tức tiếp tục như cont, nhưng nó đưa ra cảnh báo khi Observation obs là sai. Nó có thể được sử dụng để đảm bảo rằng một thuộc tính giữ trong bất kỳ điểm nhất định nào của hợp đồng, vì phân tích tĩnh sẽ không thành công nếu bất kỳ việc thực thi nào khiến khẳng định là sai.

Sample Escrow contract (Hợp đồng ký quỹ mẫu)

Giả sử rằng alice muốn mua một con mèo từ bob, nhưng cả hai đều không tin người kia. May mắn thay, họ có một người bạn chung carol mà cả hai đều tin tưởng là trung lập (nhưng không đủ để đưa tiền cho cô ấy và làm trung gian). Do đó, họ đồng ý về hợp đồng sau, được viết bằng pseudocode chức năng đơn giản. Loại hợp đồng này là một ví dụ đơn giản về ký quỹ:

When aliceChoice
      (When bobChoice
            (If (aliceChosen 'ValueEQ' bobChosen)
                agreement
                arbitrate))

Hợp đồng được mô tả bằng cách sử dụng các constructorn của kiểu Haskell data. Hàm tạo ngoài cùng When có hai đối số: đối số đầu tiên là một observation và đối số thứ hai là một hợp đồng khác. Ý nghĩa dự định của điều này là khi hành động xảy ra, hợp đồng thứ hai được kích hoạt.

Bản hợp đồng thứ hai tự nó là một hợp đồng khác When – yêu cầu quyết định từ bob – nhưng bên trong đó, có một sự lựa chọn: Nếu alice và bob đồng ý về việc phải làm, thì việc đó được thực hiện; nếu không, carol được yêu cầu phân xử và đưa ra quyết định.

Nói chung, When đưa ra danh sách các trường hợp, mỗi trường hợp có một hành động và một hợp đồng tương ứng được kích hoạt khi hành động đó xảy ra. Sử dụng điều này, chúng tôi có thể cho phép tùy chọn bob làm lựa chọn đầu tiên, thay vì alice, như thế này:

When [ Case aliceChoice
             (When [ Case bobChoice
                         (If (aliceChosen 'ValueEQ' bobChosen)
                            agreement
                            arbitrate) ],
               
       Case bobChoice
             (When [ Case aliceChoice
                          (If (aliceChosen 'ValueEQ' bobChosen)
                             agreement
                             arbitrate) ],
      ]

Trong hợp đồng này, Alice hoặc Bob có thể đưa ra lựa chọn đầu tiên; những người khác đưa ra lựa chọn. Nếu họ đồng ý, thì điều đó được thực hiện; nếu không, Carol phân xử.

Escrow (ký quỹ) tại Marlowe

Các hợp đồng Marlowe kết hợp các cấu trúc bổ sung để đảm bảo rằng chúng tiến triển đúng. Mỗi lần chúng tôi thấy When, chúng tôi cần cung cấp hai điều bổ sung:

  • Sau thời gian chờ đó là hợp đồng sẽ tiến triển và
  • hợp đồng tiếp tục những tiến triển của nó

Sử dụng timeout (thời gian chờ)

Thời gian chờ được sử dụng khi điều kiện của When không bao giờ trở thành đúng. Vì vậy, các giá trị thời gian chờ và tiếp tục được thêm vào mỗi When xảy ra trong hợp đồng:

When [ Case aliceChoice
              (When [ Case bobChoice
                          (If (aliceChosen 'ValueEQ' bobChosen)
                             agreement
                             arbitrate) ],
                    60              -- ADDED
                    arbitrate       -- ADDED
        ]
        40          -- ADDED
        Close       -- ADDED

Sau cùng When yêu cầu lựa chọn đầu tiên được thực hiện bởi Alice: nếu Alice không thực hiện lựa chọn theo slot 40, hợp đồng sẽ bị đóng và tất cả số tiền trong hợp đồng sẽ được hoàn trả.

Tài khoản Marlowe và việc sử dụng token

Tài khoản Marlowe chứa nhiều loại tiền tệ và/hoặc token có thể thay thế và không thể thay thế. Một số tiền cụ thể được lập chỉ mục bởi Token, là một cặp CurrencySymbolTokenName. Bạn có thể coi Account là Map Token Integer, trong đó: data Token = Token CurencySymbol TokenName

ADA token của Cardano được đại diện là Token adaSymbol adaToken, tuy nhiên, bạn có thể tạo tiền tệ và token của riêng mình.