EOS开发入门
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个元素:amount,symboleosio_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可以使用find,emplace,modify,earse四个接口,使用时需要先用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扩展
其中structs,actions,tables可以认为是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开发入门的更多相关文章
- EOS开发环境搭建
EOS开发环境搭建 在上一篇文章<扒一扒EOS的前世今生>中,我们已经了解了EOS以及他的创始人Daniel Larimer的故事,本次为大家带来的是关于EOS开发环境搭建的内容.首先 ...
- EOS开发实战
EOS开发实战 在上一篇文章<EOS开发入门>中,我们为大家介绍了EOS的节点启动和合约部署和调用等入门知识.本次我们来实现一个复杂的例子,可以为其取一个高大上的名字-悬赏任务管理系统 ...
- openresty 前端开发入门五之Mysql篇
openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysql获取数据,并返回给用户 操作mysql主要用到了lua-resty-my ...
- java WEB开发入门
WEB开发入门 1 进入web JAVASE:标准- standard JAVA桌面程序 GUI SOCKET JAVAEE:企业-浏览器控制 web 2 软件结构 C/S :client ...
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解
原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...
- [译]:Xamarin.Android开发入门——Hello,Android深入理解
返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...
- [译]:Xamarin.Android开发入门——Hello,Android快速上手
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
- VR原理讲解及开发入门
本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持. 1. VR沉浸感和交互作用产生的原理: 在之前,我们观看一个虚拟的创造内容是通过平面显示器的,52VR ...
- Eclipse_luna_J2EE_For_JS+tomcat8.0环境搭建、配置、开发入门
一.所有需要的软件.插件等下载地址 J2SE的官方下载路径:http://www.oracle.com/technetwork/java/javase/downloads/index.html Ecl ...
随机推荐
- JavaScript函数定义 ,参数调用
一.JavaScript函数函数: 函数就是一种封装,由事件驱动的或者当它被调用时执行的可重复使用的代码块.定义函数:function 函数名(){函数体;}数不会自动执行,需要被调用才可以执行函数名 ...
- GitLab11.3.9 使用 Crowd3.3.2 的帐号实现 SSO 单点登录,以及GitLab配置腾讯企业邮箱
GitLab11.3.9 的安装方法: 点击查看. Crowd3.3.2 的安装方法:点击查看. 需要先在 Crowd 创建应用程序,参考 <Docker 创建 Crowd3.3.2 以 ...
- PHP Socket编程(转)
[PHPsocket编程专题(理论篇)]初步理解TCP/IP.Http.Socket.md [PHPsocket编程专题(实战篇①)]php-socket通信演示 [PHPsocket编程专题(实战篇 ...
- Linux 桌面玩家指南:07. Linux 中的 Qemu、KVM、VirtualBox、Xen 虚拟机体验
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- PLC
https://www.cnblogs.com/dathlin/p/7469679.html C#读写三菱PLC和西门子PLC数据 使用TCP/IP 协议https://blog.csdn.net/x ...
- 异常 - 虚拟机初始化错误 - Error occurred during initialization of VM
目录 1 环境配置信息 1.1 服务器配置信息 1.2 Tomcat启动参数 2 问题描述 3 问题解决 4 关于vm.overcommit_memory参数 4.1 vm.overcommit_me ...
- SLAM+语音机器人DIY系列:(四)差分底盘设计——4.底盘ROS驱动开发
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
- 搞懂MySQL InnoDB事务ACID实现原理
前言 说到数据库事务,想到的就是要么都做修改,要么都不做.或者是ACID的概念.其实事务的本质就是锁和并发和重做日志的结合体.那么,这一篇主要讲一下InnoDB中的事务到底是如何实现ACID的. 原子 ...
- 原生js轮盘抽奖实例分析(幸运大转盘抽奖)
效果图: 所需图片素材: 这张图是pointer.png的位置的. turntable-bg.jpg这张是转盘背景图,在背景位置. 这张是turntable.png位置的. 需要这三张图片,如果要实现 ...
- c# 图片加水印
/// <summary> /// 图片水印 /// </summary> /// <param name="imgPath">服务器图片相对路 ...