EOS的数据持久性(下)

【云界洞见】移动云对象存储EOS项目实践 云存储市场近年来经历了显著的增长和发展。随着智能终端的普及和全球大数据储量的持续增长,云存储的需求也在不断扩大。 阅读详情

上文EOS的数据持久性(上)中提到,如果用户想要完全删除记录怎么办?我们接着来看下面的步骤:

第8步:从表中删除记录

与前面的步骤类似,在地址簿中创建一个公共方法,确保包含ABI声明和针对操作的参数用户进行测试的require_auth,以验证只有记录的所有者可以修改其帐户。

//c++
void erase(account_name user){
      require_auth(user);
    }

实例化表。在addressbook中,每个帐户只有一个记录。使用find设置iterator。

//c++
...
    void erase(account_name user){
      require_auth(user);
      address_index addresses(_self, _self);
      auto iterator = addresses.find(user);
    }
...

合约不能删除不存在的记录,因此在继续之前断言记录确实存在。

//c++
...
    void erase(account_name user){
      require_auth(user);
      address_index addresses(_self, _self);
      auto iterator = addresses.find( user );
      eosio_assert(iterator != addresses.end(), "Record does not exist");
    }
...

最后,调用erase方法,擦除迭代器iterator。

//c++
...
    void erase(account_name user){
      require_auth(user);
      address_index addresses(_self, _self);
      auto iterator = addresses.find( user );
      eosio_assert(iterator != addresses.end(), "Record does not exist");
      addresses.erase(iterator);
    }
...

合约现在基本完成。 用户可以创建,修改和删除记录。但是,合约还没有为编译做好准备。

第9步:准备ABI

完成以下步骤以完成合约。

9.1 EOSIO_ABI

在文件的底部,使用EOSIO_ABI宏程序,传递合约的名称,以及我们的单独操作“upsert”。

此宏程序处理wasm用于将调用分派给我们的合约中的特定方法的应用处理程序。

将以下内容添加到addressbook.cpp的底部将使我们的cpp文件与EOSIO的wasm解释器兼容。未能包含此声明可能会在部署合约时导致错误。

//c++
EOSIO_ABI( addressbook, (upsert) )
9.2 ABI action 声明

eosio.cdt包含一个ABI Generator,但为了它的工作,我们的合同需要一些小的声明。

在upsert和erase函数之上添加以下C++11声明:

//c++
[[eosio::action]]

上述声明将提取操作的参数,并在生成的ABI文件中创建必要的ABI结构描述。

9.3 ABI表声明

向表中添加ABI声明。修改合约私有区域中定义的以下行:

//c++
struct person {

改成这样:

//c++
struct [[eosio::table]] person {

[[eosio.table]]声明将向ABI文件添加必要的描述。

现在我们的合约已经准备好了。

以下是我们的addressbook合约的最终状态:

//c++
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>

using namespace eosio;

class addressbook : public eosio::contract {

public:
  using contract::contract;

  addressbook(account_name self): contract(self) {}

  [[eosio::action]]
  void upsert(account_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(_self, _self);
    auto iterator = addresses.find( user );
    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 {
      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;
      });
    }
  }

  [[eosio::action]]
  void erase(account_name user){
    // require_auth(user);
    address_index addresses(_self, _self);
    auto iterator = addresses.find( user );
    eosio_assert(iterator != addresses.end(), "Record does not exist");
    addresses.erase(iterator);
  }

private:
  struct [[eosio::table]] person {
    account_name key;
    std::string first_name;
    std::string last_name;
    std::string street;
    std::string city;
    std::string state;
    uint64_t primary_key() const { return key; }
  };
  typedef eosio::multi_index<N(people), person> address_index;

};

EOSIO_ABI( addressbook, (upsert)(erase) )

第10步:编译合约

从终端执行以下命令:

//shell
eosio-cpp -o addressbook.wasm addressbook.cpp --abigen

第11步:部署合约

为合约创建一个帐户,执行以下shell命令:

//shell
cleos create account eosio addressbook YOUR_PUBLIC_KEY

部署addressbook合约。

//shell
cleos set contract addressbook CONTRACTS_DIR/addressbook

结果:

//Result
5f78f9aea400783342b41a989b1b4821ffca006cd76ead38ebdf97428559daa0  5152 bytes  727 us
#         eosio <= eosio::setcode               {"account":"addressbook","vmtype":0,"vmversion":0,"code":"0061736d010000000191011760077f7e7f7f7f7f7f...
#         eosio <= eosio::setabi                {"account":"addressbook","abi":"0e656f73696f3a3a6162692f312e30010c6163636f756e745f6e616d65046e616d65...
warning: transaction executed locally, but may not be confirmed by the network yet    ]

第12步:测试合约

在表中添加一行:

//shell
cleos push action addressbook upsert '["alice", "alice", "liddell", "123 drink me way", "wonderland", "amsterdam"]' -p alice@active

结果:

////Result
executed transaction: 003f787824c7823b2cc8210f34daed592c2cfa66cbbfd4b904308b0dfeb0c811  152 bytes  692 us
#   addressbook <= addressbook::upsert          {"user":"alice","first_name":"alice","last_name":"liddell","street":"123 drink me way","city":"wonde...

检查alice是否无法为其他用户添加记录。

//shell
cleos push action addressbook upsert '["bob", "bob", "is a loser", "doesn't exist", "somewhere", "someplace"]' -p alice@active

正如预期的那样,我们合约中的require_auth阻止了alice创建/修改另一个用户的行。

//Result
Error 3090004: Missing required authority
Ensure that you have the related authority inside your transaction!;
If you are currently using 'cleos push action' command, try to add the relevant authority using -p option.

查询爱丽丝的记录。

//shell
cleos get table addressbook addressbook people -k alice

结果:

//Result
{
  "rows": [{
      "key": "3773036822876127232",
      "first_name": "alice",
      "last_name": "liddell",
      "street": "123 drink me way",
      "city": "wonderland",
      "state": "amsterdam"
    }
  ],
  "more": false
}

测试看到爱丽丝可以删除记录。

//shell
cleos push action addressbook erase '["alice"]' -p alice@active

结果:

//Result
executed transaction: 0a690e21f259bb4e37242cdb57d768a49a95e39a83749a02bced652ac4b3f4ed  104 bytes  1623 us
#   addressbook <= addressbook::erase           {"user":"alice"}
warning: transaction executed locally, but may not be confirmed by the network yet    ]

检查记录是否已删除:

//shell
cleos get table addressbook addressbook people -k alice

结果:

//Result
{
  "rows": [],
  "more": false
}

看起来不错!

总结下

你已经学习了如何配置表,实例化表,创建新行,修改现有行以及如何使用迭代器。你已经学习了如何针对空迭代器结果进行测试,以及如何配置合约的ABI。

文中调用的各种eos方法可以参考:EOS.IO C语言API手册。

======================================================================

分享一个交互式的在线编程实战,EOS智能合约与DApp开发入门:

EOS教程

本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。

  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。

汇智网原创翻译,转载请标明出处。这里是原文

EOS合约开发第十五章-数据表设计 数据表设计 一、概述 eos在执行一个action之前,会为该action设置一个干净的运行环境,也就是说每个action是完全独立的环境中运行的,目前在action之间传输数据的唯一方式是持久化数据到eos数据库和从eos数据库读取数据。 eos标准库中multi_index api提供了一个访问eos数据库的C++接口,这个API提供了一个对象存储的模型,支持多种检索方式、支持不同排序方... 阅读详情

相关推荐

四万字长文详解——node.js使用移动云,EOS对象存储

移动云对象存储EOS(Elastic Object Storage)是移动云提供的海量、高可靠、安全、低成本的云存储服务。其数据设计持久性不低于99.999999999%(11个9),服务可用性达到99.95%。使用移动云提供的API、SDK接口轻松地将海量数据移入和移出移动云EOS。数据存储到移动云EOS以后,可以选择标准存储作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低的低频访问存储、归档存储作为不经常访问数据的存储方式。

小淼淼的博客 5876

EOS 错误码整理

EOS 目前大约有180种错误类型,虽然有错误码,但是还是很笼统的,具体的报错信息还得看detail里面的内容 一、常见的错误码以及issue上对应的错误记录 3010001 Invalid name 账户名格式1-12位(a-z,1-5,“.” ) 且”.”不能在首尾https://github.com/EOSIO/eos/issues?utf8=%E2%9C%93&amp;q=301000...

agecntao的专栏 6471

JetLinks社区版VS企业版:手把手教你用PostgreSQL+Redis搭建物联网中台(Win7实测)

本文详细对比了JetLinks社区版与企业版的核心差异,并提供了在Windows 7系统上,使用PostgreSQL和Redis搭建物联网中台的完整部署教程。文章深入解析了从环境准备、后端服务构建到前端部署的每一步,为开发者在资源有限环境下构建高性价比物联网平台提供了清晰的实战指南。

w1x2y3的博客 305

EOS学习笔记——编写使用数据库的智能合约

编写使用数据库的智能合约 前面一直在捣鼓EOS网络搭建的相关东西。然而今天比较不走运的是,兴致勃勃的把源码版本升到4.0,在编译的时候如我所猜想的出现了一系列问题,正一筹莫展的时候,导师突然问了我一个关于合约如何操作数据库的问题。没办法,前面没怎么关注这一块,于是乎吞吞吐吐没能回答老师的问题。心想,反正现在源码有问题,搭不了网络,干脆花点时间看看合约的内容。 于是乎,就有了今天的学习笔记,笔记...

Leslie_Ran的博客 1893

Claude Code长期记忆:优雅的上下文管理

ClaudeCode的上下文管理系统采用三层架构设计,通过智能压缩和优化策略在记忆容量与性能间取得平衡。系统包含短期记忆(高速工作区)、中期记忆(智能蒸馏器)和长期记忆(持久化知识库)。当Token使用率达到92%阈值时启动wU2压缩器,采用8段式结构化摘要保留关键信息,并配合智能文件恢复和渐进式预警机制。该系统通过分层处理、优雅降级和透明化交互,为AI应用提供了高效可靠的上下文管理方案,展现了在有限资源下实现智能记忆的艺术。

m0_53117338的博客 3817

树莓派与OpenCV实现人脸识别(OpenCV安装篇)

主要看了以下两位博客的文章完成的,也遇到了不少的坑,在这里一一填补说明。 链接: https://blog.youkuaiyun.com/weixin_42163073/article/details/107308759. 链接: https://blog.youkuaiyun.com/weixin_42573595/article/details/108526850. 树莓派与OpenCV实现人脸识别(OpenCV安装篇)一、材料准备:二、系统烧录三、安装OpenCV依赖项四、下载OpenCV-4.3.0五、为OpenCV配置P

weixin_45880057的博客 1万+

EOS系列八:MongoDB的使用

EOS含有mongodb的插件,可以对mongodb友好支持。在此总结一下EOS与mongoDB的交互。 一、mongoDB环境搭配。 1、下载安装mongoDB,EOS安装时可能已经安装好mongodb。如你的系统未安装或者你不想使用eos默认安装的版本,可以另行安装。安装方法略(最简单方法是命令sudo apt-get install mongodb)。 2、新建数据库保存目录以及日志目录...

weixin_33656634的博客 1115

【06】新国都——新国都 嵌入式笔试,校招,题目记录及解析

本文总结了新国都嵌入式校招笔试题目及解析,内容涵盖C语言基础、Linux系统、数据结构与算法等多个方面。主要包括:1)不定项选择题10道,涉及字符串常量、蓝牙与GPRS区别、编译错误识别等;2)判断题10道,考察Linux权限、循环控制、内存管理等;3)填空题5道,包括编码计算、逻辑运算、宏定义等;4)简答题2道,解析全局变量引用和进程线程区别。题目难度适中,重点考察嵌入式开发基础知识和编程能力,并提供详细解析和扩展知识链接,对准备嵌入式相关笔试具有参考价值。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1432

EOS 配置mongodb

  本文实现方案:在虚拟机ubuntu上运行单节点的EOS,把数据存储到mongodb中,然后通过本地的windows查看mongodb的数据。   配置如下:     虚拟机: ubuntu 16.04         EOS version: v1.2.5(本人源码有部分修改)         ip:192.168.14.199         mongo db:...

weixin_30699831的博客 205

Lammps不同亲疏水性粗糙表面的润湿行为模拟(包含in文件)

Lammps粗糙表面的润湿行为模拟(包含in文件)前言—润湿行为模拟一、物理模型构建二、具体in文件—in文件内循环亲疏水性三、具体in文件—分子模板构建初始模型以及平衡态模拟四、全部代码(基地粗糙表面只提供data文件) 前言—润湿行为模拟 润湿现象:当液体与固体接触时,液体的附着层将沿固体表面延伸。当接触角 θ\rm \thetaθ 为锐角时,液体润湿固体,若θ为零时,液体将展延到全部固体表面上。润湿现象的产生与液体和固体的性质有关。(来自百度百科) 润湿行为的本质是固液之间的相互作用,也就是分子间的范

Rockyoung 7093

家用智能监控摄像机如何使用NAS进行存储/备份(小米智能摄像机如何解决群晖 / 飞牛 NAS 识别失败、文件目录不显示问题)

小米摄像头NAS存储总出问题?🤯 别慌!本文揭秘NAS底层逻辑,群晖、飞牛实战指南。手把手教你排查解决所有难题,轻松搞定监控录像安全备份!🔒

XiaoqiangClub的博客 2697

[EOS源码分析]5.EOS编写HelloWorld智能合约及各种坑

  本文所有实践都是基于EOS dawn-v4.1.0,请切到该分支然后实践 切换命令:git checkout dawn-v4.1.0 HelloWorld源码 #include &lt;eosiolib/eosio.hpp&gt; #include &lt;eosiolib/print.hpp&gt; using namespace eosio; class hello :...

区块链斜杠青年(爱踢门) 6122

使用GBIF获取生物多样性数据与GIS的结合

随着全球生物多样性的重要性日益凸显,越来越多的研究人员和保护机构开始利用地理信息系统(GIS)来分析和可视化生物多样性数据。GBIF(全球生物多样性信息设施)作为一个全球性的生物多样性数据库,提供了大量的物种分布和分类信息,为研究人员和保护工作者提供了宝贵的数据资源。本文将介绍如何使用GBIF API获取生物多样性数据,并将其与GIS技术相结合,以便更好地理解和研究生物多样性。利用GIS的强大功能,我们可以在地理空间上可视化物种分布、分析物种多样性的空间格局,并为保护生物多样性提供科学依据。

BnxBackend的博客 1763

EOS开发中的数据持久性问题(上)

本教程假定你已经完成了EOS开发从智能合约开始。 要了解数据持久性,请编写一个简单的智能合约,作为地址记录。虽然这个用例由于各种原因而不太适合作为生产智能合约,但开始学习数据持久性如何在EOSIO上运行而不被与eosio的multi_index功能无关的业务逻辑分心,这也算的上一个很好的合约。 第1步:创建一个新目录 之前,你创建了一个合约目录,现在就在那里开始。 //shell cd ...

rejames的博客 383

【短距离通信】【WiFi】精讲802.11n/ac/ax mpdu和ampdu最大长度

在 Wi-Fi 标准(802.11n、802.11ac 和 802.11ax)中,和是数据传输的核心概念。理解它们各自的作用以及不同标准下的最大长度限制,有助于深入了解 Wi-Fi 的性能优化机制。以下是对802.11n802.11ac和802.11ax中MPDU和A-MPDU最大长度的详细技术分析和对比。1. MPDU 和 A-MPDU 的基本概念MPDU 是经过 MAC 层处理后的数据单元,主要由MAC层数据帧和物理层的传输头部(PHY headers)组成。

风云说通信 1108

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

EOS数据持久性(上)

本教程假定你已经完成了EOS开发从智能合约开始。 要了解数据持久性,请编写一个简单的智能合约,作为地址记录。虽然这个用例由于各种原因而不太适合作为生产智能合约,但开始学习数据持久性如何在EOSIO上运行而不被与eosio的multi_index功能无关的业务逻辑分心,这也算的上一个很好的合约。 第1步:创建一个新目录 之前,你创建了一个合约目录,现在就在那里开始。 //shell cd CONTR...

weixin_34080571的博客 299

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

EOS开发中的数据持久性(上)

本教程假定你已经完成了EOS开发从智能合约开始。 要了解数据持久性,请编写一个简单的智能合约,作为地址记录。虽然这个用例由于各种原因而不太适合作为生产智能合约,但开始学习数据持久性如何在EOSIO上运行而不被与eosio的multi_index功能无关的业务逻辑分心,这也算的上一个很好的合约。 第1步:创建一个新目录 之前,你创建了一个合约目录,现在就在那里开始。 //shell cd CONT...

mongo_node的专栏 356

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

EOS开发中的数据持久性(下)

上文EOS的数据持久性(上)中提到,如果用户想要完全删除记录怎么办?我们接着来看下面的步骤: 第8步:从表中删除记录 与前面的步骤类似,在地址簿中创建一个公共方法,确保包含ABI声明和针对操作的参数用户进行测试的require_auth,以验证只有记录的所有者可以修改其帐户。 //c++ void erase(account_name user){ require_auth(u...

rejames的博客 637

区块链EOS|智能合约入门4——了解数据持久性

正文   本文将使用一个简单的例子帮助理解EOSIO中的数据持久性。 1. 在你的contract目录下创建addressbook文件夹,并在其中创建addressbook.cpp文件。 cd /Users/yourUserName/Documents/EOS/contracts mkdir addressbook cd addressbook touch addressbook.cpp 2....

weixin_40462761的博客 414

上如何刻字_如何在区块链网络上"刻字"?

F2Pool 鱼池挖出比特币第三次减半前最后区块(629,999),并将纽约时报标题以「NYTimes 09/Apr/2020 With $2.3T Injection, Fed's Plan Far Exceeds 2008 Rescue」的形式写入区块中,致敬中本聪在 2009 年比特币创世区块里写下泰晤士报头版标题。2009 年 1 月 3 日中本聪将泰晤士报标题以「The Times 03...

weixin_39975486的博客 236

高级EOS系列 - 第2部分 - 单例模式

欢迎来到高级EOS开发系列,在这里我将讨论技术和功能,这些很少被教程和课程所涵盖。本系列的目的是汇集您在EOS网络上作为应用程序开发人员完成技能所需的缺失部分。每个帖子都是按难度排序的,所以如果您想要概述,我建议您从第1部分开始完成。对于本系列的第2部分,我们将查看Singletons,此示例的所有代码都可以在GitHub上找到。 MitchPierias/Advanced-EOS-Exampl...

Y03977211367Y的博客 378

EOS学习笔记

EOS学习笔记latest/index学习笔记概述平台和工具链核心概念技术特点功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 latest/index学习笔记 URL地址:https://developers.eos.io/wel

u011893966的博客 752

EOS系列 - WASM智能合约 - 数据类型与RAM

EOS上编写智能合约的注意事项 EOSIO支持创建智能合约,其执行和资源消耗的方式与在操作系统上运行的应用程序类似。智能合约使用C++编写并转换为WebAssembly。 计算量和速度由带宽和CPU资源负责,持久信息的存储由RAM负责。只有在执行某些智能合约操作时才需要CPU和带宽,这些资源可以通过抵押Token获得。 持久性资源RAM需要根据需求预先购买。RAM通常为易失性内存,但在...

搬砖魁首的博客 849

[EOS源码分析]9.EOS智能合约开发实践之数据库持久化

     以太坊智能合约定义的全局变量的值是持久性的,就相当于智能合约一直在运行着。而EOS的智能合约更加接近我们平时使用的程序,每次执行action都相当于启动智能合约的一个新实例,一旦执行完,代码定义的变量就释放了,不会影响下一次执行环境。但是智能合约肯定需要有持久化存储的需求,比如永久保存智能合约代币的状态,不能代币转账执行完,代币的balance余额信息和转账前一样吧。这个持久化存储就是数...

区块链斜杠青年(爱踢门) 4514
上一篇: 如何才能招聘到合适的以太坊区块链开发者
下一篇: .NetCore使用以太坊区块链简介
落叶无声9
博客等级 码龄12年 443粉丝 343原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值