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. Python全栈之路----函数----作用域

    Python中,一个函数就是一个作用域. 局部变量放置在其作用域中,根据作用域来区分,函数属于你,函数属于我. 定义完成后,作用域已经生成,使用时顺着作用域链向上查找. 函数定义完成后,不管被在哪儿被 ...

  2. 如何利用 Git 与 GitHub 进行多人协作开发

    方法一:添加 Collaborators Collaborators 类似于Team模式. Repository的拥有者Owner 可以直接添加合作者到自己的仓库中, 让合作者拥有几乎等同拥有者的权限 ...

  3. 什么是node

    node 编辑 锁定讨论999 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!   node(结点):网络连接的端点,或两条(或多条)线路的连接点.结点可以是处理器.控制器或 ...

  4. ios-UILabel居中随内容自适应,后面的控件跟在其后

    如图绿蓝框所示,UILabel显示名字,Label框随名字长短而自适应,后面的性别图片跟在其后显示 分两部分:第一部分先布局 //名字 self.nameLab = [[UILabel alloc]i ...

  5. win10的linux子系统安装及使用

    最近需要用到linux但是又不想装双系统,正好win10推出了linux子系统,省事了,自己也是煞费苦心才整明白 1.首先你要是很新的win10版本(1607及已上),这样才有下面的步骤 依次在 设置 ...

  6. Android related

    The build env. ensure that your computer’s BIOS is set up to support Intel’s virtualization extensio ...

  7. 策略模式(Strategy )

    为实现一个目的采用不同的方式都可实现,具体看要采取哪种方式. //接口 public interface Strategy {    public void algorithmInterface(); ...

  8. Mycat 镜像-创建 Docker 镜像

    将 Mycat-server 创建到镜像,使其能够进行容器化部署,我们需要创建 Dockerfile 并在文件中安装其依赖项,使用 centos 做为 base 镜像,并安装 jdk 依赖即可,因此创 ...

  9. 阅读 Device Driver Programmer Guide 笔记

    阅读 Device Driver Programmer Guide 笔记 xilinx驱动命名规则 以X开头 源文件命名规则 以x打头 底层头文件与高级头文件 重点来了,关于指针的使用 其中 XDev ...

  10. Python变量以及类型

    变量的定义 在程序中,有时我们需要对2个数据进行求和,那么该怎样做呢? 大家类比一下现实生活中,比如去超市买东西,往往咱们需要一个菜篮子,用来进行存储物品,等到所有的物品都购买完成后,在收银台进行结账 ...