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

  查看 cleos 查看 table的命令

cleos get table addressbook addressbook people --lower alice --limit 1

  

参考:

1、https://developers.eos.io/eosio-home/docs/data-persistence

原文地址:https://www.cnblogs.com/tekkaman/p/10003694.html