在本文中,我将演示一种缓存以太坊事件的简单方法。我只想说,通常我们将事务用于链下操作,例如跟踪令牌的传输或检索特定事务的筛选列表,就像一个SQL查询一样。

假设我们想要创建一个跟踪令牌传输的网站,Etherscan。我们只需要一波简单的操作,比如:取得所有令牌转移信息

取得以太坊转账来源地址

取得以太坊转账目标地址

获得特定金额的转账信息

在特定时间范围内获得转移信息

在web3中是有getPastEvents方法,其示例用法是:

这种方法的主要问题是,随着区块链的增长,速度可能会变慢,尤其是如果您不运行自己的以太坊节点,并且使用像infura或MyEtherApi这样的公共提供者。

接下来,几乎不可能实现一些比较复杂的查询,因为筛选对象的功能非常有限。

此外,已经写入区块链的事件无法更改,只能随时间添加新记录。 这个和其他事实使事件成为缓存的完美目标。

数据库选择

在这个例子中,我们将使用mysql作为保存事件记录的数据库。MySQL有能力存储原始JSON,然后使用JSON对象的属性编写查询,就好像它们是普通的SQL列一样。

我们应该储存什么?

让我们仔细看看getPastEvents方法的结果,以实现我们使用的数据。 我以Binance代币转移为例。 每个事件对象都具有以下结构:

如您所见,事件参数存储在returnValues属性中。 blockNumber,transactionHash,logIndex也可能有用,我稍后会告诉你。

我们的目标是将这些JSON对象编写到数据库中,并实现可以无缝替换标准web3的getPastEvents方法的简单访问方法。

以下是用于创建Transfer表的SQL脚本。

需要说明的一些重要事项:json列创建为JSON类型。 这允许我们使用特殊语法创建自动生成的列。

from,to,value  - 这些是自动生成的列。 这个表达式起初看起来很复杂,但实际上它很简单。 例如,从列值等于存储在json列中的对象的returnValues.from属性。

txHash和logIndex。 这些属性组合在一起可识别每个事件对象 我们需要那些为行创建唯一索引,从而防止偶尔重复事件。

我们还可以选择添加数据库索引来提高性能。 例如,对于to 列

案例实践

先决条件

Node.js的 我使用的是8.4.0版。

Web3 npm包与区块链进行交互。 我们需要特定版本1.0.0-beta.35。 在尝试检索某些事件时,最新版本beta.36的使用导致“返回值无效,是否运行Out of Gas”错误。

3.要在JavaScript中使用MySQL数据库,我们应该安装mysql包

4.最后一个 -  MySQL服务器。 值得一提的是,我们将使用MySQL 5.7作为最新的8.0版本似乎与mysql包兼容(它在尝试连接时给了我奇怪的错误ER_NOT_SUPPORTED_AUTH_MODE)。

MySQL交互

我们将利用连接池对此示例进行查询。

使用promisified版本的查询方法会更方便

现在我们可以使用以下代码将记录插入之前创建的传输表中。

在这里,我们还检查可能的重复行插入。 现在我们不希望在这种情况下做任何特别的事情,可能我们已经提前写过这些重复事件或类似的事情。 所以我们只考虑处理这种异常。

缓存功能

让我们构造一个智能合约对象来从中检索事件

我们只能在abi参数中包含Transfer事件接口,如下所示:

这是缓存功能的基本版本。 首先,我们获取事件对象,然后逐个将它们写入数据库。

定期区块链扫描

现在让我们将其扩展为一个简单的后台脚本,该脚本不断扫描区块链以查找发出的事件。

一些实用功能:

第一个是setTimeout的简单异步/等待实现。 第二个用于fn的无限周期调用 - 工作函数。

有了这些辅助功能,我们的后台扫描仪看起来非常简单

让我解释'latestEthBlock + 1'的事情。 Web3的getPastEvents(fromBlock,toBlock)返回在[from,to]范围内写入的事件,包括边界。 因此,如果没有这个递增,下一个cacheEvents调用将再次将写入latestEthBlock的事件作为结果的一部分返回。

虽然由于实现了唯一索引,重复事件不会插入到数据库中,但我们仍然不希望完成这些多余的工作。

对于简单的后台扫描程序,此实现应该足够了。 但是,总有改进的余地。 稍后我们会回到它。 现在让我们快速了解一下我们现在可以利用这些数据做些什么。

事件检索

以下是选择从特定地址进行的转移的功能示例:

我们使用生成的列查询数据库。 这里最值得注意的部分是函数的结果看起来就像web3的getPastEvents的结果。 它使得重构当前代码变得更加容易。

进一步改进

事件对象包含许多可能对您的应用程序完全无用的属性。 在写入数据库之前删除多余部分会更好。 这样我们就节省了很多空间。

您可能还注意到,当前版本的扫描程序在每次重新启动时都以区块#0开始。 在一直扫描到当前块时,它会尝试将重复记录插入数据库。 我们可以通过查询数据库中的最新缓存块来消除那些多余的工作。

不是从块#0开始扫描也是很好的,但至少从部署合同时的块开始扫描。 为简单起见,您可以使用etherscan.io获取此信息。

这里我们再次使用MySQL json函数来获取事件对象的blockNumber属性。

然后更换旧的扫描功能

新的扫描功能

结论

最后,我们创建了一个简单但有效的事件扫描程序,可以将事件连续缓存到MySQL数据库中。

声明:磁力链财经登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担!

发表评论

mysql教学磁力链_使用MySQL存储以太坊事件相关推荐

  1. mysql教学磁力链_【python小项目】网页爬虫+mysql数据库储存,爬虫xx视频网站视频磁力链接...

    #!/usr/bin/python3 # coding=utf8 import requests from bs4 import BeautifulSoup import pymysql import ...

  2. mysql 事件_区块链研究实验室 | 使用MySQL存储以太坊事件

    在本文中,我将演示一种缓存以太坊事件的简单方法.我只想说,通常我们将事务用于链下操作,例如跟踪令牌的传输或检索特定事务的筛选列表,就像一个SQL查询一样. 假设我们想要创建一个跟踪令牌传输的网站,Et ...

  3. eth geth 安卓_零基础学习以太坊开发--安装和使用以太坊客户端geth

    一.预备知识 想从事区块链开发,了解以太坊开发的程序员,在刚开始接触以太坊的时候,发现有很多的新名词: EVM solidity go-ethereum(geth) pyethereum Testrp ...

  4. 从魔兽玩家到区块链领袖,V神是如何打造出区块链2.0代表的以太坊

    V神 维塔利克˙布特林(Vitalik Buterin),人称V神,以太坊创始人. 1994年出生的V神可以说比很多老韭菜都要年轻很多.1998年,年仅四岁的V神收到了来自父亲的一台电脑作为礼物,这开 ...

  5. 公链之王遭众链围剿,落魄以太坊能否王者归来?

    表面看起来,如今是以太坊的至暗时刻,而黎明前往往是最黑暗的.种种迹象表明,ETH 2.0 或许会成为以太坊下一个爆发点. 文 | 秦晓峰  来源 | Odaily星球日报(ID:o-daily) 作为 ...

  6. 链游知识4:以太坊浏览器的使用

    前言:链游知识是链游玩家专门推出的针对入门玩家的区块链游戏知识科普,从小白到高玩,看链游玩家就够了. 这期给大家推荐一个非常实用的工具,那就是以太坊浏览器.现在链游行业,最普遍的代币应该就属于ERC2 ...

  7. 深入浅出mysql唐汉名_深入浅出MySQL++数据库开发、优化与管理维护+第2版+唐汉明 -- 存储引擎 - 数据类型 - 字符集和校验规则 -...

    create schema deepInMySql; use deepInMySql; -- 查看当前默认存储引擎 show variables like '%table_type%'; -- 查看当 ...

  8. mysql保存特殊表情_让 MySQL 支持 emoji 表情等特殊字符存储

    在导入 twitter 内容的时候,发现有部分内容会出错.开始以为是编码问题,但文本全部为 utf8 也会出现这个问题,后来定位到 emoji 字符.其原因是 utf8 是不定长的,根据左侧位来决定占 ...

  9. mysql 中有什么命令_常用mysql命令大全

    常用的MySQL命令大全 连接MySQL格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命 ...

最新文章

  1. LeetCode 206. 反转链表(Reverse Linked List) 16
  2. C++ 函数部分(1)
  3. 使用Eclipse构建Maven的SpringMVC项目
  4. oracle sys可以登录,system权限不足,解决方法
  5. android让一个控件跟上面控件对其,学个明白--Android控件架构
  6. arm tbh_TBH的完整形式是什么?
  7. java线程池_Java 并发编程 线程池源码实战
  8. 疫情下的十大堵城:复工后整体拥堵下降37.3%
  9. sql prompt插件的安装
  10. Qt_屏幕保护程序、进程监听、数据库读取、屏幕保护
  11. 【电力拖动自动控制系统】感应/异步电机动态模型完全手把手推导
  12. Hi3519AV100 SDK文档解读
  13. wd移动硬盘不能识别_wd移动硬盘无法识别
  14. 简单大学生静态HTML网页作品 HTML5+CSS大作业——圣诞节节日(7页) 带轮播特效
  15. HDOJ 1280 前m大的数(水题)
  16. C++学习8——菜鸟教程自学
  17. uiautomator2输入中文的问题
  18. C++析取器在代码自动化测试中的应用
  19. 怎么更换当前电脑的ip(ip被网站封了无法访问怎么办)
  20. 从程序员到产品经理再到自己创业的心路历程

热门文章

  1. 电商基本功:被小瞧的促销设计,并没有想得那么简单
  2. 女生适合从事什么工作?程序员!
  3. Redis源码精炼版
  4. 微信编辑器哪个好用?-----亲测,良心推荐微编王
  5. 抖音无水印视频抓取与按帧截取图片
  6. 设置ubuntu1920*1080分辨率
  7. idea启动项目报错 --To prevent a memory leak, the JDBC Driver has been forcibly unregistered
  8. 可视化正则表达式教程
  9. 字节跳动 Go RPC 框架 KiteX 性能优化实践
  10. 抖音上的战斗力测试软件,战斗力测试app