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()构造函数中的两个参数分别是下面的意思:

  1. The "code", which represents the contract's account. This value is accessible through the scoped _code variable.
  2. 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的更多相关文章

  1. [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 ...

  2. [Spring boot] Configuring and Accessing a Data Source

    We need our data persistence with configuring our datasouce: In application.properties: spring.h2.co ...

  3. Azure Redis Cache (1) 入门

    <Windows Azure Platform 系列文章目录> Microsoft Azure Redis Cache基于流行的开源Redis Cache. 1.功能 Redis 是一种高 ...

  4. Azure Redis Cache (3) 创建和使用P级别的Redis Cache

    <Windows Azure Platform 系列文章目录> 在笔者之前的文档里面已经说明了,Azure Redis Cache分为三个不同的级别: - 基本,Basic,不包含SLA ...

  5. ios 在程序中使用iCloud

    注意,这里说的使用icould不是用icloud进行系统备份,那个功能不需要我们写代码,备份到icloud的东西我们也不能操作.我们指的是以下这3种icloud使用方法: 这里有3中使用方法, Key ...

  6. android和ubifs

    原文地址: http://opendevkit.com/?e=37 1. ubifs号称性能比yaffs2 好,同时压缩可读写,文件系统image体较小同时可写,相当不错 2. ubifs制作 (1) ...

  7. iphone dev 入门实例4:CoreData入门

    The iPhone Core Data Example Application The application developed in this chapter will take the for ...

  8. MongoDB - Introduction to MongoDB

    MongoDB is an open-source document database that provides high performance, high availability, and a ...

  9. Conclusion

    Conclusion This concludes our brief look at building a simple, but fully functional, Zend Framework ...

随机推荐

  1. 算法笔记1 - 编辑距离及其动态规划算法(Java代码)

    转载请标注原链接:http://www.cnblogs.com/xczyd/p/3808035.html 编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个 ...

  2. 洛谷P1605:迷宫(DFS)

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右 ...

  3. 谈一谈Crsf和XSS攻击

    crsf 和 XSS CRFS攻击全称是一种利用cookie的漏洞进行的一种跨域请求伪造: 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一 ...

  4. java服务端的 极光推送

    项目中用到了极光推送  下面写下笔记 首先引入jar包   下载地址https://docs.jiguang.cn/jpush/resources/(非maven项目的下载地址) <depend ...

  5. Linux双线双网卡双IP双网关设置方法

    机房上架了一台测试机,系统是Ubuntu 9.04 X64的系统,母机IBM X336机器.用户需求是双线,故采用一个网卡配置电信地址,另一个网卡配置联通地址,安装好系统后配置好IP发现联通地址和电信 ...

  6. Ubuntu 下解压tar.xz方法

    参考地址:https://www.cnblogs.com/baby123/p/6611169.html

  7. 微信支付,退款时,出现了内部错误-网站中X509Certificate2加载证书时出错

    今天给阿里云,虚拟主机 网站配置了加密证书文件,用类X509Certificate2加载证书文件时,一直报出现了内部错误,但是Demo中用控制台程序加载证书没任何问题 读取证书文件的语句: X509C ...

  8. Delphi操作剪贴板

    Windows使用剪贴板观察器和观察链.剪贴板观察器是一个显示剪贴板当前内容的窗口.            通常它应该至少能显示三种普通格式的内容:文字CF_TEXT.位图CF_BITMAP.元文件C ...

  9. nodejs教程 安装express及配置app.js文件的详细步骤

    来自:http://www.jb51.net/article/36710.htm   express.js是nodejs的一个MVC开发框架,并且支持jade等多种模板.下面简单来说说express的 ...

  10. debian删除i386的包

    sudo apt-get remove --purge `dpkg --get-selections | grep i386 | awk '{print $1}'`; sudo dpkg --remo ...