【三胖聊区块链-EOS】(五)EOS入门系列-智能合约数据持久化

393 阅读2分钟

github源码:我在这呢

在前一篇了解了智能合约的开发骨架后,接着就进入真正的智能合约开发阶段吧 在开发中最重要的就是如何对数据进行操作,因此本文说一下开发智能合约的数据持久化
本文将以代码形式引例,其他开发模式基本与其一致。 借助官网例子,自己多敲几遍,理解并融会贯通
在设计表结构的时候需要注意,区块链的表如果有data不能临时加入新column,所以在设计的时候尽可能考虑的周全一点。

1.项目结构

2.addressbook.hpp文件,说明如下:

3.addressbook.cpp文件,说明如下:

4.addressbook.hpp 代码如下:

#include <eosio/eosio.hpp>

using namespace std;
using namespace eosio;

CONTRACT addressbook : public contract {
  public:
    using contract::contract;
    /** 
      声明两个action: upsert和deleteuser,具体实现将在cpp文件中 
      ACTION:是一个标签,一定要加,声明是一个action
    */
    ACTION upsert(name user, string first_name, string last_name, string street, string city, string state);
    ACTION deleteuser(name user);

  private:
    /** 
      TABLE:标签,声明这是一张table
    */
    TABLE person {  //定义一张table,用于存储data
      name key;
      string first_name;
      string last_name;
      string street;
      string city;
      string state;
      auto primary_key() const { return key.value; }  //定义主键
    };

    /**
      设置为多索引
      name("people")  命名为people 
      person  传入上面定义的表结构
      address_index类型将用于实例化表
    */
    typedef multi_index<name("people"), person> address_index;
};

5.addressbook.cpp 代码如下:

#include <addressbook.hpp>

ACTION addressbook::upsert(name user, string first_name, string last_name, string street, string city, string state) {
  require_auth(user);
  address_index addresses(get_self(), get_self().value); //实例化表
  auto iterator = addresses.find(user.value); //创建迭代器
  if(iterator == addresses.end()) {
    addresses.emplace(user, [&](auto& row){   //mplace方法的回调函数必须使用lamba函数来创建引用,插入data
      row.key = user;
      row.first_name = first_name;
      row.last_name = last_name;
      row.street = street;
      row.city = city;
      row.state = state;
    });
  } else {
    addresses.modify(iterator, user, [&](auto& row){  //更新data
      row.key = user;
      row.first_name = first_name;
      row.last_name = last_name;
      row.street = street;
      row.city = city;
      row.state = state;
    });
  }
}

ACTION addressbook::deleteuser(name user) {
  require_auth(user);
  address_index addresses(get_self(), get_self().value); //实例化表
  auto iterator = addresses.find(user.value); //创建迭代器
  check(iterator != addresses.end(), "Record does not exist");
  addresses.erase(iterator);  //删除record
}


EOSIO_DISPATCH(addressbook, (upsert)(deleteuser))

更多

想了解更多,请关注公众号哦!