
拆解Orbit区块链交易调查工具核心代码ranker排行算法、getNew去重与pageLimit分页机制详解【免费下载链接】OrbitBlockchain Transactions Investigation Tool项目地址: https://gitcode.com/gh_mirrors/orbit5/OrbitOrbit 是一款开源的区块链交易调查工具Blockchain Transactions Investigation Tool它能从一个比特币钱包地址出发递归爬取交易历史并将资金往来渲染成可视化图谱帮你快速锁定可疑的来源、去向和关联地址。本文将带你读懂 Orbit 三个最核心的实现机制pageLimit分页计算、rankerTop-N 排行筛选和getNew去重逻辑看看这个不到 150 行的主程序是如何组织起一场完整的链上调查的 一、先认识 Orbit它能做什么Orbit 的工作方式可以概括为一句话给一个种子地址它自动滚雪球式地挖出整个交易网络。以某个地址为起点Orbit 会抓取它最近 50 笔默认交易找出所有交互过的地址再对这批新地址重复同样的过程一层一层向下挖掘默认 3 层。最终所有地址和连接被整理成图谱在浏览器中展示——节点越大、边越粗代表交易越频繁。对于安全研究员、反欺诈分析师或区块链爱好者来说这是一个轻量的链上追踪工具无需部署节点一条命令即可开始调查。克隆仓库并运行Orbit 要求 Python 3.2 及以上版本克隆后即可使用git clone https://gitcode.com/gh_mirrors/orbit5/Orbit cd Orbit python3 orbit.py -s 1AJbsFZ64EpEfS5UAjAfcUG8pH8Jn3rn1F 多个种子地址用逗号分隔即可例如-s addr1,addr2。二、项目结构总览核心文件清单Orbit 的结构非常精简所有逻辑都集中在一个入口文件加 7 个核心模块中文件职责orbit.py程序入口参数解析、爬取主循环、图谱组装core/utils.py本文主角pageLimit、ranker、getNew、genLocationcore/getTransactions.py单地址交易抓取按页循环请求接口core/requester.py封装 blockchain.info 的rawaddr接口请求core/prepareGraph.py把 JSON 数据注入 Quark 的quark.html完成可视化core/exporter.py导出graphml或原始json文件core/getQuark.py首次运行时自动下载 Quark 图查看器core/colors.py终端 ANSI 彩色输出理解了这张地图我们就能进入core/utils.py的三个机关了。三、pageLimit 分页机制如何算出要请求几页区块链数据接口每次最多返回50 条交易记录。用户通过-l参数指定最多抓取多少笔交易默认 100Orbit 需要把条数换算成页数——这就是pageLimit的工作。它由两个函数配合完成def pageLimit(n): return int((round(n, 49)/49) 1) def round(n, m): r n % m return n m - r if r r m else n - r1. 自定义 round就近取整到 49 的倍数这里的round是作者自己实现的就近取整把n舍入到距离它最近的m这里是 49的倍数。round(100, 49)100 距 98 更近差 2返回98round(50, 49)50 距 49 更近差 1返回492. pageLimit除以 49 再 1多要一页兜底公式round(n, 49) / 49 1拆开看先算需要几个49 条的整块再额外加一页作为缓冲——因为接口最后一页往往不满 50 条多请求一次能保证实际抓到的记录数不缩水。举几个具体例子感受一下-l参数round 取整后页数 取整值÷49 1504949÷49 1 2 页1009898÷49 1 3 页147147147÷49 1 4 页200196196÷49 1 5 页3. getTransactions 中的分页循环core/getTransactions.py拿到页数后逐页请求并把交易对端地址累加进databasepages pageLimit(limit) for i in range(pages): if pages 1 and increment ! 0: trail ?offset%i % increment response requester(address) ... increment 50一个值得玩味的细节拼好的trail ?offset...偏移量变量实际上并没有拼进最终的请求 URLcore/requester.py只拼接了地址本身。也就是说多页循环目前拿到的是同一批记录。分页的骨架已经搭好——只差一次字符串拼接。也正因为如此后面的ranker和getNew才成为保证结果质量的关键。阅读开源代码时这类差一步的实现细节正是最值得观察的地方。四、ranker 排行算法Top N 地址是如何筛出来的爬取一层下来某个地址可能关联了几十个对端地址。但不是所有关系都值得继续深挖——Orbit 用ranker为每个节点只保留交易次数最多的前 N 个地址对应-t参数默认 20把弱连接剪掉控制图谱的爆炸式增长。它的核心思路不是排序而是追踪 Top 数组中的最小值def ranker(database, top): newDatabase {} for node in database: newDatabase[node] {} topSize [0 for i in range(top)] # 大小槽位 topAdd [ for i in range(top)] # 地址槽位 for each in database[node]: minimum min(topSize) if database[node][each] minimum: index topSize.index(minimum) topSize[index] database[node][each] topAdd[index] each for size, address in zip(topSize, topAdd): newDatabase[node][address] size return newDatabase用生活化的比喻想象一排 N 个座位初始都是空的每来一位交易次数更多的嘉宾就挤掉当前坐着的分数最低那位。遍历结束后留在座位上的就是 Top N。这里有三个设计细节值得注意database的数据结构{节点地址: {对端地址: 交易次数}}。次数在抓取阶段由core/getTransactions.py里的database[address][found] 1累加而来——每多一笔共同交易计数加 1。空槽位是故意的当某节点的对端数量少于top时剩余槽位保持0和空字符串。别担心这些占位符会被下一站的getNew清理掉。top 1的小心思主循环orbit.py中每层调用的是ranker(database, top 1)即每层多留一个名额给下一层的扩展留出余量爬完最后一层后才用ranker(database, top)收敛到精确的 Top N 再输出。五、getNew 去重机制processed 集合如何避免重复爬取深度爬取最大的风险是重复劳动同一个地址可能被几十个邻居同时发现。Orbit 用一个全局的processed集合orbit.py中初始化的set()记录已经爬过的地址getNew负责挑出还没爬过的新面孔def getNew(database, processed): new [] for address in database: if address not in processed: new.append(address) for childAddress in database[address]: if childAddress not in processed: new.append(childAddress) return set(filter(None, new))三段逻辑各司其职节点本身 子节点都检查不只是看新邻居连当前节点自身若还没爬过也会被纳入保证不遗漏set(...)去重同一地址可能被多个邻居反复推荐集合自动去重filter(None, ...)清障顺手把ranker留下的空字符串占位符过滤掉——两个函数之间一个精巧的接力。processed则在core/getTransactions.py中、每个地址抓取完成时被processed.add(address)写入形成先认领、后放行的闭环。六、三者协同一轮完整爬取的数据流把三个机制串起来orbit.py主循环的每一步都各司其职步骤调用作用① 剪枝ranker(database, top 1)每个节点只保留交易最频繁的 Top N 对端② 去重getNew(database, processed)挑出未爬取过的新地址返回集合③ 抓取crawl(...)线程池并发10 线程每个地址按pageLimit分页拉取交易④ 记录processed.add(address)已爬地址入册供下一层去重整个循环重复depth次默认 3 层。最后orbit.py将database转成节点/边 JSON交给core/prepareGraph.py注入quark.html浏览器中就能看到资金网络的完整图谱如果带了-o参数core/exporter.py还会导出graphml或json供后续分析。七、快速上手常用参数一览参数作用默认值-s种子地址多个用逗号分隔必填-d爬取深度向下挖掘的层数3-t每层保留的 Top N 地址数ranker 生效20-l每个地址最多抓取交易数pageLimit 生效100-o导出文件.graphml/.json无一条典型的深度调查命令python3 orbit.py -s 1AJbsFZ64EpEfS5UAjAfcUG8pH8Jn3rn1F -l 100 -d 3 -t 20 -o result.graphml运行完成后quark.html会自动在浏览器打开。如果图谱看起来一团乱麻可以在 Quark 中依次点击Make Clusters → Color Clusters → Spacify用社区发现算法把可疑簇聚出来一目了然 八、小结Orbit 虽然代码量不大却是一个麻雀虽小五脏俱全的爬虫工程范本pageLimit用就近取整 多要一页的朴素算术解决条数到页数的换算分页骨架清晰ranker用最小值追踪代替排序实现低开销的 Top N 剪枝有效控制图谱规模getNew用setprocessed集合完成去重闭环顺手清理上游的占位符。如果你想深入理解区块链交易调查工具的实现不妨从core/utils.py这三个函数读起——它们正是 Orbit 从一堆地址到一张图谱的核心引擎。【免费下载链接】OrbitBlockchain Transactions Investigation Tool项目地址: https://gitcode.com/gh_mirrors/orbit5/Orbit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考