同步合约数据到数据库经典案例1
之前在《数字藏品发行平台的架构》里讲过,有一种架构希望以区块链的数据为核心。这样就需要将合约保存在区块链上的数据同步到数据库里,方便后续中间件接口的开发。
本次我们以同步ConfirmSale事件日志为例,介绍数据同步程序开发的相关知识点。
一、先上全部代码
二、相关知识点介绍
1. event logs
在Solidity代码中,使用event关键字来定义一个事件,如:event EventName(address bidder, uint amount);
这个用法和定义函数式一样的,并且事件在合约中同样可以被继承。触发一个事件使用emit(说明,之前的版本里并不需要使用emit),如:emit EventName(msg.sender, msg.value);
触发事件可以在任何函数中调用,如:
在我们的实例程序中,数字藏品交易合约定义了5种event log,分别是:商品上架、更新商品信息、取消上架、订单确认和拍卖出价。
我们需要将这5种事件从区块链同步下来,存入activity表中,作为基础数据,方便我们进行数据处理。
同时我们将event ConfirmSale单独拿出来,因为该事件数据作可以存入order为订单表,表示交易完成。
2. 使用环境变量
dotenv是一个零依赖的模块,它将环境变量从.env文件加载到process.env中。这使得我们可以隐藏数据库密码细节到.env文件,同时通过git进行代码版本管理。
3. 使用mysql数据库
此处我们将query包装在DbQuery方法的Promise中,目的是为了在程序中同步运行并等待。防止程序停止后,数据来不及存入数据库丢失。
4. 代码整体架构
使用异步方式方便使用wait语法
5. 使用hardhat同步数据
此处mysql语法使用“on duplicate key update”,为防止重复录入数据库。
6.附加order表数据结构