c++ eos智能合约开发_[EOS智能合约]第二节:用EOS开发一个To-do List小应用

17ad46d0e8ccf84c539f6aeb95ae2ce2.png

EOS Asia

本教程原文作者为EOS Asia,亚洲最具技术实力和最国际化的EOS超级节点竞选者。EOS Asia 同时也是EOS Gems和Traffic Exchange Token这两个项目背后的开发者。

本文由 DappReview 获得 EOS Asia 授权进行翻译并发表。

3f34ce148c822e2f9333084258e402ea.gif

本篇是EOS智能合约系列第二弹,该系列教程旨在帮助开发者从0到1快速上手如何在EOS生态下开发DApp。如果有任何希望深入讨论的主题,欢迎留言给我们!如果你还不知道怎么在EOS下部署智能合约,请先阅读系列第一弹《[技术教程]EOS智能合约开发:第一节——准备发车》

在大部分的应用场景中,开发者都需要通过智能合约与区块链上“永久保存”的数据进行交互。本次教程中,我们会一起通过 To-do List(待办事项)这个实例,来教会你如何实现与数据交互的标准操作(CRUD - Create, Retrieve, Update, Delete)

深入了解 Boost.MultiIndex

由于EOS的智能合约基于C++,我们需要利用Boost.MultiIndex Containers这个库。下面是该库的说明:

Boost多索引容器库提供了名为multi_index_container 的类模板,可以用于建造拥有一个或多个索引(indices) 的容器,不同的索引具有不同的排序和访问语义。这些索引都提供了类似于STL容器的接口,因此使用起来也非常相似。在一组元素之上维护多个索引的想法来自 于关系数据库,并且考虑到简单的set和map无法满足多索引表中的复杂数据结构的规范。

让我们把上述的一些概念拆分讲解一下,并与开发者所熟知的传统数据库概念做类比:

容器(Containers)

  • 包含很多元素的类(table/表)

元素(Elements)

  • 数据对象(rows in a table/表中的行)

接口(Interface)

  • 容器读取元素的方法(query/查询)

在EOS智能合约中,可以使用 eosio::multi_index 来定义多索引容器。如果我们读一读使用了这个特性的一些合约例子,比如这个“骰子合约”:

https://github.com/EOSIO/eos/blob/master/contracts/dice/dice.cpp

你会发现很难真正搞明白到底是哪一部分是在处理区块链上的数据。不过别担心,我们会带你理解它,很快你就能自己实现一个有存储功能的智能合约。

我们将通过开发一个To-do List (待办事项表)小DApp来理解上述的内容。从功能上,要能勾掉已经完成的事情,添加新事项,以及删除不需要的事项。在这个例子中,我们将用 todos 作为容器名,todo 作为元素结构。

从初始化第一个容器为开始,首先,我们向 eosio::multi_index 传入两个模板参数。第一个参数是我们的容器名,第二个参数是定义元素的数据结构。来给我们的todo模型创建一个小例子,如下:

struct todo {uint64_t id;uint64_t primary_key() const { return id; }EOSLIB_SERIALIZE(todo, (id))
};typedef eosio::multi_index<N(todos), todo> todo_table;
todo_table todos;

简单有效!我们简单地定义了一个64位无符号整型的ID,并通过primary_key来访问它。把多索引定义成typedef,暂时还不需要把它实例化。目前为止,这个todo模型里面还没有什么东西,下面来添加一些参数:

struct todo {uint64_t id;std::string description;uint64_t completed;EOSLIB_SERIALIZE(todo, (id)(description)(completed))
};typedef eosio::multi_index<N(todos), todo> todo_table;
todo_table todos;

现在我们更近了一步,加入了待办事项的描述参数- description (比如 “完成小说撰写”)和状态参数- completed(用来记录一个事项在当前是否完成了)。

为了方便自动生成我们的ABI(Application Binary Interface),我们在容器定义前面加一行注释来帮助生成器:@abi table profiles i64

那么在注释里的 i64 是什么意思呢,它是我们的查询索引。默认情况下,我们需要一种在容器里查询元素的方法,而我们的前64位(64位类型下,基本上是first key)就可以用来干这件事。一般情况下都用uint64_t id ;对于first key,也可以用 account_name 类型,因为在底层其实 account_name 类型也是一个 uint64_t 类型。参考如下:

https://github.com/EOSIO/eos/blob/2f2c8c7e3811caca178a7553192c8fe59a22576d/contracts/eosiolib/types.h#L22

此时我们应该有了一个功能简单的容器, 代码看起来是这样的:

// @abi table todos i64
struct todo {uint64_t id;std::string description;uint64_t completed;uint64_t primary_key() const { return id; }EOSLIB_SERIALIZE(todo, (id)(description)(completed))
};typedef eosio::multi_index<N(todos), todo> todo_table;
todo_table todos;

使用你的新容器

现在已经有了一个定义好的容器,我们可以使用它里面的元素。在智能合约里,将通过不同的函数与这些元素进行交互。

对于链上的永久性储存有四种基本函数:创建(Create),检索 (Retrieve),更新 (Update),删除 (Delete)。 在这个例子里,我们不需要考虑检索,因为检索是由前端读取合约来处理的而不用函数。对其他的三个,我们将分别创建函数。

创建(Create)- 创建事项

添加一个待办事项进入列表

可以用 emplace 完成

// @abi action
void create(account_name author, const uint32_t id, const std::string& description) {todos.emplace(author, [&](auto& new_todo) {new_todo.id  = id;new_todo.description = description;new_todo.completed = 0;});eosio::print("todo#", id, " created");
}

一个重要细节是我们把author作为一个参数也传入了。在 emplace 方法中第一个参量是必须的。

更新(Update)- 完成事项

创建一个完成事项的函数可以通过更新参数completed 的状态来实现:

// @abi action
void complete(account_name author, const uint32_t id) {auto todo_lookup = todos.find(id);eosio_assert(todo_lookup != todos.end(), "Todo does not exist");todos.modify(todo_lookup, author, [&](auto& modifiable_todo) {modifiable_todo.completed = 1;});eosio::print("todo#", id, " marked as complete");
}

删除(Delete)- 删除事项

这是一个内部调用的智能合约,不用太担心安全性和权限问题。 我们专心搞清楚删除函数如何最简化地实行就可以了:

// @abi action
void destroy(account_name author, const uint32_t id) {auto todo_lookup = todos.find(id);todos.erase(todo_lookup);eosio::print("todo#", id, " destroyed");
}

部署,测试,与前端打通

在上一篇教程中,我们用一个简单的ping/pong实例讲述了如何将一个EOS的智能合约与网页前端连接起来。现在我们有了几个与区块链上的永久性数据交互的函数,下面可以为这个待办事项制作一个前端了。

部署

部署合约的过程比较直观,就下面这几步:

1. 建立合约ABI和WASM:eosiocpp -o hello.wast hello.cpp && eosiocpp -g hello.abi hello.cpp

2. 建立账户/钱包:

cleos create account eosio todo.user EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
cleos set contract todo.user ../todo -p todo.user

3. 测试合约也很简单:

$ cleos push action todo create '["todo", 1, "hello world"]' -p todo.user
executed transaction: bc5bfbd1e07f6e3361d894c26d4822edcdc2e42420bdd38b46a4fe55538affcf  248 bytes  107520 cycles
#          todo <= todo::create                 {"author":"todo","id":1,"description":"hello world"}
>> todo created

4. 获取数据:

$ cleos get table todo todo todos

在前端测试

在这里我们就节省读者的时间,不在文章中深究React.js的代码了,不过我强烈推荐大家去看下这个例子的代码仓库,里面有前端部分的全部代码:

https://github.com/eosasia/eos-todo

如果你希望我们去更深入地探讨一些关于浏览器前端和EOS智能合约交互的内容,不论是用React、Vue、Angular还是原生Javascript,欢迎留言或者在电报群里告诉我们。

电报群:https://t.me/EOSAsia

DAppReview往期精选

[深度干货]浅谈你们根本不懂的区块链游戏

V神看好的Plasma使用指南第一卷:游戏落地

[技术教程]EOS智能合约开发:第一节——准备发车

爆发前夜的区块链游戏——最大的特洛伊木马已经进城

[独家专访]1周13W交易的EtherGoo开发者James & 你所不知道的数据

区块链游戏生态抢滩登陆战,谁能拔得头筹?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

acwing2058. 笨拙的手指(进制转换)

题目含义: 给出一个二进制数,三进制数(这俩数有且一位是错误的) 请输出他们对应的十进制数 原题链接 视频讲解 问题难点: 其他进制转化为十进制算法 大数据的读入 string 按位异或运算(常用的ACSII码值)

使用Github部署Azure应用服务

上次我们介绍了如果使用Azure应用服务(不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序)。我们通过Visual studio新建一个项目后手动编译发布代码。然后通过FTP上传我们的发布文件。整个过程跟我们手动发布项目到IIS上其实没啥差别。这么操作有点繁琐&#xff0c;显然…

7搭建zabbix_监控03分布式监控Zabbix

监控03-分布式监控Zabbix一、Zabbix概述Zabbix是一个基于Web界面的分布式系统监控与网络设备监控系统&#xff0c;能够监控各种网络参数&#xff0c;并提供灵活的通知机制&#xff0c;以使管理员能快速定位故障并解决。由于zabbix server端与zabbix agent组成&#xff0c;可通过…

acwing2041. 干草堆(差分数组)

题目描述: 原题链接 视频讲解 差分算法(前缀和的逆运算) 差法算法(差分与前缀和的下标都从1开始,避免出现越界) 算法思路:给l,r区间内加上x,则表示为在l的位置+x,在r+1的位置上-x,就可抵消掉+x在r+1开始后的贡献,再利用前缀和就能一次求出答案

各纬度气候分布图_欧洲气候特征:以温带气候类型为主,是海洋性气候最显著的大洲...

气候是一个区域内大气物理特征的长期多年平均状态&#xff0c;是一种相对稳定的自然地理要素&#xff0c;包括气温、热量、降水、光照等气候要素组成。根据全球不同区域的气候特征来划分出不同的气候类型&#xff0c;主要的气候类型包括热带雨林气候、热带草原气候、热带沙漠气…

.NET 5开源项目:b站账号快速升级到 Lv6,每天自动签到,观看,分享,投币视频!...

推荐一个神奇的开源项目&#xff1a;BiliBiliToolhttps://github.com/RayWangQvQ/BiliBiliTool.Net 5 编写的B站&#xff08;哔哩哔哩&#xff09;任务工具&#xff0c;通过GitHub Actions实现每日线上自动运行任务&#xff1a;每日自动登录、观看、分享、投币视频&#xff0c;…

acwing2060. 奶牛选美(bfs)

题目描述: 题目描述:在一个二维矩阵中,有两个点的集合,找到最短的距离(从一个集合到另一个集合中)距离的计算方式为(曼哈顿距离) 曼哈顿距离:两点间的曼哈顿距离 = | x1 - x2 | + | y1 - y2 | 输出最短距离 原题链接 视频讲解 问题难点: 二维矩阵使用了字符类型存储 PI…

pandas用均值填充nan_Pandas学习笔记(三)

前言学习Pandas的最好方式就是多用它&#xff0c;只有在实际中多用&#xff0c;才能更好地掌握其中的技巧&#xff0c;这一次我们从数据的聚合来开始。GroupBy的使用聚合的意思指的是对数据框架中某一类型的数据进行整合&#xff0c;在整合后可以对其进行求和、求平均值等操作&…

acwing2019. 拖拉机(最短路径)

题目描述:(边权只有0和1的最短路径问题) 可以走出矩阵 点权{走障碍物:1,不走障碍物:0} 最短路径=路径上障碍物的数量 双端队列:0的时候入队首,1的时候入队尾(只能出队一次,但可以入队很多次) 双端队列的前半段是全为0,后半段全为1. bfs(实际上是一种迪杰斯特拉算法…

有关Quartz.NET,与一线码农大佬对个线?

跟[一线码农大佬]翻译的某技术文对个线最近看到一线码农大佬翻译的《如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度》&#xff0c;行文思路&#xff1a;安装Quartz.NETQuartz.NET 中的Job,triggers 和 Schedulers创建 Scheduler开启和停止 scheduler创建 job 工厂创建 J…

真的,太多人辜负了.NET5!

.NET5发布一个月了&#xff0c;有没有动手试试&#xff1f;Windows服务器Visual Studio SQL Server做跨平台开发&#xff1f;那你真的辜负了这个时代&#xff01;强烈建议尝试下Linux&#xff0c;不仅是程序部署&#xff0c;而是全Linux环境开发、运行、部署.NET 5项目&#x…

总结 Visual Studio 2019 发布以来 XAML 工具的改进

不知不觉&#xff0c;Visual Studio 2019 已经出到 16.8 和 16.9 Preview 了。虽然每次更新都林林总总地一大堆新功能和改进&#xff0c;但关于 XAML 的内容总是&#xff0c;always&#xff0c;每次都只有一点点。其实 Xamarin 相关的内容有在使劲地更新&#xff0c;不过和我做…

与您相约.NET Conf China 2020! 新进2位重磅嘉宾

2020年12月19日由.NET众多社区联合组织主办的2020年中国.NET开发者大会将于苏州盛大开幕&#xff0c;明天将发布大会的直播方案&#xff0c;敬请关注。时间&#xff1a;2020/12/19-12/20主题&#xff1a;开源、共享、创新地点&#xff1a;苏州人工智能产业园本次大会以“开源、…

层与特征融合_【计算机系统应用】(第122期)感受野特征增强的 SSD 目标检测算法...

点击上方“蓝字”&#xff0c;关注我们吧&#xff01;目标检测是计算机视觉领域的一项重要任务, 是 生活中如实例分割[1] , 面部分析[2] , 汽车自动驾驶[3]、视 频分析[4] 等各种视觉应用的先决条件. 近些年, 伴随着深度卷积神经网络的充分发展[5] 以及良好的数据集注释先验工作…

一个基于.Net 5开发的轻量级Quartz配置中心 - QuartzCore.Blazor

项目简介QuartzCore.Blazor 是一个基于 .Net5 开发的轻量级 Quartz 作业配置中心&#xff0c;实践应用 Ant Design Blazor 和 FreeSql 两个技术&#xff0c; 对这两个技术感兴趣的小伙伴可以加我一起学习讨论哦&#xff0c;对有 Quartz 有需求的小伙伴亦可以开箱即用Code First…

如何开启jvm日志_做了10个小实验:搞懂了JVM三大参数类型

本实验的目的是讲解 JVM 的三大参数类型。在JVM调优中用到的最多的 XX 参数&#xff0c;而如何去查看和设置 JVM 的 XX 参数也是调优的基本功&#xff0c;本节以实验的方式讲解 JVM 参数的查看和设置。希望大家能有所启发。标配参数常见标配参数-version&#xff0c;获取JDK版本…

xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA架构之SelectIO结构(一)

引言&#xff1a;从本文开始我们介绍Xilinx 7系列FPGA的SelectIO资源结构及使用&#xff0c;我们在进行FPGA外设硬件及软件设计时&#xff0c;如ADC、PHY、DDR3等&#xff0c;通常会涉及到该资源。本节我们介绍以下知识点&#xff1a;SelectIO资源概述及结构SelectIO管脚通用设…

IdentityServer4系列 | 混合模式

一、前言在上一篇关于授权码模式中&#xff0c; 已经介绍了关于授权码的基本内容&#xff0c;认识到这是一个拥有更为安全的机制,但这个仍然存在局限&#xff0c;虽然在文中我们说到通过后端的方式去获取token,这种由web服务器和授权服务器直接通信&#xff0c;不需要经过用户的…

3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...

大家都知道&#xff0c;现在不少的大佬比起用Word、Excel等等这些格式文件&#xff0c;它们更喜欢使用PDF文件。而我们不管是将Word、Excel等文件转换成PDF&#xff0c;还是将PDF转换成其他格式文件&#xff0c;都是一件麻烦事&#xff0c;更别说在手机上操作这一切了。别担心&…

如何使用 C# 中的 Tuple

开局一张图&#xff0c;首先声明的是 Tuple 不是什么新鲜概念&#xff0c;在编程语言 F#&#xff0c;Python 中早就有这个了&#xff0c;Tuple 是一种 有序的&#xff0c;有限不可变的&#xff0c;支持混杂类型的固定个数的 一种数据结构&#xff0c;有些朋友可能就想问了&…