买入之前的 Solana 代币安全检查

mint 权限、冻结权限、LP 状态和扩展 —— 只花一次账户读取的链上检查,告诉你别人还能对你做什么。

BoltTx Team··14 min read
solana代币安全rug-checkmint-authority交易机器人尽调

大多数代币安全建议讲的是名声 —— 谁发的、群里什么样、官网真不真。★而这些,机器人在它拥有的两秒钟里一个都查不了。★

能查的是链上配置,而它回答的是一个更锋利的问题:不是"这是不是骗局",而是"我买了之后,别人还能对我做什么"。

组织起这一切的那个问题

★每一项有意义的检查,问的都是某个权限是否仍然存在。★

权限为 null 是一个永久保证。权限指向一把密钥,则是某人握着的一项能力。 ★当前状态远不如"谁还能改变它"重要。★

const mint = await getMint(connection, mintAddress);

const checks = {
  // ★null 意味着没人能再增发★
  mintAuthorityRevoked: mint.mintAuthority === null,
  // ★null 意味着没人能冻结你的账户★
  freezeAuthorityRevoked: mint.freezeAuthority === null,
  supply: mint.supply,
  decimals: mint.decimals,
};

一次账户读取两个都给你 —— 而对经典 SPL 代币来说,这已经是大部分答案了。

每项权限实际赋予什么

权限 如果它还在
★mint★ ★可以无限增发,把你稀释到什么都不剩★
★冻结★ ★对方能冻结你的代币账户 —— 你卖不掉★
元数据更新 名字和图片能改;只是外观
★永久委托方(2022)★ ★无需你签名就从你账户里拿走代币★
★转账费配置(2022)★ ★本来没有费用的地方可以冒出费用★

★冻结权限是一直被低估的那一个。★ mint 权限稀释你,这很糟。而冻结权限意味着别人可以在他选定的时刻让你的仓位卖不出去 —— 不同于稀释,这件事没有"部分发生"这个选项。

如果你的检查都通过了、交易还是会错过,免费领个 BoltTx key 改一行就能测测提交路径。

真正的风险住在流动性里

★一个两项权限都已放弃的代币照样会被 rug,因为风险不在代币,在池子。★

// LP 代币代表对池子流动性的所有权。
const lpMint = await getMint(connection, lpMintAddress);
const lpSupply = lpMint.supply;

// ★谁持有它们?★
const holders = await connection.getProgramAccounts(TOKEN_PROGRAM_ID, {
  filters: [
    { dataSize: 165 },
    { memcmp: { offset: 0, bytes: lpMintAddress.toBase58() } },
  ],
});

三种值得区分的结果:

已销毁。 LP 代币被打进黑洞地址,或者供应量为零。★流动性撤不走。★

已锁定。 由一个带时间条件的锁仓程序持有。查一下什么时候解锁 —— 一个明天就到期的锁不算锁。

★由某个钱包持有。★ ★持有者随时能撤走流动性,这就是经典的 rug。★ 放弃 mint 和冻结权限对此毫无作用。

集中度告诉你的是"怎么出去"

const accounts = await connection.getProgramAccounts(TOKEN_PROGRAM_ID, {
  filters: [
    { dataSize: 165 },
    { memcmp: { offset: 0, bytes: mintAddress.toBase58() } },
  ],
  dataSlice: { offset: 64, length: 8 },     // ★只要 amount★
});

const balances = accounts
  .map((a) => a.account.data.readBigUInt64LE(0))
  .sort((a, b) => (b > a ? 1 : -1));

★dataSlice 在这里很重要 —— 不加它,你为了算一个总和而传输每一个持有者的完整账户数据。★

该看什么: 少数几个钱包持有大部分供应量。这不能证明什么,但它界定了"出场"是什么样子 —— 如果一个钱包能砸出超过池子承受能力的量,你的出场价格就是他的决定。

那项必须靠模拟的检查

配置告诉你的是能力。★它没法告诉你一次卖出到底能不能成功。★

// ★建仓之前,先模拟出场。★
const sellSim = await connection.simulateTransaction(sellTx, {
  replaceRecentBlockhash: true, sigVerify: false,
});
if (sellSim.value.err) return { tradeable: false, reason: "卖出会失败" };

一个放行买入、拒绝卖出的 transfer hook,能通过每一项配置检查。 一个另一侧根本没有流动性的池子也能。★模拟卖出,是唯一一项按行为而不是按设置来抓陷阱的检查。★

对高速狙击手来说这是昂贵的一步,跳过它是一个真实的权衡而不是疏忽 —— 你是在拿一个已知风险换延迟。

按成本排序

从最便宜的开始跑,让大多数代币在你花掉任何东西之前就被拒绝:

1. ★mint 的 owner★ —— 一次读取,告诉你是经典还是 2022
2. ★mint 权限 + 冻结权限★ —— 同一次读取
3. 扩展 —— 同一次读取(如果是 2022)
4. 池子储备 —— 一次读取,到底有没有流动性
5. LP 状态 —— 几次读取
6. 持有集中度 —— 一次很重的 gPA 调用
7. ★卖出模拟★ —— 昂贵的那个

★第 1 到 4 步来自两次账户读取,就能拒绝掉大多数坏代币。★ 昂贵的检查只对那些已经看起来合理的候选跑。

这些检查覆盖不到什么

值得说明白,因为一份全部通过的清单会制造虚假的安全感:

它不说明团队或意图。 ★放弃权限、销毁 LP,描述的是"这个代币不能被那几种特定机制 rug" —— 不是"这个代币会涨"。★

它不说明未来的流动性。 现在有流动性的池子,可以通过正常交易在之后变薄。

它不说明池子程序本身。 你是在信任持有这份流动性的那个 AMM。

它是一张快照,不是一个订阅。 在你检查和你交易之间,权限随时会被行使。

上链应该是什么水平

我们投递节点上的真实交易:中位确认 336 毫秒 —— 不到一个 slot。

★每一项检查都是延迟,而延迟就是队列里的位置。★ 这个取舍是真实的:什么都查的机器人比什么都不查的到得晚,而后者偶尔会买到一个卖不掉的东西。

BoltTx 在这里的位置

我们负责提交。你交易之前查什么,完全是你的决定。

提交走我们自建的四区域投递节点,带 SWQoS 路由,不暴露公共 mempool —— 交易在落块之前、传输途中观察不到。你的安全检查继续用现在的读取端点 —— 两条路径互相独立,所以繁重的筛查耗尽不了你发送所需的配额。

你在本地签名。我们不托管资金、不代签、不修改交易内容。tip 带在交易里、从你自己的钱包链上支付,交易失败时跟着一起 revert —— 这是 Solana 原子交易的机制决定的。只有到达链上的交易才计费。

免费领 API key,没有月费:

const sender = new Connection("https://la.bolttx.io/?api-key=YOUR_KEY");

常见问题

买一个 Solana 代币之前该查什么? mint 权限、冻结权限、是 Token-2022 的话还有扩展、池子有没有流动性、LP 状态、持有集中度,以及一次卖出模拟。前四项来自两次读取。

放弃 mint 权限是什么意思? 没人能再创造供应量。它一旦为 null 就是永久保证 —— 这也是为什么检查的是"权限存不存在",而不是"它做过什么"。

冻结权限为什么重要? 持有它的人能冻结你的代币账户,让你的仓位在他选定的时刻卖不出去。不同于稀释,这件事没有部分发生的版本。

两项权限都放弃了,还会被 rug 吗? 会。权限管的是代币,而风险住在池子里。 如果 LP 代币由某个钱包持有,不管权限状态如何,持有者随时能撤走流动性。

怎么查流动性有没有锁? 看谁持有 LP 代币。销毁 = 供应量为零或被打进黑洞地址;锁定 = 由锁仓程序持有;普通钱包 = 随时可撤。

带时间锁的 LP 安全吗? 只安全到解锁为止。 查一下解锁时间 —— 一个很快到期的锁,和没有锁在功能上是一回事。

怎么查持有集中度? 查询该 mint 的代币账户,并用 dataSlice 只取 amount,然后排序。不加这个切片,你为了算总和会传输每个持有者的完整账户数据。

为什么买之前要模拟卖出? 因为配置检查发现不了"放行买入、拒绝卖出"的 transfer hook。模拟是唯一一项测试行为而不是测试设置的检查。

哪些 Token-2022 扩展危险? 永久委托方让别人无需你签名就拿走你的代币,不可转让则完全禁止卖出。一个还活着的转账费权限,也可以在之后引入费用。

安全检查会增加多少延迟? 便宜的那几项是两次账户读取,就能拒绝掉大多数坏代币。持有集中度和卖出模拟很贵,只值得对已经通过前面检查的候选跑。

安全检查结果能缓存吗? 只能缓存不可变的部分,比如 decimals 和 mint 属于哪个代币程序。权限随时会被行使、流动性随时会被撤走,那些必须是当前的。

检查全过了,是不是就值得买? 不是。它们只意味着某些特定的攻击手段不可用。 链上没有任何东西能说明价格会不会涨、或者团队打不打算继续做。

高速狙击的最低检查是什么? 从你本来就要做的那次 mint 读取里拿到 mint 和冻结权限,再加上池子储备非零。这几乎不花延迟,就能拒绝掉很大一部分坏代币。

该查元数据的更新权限吗? 值得记一笔,但严重性低。它允许改名字和图片 —— 和增发、冻结、撤流动性相比只是外观问题。

怎么用程序查 LP 状态? 读 LP mint 的供应量,并查询它的代币账户看谁持有。供应量为零、或全部在黑洞地址,意味着流动性撤不走。

权限会在我检查和交易之间被行使吗? 会。每一项检查都是快照 —— 这就是为什么执行时真正保护你的,仍然是链上的最小输出量,而不是交易前的筛查。

延伸阅读

← 返回博客列表