精通EOS:智能合约常见概念梳理

1、钱包、账户与权限

EOS 钱包里面只存放私钥,而且钱包有一个密码,需要输入密码才能解锁钱包,读取私钥。而账户里面有EOS Token以及智能合约,如果需要转移里面的 EOS Token 或者执行智能合约,你需要钱包中对应的私钥来解锁这个保险箱。

回忆一下创建账户的过程:

  1. 创建钱包

  2. 创建两个密钥对

  3. 导入私钥到钱包中

  4. 创建账户创建账户命令如下:cleos create account [OPTIONS] creator name OwnerKey [ActiveKey]OPTIONS 表示相关的选项,creator 表示为这个创建动作支付 EOS 的账户,即创建者;name 表示新创建的账户名;OwnerKey、ActiveKey 表示了两个公钥,它们具有不同的权限。其中 OwnerKey 权限是账户的最高权限,可以修改其它权限,ActiveKey 权限默认可以进行转账等操作,但不能修改权限。转账和智能合约等操作的执行都是在账户中进行的,所以账户名在 EOS 世界其实是以太坊的地址。与以太坊不同,EOS 的账户名不再是一串很长很长的地址,而是一个你可以自定义的英文字母+数字(12345)+符号(.),最长12位,最短1位,全局唯一,先到先得,长度不同注册需要的EOS也不一样。

借用一张图片来表示这些关系

《精通EOS:智能合约常见概念梳理》

2、EOS 系统资源

EOS 是 Enterprise Operation System 的简称,目标是区块链世界中的操作系统,所以一些概念和传统操作系统是类似的,其中计算机中的运行内存,在 EOS 中就可以看做是 RAM;而硬盘就可以对标 EOS 区块链数据库。

EOS 共有三大资源:CPU、NET(网络带宽)和 RAM(内存)。CPU 和 NET 需要临时抵押 EOS 获取,类似于交押金,不用了可以赎回 EOS,RAM只能用EOS直接购买,会在使用过程中被消耗掉。

对于高访问量的数据,例如账户余额、智能合约的当前状态等就会被存储在 RAM 中,并且这部分数据将长期占用 RAM;而低访问量的数据,例如交易数据,就会存储在EOS系统的硬盘中,也就是区块链中。当 RAM 不足时,转账或部署合约等相关操作就无法执行。

目前消耗 RAM 最多的场景就是 EOS 钱包的开户,其次就是转账和一些应用内的操作,因为 EOS 账号不是免费的,需要消耗 RAM。

3、什么是 WebAssembly

WebAssembly 是除了 JavaScript 以外,另一种可以在浏览器中执行的编程语言。这是由Google, Microsoft, Mozilla,Apple等几家大公司合作发起的一个关于面向Web的通用二进制和文本格式的项目。

WebAssembly 是一种新的字节码格式。它的缩写是 .wasm,.wasm为文件名后缀,是一种新的底层安全的二进制语法。它被定义为“精简、加载时间短的格式和执行模型”,并且被设计为Web 多编程语言目标文件格式。 这意味着浏览器端的性能会得到极大提升,它也使得我们能够实现一个底层构建模块的集合,例如,强类型和块级作用域。

但是,这并不意味着 WebAssmbly 是为了取代 JavaScript 而生的,就像 Bjarne Stroustup说的:“JS会活得很好,因为世界上只有两种类型的语言:一类语言被人们不断的地吐槽,而另一类语言压根儿没人用!” 而Eric Elliott认为:”最好不要把WebAssembly仅仅当做一门编程语言,实际上它更像是一个编译器。”

WebAssembly 也并不是只有 wasm 一种格式,它还有 wast 格式。这两种格式是等价的,最大的区别就是 wast 是可读文本格式的,而 wasm 是二进制格式的,他们可以通过工具相互转换。

在上一篇我的 hello 合约中,其中一步就是生成 Hello.wasm 和 Hello.wast 两个文件,大家可以看下这两个文件的内容。还有,如果大家浏览过 eos 合约目录,就会看到很多 .wasm和 .wast 文件。

4、什么是 ABI

ABI 是应用程序二进抽接口的缩写,是从区块链外部与合约进行交互,以及合约与合约之间进行交互的一种标准方式。它定义了函数签名、参数编码、返回结果编码等的规则。当合约被编译后,那么它的 ABI 也就确定了。

EOS中 ABI 的作用也和以太坊中大致类似,它定义了函数被调用的规则;定义了参数在调用者和被调用者之间是如何传递的。

5、合约核心概念

  1. action 与 transaction 的区别和联系。action 的执行环境被称为 action 上下文,action 上下文提供了执行 action 所需的一些条件,其中一个就是 action 的工作内存,这是 action 保存工作状态的地方。

  2. 在处理一个 action 之前,系统会先为它清理一次内存,因此当变量在一个 action 中被赋值后,另一个 action 的上下文是拿不到这个值的。在 action 之间传递状态的唯一方法就是把它持久存储到 EOS 数据库中。

    • action 是一个动作,账户和合约交互是通过 action 进行的,可以单独发送一个 action。每个action代表一条合约条款,实现了条款中的具体规则。

    • transaction 是一个或几个 action 组成的原子性操作,类似于传统环境下的事务。所有 action 全部成功,该 transaction 才会成功。

  3. 合约之间的交互模式合约之间有两种交互模式,即内联和延迟。

    • 内联,意思就是直接采用内部函数体发起,调用其他函数的方式。这可以保证交易无阻碍执行,不必通知外部失败或者成功结果,同时内联也可保证交易始终处于同一作用域以及权限。

    • 延迟,通过生产者的判定来决定延后按时执行,可能会发生超时的问题,但是这种方式可以跨多个作用域工作,并且可以携带着发送给它的合约权限。

  4. 合约之间数据传递智能合约之间通过 action 和共享数据文件来进行交互。

点赞