Analise smart-contract
28.03.2024

具有反鲸鱼功能的智能合约

我们继续专注于智能合约欺诈方案系列文章。今天我们将分析带有防鲸鱼转账大小限制机制的智能合约。

在本文中,我们将详细了解什么是防鲸鱼机制,它与冷却机制的区别,以及它们在何时共同使用和何时单独使用。

冷却机制

目的:

冷却机制旨在在同一地址的连续交易之间施加时间限制。其目的是调节交易频率,防止短时间内的过度买卖活动。

实现:

时间限制:冷却机制设定交易之间的等待期,通常基于从特定地址最后一笔交易以来经过的时间。用户必须等待等待期到期后才能开始新的交易。

指标:

时间戳比较:查找代码段,比较区块时间戳或使用与时间相关的函数。类型为 lastTransactionTimestamp 的状态变量可用于跟踪上次交易的时间。

防鲸鱼机制

目的:

防鲸鱼机制的主要目的是减少来自单个地址或少数几个地址的大额交易的影响,通常被称为“鲸鱼”。它旨在防止令牌过度集中在同一手中,并打击可能的市场操纵或不稳定。

实现:

交易大小限制:防鲸鱼机制通常设置单笔交易的大小或价值限制。超过设定阈值的交易将导致施加限制,如拒绝交易、高费用或其他重新分配机制。

指标:

查找检查交易大小或价值的代码段,并查找这类状态变量(如 maxTransactionAmount 或 whaleThreshold),这些可能表明防鲸鱼机制的存在。防鲸鱼主要影响具有大额交易量的用户,并专注于解决大持有者手中的令牌集中问题。

冷却和防鲸鱼的主要区别:

参数 防鲸鱼 冷却
参数:影响 防鲸鱼:主要影响具有高交易量的用户。 冷却:适用于所有用户,无论交易大小如何。
参数:市场动态 防鲸鱼:专注于解决集中问题。 冷却:旨在调节交易频率。
参数:项目目标 防鲸鱼:旨在分发令牌并确保市场稳定。 冷却:主要旨在确保市场稳定,防止快速交易。

使用场景:

  1. 减少市场操纵:
    两种机制可以共同使用,解决各种市场操纵问题。防鲸鱼机制有助于限制大额交易的规模,而冷却机制则防止在短时间内快速发生多次交易。

    假设一个实体拥有总令牌供应的大部分。如果没有防鲸鱼机制,这个实体可能进行大额交易,可能导致价格显著波动,从而进行市场操纵。通过限制单个地址在特定时间内的最大交易量或频率,防鲸鱼机制旨在防止大持有者对市场产生不应有的影响。

  2. 确保公平分配:
    在新令牌或令牌销售的情况下,防止少数参与者获取不成比例的总供应份额。设置单个地址在令牌销售期间或特定时间内可以购买的最大金额限制,可以实现令牌在更多参与者之间更均匀地分布。

  3. 解决流动性问题:
    大持有者的高交易量可能影响流动性,并扰乱去中心化交易所上的自然价格发现过程。通过限制大持有者的交易速度,防鲸鱼机制有助于维持更稳定的流动性状况。

  4. 稳定价格:
    防止快速和大规模的交易可以帮助稳定价格。通过实施防鲸鱼限制,令牌价格在交易之间有更多时间适应市场条件。

  5. 防止前端运行:
    防鲸鱼可以用来打击前端运行,即交易者利用时间敏感信息在他人之前执行交易。防鲸鱼机制可以减少通过快速执行交易获得的优势。

  6. 缓解闪电贷和重入攻击:
    防鲸鱼可以为一些闪电贷和重入攻击添加额外防御层,限制交易执行速度。

利用场景

令牌持有者可能面临的潜在风险:

  1. 设置过于严格的防鲸鱼限制可能对确实需要进行大额交易的用户造成问题。

  2. 过度依赖防鲸鱼机制可能在未考虑更广泛生态系统的情况下促进集中化。

您如何独立确定智能合约中是否存在此类威胁?

确定智能合约中是否存在防鲸鱼约束机制是一项重要任务,以下是一些提示,可帮助实现此目标:

  1. 学习合约文档:首先查看合约文档和规格说明。

  2. 分析转账功能:检查负责转移令牌的功能(如 transfer、transferFrom 等)。查找施加交易限制的条件语句。

  3. 检查时间戳比较:查找合约比较区块时间戳的情况。

  4. 检查状态变量:检查可用于存储与防鲸鱼相关信息的状态变量。

  5. 查找与时间计算相关的功能或修饰符,如 block.timestamp、block.number 或 now。

  6. 查找控制防鲸鱼行为的参数:这些参数可能是 maxTransferAmount、maxTxLimit 等。这些参数通常由合约所有者设置,或通过个别交易管理机制设置。

  7. 分析事件日志:检查特殊事件的事件日志。当执行交易时,实现将能够记录相关信息,这提供了对冷却过程的见解。

  8. 分析特定用户逻辑:如果合约实施了用户限制,请检查确定个人转账限制的逻辑。此逻辑可能包括用户属性、余额或其他标准。

  9. 保持消息灵通:随时关注我们社区的最新动态(Telegram 频道),并了解欺诈检测的最佳实践(我们的博客和YouTube频道)。

好消息:我们的安全扫描器成功地发现(包括隐藏的)并计算出了在 90% 的情况下的转账限制(反鲸鱼)。使用我们的高级订阅,保护您的资金免受威胁。

尽管反鲸鱼机制旨在防止市场操纵和确保令牌分配,但欺诈者可以利用其功能来欺诈用户。以下是一些可能的场景和通过采用反鲸鱼机制来保障令牌投资的技巧。

示例1:带有冷却期的交易金额限制(交易金额限制与冷却)

    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount
    uint256 public cooldownTime = 1 days; // Cooldown time between transactions
    
    mapping(address => uint256) private lastTransactionTimestamp;
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
        require(block.timestamp - lastTransactionTimestamp[msg.sender] >= cooldownTime, "Wait for cooldown period to end");
        ...
        lastTransactionTimestamp[msg.sender] = block.timestamp;
    }

本示例限制了单个地址在一定时间内可以转账的最大金额。

它包括了一个冷却机制,在同一地址的交易之间提供了一个等待期。lastTransactionTimestamp 数组跟踪每个地址上一笔交易的时间戳。

示例2:动态转账限制(逐步交易限制)

    uint256 public initialMaxTransactionAmount = 500000; // Initial maximum transaction amount
    uint256 public maxTransactionIncreaseRate = 20000; // Maximum increase rate per transaction
    uint256 public cooldownTime = 2 days; // Cooldown time between transactions
            
    mapping(address => uint256) private lastTransactionTimestamp;
            
    function transfer(address to, uint256 value) public {
        uint256 currentMaxTransactionAmount = initialMaxTransactionAmount + (maxTransactionIncreaseRate * (block.timestamp - lastTransactionTimestamp[msg.sender]) / cooldownTime);
        require(value <= currentMaxTransactionAmount, "Exceeded maximum transaction amount");
        ...
        lastTransactionTimestamp[msg.sender] = block.timestamp;
    }

本示例使用动态机制,随着时间推移逐步增加最大交易金额。

maxTransactionIncreaseRate 参数控制最大交易金额的增长速率。lastTransactionTimestamp 数组跟踪每个地址上一笔交易的时间戳。

动态转账限制

示例3:白名单例外(白名单例外)

    address[] public whitelistedAddresses;
    mapping(address => bool) public isWhitelisted;
    
    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTransactionAmount || isWhitelisted[msg.sender], "Exceeded maximum transaction amount");
        ...
    }

本示例使用白名单例外,使特定地址免受反鲸鱼限制。

whitelistedAddresses 数组中的地址被视为免受最大交易金额限制。isWhitelisted 数组确定特定地址是否被列入白名单。

示例4:分层交易限制(分层交易限制)

    uint256[] public tieredLimits = [5000000, 2000000, 1000000]; // Tiered transaction limits for different address balances

    function transfer(address to, uint256 value) public {
        require(value <= getTransactionLimit(msg.sender), "Exceeded maximum transaction amount");
        ...
    }
    
    function getTransactionLimit(address user) internal view returns (uint256) {
        uint256 userBalance = balanceOf(user);
    
        if (userBalance < 10000) {
            return tieredLimits[0];
        } else if (userBalance < 50000) {
            return tieredLimits[1];
        } else {
            return tieredLimits[2];
        }
    }

本示例根据发送者地址的余额实施了分层交易限制。余额较低的用户具有较高的交易限制,而余额较高的用户则具有较低的交易限制。

getTransactionLimit 函数根据用户的余额确定适当的交易限制。

示例5:大额交易费用(大额交易税)

    uint256 public taxRate = 75; // 5% tax rate on transactions exceeding the limit
    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount
    
    function transfer(address to, uint256 value) public {
        if (value > maxTransactionAmount) {
            uint256 taxAmount = (value * taxRate) / 100;
            uint256 netTransferAmount = value - taxAmount;
    
            // Transfer logic here for the net transfer amount
            ...
        } else {
            // Transfer logic here for amounts within the limit
            ...
        }
    }

本示例对超过最大交易金额的交易收取费用。

税率(TaxRate)确定交易金额的百分比。税费被扣除,然后处理净转账金额。

示例6:分层限制(多级交易限制)

    uint256 public maxTransactionAmount1 = 500000; // Maximum transaction amount for tier 1 (500,000 tokens)
    uint256 public maxTransactionAmount2 = 200000; // Maximum transaction amount for tier 2 (200,000 tokens)
    
    function transfer(address to, uint256 value) public {
        if (value <= maxTransactionAmount1) {
            ...
        } else if (value <= maxTransactionAmount2) {
            ...
        } else {
            revert("Exceeded maximum transaction amount");
        }
    }

本示例实施了多级交易限制,根据交易金额应用不同的限制。

这允许根据不同代币数量的不同级别设置交易限制。

示例7:基于令牌余额的动态交易限制(基于令牌持有者余额的加权交易限制)

    uint256 public maxTransactionPercentage = 5; // Maximum transaction percentage relative to total token supply
    
    function transfer(address to, uint256 value) public {
        uint256 maxTransactionAmount = (totalSupply() * maxTransactionPercentage) / 100;
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
        ...
    }

本示例动态计算最大交易金额,作为总供应量的百分比。maxTransactionPercentage 参数定义了单笔交易的允许百分比。

动态交易限制

示例8:时间相关的限制(基于时间的交易限制)

    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount (1 million tokens)
    uint256 public startTime = 1700000000; // Start time in Unix timestamp
    uint256 public endTime = 1800000000; // End time in Unix timestamp

    function transfer(address to, uint256 value) public {
        require(block.timestamp >= startTime && block.timestamp <= endTime, "Transaction not allowed at this time");
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
        ...
    }

本示例应用了基于时间的交易限制,只允许在给定时间范围内进行交易。

startTime 和 endTime 参数定义了允许进行交易的时间段。

示例9:逐步征税(逐步征税)

    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount (1 million tokens)
    uint256 public taxRate = 2; // Initial tax rate in percentage
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
    
        uint256 taxAmount = (value * taxRate) / 100;
        uint256 netTransferAmount = value - taxAmount;
    
        // Transfer logic here for the net transfer amount
        ...
    }

本示例展示了一种逐步征税机制,在超过最大金额的交易上征收税费。

税率(税费率)可能会随时间或根据特定条件进行调整。

示例10:基于持有者余额的交易限制(基于令牌持有者余额的加权交易限制)

  uint256 public maxTotalTransactionAmount = 5000000; // Maximum total transaction amount for all token holders
  mapping(address => uint256) public userTransactionLimit; // Transaction limits based on individual token holder balances
  
  function transfer(address to, uint256 value) public {
      require(value <= maxTotalTransactionAmount, "Exceeded maximum total transaction amount");
      require(value <= userTransactionLimit[msg.sender], "Exceeded individual transaction limit");
      ...
  }

这个示例实现了基于交易总金额和个别代币持有者余额的交易限制。

userTransactionLimit 绑定允许您根据特定地址的余额设置个性化的限制。


希望这些示例能帮助您更好地理解智能合约中的反鲸鱼机制。

由于区块链上的所有信息都是公开的(当然,前提是合约源代码经过验证),有了这些知识,您可以独立研究智能合约,并识别各种诈骗方案。

不过,我们已经为您完成了一切!订阅我们的高级服务,获取智能合约功能和最新分析的独家过滤器。提高您成功投资有利可图代币的机会。

祝好,莲花市场团队。

All posts

Connect to a wallet

Metamask