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 name
type, 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
_code
variable. - 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 ...
随机推荐
- Spark访问Hive表
知识点1:Spark访问HIVE上面的数据 配置注意点:. 1.拷贝mysql-connector-java-5.1.38-bin.jar等相关的jar包到你${spark_home}/lib中(sp ...
- 【转】@RequestBody注解出现的三点错误
错误1 { "timestamp": 1529747704259, "status": 415, "error": ...
- java面试题01
一.JAVA基础 1.简述你所知道的JAVA修饰符及各自的使用机制?(public.abstract.final.synchronized.super…) 01.public:允许所有客户访问 02. ...
- 编译安装和apt安装Nginx1.14.0
安装依赖 yum -y install gcc gcc-c++yum -y install zlib zlib-devel openssl openssl-devel pcre-devel 在Ubun ...
- 使用MSF生成shellcode
使用MSF生成shellcode payload和shellcode的区别 Payload是是包含在你用于一次漏洞利用(exploit)中的ShellCode中的主要功能代码.因为Payload是包含 ...
- Spring各个jar包作用
Spring AOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现Spring Aspects:Spring提供的对AspectJ框架的整合Spring Beans:Spring IO ...
- confluence6.3.1升级最新版本(6.15.1)
参考自官方文档:https://www.cwiki.us/display/CONFLUENCEWIKI/Upgrading+Confluence 1,confluence6.3.1安装部署 https ...
- centos7怎么查看、打开和关闭防火墙
使用centos7会发现,用centos6以前的方式查看.打开和关闭防火墙都无效了.这是因为centos7的防火墙改用firewalld,而不再使用iptables了 查看centos7的防火墙的状态 ...
- 被称为“开发者神器”的GitHub,到底该怎么用?
被称为“开发者神器”的GitHub,到底该怎么用? 原文:https://baijiahao.baidu.com/s?id=1594232691312740966&wfr=spider& ...
- 黄聪:visual studio 2017编译运行出现脚本发生错误等问题如何解决?
升级VS2017后,编译运行程序会出现 /Community/Common7/IDE/PrivateAssemblies/plugin.vs.js 错误 先说VS2017-15.6.1跟旧版本IE的兼 ...