# IOHK官网博客：Marlow的智能合约

**URL:** <https://forum.cardano.org/t/iohk-marlow/41616>\
**Category:** 中文\
**Created:** [26 October 2020 13:18 UTC](https://forum.cardano.org/t/iohk-marlow/41616 "2020-10-26T13:18:09Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Anson888](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.cardano.org/anson888/32/14861_2.png) [@Anson888](https://forum.cardano.org/u/Anson888)\
**Post date:** [26 October 2020 13:18 UTC](https://forum.cardano.org/t/iohk-marlow/41616/1 "2020-10-26T13:18:09Z")

</div>

![image](https://us1.discourse-cdn.com/flex023/uploads/cardano/original/3X/c/8/c8847a61b7496581c88567a726c28cc1be82738e.jpeg)  
_原文和图片来自IOHK官网博客，由西蒙·汤普森教授（Simon Thompson）撰写，由卡尔达诺大使陈哲Anson翻译_

**用金融语言而不是区块链语言来编写**

在我们的开发者深入系列的技术博客中，我们邀请IOHK的研究人员和工程师讨论他们的最新工作和发表见解。

Marlowe是一种用于安全金融智能合约的特定领域语言，由IOHK为Cardano区块链的Goguen功能而开发。继我在Marlowe上的介绍帖子之后，在此深潜帖子中，我们将研究语言的细节，以及进入去中心化金融（DeFi）阶段的各种Marlowe智能合约的编写方式。在解释了将预言输入到正在运行的合同中的“预言机”之后，我们看了金融合同的算法合同类型统一标准（Actus），并解释了我们如何在Marlowe中实现这一创新。

**Marlowe简述**

Marlowe是一门小语言，对于每个合同都编写了一种结构，描述了涉及固定的有限角色组的行为。

•运行的合同可以向角色或公钥付款。

•合同以补充的方式，可以等待某个角色的行动，例如货币存入或从一组选项中进行选择。至关重要的是，合同不能无限期地等待：如果在给定时间（超时）之前未采取任何行动，合同将继续另一种行为，例如退还合同中的任何资金。

•根据合同的当前状态，可以在两个未来的行动方案（它们本身就是合同）之间做出选择。

•当不需要采取任何其他措施时，合同将关闭，合同中的所有剩余货币将被退还。

当合同运行时，参与者所扮演的角色由参与者履行，这是区块链上的身份。此模型允许在合同执行期间转移角色，以便可以交换正在运行的合同中的角色。每个角色都由链上的代币表示，转移代币即可执行该角色的动作。更进一步，我们可以用多个代币表示单个角色，从而允许角色共享：这可以之称为“安全化”。

**Marlow系统**

我们故意让该语言尽可能简单，以便可以在Cardano和Marlowe Playground中轻松实现该语言。 Marlowe描述了参与者之间的加密货币流，要在Cardano区块链上实现这一点，必须在链上和链外执行代码：不过请记住，只有一个Marlowe合同描述了这两个部分。链上部分接受并验证符合智能合约要求的交易：该部分被实现为所有Marlowe合约的单个Plutus脚本，其中特定的Marlowe合约包含通过交易传递的数据。在链下，Marlowe合约将通过用户界面和钱包呈现，提供或实际上自动进行存款和选择并接收加密货币付款。

 ![MYo0dKlS5cJHPEya5fmQ64TUdUfm5CnTy3Lwzd35zwJ0G4RHfwBGeMuii7JwpSqLEo2CkMAJkIYmYRV1HxvU6o5CIH3lfUFQocrc43ItnWyIwHB76RMNSPZzRXUL-T0NaBnJ2eo](https://us1.discourse-cdn.com/flex023/uploads/cardano/original/3X/d/b/dba47d420ea79d777cb448d3a675c3c4f7521af4.png)  
图1. Marlowe Playground模拟合同行为的方式

在Playground中，我们可以模拟合同行为，以便潜在用户可以根据参与者采取的不同行动，逐步了解合同的发展方式。在图1的主要模拟中，用户具有无所不知的观点，并且能够由任何参与者执行操作，并且在每个点都可以选择撤消已采取的操作，然后采取不同的路径。钱包模拟使用户可以从一个特定参与者的角度查看行为，从而在模拟一旦合同被部署在区块链商，该用户将如何与之交互。

这种简单性还使我们有可能在SMT求解器中对Marlowe合同建模，SMT求解器是一种用于自动检查系统属性的逻辑系统，我们称之为静态分析的模型。对于每个合同，我们都可以检查它是否履行付款，并且如果合同失败，我们将获得证明其失败的证据，从而帮助作者，如果他愿意的话，他可以重写合同。

我们可以在证明中建立正式模型，我们在其中可以生成机器检查的语言行为证明。当SMT求解器适用于单个合同时，校对助手可以证明合同模板以及系统本身的属性：例如，我们可以证明，在任何正在运行的合同中，它们引用的帐户永远都不会欠债。模拟，静态分析和证明为合同提供了补充级别的保证，用户将向其承诺资产以确保应有的合同行为。

**撰写Marlow合同**

我们已经看到了如何以各种方式分析Marlowe合同，但是作者如何在Marlowe中编写智能合同呢？Playground提供了几种产生Marlowe合同的方式。 用户可以直接编写Marlowe，但是初学者经常选择使用交互式Blockly编辑器以可视方式构建合同。 图2显示了托管合同的一部分。

 ![dJ-zghzDeRPn8R4_RhZU1G6ZFIGbNM3hNbbNDQ0jWnU2UqkEUXmPUzl38LEsJtXiuYWg_qx1-Hmk3YtlfiDSbDolq0uxp0IyqtGlZ00XnO-3jyH8krbIHcVwgJvSqZtlHmvmXUc](https://us1.discourse-cdn.com/flex023/uploads/cardano/original/3X/2/8/28bf29b73ee1ce5e3de16977e2bf868a37e17690.png)  
图2. Playground的交互式Blockly编辑器中的托管合同

使用可视化编辑器进行操作的优势在于，在您选择如何填写合同时，它们会显示所有选项。另外，您可以在Haskell中开发合同，因为Marlowe DSL实际上嵌入在Haskell中。图3在Haskell中显示了相同的合同：蓝色和紫色部分是Marlowe，黑色部分在Haskell中定义，是使整个合同更具可读性的缩写。这种方法允许用户从组件逐步建立智能合约。在图3所示的代码中，要求角色Alice和Bob做出选择：如果他们的选择匹配，则表示同意，并且合同以一种方式进行；如果不是，则请第三位参与者Carol在他们之间进行仲裁，在Haskell文件中定义合同协议和仲裁。

 ![noQ0kZD-cC625Ctd0ZA-eMmLGD4XpLuPZy4iOPz814CcIR6s72DpP_zsYtXVQG8Gg50jt2pZw5UXMnhNHBX9PQpkh3aUsma2Hr6h9MP326dX8CffmB3XQt0i2eCfG0fwSpWDDDs](https://us1.discourse-cdn.com/flex023/uploads/cardano/original/3X/4/f/4f18bf3cfd8f056c297061839ff3e10ae3e0f42a.png)  
图3. Haskell中的代管合同

用户还可以使用JavaScript编写金融智能合约，同时仍可以享受Marlowe提供的分析，模拟和证明的所有优势。

**预言机**

在描述Marlowe时，我们首先要问的问题之一是关于金融预言，或者我们如何获得合同以考虑外部数据值，例如ada和比特币之间的汇率。抽象而言，预言就像是做出选择的参与者一样，因此Marlowe的语义已经可以处理外部值。但是，我们计划在实施过程中支持预言值，允许合同直接从股票行情自动收录器或Coinbase等数据馈送访问值。同时，Plutus团队正在研究总体上处理预言的最佳方法，尽管可以在Marlowe和Plutus应用框架的第一个完整版本中获得支持，但我们可以在适当的时候期望对此提供支持。

**金融合同行为**

Marlowe有潜力在没有第三方协助的情况下使人们有机会做出财务承诺和交易：区块链确保遵守合同。

我们正在构建Marlowe非中介合同的实施方案，以提供给希望直接进行点对点金融交易而无需任何第三方干预的最终用户。

Actus金融研究基金会通过详细技术规范中描述的分类法对金融合同进行分类。Actus的理解是，金融合同是两个（或多个）交易对手之间就交换未来现金流量而达成的法律协议。历史上，此类法律协议是以自然语言描述的，从而导致歧义和人为的多样性。作为回应，Actus通过一组合同条款和确定性功能来定义合同，这些功能将这些条款映射到未来的付款义务。因此，可以通过31种合同类型或模块化模板描述大多数金融工具。

接下来，我们看一个简单的例子，然后我们解释实现Actus的完整方法，并通过补充方法了解不同的利弊。

**第一个Actus示例**

零息债券是不支付利息（息票）但以折扣价发行的债券，可赎回债券的全部面值时可在到期时获利。

例如，图4描述了一个合同，投资者可以在该合同中购买价格为1,000 lovelaces且折扣为15％的债券。她在开始时间（此处为第10个slot）之前向债券发行人支付了850 lovelaces。  
以后，到期日之后，这里的第20个slot，投资者可以将债券换成其全部名义价值，即1,000 lovelaces。

 ![erSUH71lK01M2LAVXXxoLxcJr5O8yYkN6qOCO5Z-2b_VoOt-YCNlv65EkCTWwgap4aoOkCFYVB7vFHRXcST3gARPogVv63pe4wTx1UXMRQ3c9N3SZjZa3PKIq1x2tB_CTrBgLZc](https://us1.discourse-cdn.com/flex023/uploads/cardano/original/3X/b/9/b9946df06f83952a8d0ef056340612008ffb23e9.png)  
图4.零息债券的合同，折扣为15％

该合同具有明显的缺点。一旦投资者存入了850 lovelaces，将立即支付给发行人；如果投资者的投资速度不够快（即在超时之前），则合同终止。此后，可能会有两个结果：

•发行人在投资者的帐户中存入1,000 lovelaces，并立即将其全额支付给投资者；

•如果投资者未存入资金，则合同将被关闭，合同中的所有资金将被退还，但此时合同中没有任何资金，因此投资者会损失其资金。

我们如何避免债券发行人违约的问题？至少有两种方法可以解决此问题：我们可以要求发行人在合同开始之前存入全部金额，但这首先会破坏发行债券的目的。我们可以请第三方作为交易的担保人，如此处所述。

 ![dVx0VPMwJxXQ3Mofj4VhOlnfl_JgLYP8dwvkDzdfnOvDH6al6alwtrlqeSO0TG2PKZLDh3u-mgVsLPufVRCnusHYFC7JOwhF2sHpZioxdPldylPmaFji5jnkEXu4YXNeS5MHh98](https://us1.discourse-cdn.com/flex023/uploads/cardano/original/3X/9/4/9477544019bf5f0a398dd7af7c1c672c99b7e61a.png)  
图5.与担保人的改进合同

Marlow中的Actus

Actus分类法中的产品（例如到期合同中的委托人）可以根据其在合同有效期内接受条款变更的程度在Marlowe中以不同的方式展示（图6）。

![image](https://us1.discourse-cdn.com/flex023/uploads/cardano/original/3X/4/0/4049796e065fd49312bb58c8fbd3b6bf8843f2af.jpeg)  
图6. Actus分类法和Marlowe

在最简单的情况下，所有现金流量都在合同启动时设置或冻结，因此如果所有参与者在合同有效期内继续参与合同，则完全可以预测合同的运作方式。我们将这种合同称为Actus-F（固定或冻结）。

动态性（即合同演变过程中的变化）可以两种方式发生。参与者可以进行计划外的付款，这需要重新计算剩余的现金流量，并且可以通过考虑外部风险因素来修改现金流量。这两种合同的均以Actus-M（适用于Marlowe）为模型。

但这也有中间状态：Actus-FS对固定时间表进行建模：允许考虑风险因素，但没有意外的付款；相反，Actus-FR合同允许在未预期的时间付款，但不考虑任何风险因素。

最后，在Marlowe之外，Actus-H（对于Haskell为H）将合同直接建模为Plutus或Haskell中的程序，使用Marlowe，根据合同逻辑的Marlowe描述生成Plutus代码来验证合同生命周期中的每笔交易。

为什么我们提供这些不同形式的Actus合同？原因是在于要在合同的动态性和我们可以向用户提供的在合同执行之前合同将如何执行的保证之间进行权衡。

•Actus-F合同提出了完全固定的付款时间表，参与者可以直接对其进行审查，以便直接看到，例如，该合同的所有付款都会成功。

•Actus-FS和-FR合同更具活力，但合同可读性强，易于审查。此外，他们需要接受（较慢的）静态分析，例如，可以确定所有付款都将成功。

•Actus-M合同以Marlowe表示，因此可以进行分析。但是，由于合同在任何特定时间点将要采取的行动具有不可预测性，因此分析速度要慢得多。请注意，可以为按比例缩小的合同版本提供保证，这些版本具有相同的计算内容，但是会在较短的时间内演变，因此涉及的交互较少。

•Actus-H合同是以Plutus和Marlowe的组合编写的，因此不适合以与其他合同相同的方式进行静态检查。但是，该平台为企业客户提供了Actus标准实施的完全可扩展性和量身定制的功能。

在我们的Actus实施中（可以在Playground的Labs选项卡中以预发行版使用），用户可以使用所需数据的直观表示，从合同条款中生成Actus-F和-FS合同。

 ![image](https://us1.discourse-cdn.com/flex023/uploads/cardano/original/3X/7/2/72f77bc0e7dca49c8a98cae7cb261a75e313cd2d.png)  
图7.三个带星号的选项是到期本金必须

对于到期合同的委托人，需要三个项目：开始和结束日期以及合同的名义金额（因此，这些项目将在模板中加注星标）。这样的合同将包含一个简单的负载，其中，名义金额在合同开始时从交易对手转移到交易方，并在到期日以相反的方向转移。

添加其他项目将相应地更改生成的合同。在图7中，当事方将不得不在到期日将名义金额和溢价转移给交易对手，从而使交易对手首先获得了发放贷款的动力。

**通过智能合约进入DeFi世界**

如我们所见，财务专业人员和开发人员现在可以根据他们的编程专业知识，直接在Haskell或纯Marlowe中，或者在视觉上使用Marlowe Playground开始创建金融智能合约。在Playground中，您可以模拟和分析您创建的合同，以测试它们是否正常运行，并在实施Cardano的Goguen阶段时准备将其发行到去中心化金融领域。 IOHK的Marlowe团队将继续实施Actus标准的示例，因为我们准备最终确定在Cardano上的Marlowe实施，并将金融智能合约引入区块链。

原文链接: [https://iohk.io/zh/blog/posts/2020/10/13/actus-financial-smart-contracts-in-marlowe/](https://iohk.io/zh/blog/posts/2020/10/13/actus-financial-smart-contracts-in-marlowe/)
