2018-05-05 EOS上的李嘉图合约

这篇文章所涉及的主题,对于绝大多数关注 EOS 的人而言,是相对陌生而又熟悉的。

说陌生,是因为有多少人听说过李嘉图合约?
但是,李嘉图合约的一种潜在的实现,你可能已经看过很多次了,就是,Thomas Cox 在陆续更新的宪法草案。我认为随后在主网上线之前,1号宪法会以李嘉图合约的形式,加入到eosio的系统合约之中,用于明确各方参与者的意图,至于具体的代码实现方式如何,我还无法猜到。

之所以这么认为,是因为Ian Grigg,既是李嘉图合约的创造者,也是EOS的合伙人。四个月之前,他写了一篇文章: towards a ricardian constition, 就是提到的如何用李嘉图合约来构建宪法。

正如 EOS 白皮书中所提到的,所有的交易,都会是基于对宪法同意的基础之上进行的。这就意味着,实际上,在 EOS 启动之后,你所有的链上行为,都会是涉及到李嘉图合约。

顺便说一下,我最近的研究方向,聚焦在 EOS 和区块链的链上治理方面,有感兴趣的朋友,可以一起交流。 正如我之前所发的一篇文章所写到的, EOS 吸引我的,不只是涨价的预期,链上的开发,更重要的是,提供了一种人类协作治理的可能性,一种新型商业甚至社会组织的可能性, 这更加迷人。忍不住又要奶柚子了,先打住。

概述

李嘉图合约是一种特殊的结构化文本,主要用作交易中明确双方的意图。关于李嘉图合约的详细内容,要展开来讲,恐怕需要五万字左右的篇幅。在本篇文章中,我结合 EOS 的例子,来介绍一下,如何将李嘉图合约与智能合约结合,将人类意图与机器执行更好的融合。我相信,随着 EOS 的生态的发展,你会经常接触到各种类型的李嘉图合约,转账,会涉及到李嘉图合约;参与金融交易,也可能涉及到李嘉图合约。尽管,也许你不一定留意得到。

李嘉图合约要解决什么问题?

区块链上智能合约存在的一个问题是,在涉及到交易双方意图类型的问题时,仅靠代码本身,是无法良好处理这一问题的。

对于有一些概念的理解和厘清,类似现实世界之中的交易合同的约定,有时候仅靠智能合约是无法做到的。这时候,具有法律效应的文本合约,结合依赖区块链技术开发的智能合约,这两者结合,会带来更多的准确性。既能够避免意图的混淆,也可以充分利用了智能合约的自动和高效的特征。

在EOS上,是通过一种叫做李嘉图合约的结构化文本来实现的。

在EOS上,你所发送的每一条action,都是可以附加上合约。这种合约很特殊,有着固定的格式,既能够被程序读取,也能为人类阅读。这一合约,就叫做李嘉图合约。

李嘉图合约的历史和相关文献介绍

李嘉图合约出现比比特币还要早,在2000年就已经出现了,最早见于Ian Grigg的论文: 金融密码学的七层模型。李嘉图合约最初由Ian Grigg和Gary Howland开发, 用作 Ricardo支付系统的一部分。后来,李嘉图合约也应用到更多的系统之中,比如 比特币同时代的OpenBazaar 系统。

关于李嘉图合约的中文资料,少之又少。我一个月之前就想着开始介绍这部分内容,但是实在是精力有限,仍未开始。最近读到 EOS 技术爱好者团队所翻译的 "李嘉图合约" 这一论文的中文版,感兴趣的朋友推荐读一下。https://www.jianshu.com/p/3b45c92e86af

按照Ian Grigg的这篇论文所述,他创造李嘉图合约的初衷在于,解决金融工具发行时候所遇到的固有问题,他认为,每一种工具都有着不同的地方需要注意,而传统的方式不足以达到这一目的。

Ian Grigg对于 李嘉图合约的核心认知可以概括为一句话: 合约即发行。所有发行的金融工具,不论是债券,或者股票,或者是数字资产,把合约与发行合一。

“我们的创新是将发行的工具表示为合约,并将该合约链接到支付系统的各个方面。在此过程中,由该工具的发行者起草并数字化签署了一份具有广泛用途的文件(由用户和程序可读)。该文件,即李嘉图合约,构成了理解这个发行以及该发行中每项交易的基础。”(李嘉图合约,1.3: 解决方式,https://www.jianshu.com/p/3b45c92e86af)

对于李嘉图合约的定义,Ian Grigg认为:

In the simplest possible terms, a Ricardian Contract is a document defining a type of value for issuance over the Internet [11]. It identifies the Issuer, being the signatory, and any terms and clauses the Issuer sees fit to add in to make the document stand as a contract.

“用最简单的术语来说,李嘉图合约是一个文件,定义了通过互联网发行的某种类型的价值。它标识发行人和签署人,将发行人认为合适的期限和条款加入其中,从而让该文件成为合约。”(https://www.jianshu.com/p/3b45c92e86af))

这里对李嘉图合约的介绍,可能挂一漏万,可以参考一下Ian Grigg的论文和相关的一些文章:

  • Why Go Full Ricardian - the digital contract
  • Towards A Ricardian Constitution
  • Ricardian contracts
  • Implementations of Ricardian Contracts
  • Financial Cryptography in 7 Layers
  • On the intersection of Ricardian and Smart Contracts

李嘉图合约与智能合约有什么区别?

两者的区别在于,李嘉图合约是为了更明确智能合约的意图的,可以看作是对于智能合约的一个补充。要想在商业场景之中使用eos,会存在一些无法通过程序来判定的情况。但是,将李嘉图合约加到智能合约之中,可以用文本结合程序的方式,确定合约的调用者明确了合约的意图并且同意。

实例:EOS 智能合约之中的李嘉图合约

在EOS 的github代码库中,提供了关于Ricardian 合约的实例,位于智能合约hello之中。我们花一点时间来看一下,在hello合约之中的李嘉图合约是什么样的。

主要涉及到这几个文件:

上图中markdown文件,就是hello这个合约之中的李嘉图合约了。
其中,abi文件,

1. 李嘉图合约实例

在当前见到的示例实现中,李嘉图合约分为两部分:针对合约整体的条款部分(合约名_rc.md 的文件中描述),以及针对智能合约之中的具体某个action的细则部分(合约名.action名称_rc.md的文件之中描述)。

比如,在hello合约之中, hello_rc.md就是针对hello这一智能合约的条款描述的部分,而hello.hi_rc.md文件,则是对hello合约之中的hi 这一动作(action)的描述。

[hello_rc.md] (https://github.com/EOSIO/eos/blob/master/contracts/hello/hello_rc.md)这一文件之中,定义了14个条款(clauses). 由于这里的条款只是作为李嘉图合约的示范例子,本身的内容与hello合约并没有直接的关联。你可以简单看下就好。

hello.hi_rc.md 文件如下:

# CONTRACT FOR hello::hi

## ACTION NAME: hi

### Parameters
Input parameters:

* `user` (string to include in the output)

Implied parameters: 

* `account_name` (name of the party invoking and signing the contract)

### Intent
INTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect.

### Term
TERM. This Contract expires at the conclusion of code execution.

在这十九行内容中,对输入参数和隐含参数(account_name, 调用合约和签署合约的账户名称)进行了说明,并且,对于意图(Intent) 和 时效(Term) 也进行了细节的完善。

通过这一李嘉图合约,我们能够知道,hello合约的hi action,只是用于打印输出的,无其他作用。而且,该合约在代码执行结束之后就失效了。

2. 将李嘉图合约附加到智能合约中

EOS 会为每一个合约生成abi文件,即二进制的接口,命令行终端可以通过这一接口调用区块链上的智能合约。

对于hello这一智能合约而言,会将hello_rc.md中的内容,加入到abi之中的ricardian_clauses的内容之中;将hello.hi_rc.md中的内容,附加到abi文件中对应的hi action的json之中.

如下图所示。

定义的代码如下:

[DAIMAa]

注意,如果你自己要写智能合约的话,对应的李嘉图合约的格式要求比较严格,就像是python的空格一样,有固定的要求。可以参考hello合约中的李嘉图合约的样式。

结语

在这篇文章之中,我们对李嘉图合约进行了基础介绍,并结合hello的示例合约的例子,看到了在 EOS 的智能合约之中,是如何写李嘉图合约的,也知晓了 EOSIO 的系统是怎样将李嘉图合约附加到智能合约上的。

我相信官方应该会在一两周之内,出一份文档教程,介绍李嘉图合约,到时候应该会有更多的指导。

感谢你的耐心阅读。

你可能感兴趣的:(2018-05-05 EOS上的李嘉图合约)