Skip to main content

Bài 3: Marlowe - từng bước

Marlowe có sáu cách xây dựng hợp đồng. Năm trong số này là 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à thứ sáu là Close là một hợp đồng đơn giản. Tại mỗi bước thực hiện, cũng như trả lại 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.

Khi giải thích các hợp đồng này, chúng ta cũng sẽ giải thích các giá trị, quan sátthực thi của Marlowe, đượ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.

Pay - Trả tiền

Hợp đồng thanh toán Pay a p t v cont sẽ thực hiện thanh toán giá trị v token t từ tài khoảna 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 ra nếu giá trị v là số âm 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, một khoản 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 - Kết thúc hợp đồng

Hợp đồng Close quy định hợp đồng được đóng (hoặc chấm dứt). thực thi duy nhất được 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 thảo luận về các hình thức hợp đồng khác, chúng ta cần mô tả các giá trị, quan sát và thực thi.

Giá trị, quan sát và thực thi

Giá trị bao gồm một số đại lượng thay đổi theo thời gian, bao gồm “số slot hiện tại”, [1] “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; chúng ta gọi đó là những giá trị dễ 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 quan sát.

Các quan sát 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 quan sát sẽ có một giá trị ở mỗi bước thực hiện. Mặt khác, các thực thi xảy ra tại các điểm cụ thể trong quá trình thực thi. Như đã lưu ý trước đó, các thực thi có thể

  • 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 giá trị Oracles (xem phần tiếp theo), hoặc
  • Thông báo một giá trị bên ngoài của một số loại.

Oracles

Oracles đang được phát triển cho blockchain Cardano nói chung và sẽ có sẵn để sử dụng trong Marlowe trên Cardano. Trong thời gian chờ đợi, chúng ta đã giới thiệu một nguyên mẫu oracle, được triển khai trong Marlowe Playground.

Chúng ta lập mô hình Oracles là những lựa chọn được thực hiện bởi một người tham gia có vai trò Oracle cụ thể, “kraken”.

Nếu một vai trò trong hợp đồng là kraken và vai trò đó đưa ra lựa chọn chẳng hạn như "dir-adausd" sau đó, trong mô phỏng Playground, lựa chọn này sẽ được điền trước, dựa trên dữ liệu từ Cryptowat.ch, với giá trị hiện tại của chuyển đổi ADA / USD trực tiếp tỷ lệ. Bạn có thể tìm thấy tất cả các cặp tiền được hỗ trợ tại đây https://api.cryptowat.ch/markets/kraken

Cũng có thể nhận được tỷ giá nghịch đảo của các cặp tiền tệ được liệt kê bằng cách thêm tiền tố inv-thay thế. Ví dụ: "inv-adausd"sẽ trả về giá trị của tỷ lệ chuyển đổi USD / ADA.

Lưu ý rằng chúng ta chỉ hỗ trợ số nguyên làm đầu vào lựa chọn. Sau đó, làm cách nào để chúng ta sử dụng giá ADA / USD hiện tại, có thể là $ 0,098924? chúng ta chỉ cần nhân giá với 10 8, vì vậy giá sẽ xuất hiện là 9892400. Bạn có thể DivValue tính giá trị sau khi thực hiện các phép tính của mình.

Ví dụ: bạn muốn mua USDT với giá 12 ADA, sử dụng giá Oracle.

Nhận giá:

When [Choice (ChoiceId "dir-adausdt" (Role "kraken") [Bound 1000000 10000000]...

Tính số tiền USDT

Let (ValueId "amount of USDT in microcents")
(MulValue
(Constant 12)
(ChoiceValue (ChoiceId "dir-adausdt" (Role `"kraken"`))))

Chia tỷ lệ kết quả xuống 10 6 để nhận được số tiền bằng USDT cent.

DivValue (UseValue (ValueId "amount of USDT in microcents")) (Constant 1000000)

If - Nếu

Đ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 quan sát obs khi cấu trúc này được thực thi.

When - Khi

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

Trong hợp đồng When cases timeout cont, danh sách cases có 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 đó là một thực thi ac và một phần co tiếp theo (một hợp đồng khác). Khi một thực thi 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ư sự tiếp tục tương ứng co.

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

Let - Gán

Hợp đồng Let Let id val cont cho phép một hợp đồng đặt tên cho một giá trị bằng cách sử dụng một số nhận dạng. 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 ta sử dụng các chữ viết tắt, cơ chế này cũng có nghĩa là chúng ta 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ụ như 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 - Yêu cầu

Một hợp đồng Yêu cầu 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 quan sát obs là sai. Nó có thể được sử dụng để đảm bảo rằng một tài sản nắm 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 Yêu cầu là sai.

[1] Phần trình bày ở đây là sự đơn giản hóa việc triển khai cụ thể, trong đó các giao dịch được liên kết với một khoảng thời gian mà việc thêm chúng vào blockchain là hợp lệ. một giao dịch sẽ được chấp nhận để đưa vào blockchain; do đó sẽ mạnh mẽ hơn khi chỉ định khoảng thời gian mà giao dịch sẽ được chấp nhận. Quan điểm được trình bày ở đây là một sự đơn giản hóa trong đó chúng ta chỉ xem xét một cách hiệu quả những khoảng có độ dài là một. Vì vậy, hợp đồng Marlowe có thể truy cập giới hạn trên và giới hạn dưới trên khoảng thời gian hiện tại, thay vì giá trị slot hiện tại cụ thể. Trong một số trường hợp, việc thực thi hợp đồng có thể dẫn đến “lỗi khoảng thời gian không rõ ràng”, nhưng chúng ta không đề cập thêm về vấn đề đó ở đây.

Nguồn bài viết tại đây


Picture