Analise smart-contract
23.01.2024

如何识别 BlackList DeFi 令牌?

我们继续系列文章,重点介绍智能合约中的欺诈方案。今天我们将分析带有黑名单功能(BlackList)的智能合约。

带有BlackList功能的智能合约的风险:

包含黑名单功能的智能合约对项目及其用户都带来一定的风险和问题。以下是与黑名单功能相关的一些危险:

  1. 集中控制: 黑名单功能通常为合约所有者或管理员提供集中控制权。

  2. 滥用黑名单进行不公平实践: 滥用者(包括合约所有者)可能使用黑名单针对特定地址。这可能包括无故冻结或限制账户功能。

  3. 缺乏透明度: 存在黑名单功能,尤其是如果没有文件记录,可能导致缺乏透明度。用户可能不清楚黑名单标准或黑名单程序。

  4. 安全风险: 如果BlackList实施不安全,存在未经授权的第三方可能操控黑名单的风险,这可能导致未经授权的资金冻结或转移。

  5. 用户不信任: 存在黑名单功能可能会损害用户信任,因为他们的资产可能会在没有明确规则的情况下被列入黑名单。

  6. 代币没收: 攻击者可以使用黑名单从特定地址没收代币或资产,而没有适当的理由。这可能导致重大的财务损失。

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

在验证智能合约时,可以采取以下步骤来确定是否存在与黑名单功能相关的威胁:

  • 在开始使用智能合约之前,仔细阅读并研究其代码,包括所有与黑名单相关的功能。查找与黑名单、冻结或限制账户功能相关的函数。检查是否有允许添加或移除地址出现在黑名单中的功能。

  • 分析合约的所有权或管理控制权。评估与所有者或管理员相关的控制程度和权利。

  • 检查合约文档,了解黑名单功能的预期使用方式。寻找控制黑名单使用的治理机制的信息。

  • 评估透明度:合约是否确保黑名单标准是透明的?检查是否有清晰的程序来消除误报或将地址从黑名单中移除。

  • 安全审计:检查智能合约是否经过了有声望的第三方公司的安全审计。

  • 熟悉社区或在线论坛关于项目中黑名单使用的反馈。警惕社区成员提出的任何关于不公平实践或缺乏透明度的警告信号。

  • 通过进行彻底分析并考虑以上因素,您将能够更好地评估智能合约中与黑名单功能相关的风险。及时了解我们社区(Telegram频道)的最新发展以及欺诈检测的最佳实践(我们的博客和YouTube频道)。

 

好消息:我们的安全扫描器99.9%的时间内发现所有常见(包括隐藏的)BlackList功能。使用我们的高级订阅保护您的资金免受威胁。

 

接下来,我们将查看我们的平台成功检测到的几种常见BlackList功能的简化示例。

请注意,这些是简化的示例,实际实施可能会有所不同。在分析智能合约时,您应始终进行彻底的代码审查并考虑上下文相关因素。

示例1:黑名单的基本功能


    contract TokenWithBlackListAndFee {
      address public owner;
      mapping(address => bool) public BlackList;
      uint256 public BlackListFee;
  
      constructor(uint256 _fee) {
          owner = msg.sender;
          BlackListFee = _fee;
      }
  
      modifier onlyOwner() {
          require(msg.sender == owner, "Only the owner can modify the BlackList");
          _;
      }
  
      function addToBlackListWithFee(address _account) public payable onlyOwner {
          require(msg.value >= BlackListFee, "Insufficient fee");
          BlackList[_account] = true;
      }
  
      function removeFromBlackList(address _account) public onlyOwner {
          BlackList[_account] = false;
      }
  }

检测提示:查找具有访问修饰符(onlyOwner)的函数(例如addToBlackList和removeFromBlackList)。有这类修饰符的存在意味着只有所有者才能修改黑名单。

常见提示

示例2:带有费用机制的黑名单(带有费用的BlackList)


    contract TokenWithBlackListAndFee {
      address public owner;
      mapping(address => bool) public BlackList;
      uint256 public BlackListFee;
  
      constructor(uint256 _fee) {
          owner = msg.sender;
          BlackListFee = _fee;
      }
  
      modifier onlyOwner() {
          require(msg.sender == owner, "Only the owner can modify the BlackList");
          _;
      }
  
      function addToBlackListWithFee(address _account) public payable onlyOwner {
          require(msg.value >= BlackListFee, "Insufficient fee");
          BlackList[_account] = true;
      }
  
      function removeFromBlackList(address _account) public onlyOwner {
          BlackList[_account] = false;
      }
  }

检测提示:定义需要收费(msg.value)来将地址列入黑名单的函数(例如addToBlackListWithFee)。这是一个非常危险的信号。

示例3:带有时间相关条件的黑名单


    contract TokenWithTimeLock {
      address public owner;
      mapping(address => bool) public BlackList;
      uint256 public BlackListTimeLock;
  
      constructor(uint256 _timeLock) {
          owner = msg.sender;
          BlackListTimeLock = _timeLock;
      }
  
      modifier onlyOwner() {
          require(msg.sender == owner, "Only the owner can modify the BlackList");
          _;
      }
  
      function addToBlackListTimed(address _account) public onlyOwner {
          require(block.timestamp >= BlackListTimeLock, "Time lock not yet expired");
          BlackList[_account] = true;
      }
  
      function removeFromBlackList(address _account) public onlyOwner {
          BlackList[_account] = false;
      }
  }

检测提示:定义具有块时间依赖条件的功能(例如addToBlackListTimed),用于黑名单。这通常用于延迟或计划的黑名单。

示例4:带有事件记录的黑名单


    contract TokenWithBlackListAndEvents {
      address public owner;
      mapping(address => bool) public BlackList;
  
      event AddressAddedToBlackList(address indexed account);
      event AddressRemovedFromBlackList(address indexed account);
  
      constructor() {
          owner = msg.sender;
      }
  
      modifier onlyOwner() {
          require(msg.sender == owner, "Only the owner can modify the BlackList");
          _;
      }
  
      function addToBlackList(address _account) public onlyOwner {
          BlackList[_account] = true;
          emit AddressAddedToBlackList(_account);
      }
  
      function removeFromBlackList(address _account) public onlyOwner {
          BlackList[_account] = false;
          emit AddressRemovedFromBlackList(_account);
      }
  }

检测提示:事件记录:查找记录黑名单操作的事件。事件提供透明度,对于监视合约操作非常重要。可以说这是最安全的BlackList类型,因为开发人员不隐藏此功能,而是在事件日志中公开记录所有调用。

示例5:带有白名单功能的黑名单(白名单)


    contract TokenWithBlackListAndWhitelist {
      address public owner;
      mapping(address => bool) public BlackList;
      mapping(address => bool) public whitelist;
  
      constructor() {
          owner = msg.sender;
      }
  
      modifier onlyOwner() {
          require(msg.sender == owner, "Only the owner can modify the lists");
          _;
      }
  
      function addToBlackList(address _account) public onlyOwner {
          BlackList[_account] = true;
      }
  
      function removeFromBlackList(address _account) public onlyOwner {
          BlackList[_account] = false;
      }
  
      function addToWhitelist(address _account) public onlyOwner {
          whitelist[_account] = true;
      }
  
      function removeFromWhitelist(address _account) public onlyOwner {
          whitelist[_account] = false;
      }
  }

检测提示:白名单功能:注意同时具有黑名单和白名单功能的合约。这种双重功能可能会对无所有者知情的代币转移或其他欺诈活动产生影响。

常见提示

示例6:带有治理控制的黑名单(治理控制)


    interface Governance {
      function canBlackList(address _caller) external view returns (bool);
  }
  
  contract TokenWithGovernanceControl {
      address public owner;
      address public governanceContract;
      mapping(address => bool) public BlackList;
  
      constructor(address _governanceContract) {
          owner = msg.sender;
          governanceContract = _governanceContract;
      }
  
      modifier onlyOwnerOrGovernance() {
          require(msg.sender == owner || Governance(governanceContract).canBlackList(msg.sender), "Not authorized");
          _;
      }
  
      function addToBlackListGoverned(address _account) public onlyOwnerOrGovernance {
          BlackList[_account] = true;
      }
  
      function removeFromBlackList(address _account) public onlyOwnerOrGovernance {
          BlackList[_account] = false;
      }
  }

检测提示:识别黑名单活动受外部合同管理的合约。在考虑智能合约时,仔细分析代码,注意访问控制、支付机制、时间依赖的条款和条件、事件记录、反规避保护及其他重要因素。此外,评估项目及其目标的具体情况,以评估使用黑名单功能的影响。

示例7:带有紧急停止功能的黑名单


    contract TokenWithEmergencyStop {
      address public owner;
      bool public emergencyStop;
      mapping(address => bool) public BlackList;
  
      constructor() {
          owner = msg.sender;
      }
  
      modifier onlyOwner() {
          require(msg.sender == owner, "Only the owner can modify the BlackList");
          _;
      }
  
      modifier whenNotPaused() {
          require(!emergencyStop, "Contract is paused");
          _;
      }
  
      function addToBlackList(address _account) public onlyOwner whenNotPaused {
          BlackList[_account] = true;
      }
  
      function removeFromBlackList(address _account) public onlyOwner whenNotPaused {
          BlackList[_account] = false;
      }
  
      function toggleEmergencyStop() public onlyOwner {
          emergencyStop = !emergencyStop;
      }
  }

检测提示:崩溃暂停机制可能会暂停某些功能,包括黑名单更改。

示例8:带有动态条件的黑名单


    contract TokenWithDynamicBlackList {
      address public owner;
      mapping(address => bool) public BlackList;
  
      constructor() {
          owner = msg.sender;
      }
  
      modifier onlyOwner() {
          require(msg.sender == owner, "Only the owner can modify the BlackList");
          _;
      }
  
      function conditionallyBlackList(address _account, uint256 _threshold) public onlyOwner {
          require(getBalance(_account) < _threshold, "Account balance exceeds threshold");
          BlackList[_account] = true;
      }
  
      function removeFromBlackList(address _account) public onlyOwner {
          BlackList[_account] = false;
      }
  }

检测提示:黑名单通常基于特定条件或事件。仔细研究在激活黑名单之前检查的函数。这些函数包含将所有者添加到黑名单的逻辑,例如在此示例中,添加的条件是账户余额高于指定阈值。

示例9:带有时间锁定移除的黑名单(时间锁定移除)


    contract TokenWithTimeLockedRemoval {
      address public owner;
      mapping(address => bool) public BlackList;
      mapping(address => uint256) public removalTimeLock;
  
      constructor() {
          owner = msg.sender;
      }
  
      modifier onlyOwner() {
          require(msg.sender == owner, "Only the owner can modify the BlackList");
          _;
      }
  
      function addToBlackList(address _account) public onlyOwner {
          BlackList[_account] = true;
          removalTimeLock[_account] = block.timestamp + 7 days;
      }
  
      function removeFromBlackList(address _account) public onlyOwner {
          require(block.timestamp >= removalTimeLock[_account], "Time lock not expired");
          BlackList[_account] = false;
          removalTimeLock[_account] = 0;
      }
  }

检测提示:识别黑名单移除受时间限制的合约。在这类情况下,通常基于block.timestamp进行时间计算。

示例10:带有Gas限制的黑名单(Gas限制保护)


    contract TokenWithGasLimitProtection {
      address public owner;
      mapping(address => bool) public BlackList;
  
      constructor() {
          owner = msg.sender;
      }
  
      modifier onlyOwner() {
          require(msg.sender == owner, "Only the owner can modify the BlackList");
          _;
      }
  
      modifier limitGas() {
          require(gasleft() >= 100000, "Insufficient gas");
          _;
      }
  
      function addToBlackListGasLimited(address _account) public onlyOwner limitGas {
          BlackList[_account] = true;
      }
  
      function removeFromBlackList(address _account) public onlyOwner {
          BlackList[_account] = false;
      }
  }

检测提示:识别一些函数,如黑名单,受到Gas限制的合约。

常见提示

示例11:与Oracle外部集成的黑名单(Oracle)


    interface Oracle {
      function isBlackListed(address _account) external view returns (bool);
  }
  
  contract TokenWithOracleIntegration {
      address public owner;
      Oracle public oracle;
  
      constructor(address _oracleAddress) {
          owner = msg.sender;
          oracle = Oracle(_oracleAddress);
      }
  
      modifier onlyOwner() {
          require(msg.sender == owner, "Only the owner can modify the BlackList");
          _;
      }
  
      function addToBlackListByOracle(address _account) public onlyOwner {
          require(oracle.isBlackListed(_account), "Oracle did not confirm BlackListing");
      }
  }

检测提示:注意依赖外部Oracle做出黑名单决策的合约。始终检查智能合约使用的Oracle的可靠性和透明性。

示例12:与外部合同交互的黑名单


    interface ExternalContract {
      function addToBlackList(address _account) external;
      function removeFromBlackList(address _account) external;
  }
  
  contract TokenWithExternalInteraction {
      address public owner;
      ExternalContract public externalContract;
  
      constructor(address _externalContract) {
          owner = msg.sender;
          externalContract = ExternalContract(_externalContract);
      }
  
      modifier onlyOwner() {
          require(msg.sender == owner, "Only the owner can modify the BlackList");
          _;
      }
  
      function addToBlackListExternal(address _account) public onlyOwner {
          externalContract.addToBlackList(_account);
      }
  
      function removeFromBlackListExternal(address _account) public onlyOwner {
          externalContract.removeFromBlackList(_account);
      }
  }       

检测提示:在做出黑名单决策时,注意与外部合同交互的合约,特别是外部合同的源代码未经验证的情况。

示例13:带有动态阈值的黑名单(动态阈值)


    contract TokenWithDynamicThreshold {
      address public owner;
      mapping(address => bool) public BlackList;
      uint256 public dynamicThreshold;
  
      constructor(uint256 _initialThreshold) {
          owner = msg.sender;
          dynamicThreshold = _initialThreshold;
      }
  
      modifier onlyOwner() {
          require(msg.sender == owner, "Only the owner can modify the BlackList");
          _;
      }
  
      function addToBlackListDynamicThreshold(address _account) public onlyOwner {
          require(getBalance(_account) > dynamicThreshold, "Account balance is below threshold");
          BlackList[_account] = true;
      }
  
      function removeFromBlackList(address _account) public onlyOwner {
          BlackList[_account] = false;
      }
  
      function updateDynamicThreshold(uint256 _newThreshold) public onlyOwner {
          dynamicThreshold = _newThreshold;
      }
  }

检测提示:识别黑名单阈值是动态的合约,所有者可以随时间(通过调用特定合约方法)设置该阈值。

识别黑名单功能的一般提示(BlackList)

  1. 查找修改地址列表(映射)的函数:
    检查智能合约代码,以识别修改地址列表(如添加或移除地址)的函数。

  2. 检查仅限所有者访问:
    黑名单功能通常具有访问限制,只允许合约所有者或管理员执行。查找是否使用了onlyOwner修饰符或类似的访问控制机制。

  3. 检查constructor()构造函数:
    构造函数指定合约的初始状态。检查构造函数中是否初始化了任何地址绑定或列表,指示有黑名单存在。

  4. 探索修饰符的逻辑:
    分析类型为onlyOwner的修饰符的逻辑,了解在何种条件下可以执行与黑名单相关的功能。

  5. 查找关键词:
    在智能合约代码中查找关键词,如"BlackList"、"addBlackList"、"removeBlackList"或类似术语(在简单情况下,这些函数名称类似,而在更复杂的变体中,名称可能不反映功能的本质以 掩盖其目的)。

  6. 检查文档和注释:
    查阅文档和合约注释,查看是否提及了黑名单功能的任何信息。开发人员通常会提供有关如何使用特定功能(包括黑名单)的信息。

  7. 检查外部调用(call)或事件(event):
    查找可能在将地址添加到黑名单或从中移除时触发的外部调用或事件。这可以揭示合约如何根据与黑名单相关的操作与外部组件进行交互。

  8. 评估合同代码的更新和管理能力:
    评估智能合约的更新机制或治理结构,允许对其黑名单逻辑进行更改。了解如何管理更新对于预测黑名单功能的潜在更改至关重要。

  9. 检查其他函数中的黑名单逻辑:
    检查合同中的其他函数,看看在执行某些操作之前是否会检查地址是否被列入黑名单。

  10. 了解用例和通证经济学:
    了解项目的使用场景和通证经济学。如果项目涉及用户地址管理或具有与用户权利相关的功能,可能会有列入黑名单的原因。

  11. 事件记录:
    注意与黑名单操作相关联的事件日志的存在。事件通常用于记录重要的状态变化,提供合约行为的透明性。

  12. Gas限制保护:
    谨慎使用具有Gas限制保护的功能。虽然这可能是安全功能的实现,但也可以用来控制或限制某些关键合同功能的性能。

  13. 时间相关条件:
    检查与黑名单相关的时间相关条件。例如,合同可能在删除或其他时间敏感机制上实施时间锁定。

  14. 独立审计:
    查找由知名审计公司独立审计过的智能合约。审计报告提供有关合约安全性和功能的洞见。

  15. 审查社区反馈:
    查看社区论坛、社交媒体或官方通信渠道,了解关于黑名单功能存在和使用的讨论。用户可以提供宝贵的见解和关注点。















  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  

常见提示

在分析智能合约时,全面理解其功能和功能至关重要。这些提示将帮助您识别和评估黑名单功能的存在,使您能够对与合约进行交互做出明智的决策。

在可能的情况下,选择符合已建立标准(如ERC-20)的合约。这些标准经常受到审查,并以可靠性著称。

 

我们希望这些示例能帮助您更好地理解智能合约中的黑名单方案(BlackList)。

 

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

不过,我们已经为您完成了所有工作!注册高级订阅,即可访问智能合约功能的独家过滤器和最新分析。增加成功投资有利可图代币的机会。

致敬,Lotus Market团队。

All posts

Connect to a wallet

Metamask