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 ...
随机推荐
- Linux命令行下:把程序放后台执行,以及从后台继续执行程序
把任务放到后台用 & 和 Ctrl+z 让后台任务从停止状态转为运行状态用 bg %N 把后台任务调回到前台用 fg %N 查看所有任务用jobs
- CART-GBRT-GBDT
CART:分类回归树 分类树和回归树的区别:分裂节点时使用的节点非纯度量(最小化准则.特征选择)不一样,修剪树的准则不一样 回归树: 节点非纯度量:平方误差和 区域估计值:均值(在给定的划分下,均值带 ...
- Spring @Resource,@Autowired,@Qualifier的注解注入和区别
spring2.5提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖.在Java代码中可以使用 @Resource或者@Autowired注解方式来经行注入 ...
- Semantic Compositionality through Recursive Matrix-Vector Spaces-paper
Semantic Compositionality through Recursive Matrix-Vector Spaces 作者信息:Richard Socher Brody Huval Chr ...
- Reading Level Assessment Using Support Vector Machines and Statistical Language Models-paper
Authors: Sarah E. Schwarm University of Washington, Seattle, WAMari Ostendorf University of Washingt ...
- 数据持久化系列之Mysql
一.命令行操作 1.显示所有库: show databases; 2.要操作某个库,比如库名: db_book:use db_book; 3.查看表的基本结构,比如表名: t_book:desc t_ ...
- python trie
Trie 库 https://github.com/pytries/marisa-trie/blob/master/docs/tutorial.rst http://marisa-trie.readt ...
- pam模块初探
- Flink+Kafka 接收流数据并打印到控制台
试验环境 Windows:IDEA Linux:Kafka,Zookeeper POM和Demo <?xml version="1.0" encoding="UTF ...
- python之路——9
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 学习内容 1.文件处理 1.打开文件 open(‘路径’,‘打开方式’) 打开方式 r w a r+ w+ ...