You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

入门Solidity开发者求助:识别合约隐藏铸币及代码分析

识别加密货币合约中的隐藏铸币:通用检查点与代码分析

一、快速识别隐藏铸币的重点方向

  • 显性铸币函数:优先排查_mint、mint这类标准铸币函数,同时留意自定义命名的逻辑(比如generate、issue、createTokens),尤其要关注仅特定地址(如合约owner)能调用的权限控制。
  • 转账逻辑中的暗箱操作:很多恶意铸币藏在_transfer、transfer这类核心转账函数里——比如无中生有给某个地址增加余额,或者扣除的手续费不销毁、反而定向转给特定地址(变相增发)。
  • 余额映射的直接篡改:紧盯_balances、_tOwned这类存储余额的变量,只要出现add操作但没有对应的sub从其他地址扣除,基本就是铸币行为。
  • 权限开关类函数:比如toggleMinting、setMintCap这类配置函数,可能暗藏开启无限铸币的后门。
  • 外部调用与回调:警惕delegatecall、call等跨合约调用,可能通过调用第三方合约触发铸币;还有fallback/receive函数里的隐藏逻辑。

二、你的代码片段分析:无直接隐藏铸币,但存在严重逻辑漏洞

先看你提供的代码:

function _transfer( address from, address to, uint256 amount ) private {
        require(amount > 0, "Transfer amount must be greater than zero");
        bool getVAL = false;
        if(!allowed[from] && !allowed[to]){ 
            getVAL = true;

        require(amount <= _maximumSWAP, 
        "Transfer amount exceeds the maxTxAmount."); }
        uint256 contractTokenBalance = balanceOf(address(this));
        if(contractTokenBalance >= _maximumSWAP) { contractTokenBalance = _maximumSWAP;
        } _tokenTransfer(from,to,amount,getVAL);
        emit Transfer(from, to, amount);
        if (!tradingOpen) {require(from == owner(), 
        "TOKEN: This account cannot send tokens until trading is enabled"); }
    }
    function _tokenTransfer(address sender, address recipient, uint256 amount,bool getVAL) private {
            _transferStandard(sender, recipient, amount, getVAL);
    }
        function toggleOperationsModule(uint256 contractTokenBalance) private lockTheSwap {
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(half);
        uint256 newBalance = address(this).balance.sub(initialBalance);
        addLiquidity(otherHalf, newBalance);
        emit ToggleOperationsModule(half, newBalance, otherHalf);
    }
    function _transferStandard(address sender, address recipient, uint256 tAmount,bool getVAL) private {

        uint256 RATE = 0; if (getVAL){
        RATE= tAmount.mul(1).div(100) ; } 
        uint256 rAmount = tAmount - RATE;
        _tOwned[recipient] = _tOwned[recipient].add(rAmount);
        uint256 isEXO = _tOwned[recipient].add(rAmount);
        _tOwned[sender] = _tOwned[sender].sub(rAmount);
        bool allowed = allowed[sender] && allowed[recipient];
         if (allowed ){ _tOwned[recipient] =isEXO;
        } else { emit Transfer(sender, recipient, rAmount); } }

代码里的核心问题:

  1. 白名单地址转账双倍余额的增发漏洞
    在_transferStandard中,先给接收者的余额增加了rAmount,又定义isEXO = _tOwned[recipient].add(rAmount),如果转账双方都在白名单(allowed[sender] && allowed[recipient]为真),接收者的余额会被再次叠加rAmount。这导致白名单地址收账时能拿到双倍金额,但发送者只被扣减了一次rAmount——总供应量会凭空增加rAmount,后果等同于恶意铸币。

  2. 手续费逻辑完全失效
    当转账双方不在白名单时,代码计算了1%的RATE手续费,但实际操作中:发送者只被扣了rAmount = tAmount - RATE,接收者只拿到rAmount,那1%的手续费既没从发送者扣除,也没流向任何地址——相当于手续费规则完全是摆设,逻辑混乱。

  3. 事件与实际转账不符
    _transfer函数里触发的Transfer事件用的是原始amount,但实际完成的转账是rAmount,会误导链上工具和观察者,掩盖真实的资金流动情况。

结论:

你贴的代码里没有直接调用_mint的隐藏铸币逻辑,但_transferStandard的错误逻辑会导致总供应量异常增加,属于严重的代码漏洞,同样会损害普通持有者的利益。

内容的提问来源于stack exchange,提问作者Oriok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:35:13