Data Persistence
【Data Persistence】
1、构建环境。
cd /home/ubuntu/contracts
mkdir addressbook
cd addressbook
touch addressbook.cpp
2、新建合约,有两要点注意
1)class 与类名间添加 [[eosio::contract]]
2)新类继承于 public eosio::contract
#include <eosiolib/eosio.hpp>
using namespace eosio;
class [[eosio::contract]] addressbook : public eosio::contract {
public:
private:
};
3、创建Table Record 结构. 注意在 struct 和 name 之间,要加上 [[eosio::table]].
struct [[eosio::table]] person {
name key;
string first_name;
string last_name;
string street;
string city;
string state;
uint64_t primary_key() const { return key.value;}
};
4、定义表类型
typedef eosio::multi_index<"people"_n, person> address_index;
1)Use the _n operator to define an eosio::name type and use that name the table. This table contains a number of different singular "persons", so name the table "people".
_n是一个操作符,将"people"的 char* 类型转为 eosio::name类型。"people"即是表的名字。
2)Pass in the singular person struct defined in the previous step.
person是表的类型.
5、构造函数
addressbook(name receiver, name code, datastream<const char*> ds):contract(receiver, code, ds) {}
code parameter which is the account on the blockchain that the contract is being deployed to.
code参数是发布合约的账户.
6、使用 require_auth 限制每个账户只能操作自己的数据。
void upsert(name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state) {
require_auth( user );
}
utilize the require_auth method provided by the eosio.cdt. This method accepts one argument, an nametype, and asserts that the account executing the transaction equals the provided value.
7、实例化 Table。
void upsert(name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state) {
require_auth( user );
address_index addresses(_code, _code.value);
}
addresses()构造函数中的两个参数分别是下面的意思:
- The "code", which represents the contract's account. This value is accessible through the scoped
_codevariable. - The "scope" which make sure the uniqueness of the contract. In this case, since we only have one table we can use "_code" as well
8、使用 find 查找目标
void upsert(name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state) {
require_auth( user );
address_index addresses(_code, _code.value);
auto iterator = addresses.find(user.value);
if( iterator == addresses.end() )
{
//The user isn't in the table
}
else {
//The user is in the table
}
}
9、使用multi_index的emplace方法插入。
void upsert(name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state) {
require_auth( user );
address_index addresses(_code, _code.value);
auto iterator = addresses.find(user.value);
if( iterator == addresses.end() )
{
addresses.emplace(user, [&]( auto& row ) {
row.key = user;
row.first_name = first_name;
row.last_name = last_name;
row.street = street;
row.city = city;
row.state = state;
});
}
else {
//The user is in the table
}
}
emplace接受两个参数:the "scope" of this record and a callback function.
9、update数据
else {
std::string changes;
addresses.modify(iterator, user, [&]( auto& row ) {
row.key = user;
row.first_name = first_name;
row.last_name = last_name;
row.street = street;
row.city = city;
row.state = state;
});
}
第二个参数是scope。
10、erase 方法
void erase(name user) {
require_auth(user);
address_index addresses(_code, _code.value);
auto iterator = addresses.find(user.value);
eosio_assert(iterator != addresses.end(), "Record does not exist");
addresses.erase(iterator);
}
11、编译
eosio-cpp -o addressbook.wasm addressbook.cpp --abigen
12、Deploy the Contract
cleos create account eosio addressbook XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX -p eosio@active cleos set contract addressbook /home/ubuntu/contracts/addressbook -p addressbook@active
13、Test the Contract
cleos push action addressbook upsert '["alice", "alice", "liddell", "123 drink me way", "wonderland", "amsterdam"]' -p alice@active
Check that alice cannot add records for another user.
cleos push action addressbook upsert '["bob", "bob", "is a loser", "doesnt exist", "somewhere", "someplace"]' -p alice@active
查看table
cleos get table addressbook addressbook people --lower alice --limit
查看 cleos 查看 table的命令
cleos get table addressbook addressbook people --lower alice --limit
参考:
1、https://developers.eos.io/eosio-home/docs/data-persistence
Data Persistence的更多相关文章
- [Angular] Improve Server Communication in Ngrx Effects with NX Data Persistence in Angular
Communicating with a remote server via HTTP presents an extra level of complexity as there is an inc ...
- [Spring boot] Configuring and Accessing a Data Source
We need our data persistence with configuring our datasouce: In application.properties: spring.h2.co ...
- Azure Redis Cache (1) 入门
<Windows Azure Platform 系列文章目录> Microsoft Azure Redis Cache基于流行的开源Redis Cache. 1.功能 Redis 是一种高 ...
- Azure Redis Cache (3) 创建和使用P级别的Redis Cache
<Windows Azure Platform 系列文章目录> 在笔者之前的文档里面已经说明了,Azure Redis Cache分为三个不同的级别: - 基本,Basic,不包含SLA ...
- ios 在程序中使用iCloud
注意,这里说的使用icould不是用icloud进行系统备份,那个功能不需要我们写代码,备份到icloud的东西我们也不能操作.我们指的是以下这3种icloud使用方法: 这里有3中使用方法, Key ...
- android和ubifs
原文地址: http://opendevkit.com/?e=37 1. ubifs号称性能比yaffs2 好,同时压缩可读写,文件系统image体较小同时可写,相当不错 2. ubifs制作 (1) ...
- iphone dev 入门实例4:CoreData入门
The iPhone Core Data Example Application The application developed in this chapter will take the for ...
- MongoDB - Introduction to MongoDB
MongoDB is an open-source document database that provides high performance, high availability, and a ...
- Conclusion
Conclusion This concludes our brief look at building a simple, but fully functional, Zend Framework ...
随机推荐
- CentOS 6.9搭建CDH 5.12.0集成环境
Cloudera Manager则是为了便于在集群中进行Hadoop等大数据处理相关的服务安装和监控管理的组件,对集群中主机.Hadoop.Hive.Spark等服务的安装配置管理做了极大简化. ...
- 解决使用C/C++配置ODBC链接使用SQLConnect返回-1
VS中建立空项目使用ODBC连接时,SQLConnect函数总是返回-1,mysql和命令行连接数据库都是没问题的 retcode = SQLConnect(hdbc, (SQLCHAR*)" ...
- day06 内存地址 小数据池缓存机制
1. 内存相关 示例一 v1=[11,22,33] v2=[11,22,33] #值相等 内存地址不等 v1=11 v2=11 #按理说内存地址应该不等,但是python为了优化使其内存地址相等 v1 ...
- 2019西湖论剑网络安全技能大赛(大学生组)--奇怪的TTL字段(补充)
鉴于有人不会将得到的16进制数据在winhex中转成图片,我在这里写一个详细的步骤. 首先就是将六张图片的十六进制数据找出并提取出来. 打开winhex,新建一个文档. 大小可以选1bytes 将数据 ...
- git 错误汇总
★一.git提交时报错:Updates were rejected because the tip of your current branch is behind 出现这样的问题是由于:自己当前版本 ...
- 无旋treap
#ifndef FHQTREAP_H_INCLUDED #define FHQTREAP_H_INCLUDED //author Eterna #define Hello The_Cruel_Worl ...
- python基础-闭包
def bibao(): li = [] n = [1] def inner(): li.append(n[0]) n[0] +=1 print(li) return inner b = bibao( ...
- zombodb 数据类型映射
zombodb 与es 数据类型的映射处理 通用数据类型映射 Postgres 类型 Elasticsearch JSON 映射定义 bytea {"type": "bi ...
- Session、Cookie、Cache、Token分别是什么及区别
一.Session 1 )Session 解释 Session 是单用户的会话状态.当用户访问网站时,产生一个 sessionid.并存在于 cookies中.每次向服务器请求时,发送这个 cooki ...
- Centos6.5安装mariadb的坑坑
最近在看Ansible,<Ansible权威指南>,然后有个地方是搭建Web应用框架,有个服务器是安装Mariadb,找到官方文档,一直弄,总是报错,换个思路,下载rpm到本地,安装,然后 ...