ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

构建实时去中心化搜索引擎:Origin Protocol 事件监听与索引架构解析

构建实时去中心化搜索引擎:Origin Protocol 事件监听与索引架构解析 构建实时去中心化搜索引擎Origin Protocol 事件监听与索引架构解析【免费下载链接】originMonorepo for our developer tools and decentralized marketplace application项目地址: https://gitcode.com/gh_mirrors/origin1/originOrigin Protocol 是构建在以太坊上的去中心化市场协议其核心难点之一就是如何为链上数据提供实时的搜索体验。本篇文章将深入解析 Origin Protocol 的去中心化搜索引擎架构从事件监听、数据索引到查询服务的完整链路带你理解一个区块链版搜索引擎是如何被一步步搭建起来的。文章基于开源项目 Origin 的 Discovery 服务展开相关代码位于infra/discovery/目录整体架构分为三大模块事件监听器listener、索引库lib与 GraphQL 查询服务apollo。为什么去中心化市场需要一套独立的搜索引擎在传统中心化平台中商品数据都存在数据库里SQL 一查就出来。但在区块链上所有 Listing商品列表和 Offer交易报价都以事件Event的形式散落在区块中天然不支持按关键词模糊搜索、按价格排序这类查询。如果每次搜索都去扫描链上数据不仅慢而且成本极高。Origin Protocol 的解法非常典型用事件监听器把链上数据搬运到链下的离线索引中再通过 GraphQL 接口对外提供实时搜索能力。这套架构与中心化搜索引擎如 Elasticsearch的采集 → 索引 → 查询三段式非常相似只不过数据源头换成了区块链。三大核心组件事件监听器、索引库与查询服务整个 Discovery 服务的代码结构非常清晰一眼就能看懂分工infra/discovery/src/listener/区块链事件监听器负责捕获链上事件并触发处理infra/discovery/src/lib/索引库负责把数据写入 Elasticsearch 与 Postgresinfra/discovery/src/apollo/GraphQL 查询服务面向 DApp 前端提供搜索 API三者构成一条完整的数据流水线链上事件 → 监听器 → 索引库 → 查询服务 → 前端搜索。下面我们逐一拆解。事件监听器如何实时捕获链上事件监听器的核心逻辑在 listener.js它的工作方式不是 WebSocket 推送而是定时轮询每 30 秒向以太坊节点查询一次最新区块高度然后抓取目标合约在上次处理区块到最新区块之间产生的所有事件。监听的目标合约包括各版本的市场合约Marketplace V0/V1/V2 等捕获商品与交易事件身份合约IdentityEvents捕获用户资料更新事件代理工厂合约ProxyFactory捕获账户代理创建事件断点续传与至少一次投递保障监听器最巧妙的设计在于断点续传。它会为每个合约记录已处理到的区块高度getLastBlock/setLastBlock状态可以持久化到 Postgres 的Listener表也可以写入本地 continue 文件。这样无论进程崩溃还是网络抖动重启后都能从上次的位置继续不会漏掉任何一个事件。同时代码注释里明确声明了两条保证至少一次At-least-once投递同一事件可能被重复处理因此下游消费方必须做到幂等按区块链顺序处理事件严格按照区块高度顺序逐个处理避免数据错乱针对节点不同步、RPC 超时等常见故障工具函数 utils.js 提供了带指数退避的重试机制withRetrys最多重试 10 次、单次最长等待 2 分钟重试仍失败则主动退出进程交由外部编排系统重启。事件分类与处理器分发机制监听器拿到原始事件后会通过 handler.js 中一张事件 → 处理器映射表进行分发。例如ListingCreated、ListingUpdated、ListingWithdrawn等商品事件 → 市场处理器OfferCreated、OfferAccepted、OfferDisputed、OfferFinalized等交易事件 → 市场处理器IdentityUpdated→ 身份处理器ProxyCreation→ 代理处理器每个处理器如 handler_marketplace.js会做两件事先从origin/graphql拉取该事件的完整业务数据商品详情、买卖双方信息等再把这些数据写入索引。此外处理器还支持把事件以 JSON 形式推送到多种下游渠道通知服务 Webhook、Discord 群通知、邮件列表以及 Google Cloud Pub/Sub 消息队列实现生态联动。从事件到索引数据如何写入 Elasticsearch市场处理器拿到商品数据后会调用 search.js 中的Listing.index()把商品写入 Elasticsearch 的listings索引。这里有几个值得学习的工程细节去除不稳定字段日历类jCal字段结构变化频繁容易破坏 Elasticsearch 的动态映射索引前会被剔除预处理评分写入前预先计算scoreMultiplier评分乘数避免查询时实时计算拖慢响应更新用 Painless 脚本审核人员对商品打标签时通过服务端脚本原子更新分数减少并发竞态价格归一化与多币种排序技巧去中心化市场最大的特色是多币种商品价格可能是 ETH、DAI、美元、欧元……直接排序没有意义。Origin 的解法是借助 Redis 中由桥接服务实时刷新的汇率数据把各币种价格统一折算成美元后排序见 search.js 中的getSortQuery。折算过程放在 Elasticsearch 的 Painless 脚本里执行还贴心地用 try/catch 兜底遇到格式异常的商品自动排在末尾保证查询永不报错。相关性打分不只是简单的关键词匹配为了让搜索结果更智能Origin 设计了一套多因子评分体系scoring.js文本匹配搜索词在标题中命中可获得 2 倍加权关键词邻近度slop也参与评分商品状态非在售状态的商品降权至 0.3 倍反垃圾超低价商品疑似洗钱/刷单降至 0.2 倍无图片商品降至 0.8 倍OGN 质押激励卖家质押 OGN 代币越多商品曝光权重越高最高 2.5 倍时效加权新发布的商品在 18 天内享受线性衰减的热度加成脚本见search的function_score审核标签被标记为 Super Featured 的商品获得 5 倍权重被 Hide 的商品直接消失值得一提的是查询层还会对已下架、无效、被审核隐藏的商品做硬性过滤must_not保证用户永远看不到违规内容。面向用户的 GraphQL 查询服务索引建好后如何把数据暴露给前端答案是 apollo 目录 下的 GraphQL 服务。它提供三类核心查询listings支持关键词、排序、筛选、分页的复合搜索同时返回价格区间等聚合统计listing按 ID 获取单个商品详情其中scoreTags等审核字段仅对授权管理员开放visibleListingIds根据审核操作记录表discovery_tag_action批量过滤被隐藏的商品DApp 前端只需一次 GraphQL 查询就能拿到按相关度排序、带价格区间的搜索结果页体验与中心化电商几乎无异。本地快速体验一键启动去中心化搜索引擎想亲身体验这套架构项目提供了完善的 Docker 编排支持在 README.md 中给出了完整步骤核心流程如下克隆仓库git clone https://gitcode.com/gh_mirrors/origin1/origin启动依赖服务docker-compose up postgres elasticsearch redis-master配置环境变量DATABASE_URL、ELASTICSEARCH_HOST、NETWORK先启动监听器npm run start:listener:development -- --networklocalhost --marketplace --identity --elasticsearch再启动查询服务npm run start:discovery:development -- --networklocalhost --marketplace --identity --elasticsearch监听器支持--concurrency参数开启回填模式backfill以多并发方式快速重建历史索引这在从零同步主网数据时非常实用。需要特别提醒的是Redis 中缺少汇率时系统会自动使用内置默认值不影响正常启动适合本地调试。架构全景图与数据流梳理最后我们把整条链路串起来看以太坊智能合约Marketplace / Identity / ProxyFactory │ 产生事件 ▼ 事件监听器每 30 秒轮询断点续传按序处理 │ 调用处理器拉取完整业务数据 ▼ 数据索引Elasticsearch 商品索引 Postgres 业务表 │ 预计算评分、汇率归一化 ▼ GraphQL 查询服务搜索 / 详情 / 审核过滤 │ ▼ Origin DApp 前端搜索页这套链上事件监听 链下索引 GraphQL 查询的三层架构成功把不可查询的区块链数据变成了毫秒级响应的实时搜索体验。无论你是想学习区块链数据索引的最佳实践还是准备为自己的 DApp 搭建搜索引擎Origin Protocol 的实现都提供了绝佳的参考模板——事件监听器的断点续传、多因子评分、多币种归一化排序等设计处处体现着生产级工程应有的严谨。如果你想深入了解代码细节建议从 listener.js 的轮询主循环读起再对照 search.js 的查询构造逻辑很快就能掌握这套架构的精髓。【免费下载链接】originMonorepo for our developer tools and decentralized marketplace application项目地址: https://gitcode.com/gh_mirrors/origin1/origin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表