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. 号称“新至强,可拓展,赢当下”的Xeon可拓展处理器有多逆天?

    目前企业数据中心正在发生重大变化,许多企业正在经历基于在线服务和数据的广泛转型.他们将这些数据用于功能强大的人工智能和分析应用程序,这些应用程序可以将其转化为改变业务的洞察力,然后推出可以使这些洞察力 ...

  2. 你可能不知道的 docker 命令的奇淫怪巧

    你可能不知道的 docker 命令的奇淫怪巧 Intro 介绍并收录一些可能会用到的一些简单实用却很少有人用的 docker 命令 dangling images build 自己的 docker 镜 ...

  3. Cocos Creator—定制H5游戏首页loading界面

    Cocos Creator从1.0版本发布到现在也有一年多了,按理说一些常见的问题网上都有解决方案,例如"如何自定义首页加载进度条界面"这种普遍需求,应该所有人都会遇到的,因此也有 ...

  4. Linux 桌面玩家指南:11. 在同一个硬盘上安装多个 Linux 发行版以及为 Linux 安装 Nvidia 显卡驱动

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  5. echarts在tab切换时容器宽度设置为100%,只展示100px

    在 mychart.setOption(option); 后面加上 mychart.resize(); 即可

  6. 基于Spring和Mybatis拦截器实现数据库操作读写分离

    首先需要配置好数据库的主从同步: 上一篇文章中有写到:https://www.cnblogs.com/xuyiqing/p/10647133.html 为什么要进行读写分离呢? 通常的Web应用大多数 ...

  7. Microsoft Power BI 学习笔记

    ​   Power Bi 学习笔记 一   Power BI 是微软发布的一系列的软件服务.应用和连接器,这些软件服务.应用和连接器协同工作,将不相关的数据源转化为合乎逻辑.视觉上逼真的交互式见解. ...

  8. 【Git之旅】2.Git对象

    1.块(blob)对象 (1)文件的每一个版本表示为一个块 (2)二进制大对象(binary large object)的缩写,是计算机领域的常用术语,用来指代某些可以包含任意数据的变量或文件,同时其 ...

  9. ASP.NET Core Web API 版本控制

    在nuget.org上,您可以找到  Microsoft.AspNetCore.Mvc.Versioning包,它提供了有关如何对Web API端点进行版本化的更多选项.这个包的好处是允许你直接在控制 ...

  10. [开发技巧]·HTML检测输入已完成自动填写下一个内容

    [开发技巧]·HTML检测输入已完成自动填写下一个内容 个人网站 --> http://www.yansongsong.cn 在上一个博客中简易实现检测输入已完成,我们实现了检测输入已完成,现在 ...