Marlowe Step by Step
Marlowe có sáu cách xây dựng hợp đồng. Năm trong số này làPay, Let, If, When, Assert
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à hợp đồng 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ả 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 tôi cũng sẽ giải thích các giá trị (values), quan sát (observations) và hành động (actions) 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ó cũng như việc phát triển nó như thế nào.
Pay
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 mã thông báo 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
âm hoặc nếu tài khoản không có đủ tiền để thanh toán đầy đủ (ngay cả khi có số dư dương của các mã thông báo 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ương ứng 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
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 của các 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à hành động.
Giá trị, quan sát và hành động
Giá trị bao gồm một số đại lượng thay đổi theo thời gian, gồm “số slot hiện tại”, 1 “số dư hiện tại của một số mã thông báo trong tài khoản” và bất kỳ lựa chọn nào đã được thực hiện; chúng tôi gọi những giá trị này là biến động (volatile). Các giá trị cũng có thể được kết hợp bằng cách sử dụng cộng, trừ, phủ định, nhân và chia và có thể có điều kiện đối với một quan sát. Mặc dù chúng được hỗ trợ bởi Marlowe, việc sử dụng phép nhân và phép chia có thể khiến quá trình phân tích tĩnh trở nên khó thực hiện.
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 hành động 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 hành động 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 một giá trị oracle (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 chuỗi khối 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 tôi đã giới thiệu một nguyên mẫu oracle, được triển khai trong Sân chơi Marlowe.
Chúng tôi lập mô hình Oracles 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 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 (pre-filled), dựa trên dữ liệu từ Cryptowat.ch, với giá trị hiện tại của chuyển đổi trực tiếp tỷ lệ ADA / USD. Bạn có thể tìm thấy tất cả các cặp tiền tệ đượ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 tôi 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 tôi 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ể sử dụng DivValue
với giá trị kết quả 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á:
Tính số tiền USDT
Chia tỷ lệ kết quả xuống 10^6 để nhận được số tiền bằng USDT cent.
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 quan sát 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 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 hành động (triggered on actions), 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 hành động khác nhau xảy ra được mô tả bởi các trường hợp (cases) 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 đó 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ư 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
đến khi timeout
chạm tới số vị trí slot.
Let
Hợp đồng Let id val cont
cho phép một hợp đồng đặt tên cho một giá trị (name a value) 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ư sau cont
.
Ngoài việc cho phép chúng tôi sử dụng các chữ 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ụ như giá dầu hiện tại hoặc số vị trí 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
Một hợp đồng khẳng định 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 gây ra cảnh báo.
[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à trong đó việc thêm chúng vào chuỗi khối là hợp lệ. Lý do cho điều này là nói chung rất khó để dự đoán chính xác vị trí mà 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 các khoảng độ dài một cách hiệu quả. 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ị vị trí 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 tôi không đề cập thêm về vấn đề đó ở đây.
Last updated