在区块浏览器上查代币管理权限:能不能增发、冻结、暂停转账
有增发、冻结权限不等于骗局,owner 放弃了也不等于没人能动。持币的人该读哪几处、读完怎么判断、读不出来怎么办。

很多代币能。能不能增发、能不能冻结某个地址、能不能一键暂停全部转账,都是发币时写进合约的,通常只开放给一个管理地址或几个指定角色。持币的人自己就能查:以太坊、BNB Chain 这类 EVM 链,打开区块浏览器的合约页,看源码有没有验证、owner 是谁、有哪些管理函数、是不是代理合约;Solana 上的代币,看 mint 账户里的铸币权限和冻结权限还在不在。
查到的结果只是起点,后面还得接着问三件事:权限在谁手里,项目方有没有公开说过怎么用,这种安排你能不能接受。合约地址本身怎么核对,这篇不重复,下面默认你手里已经是确认过的网络加完整地址。
增发、冻结、暂停,落到合约里是什么
OpenZeppelin 是以太坊生态里常用的合约库。它的访问控制文档开头就挑明了:合约的访问控制,决定谁能铸造代币、谁能对提案投票、谁能冻结转账。换成持币者的话说,你担心的每一种“被动手脚”,在代码里都是一个函数,外加一道“只有谁能调用”的门。
门常见两种写法。一种是 Ownable:合约里有一个 owner 账户,挂着 onlyOwner 的函数只有它能调。另一种是 AccessControl,按角色分权,比如 MINTER_ROLE 管铸币、BURNER_ROLE 管销毁,每个角色可以发给不同地址。有的合约两种都用。
函数叫什么,没有统一规定。OpenZeppelin 的 ERC-20 文档写得清楚,基础合约里的铸币函数 _mint 是内部函数,由开发者按自己喜欢的方式对外暴露。所以增发函数可以叫 mint,可以叫 issue,叫别的也行。同一份文档里的 ERC20Pausable 扩展,能暂停的不只是转账,还包括铸币和销毁。“把某个地址拉黑”在这套标准库里没有现成函数,见到的都是项目自己写的。
这决定了查法:搜一个关键词下不了结论。要找的是哪些函数能改供应量、能改别人的余额、能卡住转账,再看这些函数的门开给了谁。
在 Etherscan 上读权限,分四步
下面以 Etherscan 为例,BscScan 这类同结构的浏览器合约页布局相近,标签名以你打开的页面为准。在代币的合约地址页找到 Contract(合约)标签,后面四步都在它里面做。
1. 源码有没有验证
Contract 标签里能看到完整 Solidity 源码、并标着 Verified(已验证),才有往下读的基础。按 Etherscan 的验证说明,验证是把提交的源码编译后和链上代码比对。它证明的是“你看到的源码就是链上跑的那份”,不证明写代码的人可信。没验证的合约只有一串字节码,后面三步基本读不了,直接看文末读不出答案的那一节。
2. Read Contract 里看 owner 或角色
Read Contract(读合约)把合约里的只读函数列成一张表,owner、totalSupply 这类值就在这里查。Etherscan 的读写合约说明专门区分过:Write Contract 需要先连接钱包,Read Contract 不用。查权限从头到尾都是读,不连钱包,也不花手续费。

owner 返回的是一个地址,读法分三种。
返回全零地址,说明 owner 大概率已被放弃。OpenZeppelin 的 Ownable 源码里,renounceOwnership(放弃所有权)做的就是把 owner 改成零地址;文档写明,放弃后合约没有 owner,挂着 onlyOwner 的函数再也调不了。
返回一个普通钱包地址,意思是一把私钥就能调用全部 owner 函数。
返回的是合约地址,就点进去看它是什么合约,可能是多签钱包,可能是时间锁,也可能是别的。OpenZeppelin 文档建议把关键角色交给 DAO 或多签这类治理合约;它提供的 TimelockController(时间锁控制器)会给管理操作加一段强制等待,文档写的目的,是让使用者在可能有风险的维护操作生效之前,有时间退出。
列表里没有 owner,却有 MINTER_ROLE、BURNER_ROLE、DEFAULT_ADMIN_ROLE 这类条目,那就是角色制。点开返回的是一串 32 字节的角色标识,把它和你想查的地址一起填进 hasRole,能回答“这个地址有没有这个角色”。反过来查“谁有这个角色”就难了:文档说基础版 AccessControl 不支持在链上列举角色成员,只有用了 AccessControlEnumerable 扩展的合约,才能用 getRoleMemberCount 和 getRoleMember 逐个列出来。另外别漏看 DEFAULT_ADMIN_ROLE,它默认是所有角色的管理角色,拿着它的地址能把 MINTER_ROLE 发给别人。
3. Write Contract 里扫函数名
Write Contract(写合约)列的是会改动链上状态的函数。只看名字就够,不用点 Connect to Web3(连接钱包),更不要往任何一栏里填东西。扫的时候留意这几类:带 mint、issue 的(增发),带 pause 的(暂停),带 blacklist、freeze、block 的(拉黑或冻结),能从别人地址 burn 的(销毁他人余额),还有以 set 开头、改税率、手续费或白名单的。
名字只能当线索。增发函数叫什么是开发者自己定的,假设合约里有个叫 updateReward 的函数,它照样可以在里面铸币;反过来,叫 mint 的函数也可能挂着一道谁都过不去的门。靠谱一点的做法是回到源码,在页面里搜 onlyOwner、onlyRole,看它们挂在哪些函数上。代码读不动,就把增发、冻结记成“未确认”,别因为没看到 mint 就当它不能增发。
4. 有没有 Read as Proxy
Contract 标签下如果多出 Read as Proxy、Write as Proxy(按代理方式读、写),你看的是代理合约。Etherscan 的代理合约说明写道:代理合约把调用转交给另一个“实现合约”执行,这两个标签加载的是实现合约的 ABI。合约代码里有 delegatecall 时,页面会显示 Is this a proxy?(这是代理吗?)按钮,用来发起代理识别。
代理对持币者意味着什么,OpenZeppelin 的代理文档说得很直白:状态存在代理里,逻辑在实现合约里,逻辑合约可以被替换,用户交互的地址却始终不变。今天在实现合约里读到“没有 mint 函数”,升级之后就可能有了。
所以代理合约里分量最重的权限是升级权。OpenZeppelin 的透明代理把有权升级的地址叫作代理的 admin,它的升级插件会为每个透明代理配一个 ProxyAdmin 合约来当这个 admin。顺着追到 admin 由谁控制,比读实现合约里的 owner 更要紧。
owner 已经是零地址,就没人能动了吗?
不能这么下结论。零地址只说明 Ownable 这一道门关上了,下面几处它管不到:
- 角色制的权限不归 owner 管。合约同时用了 AccessControl 的话,MINTER_ROLE 照样有人拿着。
- 代理合约的升级权在另一个地址上,透明代理里就是那个 admin。owner 放弃了,升级权还在,逻辑就还能换。
- 项目方可以不用 onlyOwner,自己写一套判断,比如把某个地址直接写进代码。浏览器的 owner 一栏显示不出它。
- 放弃之前发生的事不会撤销。放弃前铸了多少、铸给了谁,那批筹码现在在谁手里,要去看持币集中度。
所以项目方说“已经放弃权限”,追问两件事:放弃的是哪一项,交易哈希是哪一条。用 Ownable 的合约放弃所有权,是一笔调用 renounceOwnership 的交易;Solana 上撤销权限,是一笔带 SetAuthority 指令的交易,都能在浏览器里翻到。只有截图、没有链上记录的,按未确认处理。
以太坊上的 USDT,合约里就留着增发和冻结
拿一个谁都能打开的合约对照:以太坊上的 USDT,合约地址 0xdAC17F958D2ee523a2206206994597C13D831ec7。它的 Etherscan 合约页显示源码已验证(Exact Match),合约名 TetherToken。源码里能读到这些函数:
issue:增发,挂着 onlyOwner,调用后总供应量增加,新币记在 owner 地址上。它不叫 mint。redeem:和 issue 相反,从 owner 地址减少代币,总供应量跟着减。pause、unpause:暂停和恢复。转账函数挂着 whenNotPaused,暂停期间转不了。addBlackList、removeBlackList:拉黑和解除。转账函数会先检查发送方在不在黑名单里。destroyBlackFunds:只能用在已拉黑的地址上,把它的余额清零,同时从总供应里扣掉。deprecate:把合约标记为弃用并指定一个新地址,之后的转账会转交给新地址上的合约处理。
最后一条值得多看一眼。这个合约没走代理模式,页面上也就没有 Read as Proxy,但 owner 通过 deprecate 照样能把后续逻辑切到别的合约。判断规则会不会被换掉,要把这类改道函数和代理升级权放在一起看。
带着这么多权限,并不能说明 USDT 是骗局。由单一公司发行的稳定币,增发和冻结本来就是按设计留在发行方手里的,合约写得明明白白。合约能告诉你的只有“能做什么、谁能做”;什么情况下冻结、增发依据什么,要读发行方自己公开的条款。到这一步,问题就换成了:你接不接受把这些权限放在这家发行方手里。
还有一点:其他链上的 USDT 是另外部署的合约,权限要在那条链的浏览器上单独查一遍,别拿以太坊这份的结论去套。
Solana 代币:mint 账户里的两个字段
Solana 上一个 SPL 代币由它的 mint 账户定义。Solana 文档创建 mint 一页列出了 mint 账户的字段,和权限有关的是两个:mint_authority(铸币权限)和 freeze_authority(冻结权限)。
铸币权限的说明原文是:If no mint authority is present then the mint has a fixed supply and no further tokens may be minted。意思是没有铸币权限,供应量就固定了,不能再增发。
冻结权限用来冻结持币账户。按冻结账户文档的说法,账户被冻结后,所有者、代币种类和余额都不变,但在解冻之前不能收币、转出或销毁;而且只有冻结权限还在的 mint,才能冻结账户。
这两项可以通过 SetAuthority 换人,也可以设为空。文档写明,把某项权限设为 None 会永久移除这个角色,撤了就回不来。
用 Solana 官方浏览器 explorer.solana.com 打开 mint 地址时,按它在 GitHub 公开的前端代码(2026年9月查看):铸币权限为空,供应量那一行的标题显示 Fixed Supply(固定供应);权限还在,则显示 Current Supply(当前供应),并多出一行 Mint Authority(铸币权限)写着持有地址。Freeze Authority(冻结权限)同样是有才显示。别的浏览器写法不一样,以字段内容为准。
Token-2022 代币要多看一层
用 Token Extensions 程序(常叫 Token-2022)发行的代币可以开扩展功能。扩展列表里,和持币者直接相关的有这几个:
- PermanentDelegate(永久代理):文档说它是 mint 层级的权限,能对这个代币的任何持币账户授权转账和销毁,持币人没法从自己账户上撤掉它。
- Pausable(可暂停):铸币、销毁、转账都可以被暂停。
- TransferHook(转账钩子):每笔转账都会去调用另一个程序执行指令,文档写明这一步失败,整笔转账就失败。那个程序里写了什么规则,决定你转不转得出去。
- TransferFeeConfig(转账手续费):带费率信息,也带设置费率、提取手续费的权限。
- DefaultAccountState(默认账户状态):规定新开持币账户的默认状态,而账户状态里就包括冻结。
也就是说,一个 Token-2022 代币即便铸币权限和冻结权限都空了,开着永久代理的话,仍然有人能把你账户里的币转走或销毁。看这类代币,要确认它开了哪些扩展,每个扩展对应的权限又在谁手里。
两条链的查法放在一起对照:
| 你想知道 | EVM 合约里找 | Solana 代币里找 |
|---|---|---|
| 还能不能增发 | 铸币类函数(mint、issue 或别的名字)和它挂的门 | mint_authority 是否为空 |
| 能不能冻结某个地址 | 项目自己写的黑名单、冻结函数 | freeze_authority 是否为空 |
| 能不能整体停转 | pause 类函数,比如 ERC20Pausable | Token-2022 的 Pausable 扩展 |
| 能不能直接动你的余额 | 销毁他人余额类函数,比如 USDT 的 destroyBlackFunds | Token-2022 的 PermanentDelegate |
| 规则会不会被换掉 | 代理合约的升级权,或 deprecate 这类改道函数 | TransferHook 调用的程序,需另查它由谁控制 |
读到结果之后,按四种情况处理
权限只有两个问题值得追:谁拿着,拿来做什么。按你查到的结果对号入座。
权限都在,攥在一个普通地址手里
一把私钥就能增发或冻结。页面上写着的最大供应量拦不住它:最大供应量是资料上的数字,合约里的增发函数不看这个数字,除非合约自己写了上限(OpenZeppelin 的 ERC20Capped 扩展就是给供应量加上限用的)。下一步去找项目方的公开说明:这个地址是谁的,权限留着做什么,有没有放弃或交给多签的安排。找不到说明,就把“随时可能增发、可能被冻结”当成这个币的已知条件,再决定碰不碰。
权限在多签或时间锁合约里
比一把私钥多了一道约束,约束多大看参数。多签要看签名人是谁、几个人里要几个同意;时间锁要看等待期多长。时间锁的用处就是给你留出反应时间,等待期短到来不及看公告,这道锁对你的意义就很有限。参数去对应合约的 Read Contract 里找,或者看项目文档。
owner 已放弃,或 Solana 的两项权限为空
这一项确实锁死了。接着把前面那张清单过一遍:有没有角色,是不是代理,Token-2022 有没有别的扩展。都排除了,权限这一块才算看完,注意力可以转到筹码分布和流动性上。
权限在,而且是发行方公开写明的设计
USDT 这类由发行方集中管理的代币就是这样。合约里没什么可再挖的,要问的是你信不信这家发行方,能不能接受自己的地址有被冻结的可能。
这一步守住一条:谁拿着权限、拿来做什么,只要有一个答不上来,就在笔记里写“未确认”,别替项目方补成“应该不会用”。合约里的函数不会因为社群里没人提就失效。
这几种情况,浏览器给不出答案
源码没验证。你看到的只有字节码,函数名、修饰词都读不出来。一个已经在流通的代币不公开源码,这件事本身就该记下来:它里面有什么权限,你没法从页面上知道。
代理合约的实现没验证,或者升级权追不到头。Read as Proxy 用的是实现合约的 ABI,实现合约没验证,这里就没什么可读。升级权最后落在一个查不清是谁的地址上,也属于这一类。
桥接到别的链上的版本。同名的币出现在另一条链上,可能是桥接版本,也可能是单独部署的合约,和原链那份是两套权限。目标链那份合约的铸币权交给了谁,可能是桥合约,桥合约又由谁控制,又是一条要单独追的线。先按网络和合约地址确认手里的是哪个版本,再到对应链的浏览器从头查。
权限只是看一个代币的其中一块。供应口径、解锁、流动性和退出条件,放到陌生代币研究路径里一起看。
关于代币权限,再补几问
查合约权限需要连接钱包吗?
只读的话不需要。按 Etherscan 的说明,Read Contract 不用连接钱包,Write Contract 才需要。查权限只看函数列表和返回值,不必点 Connect to Web3,也不会产生手续费。
项目方发截图说已经放弃权限,这样够吗?
不够。截图只能说明某个时刻页面上显示了什么。请对方给出放弃操作的交易哈希,自己到浏览器里确认放弃的是哪一项;EVM 合约还要看有没有角色和代理升级权,Solana 代币还要看 Token-2022 扩展。
合约里有黑名单函数,我的币一定会被冻吗?
不一定。黑名单函数只说明掌握权限的一方有能力这么做,至于什么情况下会用,要看发行方公开的规则。合约回答不了这个问题,只能告诉你这把钥匙存在、在谁手里。
Solana 代币显示固定供应,还需要查别的吗?
要看它是不是 Token-2022 代币。这类代币可以开启永久代理、可暂停、转账钩子等扩展,铸币和冻结权限都为空时,扩展对应的权限仍可能影响你的余额和转账。