Zihao

Make small but daily progress

0%

EOS智能合约基础教程--EOS简介

EOS 是 Enterprise Operation System 的缩写,是为商用分布式应用设计的一款区块链操作系统。

EOS 是引入的一种新的区块链架构,旨在实现分布式应用的性能扩展。

EOS 它并不是像比特币和以太坊那样的货币,而是基于 EOS 软件项目之上发布的代币,被称为 「 区块链 3.0 」

EOS 的特点

  • EOS 的出块速度快,平均 0.5秒出一个块。通过并行链和DPOS的方式解决了延迟和数据吞吐量的难题,EOS是每秒可以上千级别的处理量,而比特币每秒7笔左右,以太坊是每秒30-40笔。

  • EOS 转账是没有手续费的!相对于其他币,在币价上涨后要承担的巨额转账费用,更受到普通用户的接受。

  • EOS 是天生的合约系统。EOS 是 EOS 软件系统上的通过合约发布的代币。EOS 目前有五个基础合约

    • eosio.bios

      合约用于管理链上的堆栈和非堆栈资源,通过确认用户持有的 token 控制资源分配,包括带宽、CPU 以及内存资源

    • eosio.token

      代币合约,只要加载这个合约,就可以轻松的发行一个代币

    • exchange

      交易所合约,模拟的是交易所的功能,支持充值提现 eos 和 currency,支持 eos 和 currency 之间的买卖,别有一番玩味

    • eosio.msig

      多用户签名和用户权限管理合约

    • eosio.system

      系统智能合约,可以进行很多系统级别的操作,比如用户投票、将用户注册成为生产者

适合谁学

本教程是专门为 EOS 合约初学者打造的,帮助他们理解与 EOS 合约编程语言相关的基础知识,和一些高级的概念。当然如需编写合约最好有一定的编程基础才容易理解。

准备工作

  • 推荐使用c++写合约
    基于 EOSIO 的区块链使用 WebAssembly( WASM )执行用户生成的应用程序和代码。WASM 是一种新兴的 Web 标准,得到了 Google,Microsoft,Apple 和行业领先公司的广泛支持。
    目前用于构建编译为 WASM 的应用程序的最成熟工具链是 clang/llvm 及其 C/C++ 编译器。为获得最佳兼容性,建议您使用 EOSIO C++ 工具链。
    所以说EOS 的合约开发语言是 C++,所以需要一点 C++的基础,不用太多。如果有开发经验,推荐迅速《C++语言导学》即可。

  • 第三方开发合约的工具链
    第三方开发的其他工具链包括:Rust,Python 和 Solidity。

  • 操作系统和环境(推荐mac或者ubuntu)

    • Amazon 2017.09 及更高的系统
    • Centos 7
    • Fedora 25 及更高版本( 推荐 Fedora 27 )
    • Mint 18
    • Ubuntu 16.04 ( 推荐 Ubuntu 16.10)
    • Ubuntu 18.04
    • MacOS Darwin 10.12 及更高版本(推荐 MacOS 10.13.x )

      ps:推荐mac或者ubuntu,如果 Windows 上进行开发,可以用VM 虚拟机或者 mingw/cygwin + docker

  • 推荐的编辑器和 IDE

      1. Sublime Text
      1. Atom Editor
      1. CLion
      1. Eclipse
      1. Visual studio code

一些基础概念

Action

一个智能合约可以定义多个Action,每个Action代表一次单独的操作,例如:转账、掷骰子、比较点数大小。

映射到代码中,可以将Action理解成类中的函数,函数中定义了调用Action时需要执行的操作。

智能合约与账户通过Action的方式进行通信。Action可以单独执行,也可以和其他Action一起作为一个整体执行。

例如:账户小王执行了【还钱】Action,【还钱】Action通知账户工商银行,执行【转账】Action,【转账】Action又通知账户【小李】,执行【短信通知】Action。

Transaction

Transaction是一个或多个Action的集合,一个Transaction中的Action要么全部成功,要么全部失败,从这个角度来看,Transaction与数据库中的“事务”非常像。

在前面Action的例子中,【还钱】Action、【转账】Action、【短信通知】Action可以都被包含在一个事务中。
下面是包含了多个Action的Transaction例子(关键字:actions)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"expiration": "2018-04-01T15:20:44",
"region": 0,
"ref_block_num": 42580,
"ref_block_prefix": 3987474256,
"net_usage_words": 21,
"kcpu_usage": 1000,
"delay_sec": 0,
"context_free_actions": [],
"actions": [{
"account": "eosio.token",
"name": "issue",
"authorization": [{
"actor": "eosio",
"permission": "active"
}],
"data": "00000000007015d640420f000000000004454f5300000000046d656d6f"
},{
"account": "...",
"name": "...",
"authorization": [{
"actor": "...",
"permission": "..."
}],
"data": "..."
}],
"signatures": [""],
"context_free_data": []
}

合约交互模式

EOSIO中提供了两种智能合约的交互模式,Inline(内联)和 Deferred(延迟)。

EOSIO中提供了两种智能合约的交互模式,Inline(内联)和 Deferred(延迟)。

Inline可以被理解为实时交互模式,在一个Transaction中所有的Action,实时调用顺序执行。

Deferred可以被理解为延时交互模式,TransactionA中的部分Action没有被立即执行,而是延迟一段时间后,由TransactionB来执行。

下面用一个具体的示例来说明两种模式。

假设有一个Employer(雇主)账户,希望通过它的payroll Action将工资发放给Employees(雇员)账户。

Inline模式

在Inline模式下,所有的Action是被实时顺序调用的,整个执行过程的时序图如下所示。

image.png

图中employer::runpayroll发起了发工资的请求,
employer::dootherstuff是雇主执行的其它操作,我们可以不用理会它。

第一步,employer::runpayroll执行inline action eosio::token::transfer,从Employer账户发送给Bank账户,并将需要收到工资的Employee账户信息保存在memo字段中。

第二步,eosio::token::transferaction修改了token的转账状态,并将memo字段的信息通知给Bank账户。

第三步,Bank账户部署了一个合约,用来监听eosio::token::transferaction的通知。当收到通知后,根据memo字段的内容通知对应的Employee账户。

第四步,Employee账户同样部署了合约监听eosio::token::transferaction的听通知。当收到通知后,执行inline action bank::doacctpolicy

第五步,Bank账户执行bank::doacctpolicyaction

Deferred模式

还是同样的场景,假设bank::doacctpolicy不是以inline模式调用,而是以deferred模式调用,时序图会改成下面这个样子。

image.png

从时序图来看,主要的区别:

bank::doacctpolicyaction并没有立即被执行,而是放到了一个队列(queue)中。
bank::doacctpolicyaction是在延迟一段时间以后,放在Defered Transaction执行的。
通过前面的描述,我们可以总结出inline模式与deferred模式的主要区别:

inline模式是实时执行action,而deferred模式是延时执行。
deferred模式下的action会被放到一个队列中,后续执行时再从队列中拿出来。
inline模式中的action是在同一个Transaction里,而deferred模式下action被分散到不同的Transaction里。

交易确认及限制

交易完成后,将生成交易收据,此收据采用散列形式。 接收交易散列并不意味着交易已被确认,它只意味着节点接受它而没有错误,这也意味着其他生产者很可能会接受它。通过确认,在交易历史记录中可以看到包含它的块编号的交易。

每个交易必须在30ms或更短时间内执行。 如果交易包含多个操作,并且这些操作的总和大于30毫秒,则整个交易将失败。 在没有对其操作进行并发性要求的情况下,可以通过在单独的交易中包含CPU消费动作来规避这种情况。

EOS 的工具结构

对于 EOS 项目,提供了三个主要的命令行工具,nodeos 、cleos 和 keosd,而对于 eosio.cdt则主要提供了 eosio-cpp 这个工具。

  • nodeos

    ( node + eos = nodeos ),EOS 节点工具。是核心 EOSIO 节点守护程序,可以配置插件来运行节点。

    在测试环境中,主要用途是生产块,提供了专用 RPC API 接口,大大方便了本地开发和部署 EOS 合约.

  • cleos

    (cli + eos = cleos), EOS 客户端。一个命令行工具,可以用来快速的与 EOS 区块链交互,还可以用来管理钱包。

  • keosd

    (key + eos = keosd),EOS 钱包管理工具。是一个将 EOSIO 密钥安全存储在钱包中的组件。

  • eosio-cpp

    合约编译工具 eosio.cdt 中最重要的工具,也是合约开发最常用的工具,用来将 C++ 代码编译为 WASM 并可以生成 ABI

这几个工具之前的关系如下图
image.png


相关资源:

  • 官网: https://eos.io/

  • EOS 开发资源 https://developers.eos.io/eosio-home/docs/introduction

  • eosio.cdt 工具 https://github.com/EOSIO/eosio.cdt

部分资料引自网络,如有需要可联系我修改

  • 本文作者: Zihao Yao
  • 本文链接: https://yaozihao.com/eos_basic_desc/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道