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 ...
随机推荐
- Python全栈之路----函数----作用域
Python中,一个函数就是一个作用域. 局部变量放置在其作用域中,根据作用域来区分,函数属于你,函数属于我. 定义完成后,作用域已经生成,使用时顺着作用域链向上查找. 函数定义完成后,不管被在哪儿被 ...
- 如何利用 Git 与 GitHub 进行多人协作开发
方法一:添加 Collaborators Collaborators 类似于Team模式. Repository的拥有者Owner 可以直接添加合作者到自己的仓库中, 让合作者拥有几乎等同拥有者的权限 ...
- 什么是node
node 编辑 锁定讨论999 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! node(结点):网络连接的端点,或两条(或多条)线路的连接点.结点可以是处理器.控制器或 ...
- ios-UILabel居中随内容自适应,后面的控件跟在其后
如图绿蓝框所示,UILabel显示名字,Label框随名字长短而自适应,后面的性别图片跟在其后显示 分两部分:第一部分先布局 //名字 self.nameLab = [[UILabel alloc]i ...
- win10的linux子系统安装及使用
最近需要用到linux但是又不想装双系统,正好win10推出了linux子系统,省事了,自己也是煞费苦心才整明白 1.首先你要是很新的win10版本(1607及已上),这样才有下面的步骤 依次在 设置 ...
- Android related
The build env. ensure that your computer’s BIOS is set up to support Intel’s virtualization extensio ...
- 策略模式(Strategy )
为实现一个目的采用不同的方式都可实现,具体看要采取哪种方式. //接口 public interface Strategy { public void algorithmInterface(); ...
- Mycat 镜像-创建 Docker 镜像
将 Mycat-server 创建到镜像,使其能够进行容器化部署,我们需要创建 Dockerfile 并在文件中安装其依赖项,使用 centos 做为 base 镜像,并安装 jdk 依赖即可,因此创 ...
- 阅读 Device Driver Programmer Guide 笔记
阅读 Device Driver Programmer Guide 笔记 xilinx驱动命名规则 以X开头 源文件命名规则 以x打头 底层头文件与高级头文件 重点来了,关于指针的使用 其中 XDev ...
- Python变量以及类型
变量的定义 在程序中,有时我们需要对2个数据进行求和,那么该怎样做呢? 大家类比一下现实生活中,比如去超市买东西,往往咱们需要一个菜篮子,用来进行存储物品,等到所有的物品都购买完成后,在收银台进行结账 ...