1、简介

随着EOS Dawn 3.0发布,智能合约的坑又要重新踩了o(╥﹏╥)o;
3.0不仅将原来本身就在链里的基础合约独立出来,简单的介绍见3.0合约改变,合约的书写方式也有巨大变化,相比之前更加“面向对象”;
这边文章就从最简单的hello合约,讲解下,详细的例子会在之后文章介绍;

2、2.0的合约格式

先来看看2.0的最基础的智能合约如何编写:

  1. #include <eoslib/eos.hpp>
  2. namespace hello {
  3. /**
  4. * @abi action
  5. * @abi table
  6. * 上面两行,分别用于在执行eoscpp -g的时候,自动生成action和table
  7. */
  8. struct printinfo {
  9. account_name sender;
  10. eosio::string info;
  11. };
  12. void print_hello ( const hello::printinfo& data ) {
  13. require_auth(data.sender);
  14. eosio::print( "Hello World: ", eosio::name(data.sender), "->", data.info, "\n" );
  15. }
  16. }
  17. extern "C" {
  18. /**
  19. * init为初始化函数,当合约上传或更新的时候执行。
  20. */
  21. void init() {
  22. eosio::print( "Init World!\n" );
  23. }
  24. /// apply函数,执行合约的时候,调用该函数,并根据code、action选择的进行的操作。
  25. void apply( uint64_t code, uint64_t action ) {
  26. if( code == N(hello) ) {
  27. if( action == N(printinfo) ) {
  28. hello::print_hello( eosio::current_message<hello::printinfo>() );
  29. }
  30. } else {
  31. assert(0, "unknown code");
  32. }
  33. }
  34. } // extern "C"

重要地方都已经给出解释,以后该格式也不是重点,也不在多解释。

2、3.0的合约格式

而3.0的智能合约更加的“面向对象”,来看看和上面功能一样的智能合约在3.0下的实现方式:

  1. /**
  2. * @file hello.cpp
  3. * @author redbutterfly
  4. */
  5. #include <eosiolib/eosio.hpp>
  6. #include <eosiolib/print.hpp>
  7. using namespace eosio;
  8. class hello : public eosio::contract {
  9. public:
  10. using std::string;
  11. using contract::contract;
  12. /// 执行eosiocpp 时生成action
  13. /// @abi action
  14. void printinfo( account_name sender, std::string info ) {
  15. eosio::print( "Hello World: ", name{data.sender}, "->", data.info, "\n" );
  16. }
  17. private:
  18. /// 执行eosiocpp 时生成table
  19. /// @abi table
  20. struct message {
  21. account_name sender;
  22. std::string info;
  23. /// 序列化该结构,用于table时候查询
  24. EOSLIB_SERIALIZE( message, (sender)(info) )
  25. };
  26. };
  27. EOSIO_ABI( hello, (printinfo) )

可以看出,这种格式比较舒适,面向对象的风格;

  • 首先,定义继承自contract的智能合约结构体,在public下实现智能合约的action接口,然后在private下实现table等结构(注释中的@还是需要添加)
  • 其次,在定义结构体的时候,需要使用EOSLIB_SERIALIZE( structname, (param)...),将结构体进行序列化,table存储的时候,才能正常序列化;
  • 最后,使用EOSIO_ABI(classname, (action)...),同样序列化操作,在abi生成的时候,正确生成abi;

3、生成合约文件

生成合约的方式依然没有变:

  1. eosiocpp -g hello.abi hello.cpp //生成abi文件
  2. eosiocpp -o hello.wast hello.cpp //生成wast文件

然后,使用cleos set contract hello ./hello -p hello部署即可

3、总结

本篇主要简单描述下,EOS Dwan 3.0下,智能合约的新编写方式,下篇写简单数据库功能的智能合约。

作者:redbutterfly
链接:https://www.jianshu.com/p/03d8b096340c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

EOS Dawn 3.0 智能合约 -- 新格式的更多相关文章

  1. [blockchain-035]eos的部署安装智能合约

    0.参考资料 https://github.com/EOSIO/eos/wiki 1. eos的github地址 https://github.com/EOSIO/eos 2.下载eos源码 git ...

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

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

  3. eosio.cdt:EOS智能合约工具集

    目前EOS已经迎来了1.5.x时代,很多内容都有了较大的改变.其中智能合约的工作流程发生了改变,EOSIO为智能合约提供了独立且功能完整的工具集eosio.cdt.该工具集基于WASM平台,可解耦于e ...

  4. 比特股-去中心化交易所, STEEM - 去中心化社区, EOS - 下一代智能合约

    libsnark 是实现了 zkSNARK 模式的 C++ 库.zkSNARK 是一个证明/验证计算完整性的加密方法,也即零知识验证的算法, https://github.com/scipr-lab/ ...

  5. Truffle 4.0、Geth 1.7.2、TestRPC在私有链上搭建智能合约

    目录 目录 1.什么是 Truffle? 2.适合 Truffle 开发的客户端 3.Truffle的源代码地址 4.如何安装? 4.1.安装 Go-Ethereum 1.7.2 4.2.安装 Tru ...

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

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

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

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

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

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

  9. EOS开发基础之六:使用cleos命令行客户端操作EOS——智能合约之eosio.msig和eosio.system

    上一节我们搞了老半天,也没整明白Exchange这个合约到底干啥用的.就它官方提供的说法,是用于货币的创造和交易.我没整明白,所以去看了下代码,发现代码头文件里面有下面这段话: This contra ...

随机推荐

  1. 【NOI 2005】 维修数列

    [题目链接] 点击打开链接 [算法] 本题所运用的也是Splay的区间操作,但是实现较为困难 INSERT操作             将pos splay至根节点,pos+1 splay至根节点的右 ...

  2. RadioGroup和RadioButton

    Activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  3. MongoDB 用户名密码登录

    Mongodb enable authentication MongoDB 默认直接连接,无须身份验证,如果当前机器可以公网访问,且不注意Mongodb 端口(默认 27017)的开放状态,那么Mon ...

  4. windows上搭建php环境

    在Windows 7下进行PHP环境搭建,首先需要下载PHP代码包和Apache与Mysql的安装软件包. PHP版本:php-5.3.2-Win32-VC6-x86,VC9是专门为IIS定制的,VC ...

  5. CClientDC类 CWindowDC类

    CClientDC类 CClientDC类也是CDC类的派生类.它只能在窗口的客户区(即窗口中除了边框.标题栏.菜单栏以及状态栏外的中间部分)中进行绘图,坐标点(0,0)通常指的是客户区的左上角.它的 ...

  6. J20170509-hm

    インスペクタ  巡查员 スライス   切片

  7. 51nod 1103【鸽巢原理】

    思路: 这道题嘛有些弯还是要转的,比如你说让你搞n的倍数,你别老老实实照她的意思去啊,倍数可以除法,取膜 . 因为n个数我们可以求前缀和然后取膜,对n取膜的话有0-n-1种情况,所以方案一定是有的,说 ...

  8. Unity3D NGUI UIPlayTween(原UIButtonTween)动画事件详解

    http://blog.csdn.net/asd237241291/article/details/8507817 原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术 ...

  9. jQuery笔记之热点搜索排名小demo

    先来看一下成品图: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  10. 在IDEA中使用JSP中的out内置对象,out.println()——println红色解决方法

    今天在学习JSP的时候,在jsp中使用out内置对象,开发工具用的是IDEA,结果如下图所示 郁闷了半天找度娘,可能关键字输的不准确,乱七八糟的方法一大堆,什么加依赖啊啥的,反正都不管用,最后找到一篇 ...