该文章介绍了一种通过链上行为映射来分析Solana上闭源程序的方法。
随着 Solana 生态系统变得越来越复杂和广泛采用,其许多最活跃的程序在部署时没有开源代码、公共 SDK 或 IDL。这些闭源协议通常是完全可升级且由管理员控制的,这使得分析师、研究人员和用户难以理解它们的工作方式——或者它们的使用方式。
虽然我们通常认为逆向工程是重构程序逻辑,但还有另一种更易于访问且用途广泛的方法:行为映射。通过跟踪链上活动并在真实交易中展示一致的结构,可以对合约正在做什么、谁在使用它以及如何使用它进行分类。
本文介绍了一种实用的、可重复的方法,用于识别和标记闭源 Solana 程序中的真实行为。我们没有打开合约的逻辑,而是通过账户模式、内部指令跟踪和代币流动来推断结构——从只有交易本身开始。
结果是一个有用的框架,用于大规模地展示合约活动,即使内部逻辑完全不透明。我们希望这项工作有助于提高 Solana 的透明度——为社区提供更好的工具来了解不透明程序在现实世界中是如何运作的。
我们的方法基于观察和解释闭源 Solana 程序的运行时行为。由于我们无法检查源代码或依赖 IDL,我们将程序视为一个黑盒——通过与它交互并测量其响应来学习它的工作原理。
从高层次上讲,该方法包括:
识别要跟踪的目标程序
使用受控输入制作和发送交易
捕获交易日志和执行跟踪
分析涉及的账户、账户数据的变化和日志输出
寻找指示函数行为、参数结构和控制流的一致模式
通过迭代和变化来完善我们的理解
为了说明这个过程的实际操作,我们将逐步完成一个跟踪闭源 Solana 程序中单个用户交互类别的完整示例。
我们首先选择一个正在积极部署、缺少 IDL 且没有公开可用源代码的程序。对于本示例,我们将使用 pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA
,即 PumpSwaps 的地址——一个部署在 Solana 主网上的闭源协议。它是 Solana 上一个新流行的 DEX,但其行为仍然没有文档记录且不透明。
你可以通过监控交易流程中的活动地址、检查 Solana Explorer 上交互最多的程序或识别 SolanaFM 等平台上没有 IDL 的合约来发现类似的程序。
当闭源 Solana 程序具有活动前端时,它提供了一种启动使用情况跟踪的便捷方法。即使无法访问代码库或 SDK,UI 也会公开链上功能,我们可以手动触发这些功能来生成真实交易——为更深入的分析提供了一个起点。
在本例中,我们访问了 PumpSwaps 前端并执行了一个基本操作:提交代币交换。
提交交换后,我们打开钱包的交易历史记录并找到相关交易。从那里,我们在区块浏览器(例如,SolanaFM、Solscan 或 Solana Explorer)上查找它,以更详细地检查其结构。
这是我们开始使用的交易哈希:4wMYkBw51pZ1ve45xTYcW4mnqHPVJRbNqpMwyFa2VyJKrfjHi13Feeeb7bUFrdJowvZRNasiBRiJaYzWKLrMG11J
我们检查了:
被调用的程序 ID ( pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA
,即 PumpSwaps)
涉及的账户列表(用户钱包、PDAs、代币账户等)
执行期间发出的日志消息
原始指令数据和参数值
一旦我们有了交易的基本结构,我们就在区块浏览器中浏览了类似的交易——理想情况下,这些交易:
调用了相同的程序 ID
包含类似的账户结构(例如,17 个账户)
记录了 "Instruction: Buy" 或 "Instruction: Sell"
使用了不同的代币对或用户
这给了我们一个更广泛的样本集,了解程序在不同场景下的行为方式。我们可以比较输入、账户和日志如何变化——建立对什么是固定的(例如,PDAs)和什么是动态的(例如,金额字段、代币铸币)的直觉。
探索相关交易的这个过程至关重要。它将我们从孤立的检查转变为行为映射——帮助我们识别模式、发现异常并最终对程序的核心逻辑进行建模。
通过探测前端及其生成的交易——并跟踪类似交换的行为方式——我们为从外部向内跟踪协议的使用情况奠定了基础。
一旦我们有了一个小的样本集,我们确信这些是交换,我们便开始编目它们的结构和执行。在这些示例中,我们看到了明显的规律性:
我们在此步骤中使用两个 Flipside 查询。第一个查询 [ 这里] 计算调用 PumpSwaps 合约的交易数量,按涉及的账户数量分组。这给了我们账户数量的分布,并帮助我们识别常见的结构模式。第二个查询 [ 这里] 过滤包含特定数量账户的交易——在本例中为 17 个账户——并返回我们手动检查的样本集。
我们通常检查来自此过滤后集合的 10-20 个交易,以验证它们是否遵循一致的结构并且可能代表交换行为。
虽然账户数量通常是最有效的起点,但根据合约的不同,你可能需要尝试其他信号——例如指令鉴别符、代币流动方向或 PDA 一致性——以准确区分交易类型。但对于许多闭源程序,账户数量提供了最清晰的初始分段。
我们发现所有调用 PumpSwaps 且恰好有 17 个账户的交易都是交换——无论是买入还是卖出。每个都包括:
签名者钱包
输入和输出代币账户(用户和池)
池状态和配置账户
协议费用接收者
支持程序(Token、System、Associated Token)
这种一致性让我们开始跨多个交易标记账户角色,并将用户特定状态与固定 PDA 区分开来。
一旦我们确定了值得分析的交易,下一步就是从中提取相关数据。对于 PumpSwap 交换,有用的信息包括:
输入代币和数量
输出代币和数量
流动性池地址
交易时间戳
交易 ID
交易者(签名者钱包)
这些数据使我们能够量化交换行为、跟踪代币流动并将链上操作归因于特定用户。由于这些交易中的账户结构是一致的,因此我们可以使用账户索引和交易结构中的已知模式可靠地提取此信息。
我们的 Flipside 查询 [ 这里] 演示了我们如何从我们识别的事件中提取该信息。
有了一个关于“标准”PumpSwap 交换是什么样子的工作模型,我们假设:
任何调用 PumpSwaps 程序且恰好有 17 个账户的交易都是交换——关于进出池的代币的数据通常在事件的第二个和第三个内部指令中找到。
在挖掘符合此框架的交易时,我们在 Flipside 数据表中遇到了两个关键的异常:
一些交易列出了相同的代币作为 token in 和 token out。
一些行的 token_out
和 amount_out
均为 null
。
我们通过在区块浏览器中检查交易来调查这些问题。以下是每种类型异常的示例:
token_out
和 amount_out
均为 Null:51yeRPusTvzsi1DREs6Kni3XAv4auwHJassrWR6ngRXfmuJZxVbxE9y7memath2VTAZxcf5L6n2D29hwFe7AYCTn
列出的 token in 和 token out 相同:2v8fE6tAB2P4dUpRd5vcNZqV3vutqQnZeDJ233DPRZwJwKwwJMED3G8Xh42suVLhxERqouY5s9RRRKnr76ZVyU7Y
在 token_out
和 amount_out
均为 null 的交易中,我们发现 min_quote_amount_out
设置为 0。这意味着交易者实际上说:“我会给你这些代币,而且我接受什么都不收。” 这正是发生的事情——交易执行了,但没有代币发送回来。这个人基本上将代币存入池中而没有得到任何回报。由于这些交换没有反映有意义的代币交换,因此我们将其从数据集中排除。
在 token in 和 out 相同的交易中,我们发现相关的交换数据出现在第 6 个和第 7 个内部指令中,而不是像我们原始模型中那样出现在第 2 个和第 3 个内部指令中。这表明内部指令中交换数据的位置可能会有所不同,并且必须相应地处理。
在识别并考虑交换数据出现方式的这些变化之后,我们改进了我们的 Flipside 查询,以更准确地捕获交换活动并适当地处理边缘情况。你可以在 这里 查看该查询。
通过这种黑盒方法,我们能够跟踪闭源 Solana 程序的使用情况——识别交换交易、标记账户角色和处理不规则行为。尽管没有源代码或 IDL,但我们仅从链上数据重建了有意义的见解。
重要的是要注意,这种方法依赖于研究大量示例交易。它不能保证完美或完整地重构程序的内部逻辑——也不能完全揭示所有可能的执行分支。但是,它擅长对大量真实世界的活动进行分类。通过展示用户如何在实践中与合约交互,这种方法提供了对合约——以及其中的不同功能——如何被使用的有力见解。
这种方法是通用的。通过正确的工具和流程,Solana 生态系统中的其他人可以执行类似的使用情况跟踪——无论是出于研究、安全、分析还是透明度目的。
https://flipsidecrypto.xyz/studio/queries/f1ff38c8-218c-417d-8fa8-cbcf17f6f85c
https://flipsidecrypto.xyz/studio/queries/e3359ba2-1525-4387-b798-61b7769789d2
https://flipsidecrypto.xyz/studio/queries/56a91435-86f7-449d-9b36-d6162c42c93d
https://flipsidecrypto.xyz/studio/queries/b69fbb22-8ee5-458a-8941-d07d8841fabc
- 原文链接: pineanalytics.substack.c...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!