传送门: 柏链项目学院


  EOS的智能合约与以太坊区别很大, EOS 的智能合约基于 WebAssembly(WASM) 技术执行用户生成的应用程序和代码。WASM是一项新兴的网络标准,得到了谷歌,微软,苹果等公司的广泛支持。目前,用于构建编译为WASM的应用程序的最成熟工具链是使用C / C ++编译器的clang / llvm。目前EOS的智能合约仅支持C和C ++编写。我个人认为,EOS的智能合约相较于以太坊的智能合约上手难度要更大一些。一个简单的EOS智能合约都要由多种种文件构成,而以太坊的solidity就相对简单了。

智能合约文件组成

  前面说到了EOS智能合约需要多种文件组成,接下来我们来看看是哪几种文件。

  通常一个简单的智能合约需要有.cpp、.hpp、.abi这几种文件,其中.hpp文件是包含.cpp文件引用的变量、常量和函数的头文件。.cpp文件是包含合约功能的源文件,用来实现智能合约的功能和动作等。abi文件是应用程序二进制接口文件,是一种基于JSON的描述,通过ABI描述合约,开发人员和用户可通过JSON无缝地与智能合约进行交互。而wasm是一种字节码,wasm字节码既可以编译成机器码后执行,又可以使用解释器直接执行, 兼容性和性能兼有。

hello智能合约

  了解了各种文件的功能之后,我们来解析一下最简单的hello智能合约。

  • hpp文件

  此hello合约比较简单,也可以不写hpp文件,把类与成员定义在 cpp 文件中。

  • hello.cpp
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp> using namespace eosio; class hello : public contract {
public:
using contract::contract; [[eosio::action]]
void hi( name user ) {
print( "Hello, ", user);
}
}; EOSIO_DISPATCH( hello, (hi))

  前面几行不用多说,都是c++基本语法。我们重点看“[[eosio::action]]”后面的几行代码。那么问题来了,什么是action呢?action意为动作。在EOS中,智能合约的方法称为动作,在这里,“hi”就是这个智能合约的动作。当有其他账户调用此合约时,合约回打印hello回应他。一个 EOS 合约中可以有多个动作action,当EOS接收到一个事务后,会将该事务分发给相应的合约,或者说,调用相应的合约的动作。为了确保合约的哪个动作可以调用,需要使用 EOSIO_DISPATCH 宏来告诉 EOS。EOSIO_DISPATCH 宏在 <eosiolib/dispatcher.hpp>头文件中定义,该宏的第一个参数是合约的名字,第二个参数,是多个小括号()扩起来的多个动作的方法名。

  • hello.abi

  hello.abi文件通过eosiocpp工具产生,我们来看看它的内容

{
"____comment": "This file was generated with eosio-abigen. DO NOT EDIT Tue Nov 20 18:39:18 2018",
"version": "eosio::abi/1.0",
"structs": [
{
"name": "hi",
"base": "",
"fields": [
{
"name": "user",
"type": "name"
}
]
}
],
"types": [],
"actions": [
{
"name": "hi",
"type": "hi",
"ricardian_contract": ""
}
],
"tables": [],
"ricardian_clauses": [],
"abi_extensions": []
}

可以看出abi文件中的数据大概可以分为这么几类:

  • types
  • structs
  • actions
  • tables
  • ricardian_clauses

  types应该是合约的类型,structs应该是合约中交易的数据结构,actions里包含了合约的所有动作,tables中应该是合约存储的数据结构,用于定义合约的数据存储。而ricardian_clauses则是李嘉图条款,李嘉图条款是人和机器都能读懂的,此hello合约中为空。

  总而言之,EOS的智能合约编写难度还是比较高的,据说一些积极的第三方也在开发其他语言,很期待编写智能合约变得简单。


EOS之hello智能合约解析的更多相关文章

  1. Eos的Wasm智能合约的局限性

    官方只支持用C++写智能合约 用C++写智能合约门槛过高,会把许多开发者挡在门外,C++的复杂性也会让智能合约的设计变得困难. Wasm智能合约的效率并不是最优 由于C++最终也是编译成wasm字节码 ...

  2. EOS之记事本智能合约

    EOS记事本智能合约 本次分享的内容是一个记事本合约,调用合约中的写入动作可以将文本和作者保存到数据库中,通过记事本合约来学习EOS智能合约数据存储当中的主键自增. 合约动作 写入动作 记事本合约必须 ...

  3. EOS测试链智能合约部署调用

    ETH与EOS两者智能合约进行简单的对比. 1.编译智能合约(合约编译成.wasm与.abi格式后即可部署到区块链) [root@C03-12U-26 testcontract]# cat testc ...

  4. 【精】EOS智能合约:system系统合约源码分析

    系统合约在链启动阶段就会被部署,是因为系统合约赋予了EOS链资源.命名拍卖.基础数据准备.生产者信息.投票等能力.本篇文章将会从源码角度详细研究system合约. 关键字:EOS,eosio.syst ...

  5. EOS技术研究:合约与数据库交互

    智能合约操作链数据库是很常见的应用场景.EOS提供了专门的工具来做这件事(相当于Ethereum的leveldb),专业术语叫做持久化API,本文将完整严密地介绍这个工具以及对它的使用测试. 关键字: ...

  6. EOS基础全家桶(十三)智能合约基础

    简介 智能合约是现在区块链的一大特色,而不同的链使用的智能合约的虚拟机各不相同,编码语言也有很大差异.而今天我们开始学习EOS的智能合约,我也是从EOS初期一直开发合约至今,期间踩过无数坑,也在Sta ...

  7. 【精解】EOS智能合约演练

    EOS,智能合约,abi,wasm,cleos,eosiocpp,开发调试,钱包,账户,签名权限 热身 本文旨在针对EOS智能合约进行一个完整的实操演练,过程中深入熟悉掌握整个EOS智能合约的流程,过 ...

  8. [转]EOS智能合约 & 私链激活 & 基本操作

    链接:https://www.jianshu.com/p/90dea623ffdf 简介 本篇文章,将跟大家介绍eos私链的激活.基础智能合约的安装,以及为大家演示转账等基础操作.还没有安装eos私链 ...

  9. EOS智能合约存储实例讲解

    EOS智能合约存储实例 智能合约中的基础功能之一是token在某种规则下转移.以EOS提供的token.cpp为例,定义了eos token的数据结构:typedef eos::token<ui ...

随机推荐

  1. Android之webview详解

    文章大纲 一.webview基本介绍1.什么是webview2.为什么要使用webview3.webview基本操作 二.webview高级使用1.WebView状态2.资源加载3.WebView加载 ...

  2. Unable to get the CMake version located at

    出现这个问题说明你没有安装CMake,这个是使用NDK的时候需要下载的,可以在as上点击下载, SDK Tool里面

  3. AMBARI Blueprint 使用文档

    Introduction Notable JIRAs API Resources and Syntax Blueprint Usage Overview Step 0: Prepare Ambari ...

  4. 网卡的 Ring Buffer 详解

    1. 网卡处理数据包流程 网卡处理网络数据流程图: 图片来自参考链接1 上图中虚线步骤的解释: DMA 将 NIC 接收的数据包逐个写入 sk_buff ,一个数据包可能占用多个 sk_buff , ...

  5. AI - TensorFlow - 第一个神经网络(First Neural Network)

    Hello world # coding=utf-8 import tensorflow as tf import os os.environ[' try: tf.contrib.eager.enab ...

  6. c语言-自己写的库

    一.俗话说算法是程序的灵魂,这下面本人写了一部分常用算法,欢迎大家使用,并提出批评和指正,当然也可以改进或者添加. 1.这是自己实现的算法库头文件 #ifndef _INC_ALGORITHM #de ...

  7. 机器学习基石笔记:01 The Learning Problem

    原文地址:https://www.jianshu.com/p/bd7cb6c78e5e 什么时候适合用机器学习算法? 存在某种规则/模式,能够使性能提升,比如准确率: 这种规则难以程序化定义,人难以给 ...

  8. 剑指Spring源码(二)

    这是春节后的第一篇博客,我在构思这篇博客的时候,一度想放弃,想想要不要换个东西写,因为毕竟个人水平有限,Spring源码实在博大精深,不是我这个菜的抠脚的菜鸡可以驾驭的,怕误人子弟,还有就是源码分析类 ...

  9. Entity Framework Core 2.1,添加种子数据

    EFCore 2.1出来有一段时间了,里面的新功能还没怎么用,今天研究下如何使用EF Core 2.1添加种子数据. 这部分的官方文档地址是:https://docs.microsoft.com/en ...

  10. springboot~基于单元测试的mongodb

    添加对应版本的包 testCompile('de.flapdoodle.embed:de.flapdoodle.embed.mongo:1.46.0') 在测试之前,它会根据你的操作系统去下载当前的m ...