背景说明
在项目中,解析交易对数据是一个常见且重要的需求。例如,在以太坊(ETH)链上的 Uniswap 和币安智能链(BSC)上的 PancakeSwap 中,交易对的解析逻辑几乎完全一致。基于此,我们充分考虑代码的通用性,将交易对服务模块化,以提升开发效率和系统的维护性。
在模块设计过程中,我们预留了事件解析的前后处理接口(Handler 文件),以便业务系统能够灵活对接和扩展。例如,开发者可以在事件触发前通过预处理接口完成数据验证,或在事件完成后利用后处理接口对解析结果进行加工。这样的设计不仅增强了模块的适配性,也确保了业务场景的高度可定制化。
此外,模块化设计遵循框架的开发要求,统一了代码结构,同时确保了事件解析逻辑的高复用性。这样的实现方式为多链支持(例如适配其他链上的 DEX 协议)奠定了坚实的基础,也为后续开发工作提供了充分的扩展空间。
合约地址
// 调用Factory
function getPair(address tokenA, address tokenB) external view returns (address pair);
// 通过算法
keccak256(
abi.encodePacked(
hex"ff",
factoryAddress,
keccak256(abi.encodePacked(tokenA, tokenB)),
initCodeHash
)
)
注:相关的pancake详细的中文注释,可以参考:https://github.com/Fankouzu/my-uniswap-v2-core?tab=readme-ov-file
数据结构
配置数据
由于当时没有做pair的配置,所以用了一个扩展字段做为配置,他指定pair的地址和本身标识,详情可以参考如下的DML语句。
INSERT INTO `t_contract_config` (`contract_config_id`, `chain_config_id`, `chain_symbo