EOS开发入门

  在上一篇文章《EOS开发环境搭建》中,我们已经完成了EOS开发环境的搭建,本次为大家带来的是EOS开发入门的相关内容。

1. EOS的合约开发基础

  智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。

1.1 所需知识

  • 熟悉或了解C++14的基本语法,这部分技能需要掌握,短时间内无法搞定。
  • 了解abi(The Application Binary Interface)文件,基于json格式的,描述合约的接口

1.2 c++与智能合约部分语法

  • require_auth——

    require_auth(name user): 验证用户是否有签名
  • [[eosio::action]] action声明的特殊标记
  • asset 是eos官方提供的一个结构体,内部主要有2个元素:amountsymbol
  • eosio_assert( expr, "errmsg" ) 验证表达式是否位置,类似于以太坊的assert
  • [[eosio::table]] table声明的特殊标记,在结构体声明中使用
  • multi_index 是eos提供的一个数据库存储结构,可以支持多个索引,同样有增删改查接口
struct [[eosio::table]] task {
uint64_t taskID;
name creator;
name worker;
asset bonus;
uint8_t status = 0;
string remark;
string comment; uint64_t primary_key()const { return taskID; }
}; typedef eosio::multi_index< "tasks"_n, task > tasks;
//tasks 是最终的表名字,task是结构体名字
  • multi_index可以使用 findemplacemodifyearse四个接口,使用时需要先用tasks定义变量
tasks tk( _code, _code.value );

    tk.emplace( creator, [&](auto &t){
t.creator = creator;
t.worker = worker;
t.taskID = tk.available_primary_key();//主键自动增长
t.bonus = taskBonus;
t.remark = memo;
});

1.3 理解abi文件

  这是一个空的abi文件

{
"version": "eosio::abi/1.0",
"types": [],
"structs": [],
"actions": [],
"tables": [],
"ricardian_clauses": [],
"abi_extensions": [],
"___comment" : ""
}
  • types 新类型定义
  • structs 合约内结构体定义
  • actions 合约内动作定义,注意在合约中需要使用特殊的标记才能在abi中得到
  • tables 合约内表结构定义,注意在合约中需要使用特殊的标记才能在abi中得到
  • ricardian_clauses 李嘉图条款
  • abi_extensions 扩展

  其中structsactionstables可以认为是abi文件的三要素,每个合约内可以有多个action,每个action会执行这样那样的逻辑,需要借助结构体的结构将信息存储或变更保存在区块链中,这个保存的数据我们类比为传统数据库中的表,也就是tables。我们学习智能合约编写主要要写什么?其实就是写一个一个action,类似于rpc中的微服务。与传统数据库编程一样,我们同样也是围绕着table做增删改查操作。

2. EOS的hello智能合约

2.1 编写hello合约

  • 合约代码如下
#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))

上例中hello是我们的类名,需要继承eos为我们提供的基类contract,[[eosio::action]]是一个特殊用法,定义一个action必须在函数声明前加上此标记。hi这个函数就是一个 action,本例实现的就是一个打招呼的action,根据输入的不同用户进行打招呼。

EOSIO_DISPATCH( hello, (hi)) 是生成action的关键,EOSIO_DISPATCH是eos提供的宏,hello显然就是类名,(hi)就是要生成的action,如果多个action,采用相同格式在后面添加。

2.2 hello合约的部署和调用

  • 使用eosio-cpp编译hello合约,这个就来自于cdt工具包
eosio-cpp -o hello.wasm hello.cpp --abigen

  • 创建hello合约账户
cleos create account eosio hello YOUR_PUBLIC_KEY -p eosio@active
  • 部署hello合约
cleos set contract hello ./hello -p hello@active

  • 调用hello合约
//先创建一个普通账户bob
cleos create account eosio bob YOUR_PUBLIC_KEY -p eosio@active
//bob调用hello合约的hi动作
cleos push action hello hi '["bob"]' -p bob@active

  到这一步,一个简单的hello智能合约就部署并调用完成了,快来试试吧。下次将为大家分享关于EOS开发实战的内容,敬请关注。



EOS开发入门的更多相关文章

  1. EOS开发环境搭建

    EOS开发环境搭建   在上一篇文章<扒一扒EOS的前世今生>中,我们已经了解了EOS以及他的创始人Daniel Larimer的故事,本次为大家带来的是关于EOS开发环境搭建的内容.首先 ...

  2. EOS开发实战

    EOS开发实战   在上一篇文章<EOS开发入门>中,我们为大家介绍了EOS的节点启动和合约部署和调用等入门知识.本次我们来实现一个复杂的例子,可以为其取一个高大上的名字-悬赏任务管理系统 ...

  3. openresty 前端开发入门五之Mysql篇

    openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysql获取数据,并返回给用户 操作mysql主要用到了lua-resty-my ...

  4. java WEB开发入门

    WEB开发入门 1 进入web JAVASE:标准- standard   JAVA桌面程序 GUI    SOCKET JAVAEE:企业-浏览器控制  web 2 软件结构 C/S :client ...

  5. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解

    原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...

  6. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  7. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

  8. VR原理讲解及开发入门

    本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持.   1. VR沉浸感和交互作用产生的原理:   在之前,我们观看一个虚拟的创造内容是通过平面显示器的,52VR ...

  9. Eclipse_luna_J2EE_For_JS+tomcat8.0环境搭建、配置、开发入门

    一.所有需要的软件.插件等下载地址 J2SE的官方下载路径:http://www.oracle.com/technetwork/java/javase/downloads/index.html Ecl ...

随机推荐

  1. Changes of user relationship in AD can't be correctly synchronized to SCSM

    The relationship of users might be not correctly updated if related users were once re-named in AD o ...

  2. Android Jetpack之AppCompat(一)

    今天我们来聊一聊有关AppCompat,作为Android Jetpack系列文章的开篇.说到Android Jetpack,我们先看一下这张图: 从图中我们可以看到,整个Android Jetpac ...

  3. 章节十、7-Xpath---Xpath中绝对路径相对路径的区别

    以下演示操作以该网址中的内容为例:https://learn.letskodeit.com/?_ga=2.143454972.85111248.1555037144-697706367.1554889 ...

  4. 【转载】Sqlserver数据库备份的几种方式

    在实际的数据库Sqlserver的运维的过程中,很多时候我们需要做到数据的备份操作,可以做到定时备份,也可以进行手动数据库备份.在实际的过程中,有时候因业务需要备份出完整数据库,而有时候又因为实际业务 ...

  5. 数据库艰难求生之路(基础:增删改查)part2

    一.数据库查询 由于这个点的东西实在是多的,我就和题目,知识点一起演示. 首先是创建数据库: create database ExampleInfo --创建数据库 use ExampleInfo - ...

  6. Web前端 前端工程师首选的几款编辑器/IDE以及Markdown的编辑器、语法

    前端工程师常使用的编辑器/IDE 本地在线工具 webstrom 推荐指数 ***** vs code 推荐指数 **** atom 推荐指数 **** subline-text 推荐指数 **** ...

  7. 如何设置织梦cms自定义表单字段为必填项

    1.编辑器打开\plus\diy.php2.在40行左右找到此行代码:$dede_fields = empty($dede_fields) ? '' : trim($dede_fields);3.在这 ...

  8. 有趣的 box-decoration-break

    这两天接触到一个很有意思的 CSS 属性 -- box-decoration-break.下面就一起去一探究竟. 因为 MDN 上关于这个属性,没有中文文档,所以一直在想一个合理贴切的中文翻译.直译一 ...

  9. 使用FakeAPP进行AI换脸必看!!

    C盘生于容量小于5G的千万别用啊!!笔者本人因为C盘只剩了3G,根本用不上这个,最后会把大小为4G的core文件必须移植到C盘当中,俺的CUDA也白安装了,而且还不小心安装成CUDA8了,应该用9好么 ...

  10. Linux下编译安装php7.2

    准备工作 所有操作需要在root用户下 安装路径: /usr/local/php 安装PHP 首先要安装如下依赖包 $ yum install -y gcc gcc-c++  make zlib zl ...