EOS之记事本智能合约
EOS记事本智能合约
本次分享的内容是一个记事本合约,调用合约中的写入动作可以将文本和作者保存到数据库中,通过记事本合约来学习EOS智能合约数据存储当中的主键自增。
合约动作
- 写入动作
记事本合约必须要有的写入文本action,用来存储记录文本和记录作者。
- 删除动作
记事本中同样需要有删除记录的action,用来删除记录信息。
合约代码
note.cpp
#include <eosiolib/eosio.hpp>
#include <string>
using namespace eosio;
using std::string;
class record : public eosio::contract {
public:
/// @abi table notes i64
struct note {
uint64_t id;
account_name author;
string text;
auto primary_key() const { return id; }
};
typedef multi_index<N(notes), note> notes;
using contract::contract;
/// @abi action
void write(account_name author, string text) {
require_auth(author);
print("Hello, ", name{author});
notes nt( _self, _self );
uint64_t noteId;
nt.emplace(author, [&](auto &n) {
n.id = nt.available_primary_key();// 主键自增
n.author = author;
n.text = text;
noteId = n.id;
});
print("----noteId = ", noteId);
}
void remove(uint64_t id) {
notes nt( _self, _self );
auto it = nt.find( id );
eosio_assert( it != nt.end(), "the id not found" );
require_auth(it->author);
nt.erase( it );
}
};
EOSIO_ABI(record, (write)(remove))
合约涉及数据库操作部分
- 在表中增加记录:emplace
- 删除一条数据:erase
- 查询记录:find
- 主键自增:available_primary_key
其中主键自增非常重要,不写主键自增会导致无法存入多条记录。
合约调用演示
- 调用write动作
$ cleos push action note write '{"author":"user","text":"This is my first diary"}' -p user
executed transaction: ab59fc4e04342690af46d5bf4dd48c8418d4655e8bcaea81ca3fdc0c99b6fed7 216 bytes 511 us
# note <= note::write {"author":"user","text":"This is my first diary"}
>> Hello, user----noteId = 0
warning: transaction executed locally, but may not be confirmed by the network yet
调用成功会返回信息,其中noteId是记录的id,在删除记录的时候需要用到。
- cleos get table 查询表
$ cleos get table note note notes
{
"rows": [{
"id": 0,
"author": "user",
"text": "This is my first diary"
},{
"id": 1,
"author": "student",
"text": "my name is student!"
},{
"id": 2,
"author": "miaomiao",
"text": "my name is miaomiao"
}
],
"more": false
}
- 调用remove动作
删除时进行了授权限制,每个账户只能删除自己的记录,无法删除其他账户的记录
错误的授权:
$ cleos push action note remove '{"id":2}' -p user
Error 3090004: missing required authority
Ensure that you have the related authority inside your transaction!;
If you are currently using 'cleos push action' command, try to add the relevant authority using -p option.
Error Details:
missing authority of miaomiao
正确的授权:
$ cleos push action note remove '{"id":2}' -p miaomiao
executed transaction: 51eb63f0fdb7d5d01676e898a0f9bc144ee1feda344780042782f359541a578d 192 bytes 442 us
# note <= note::remove {"id":2}
$ cleos get table note note notes
{
"rows": [{
"id": 0,
"author": "user",
"text": "This is my first diary"
},{
"id": 1,
"author": "student",
"text": "my name is student!"
}
],
"more": false
}
在编写记事本合约时为了找到让主键增加的方法差了很多资料,也走了很多弯路。最后发现其实就是一行代码就能解决的事情。主键自增的使用详见这里。

EOS之记事本智能合约的更多相关文章
- EOS之hello智能合约解析
传送门: 柏链项目学院 EOS的智能合约与以太坊区别很大, EOS 的智能合约基于 WebAssembly(WASM) 技术执行用户生成的应用程序和代码.WASM是一项新兴的网络标准,得到了谷歌, ...
- Eos的Wasm智能合约的局限性
官方只支持用C++写智能合约 用C++写智能合约门槛过高,会把许多开发者挡在门外,C++的复杂性也会让智能合约的设计变得困难. Wasm智能合约的效率并不是最优 由于C++最终也是编译成wasm字节码 ...
- EOS测试链智能合约部署调用
ETH与EOS两者智能合约进行简单的对比. 1.编译智能合约(合约编译成.wasm与.abi格式后即可部署到区块链) [root@C03-12U-26 testcontract]# cat testc ...
- 【精】EOS智能合约:system系统合约源码分析
系统合约在链启动阶段就会被部署,是因为系统合约赋予了EOS链资源.命名拍卖.基础数据准备.生产者信息.投票等能力.本篇文章将会从源码角度详细研究system合约. 关键字:EOS,eosio.syst ...
- EOS技术研究:合约与数据库交互
智能合约操作链数据库是很常见的应用场景.EOS提供了专门的工具来做这件事(相当于Ethereum的leveldb),专业术语叫做持久化API,本文将完整严密地介绍这个工具以及对它的使用测试. 关键字: ...
- EOS基础全家桶(十一)智能合约IDE-EOS_Studio
简介 我们马上要进入智能合约的开发了,以太坊最初提供了智能合约的功能,并宣告区块链进入2.0时代,而EOS的智能合约更进一步,提供了更多的便利性和可能性.为了进一步了解智能合约,并进行开发,我们需要先 ...
- 【精解】EOS智能合约演练
EOS,智能合约,abi,wasm,cleos,eosiocpp,开发调试,钱包,账户,签名权限 热身 本文旨在针对EOS智能合约进行一个完整的实操演练,过程中深入熟悉掌握整个EOS智能合约的流程,过 ...
- [转]EOS智能合约 & 私链激活 & 基本操作
链接:https://www.jianshu.com/p/90dea623ffdf 简介 本篇文章,将跟大家介绍eos私链的激活.基础智能合约的安装,以及为大家演示转账等基础操作.还没有安装eos私链 ...
- EOS智能合约存储实例讲解
EOS智能合约存储实例 智能合约中的基础功能之一是token在某种规则下转移.以EOS提供的token.cpp为例,定义了eos token的数据结构:typedef eos::token<ui ...
随机推荐
- SaltStack安装配置详解
一.简介 Saltstack 比 Puppet 出来晚几年,是基于Python 开发的,也是基于 C/S 架构,服务端 master 和客户端 minions :Saltstack 和 Puppet ...
- leetcode — jump-game
/** * Source : https://oj.leetcode.com/problems/jump-game/ * * Created by lverpeng on 2017/7/17. * * ...
- 【原创】关于Git暂存区的理解
关于Git暂存区的理解 暂存区可以说是Git的三大重要的区域之一,另外两个分别是工作目录和Git仓库,所以说对暂存区的深入理解可以帮助我们理解很多Git命令背后隐藏的工作原理.今天,本文将以 ...
- 【MySQL经典案例分析】关于数据行溢出由浅至深的探讨
本文由云+社区发表 一.从常见的报错说起 故事的开头我们先来看一个常见的sql报错信息: 相信对于这类报错大家一定遇到过很多次了,特别对于OMG这种已内容生产为主要工作核心的BG,在内容线的存 ...
- Mybatis学习(三)————— 映射文件详解
前面说了全局配置文件中内容的详解,大家应该清楚了,现在来说说这映射文件,这章就对输入映射.输出映射.动态sql这几个知识点进行说明,其中高级映射(一对一,一对多,多对多映射)在下一章进行说明. 一.输 ...
- 第2章 细说Linux系统用户/组管理(1)
2.1 用户和组的基本概念 用户和组是操作系统中一种身份认证资源. 每个用户都有用户名.用户的唯一编号uid(user id).所属组及其默认的shell,可能还有密码.家目录.附属组.注释信息等. ...
- SQLite占用资源少原因
本篇承接上篇SQLite详解的下篇,介绍SQLIte为什么占用资源少的原因?本文主要参考https://blog.csdn.net/hanyingzhong/article/details/46400 ...
- NLP入门(一)词袋模型及句子相似度
本文作为笔者NLP入门系列文章第一篇,以后我们就要步入NLP时代. 本文将会介绍NLP中常见的词袋模型(Bag of Words)以及如何利用词袋模型来计算句子间的相似度(余弦相似度,cosi ...
- C# 显式转换关键字 explicit
不同于隐式转换,显式转换运算符必须通过转换的方式来调用. 如果转换操作会导致异常或丢失信息,则应将其标记为 explicit. 这可阻止编译器静默调用可能产生意外后果的转换操作. 省略转换将导致编译时 ...
- C#字符串。
string类型不能被继承,它是密封类,sealed. 一.字符串的特性. 1.不可变性. class Program { static void Main(string[] args) { stri ...