虽然智能合约(Smart Contract)这个词现在已经很流行了,但如果你问我到底什么是智能合约?我还真不能马上给出准确的答案,为此,我查看了 wikipedia 上关于 Smart Contract 的词条 (http://t.cn/RVQQ1Ja):

A smart contract is a computer protocol intended to digitally facilitate, verify, or enforce the negotiation or performance of a contract. Smart contracts allow the performance of credible transactions without third parties. These transactions are trackable and irreversible.

Proponents of smart contracts claim that many kinds of contractual clauses may be made partially or fully self-executing, self-enforcing, or both. The aim of smart contracts is to provide security that is superior to traditional contract law and to reduce other transaction costs associated with contracting.

可以看到,所谓智能合约中的智能,其实和人工智能中的智能(Intelligence)还是有很大的区别,之所以称之为智能合约,也许是因为它比传统的合约要先进,主要体现在以下几个方面

你相信合约就行了,不需要第三方参与
它是可追踪的,不可逆的
它是可以自动执行的
不要小看这几点特性,智能合约的普及,可以让人们在交易过程中更为透明,你和一个陌生人交易,不会再是一次博弈的关系,而是多次博弈,因为所有的交易记录都是可追踪的,试想以下,如果你在和别人交易时,事先就知道今后还会和这个人交易,你会选择合作还是背叛?当然是合作。所以,相比于传统的合约,智能合约可以减少交易成本(Transaction cost (http://t.cn/RDjUw0D)),从而整体的提升社会效率。

什么是 EOS 智能合约

在 EOSIO 开发者文档 (http://t.cn/RDjUT09) 中,有这么一段描述

A real-world contract, simply stated, is an agreement governing outcomes for actions, given a set of inputs. A contract can range from formal legal contracts (e.g., a financial transaction) to something as simple as the “rules” of a game. Typical actions can be things such as fund transfers (in the case of a financial contract) or game moves (in the case of a game contract).

真实世界的合约,简单来说,是一组协议,给予其输入一定的行为,它会产生相应的结果。从正规的法律合同(如金融交易)到简单的游戏「规则」都属于合约的范畴。典型的行为可以是转账(金融合约)或玩家的移动(游戏合约)。

An EOSIO Smart Contract is software registered on the blockchain and executed on EOSIO nodes, that implements the semantics of a “contract” whose ledger of action requests are being stored on the blockchain.

EOSIO 智能合约软件注册在区块链上,并在 EOSIO 节点上执行,它实现了「合约」的语义,并将合约的请求行为存储在区块链上,即请求账本。

EOS 定义的智能合约包含两个要素:代表合约的程序和执行合约时的行为。同时,阅读上面这段文字时,你很可能会把它和比特币系统对应起来,其实比特币是智能合约的一个特例:它只定义了转账合约,即接收 UTXO(Unspent Transaction Output)、验证签名及创建新的 UTXO;而该合约也只有一个行为——转账(发送UTXO)。

和比特币把 UTXO 记录在区块链上一样,EOS 也把所有的行为数据记录在了区块链上,唯一不同的是,EOS 是一个智能合约平台,它不仅支持转账合约,现在你能看到的 CPU、Bandwidth 抵押、RAM 人机交易市场、投票等都在其范畴之内,可以看到智能合约平台是非常具有想象力的,它提供了多样性,即便如此,它仍然由最基本的因素组成:代表合约的程序和执行合约的行为。从这个角度来看,EOS 仍然只是比特币的扩展,所以在学习中,牢记这两个要素,有助于在学习的过程中不至于迷失。

如何开发 EOS 智能合约

开发 EOS 智能合约,你需要完成该合约对应的程序,并将其上传到 EOS 平台上,计算机语言方面,目前智能合约只能用 C++ 开发,并将其编译成 WebAssembly 兼容的可执行程序,因为 Go 语言将支持 WebAssembly,所以未来你也可以使用 Golang 来写智能合约,除此之外,也有开发者正在将 EOS 接入 JavaScript 虚拟机和 Python 虚拟机,所以在不久的将来,开发智能合约将不再受 C++ 这座大山的限制。

即便现在只能使用 C++ 语言开发,要实现一个 EOS 智能合约也并不复杂,实际上你只需要开发该合约所提供的行为即可,从这个角度来讲,合约和行为的关系,就好比 WebService 和其提供的 Interface 之间的关系。假设目前 eosio.token 这个合约不存在,需要你来实现它,你会怎么做?eosio.token 这个合约主要完成了 EOSIO 平台中各种 token 的创建、发行和转账功能,所以你应该首先定义其具备的3个行为:

create:用于创建新的 token
issue:用于发行 token,有点像银行印钞的功能
transfer:让用户之间可以进行转账
同时,和应用程序提供的接口(interface)一样,你需要将所有的行为暴露出去,这样使用者才可以进行调用。EOSIO 为每个合约提供了统一的行为入口——apply 函数,你可以把它理解为 WebService 中的路由(routing),同时,为了方便开发,EOSIO 提供了一个宏,你只需要添加一行代码,就可以实现 apply 功能,如下:

EOSIO_ABI( eosio::token, (create)(issue)(transfer) )
以上代码将 create、issue 和 transfer 三个行为都暴露到了外部。也就是说,使用者要执行该合约,首先进入的是 apply 函数,然后根据具体的行为,再进入到不同的 create、issue 或 transfer 中运行。

为了完成 eosio.token 智能合约,我们已经实现了其所具备的行为,以及将这些行为通过 apply 函数暴露到外部,根据 EOSIO 对智能合约的定义,这里似乎少了点什么,的确,在实现的过程中,我们遗漏了最为关键的步骤:将用户请求智能合约的行为存储到区块链上。

大家都知道区块链是一种时间序列的链表式数据库,即它是一种以交易为单位、按照时间的顺序、以链表形式存储的数据结构,链表的特点是检索困难,所以通常区块链系统都会配备一个 KV 数据库来加速检索,EOSIO 也不例外,它提供一个仿 boost::multi_index(Boost 是扩展 C++ 的强大的功能库) 的数据结构,也叫 multi_index 数据库,这种数据库相比传统的 KV 数据库来说,优势在于它可以对同一份数据建多级索引,检索效率更高。

在 EOSIO 中,multi_index 数据库除了帮助加速检索外,它还是智能合约写区块链的桥梁,所以要写好智能合约,对 multi_index 的学习是必不可少的,相信你也猜到了,multi_index 使用的资源就是 EOSIO 系统中最重要的——RAM,更加说明了它的重要性。

下面这张图很好的说明了 EOS 处理智能合约的流程,从上至下,系统会依次执行每个合约,从左至右,对每个合约,系统会为其分配一个 apply 上下文,不同合约之间的上下文是隔离的,不会互相影响。

https://cdn.8btc.com/wp-content/uploads/2018/08/201808120317147387.png
以上,是你写一个 EOS 智能合约的要点,如果你读了这些内容后,觉得写一个智能合约不是什么难事儿,那么这篇文章的目的就达到了,下一步,你应该就可以阅读 contracts/eosio.token 下的代码了。

总结一下,这篇文章主要讲述了什么是智能合约,EOS 智能合约具体又指什么,以及写一个 EOS 智能合约的关键,它们是:

实现既定合约中包含的行为,将行为暴露给外部
学会使用 multi_index 数据库接口
稿源:巴比特资讯(https://www.8btc.com/article/250297)

什么是EOS智能合约相关推荐

  1. 原 EOS智能合约开发入门

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. EOS智能合约的开发需要使用llvm和abigen来生成abi文件. 为此eos提供了一个 名为eosiocpp的工具. ...

  2. c++ eos智能合约开发_十分钟教你开发EOS智能合约

    EOS环境搭建和启动节点 下面从EOS入门的环境搭建.编译运行一个智能合约.发送一些Aigsen,给大家做一些展示,希望能让非技术人员也有一些收获. 首先下载EOS环境搭建和启动节点.这一步其实还是比 ...

  3. 【许晓笛】 EOS智能合约案例解析(1)

    详解 EOS 智能合约的 hpp 文件 为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不 ...

  4. 十分钟教你开发EOS智能合约

    十分钟教你开发EOS智能合约 在CSDN.柏链道捷(PDJ Education).HelloEOS.中关村区块链产业联盟主办的「EOS入门及最新技术解读」专场沙龙上,柏链道捷(PDJ Educatio ...

  5. EOS智能合约授权限制和数据存储

    EOS智能合约授权限制和数据存储 在EOS合约中,调用合约需要来自账户的授权,同时还要指定需要调用的动作.当然,有的合约并不是所有账户都可以调用的,这就需要用到授权限制.接下来我们就来看看如何限制合约 ...

  6. c++ eos智能合约开发_[EOS智能合约]第二节:用EOS开发一个To-do List小应用

    EOS Asia 本教程原文作者为EOS Asia,亚洲最具技术实力和最国际化的EOS超级节点竞选者.EOS Asia 同时也是EOS Gems和Traffic Exchange Token这两个项目 ...

  7. 【许晓笛】 EOS 智能合约案例解析(2)

    详解 EOS 智能合约的 cpp 文件 之前的文章介绍了 eosio.token 智能合约的 hpp 文件,这次向大家介绍 eosio.token.cpp 文件,cpp 文件即 C++ 代码文件,智能 ...

  8. 【许晓笛】 EOS智能合约案例解析(1) 1

    详解 EOS 智能合约的 hpp 文件 为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不 ...

  9. eos智能合约执行流程

    eos智能合约执行 1. 执行流程 controller::push_transaction()  // 事务 -> transaction_context::exec()  // 事务 -&g ...

  10. EOS智能合约开发(四)EOS智能合约部署及调试(附编程示例)

    EOS的智能合约里面有一个action(动作)和transaction(交易)的概念. 对于我们开发以太坊开发者来说,基本上只有transaction的概念.如果我只要执行一种操作,而且是只读操作,就 ...

最新文章

  1. 论排列组合,持续更新
  2. php gtk中文介绍,PHP-GTK介绍及其应用_PHP教程
  3. 我的LAMP源码编译安装linux+Apache+mysql+php
  4. python安装xlrd和xlwt及应用
  5. 一分钟区分一流公司、二流公司、三流公司(转)
  6. 四、Angular新建组件和使用
  7. CoreAnimation-CATransform3D-1
  8. 计算机教师招聘试题(汇总集合版),计算机教师招聘试题(汇总集合版)ed.doc
  9. 《Redis开发与运维》学习第五章
  10. 用java写图形验证码,超级简单
  11. 什么是ROE、ROA和ROS?衡量企业盈利能力的比率有哪些?
  12. 【深度理解】如何评价GAN网络的好坏?IS(inception score)和FID(Fréchet Inception Distance)
  13. 关于vue使用print.js打印会有一个空白页的问题
  14. tssd加载lisp_几个有用的CAD的加载程序LISP
  15. js弹窗确认取消php,JS实现删除时的确认弹窗
  16. 如何清爽的安排日常?
  17. Python数据分析-绘图-2-Seaborn进阶绘图-6-回归图
  18. 算法笔记:找考试座位号问题
  19. 小学计算机课程目录五年级,小学五年级信息技术课件
  20. MicroATX 主板 定位孔位图

热门文章

  1. 你要知道的测试面试题
  2. 哈夫曼树的创建和哈夫曼树编码及解码
  3. 学习Struts框架系列(一):模拟Struts工作流程
  4. linux u盘插入事件,Linux 下监控USB设备拔插事件
  5. pacemaker和keepalived的区别
  6. ArcGIS填补栅格中空值
  7. 语言的翻译叫什么_翻译翻译,什么叫惊喜!
  8. 统计学中数据分析方法大全
  9. C语言-飞机航班订票系统
  10. 商用车SCR系统行业调研报告 - 市场现状分析与发展前景预测