Analise smart-contract
23.01.2024

Kako prepoznati žeton BlackList DeFi?

Nadaljujemo serijo člankov, namenjenih opisovanju goljufivih shem v pametnih pogodbah. Danes bomo analizirali pametne pogodbe s funkcijami črnega seznama (BlackList).

Nevarnosti pametnih pogodb s funkcijami črnega seznama:

Pametne pogodbe, ki vključujejo funkcije črnega seznama, prinašajo določena tveganja in težave tako za projekt kot za njegove uporabnike. Tukaj je nekaj nevarnosti, povezanih s funkcijami črnega seznama:

  1. Centraliziran nadzor: Funkcije črnega seznama pogosto zagotavljajo centraliziran nadzor lastniku pogodbe ali administratorjem.

  2. Zloraba črnega seznama za nepoštene prakse: Zlorabniki (vključno z lastnikom pogodbe) lahko uporabijo črni seznam za ciljanje določenih naslovov. To lahko vključuje zamrznitev ali omejevanje funkcionalnosti računov brez pravega razloga.

  3. Pomanjkanje transparentnosti: Prisotnost funkcij črnega seznama, še posebej če niso dokumentirane, lahko vodi do pomanjkanja transparentnosti. Uporabniki morda ne bodo seznanjeni s kriteriji črnega seznama ali postopkom uvrščanja na črni seznam.

  4. Varnostna tveganja: Če črni seznam ni varno implementiran, obstaja tveganje ranljivosti, ki lahko omogoči nepooblaščenim osebam manipulacijo s črnim seznamom, kar lahko vodi do nepooblaščene zamrznitve ali prenosa sredstev.

  5. Nezaupanje uporabnikov: Prisotnost funkcij črnega seznama lahko spodkoplje zaupanje uporabnikov, saj lahko njihova sredstva brez jasnih pravil pristanejo na črnem seznamu.

  6. Konfiskacija žetonov: Napadalci lahko uporabijo črni seznam za konfiskacijo žetonov ali sredstev z določenih naslovov brez ustrezne utemeljitve. To lahko povzroči znatne finančne izgube.

Kako lahko sami ugotovite, ali so takšne grožnje prisotne v pametnih pogodbah?

Pri preverjanju pametne pogodbe lahko sprejmete določene korake, da ugotovite, ali obstaja grožnja, povezana s funkcijami črnega seznama:

  • Preden začnete delati s pametno pogodbo, skrbno preberite in preučite njeno kodo, vključno z vsemi funkcijami, povezanimi s črnim seznamom. Poiščite funkcije, povezane s črnim seznamom, zamrzovanjem ali omejevanjem funkcionalnosti računov. Preverite funkcije, ki omogočajo dodajanje ali odstranjevanje naslovov s črnega seznama.

  • Analizirajte, kdo ima lastništvo ali administrativni nadzor nad pogodbo. Ocenite stopnjo nadzora in pravice, povezane z lastnikom ali administratorji.

  • Preučite dokumentacijo pogodbe, da razumete, kako naj bi se uporabljale funkcije črnega seznama. Iščite informacije o mehanizmih upravljanja, ki nadzorujejo uporabo črnega seznama.

  • Ocenite transparentnost: Ali pogodba zagotavlja, da so kriteriji za uvrščanje na črni seznam pregledni? Preverite, ali obstajajo jasni postopki za odpravljanje lažnih pozitivnih rezultatov ali odstranjevanje naslovov s črnega seznama.

  • Varnostni pregledi: Preverite, ali je pametna pogodba prestala varnostne preglede s strani uglednih tretjih podjetij.

  • Seznanite se s povratnimi informacijami skupnosti ali spletnimi forumi o uporabi črnih seznamov v projektu. Bodite pozorni na morebitne opozorilne znake članov skupnosti glede nepoštenih praks ali pomanjkanja transparentnosti.

  • Z izvedbo temeljite analize in upoštevanjem zgoraj navedenih dejavnikov boste bolje ocenili tveganja, povezana s funkcijami črnega seznama v pametnih pogodbah. Ostanite na tekočem z najnovejšimi dogajanji v naši skupnosti (Telegram kanal) in najboljšimi praksami za odkrivanje prevar (naš Blog in YouTube kanal).

 

Dobra novica: naš varnostni skener odkrije vse običajne (vključno s skritimi) funkcije črnega seznama (BlackList) v 99,9% primerov. Uporabite našo premijsko naročnino in zaščitite svoja sredstva pred grožnjami.

 

Nato bomo pogledali nekaj najpogostejših primerov funkcij črnega seznama, ki jih naša platforma uspešno zazna.

Upoštevajte, da so to poenostavljeni primeri in da se dejanska izvedba lahko razlikuje. Pri analizi pametnih pogodb morate vedno opraviti temeljit pregled kode in upoštevati kontekstualne dejavnike.

Primer 1: Osnovna funkcionalnost črnega seznama


    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;
      }
  }

Nasveti za odkrivanje:Poiščite funkcije (kot so addToBlackList in removeFromBlackList), ki imajo dostopne modifikatorje (onlyOwner). Prisotnost takšnih modifikatorjev pomeni, da lahko črni seznam spreminja le lastnik.

common tips

Primer 2: Črni seznam z mehanizmom plačila (BlackList with Fee)


    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;
      }
  }

Nasveti za odkrivanje:Opredelite funkcije (kot je addToBlackListWithFee), ki zahtevajo plačilo (msg.value) za dodajanje na črni seznam. To je zelo nevaren signal.

Primer 3: Črni seznam s časovno odvisnimi pogoji


    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;
      }
  }

Nasveti za odkrivanje:Opredelite funkcije (npr. addToBlackListTimed), ki nalagajo pogoje, odvisne od časa bloka, na črni seznam. To se običajno uporablja za zamudo ali načrtovane črne sezname.

Primer 4: Črni seznam z beleženjem dogodkov


    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);
      }
  }

Nasveti za odkrivanje:Beleženje dogodkov: Poiščite dogodke, ki beležijo dejanja črnega seznama. Dogodki zagotavljajo transparentnost in so zelo pomembni za spremljanje dejanj pogodbe. Lahko rečemo, da je to najvarnejša vrsta črnega seznama, saj razvijalci te funkcije ne skrivajo, temveč odkrito beležijo vse njene klice v dnevnikih dogodkov.

Primer 5: Črna lista s funkcijami Whitelist (Whitelist)


    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;
      }
  }

Nasveti za odkrivanje: Funkcionalnost Whitelist: Pazite na pogodbe, ki imajo hkrati funkcije za črnjenje in beljenje. Takšna dvojna funkcionalnost lahko vpliva na prenose žetonov brez vednosti lastnika ali druge goljufive dejavnosti.

splošni nasveti

Primer 6: Črna lista z upravljanjem (Governance Control)


    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;
      }
  }

Nasveti za odkrivanje: Identificirajte pogodbe, kjer je črnjenje pod nadzorom zunanjih upravljavcev pogodb. Pri pregledu pametne pogodbe skrbno analizirajte kodo, pozorno spremljajte kontrole dostopa, mehanizme plačil, časovno odvisne pogoje in druge pomembne dejavnike. Prav tako upoštevajte specifičnosti projekta in njegove cilje pri ocenjevanju posledic uporabe funkcij črnega seznama.

Primer 7: Črna lista z zasilnim ustavljanjem (Emergency Stop)


    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;
      }
  }

Nasveti za odkrivanje: Mehanizem za zasilno ustavljanje lahko zaustavi nekatere funkcije, vključno z spreminjanjem črne liste.

Primer 8: Črna lista z dinamičnimi pogoji


    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;
      }
  }

Nasveti za odkrivanje: Črnjenje je pogosto odvisno od določenih pogojev ali dogodkov. Skrbno preučite funkcije, ki so preverjene pred aktiviranjem črne liste. Te funkcije vsebujejo logiko za dodajanje lastnika v črno listo; v tem primeru je pogoj za dodajanje, da je stanje računa nad določenim pragom.

Primer 9: Črna lista s časovno zaklenjenim odstranjevanjem (Time-Locked Removal)


    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;
      }
  }

Nasveti za odkrivanje: Identificirajte pogodbe, kjer je odstranjevanje iz črne liste časovno omejeno. Pogosto se v takih primerih uporabljajo časovne izračune na podlagi block.timestamp.

Primer 10: Črna lista s omejitvami plina (Gas Limit Protection)


    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;
      }
  }

Nasveti za odkrivanje: Identificirajte pogodbe, kjer so določene funkcije, kot je črnenje, omejene z omejitvami plina.

splošni nasveti

Primer 11: Črna lista z zunanjim integriranjem z 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");
      }
  }

Nasveti za odkrivanje: Bodite pozorni na pogodbe, ki se zanašajo na zunanje Oracle za odločanje o črnenju. Vedno preverite zanesljivost in preglednost Oracle, ki jih uporablja pametna pogodba.

Primer 12: Črna lista z interakcijo z zunanjim kontraktom


    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);
      }
  }           

Nasveti za odkrivanje: Pri odločanju o črnenju bodite pozorni na pogodbe, ki se v interakciji s tujimi pogodbami, še posebej, če vir kode zunanje pogodbe ni preverjen.

Primer 13: Črna lista z dinamičnim pragom (Dinamični prag)


    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;
      }
  }

Nasveti za odkrivanje: Identificirajte pogodbe, kjer je prag črne liste dinamičen in ga lahko lastnik čez čas nastavi (s klicanjem določenih metod pogodbe).

Splošni nasveti za identifikacijo funkcij Črne liste (Črna lista)

  1. Iščite funkcije, ki spreminjajo seznam naslovov (mapping):
    Preglejte kodo pametne pogodbe, da identificirate funkcije, ki spreminjajo seznam naslovov, kot so dodajanje ali odstranjevanje naslovov.

  2. Preverite dostop samo za lastnika:
    Funkcije črne liste pogosto imajo omejitve dostopa, ki dovoljujejo izvajanje samo lastniku pogodbe ali administratorjem. Iščite uporabo modifierja onlyOwner ali podobnih mehanizmov za nadzor dostopa.

  3. Preverite funkcijo konstruktorja constructor():
    Konstrukcijska funkcija določa začetno stanje pogodbe. Preverite, ali so v konstruktorju inicializirane kakršne koli vezave naslovov ali seznamov, kar nakazuje na črno listo.

  4. Raziščite logiko modifierjev:
    Analizirajte logiko modifierjev tipa onlyOwner, da razumete pod kakšnimi pogoji se lahko izvajajo funkcije, povezane s črno listo.

  5. Poiščite ključne termine:
    Iščite ključne besede, kot so "BlackList", "addBlackList", "removeBlackList" ali podobne izraze v kodi pametne pogodbe (v najpreprostejših primerih imajo te funkcije podobna imena, v bolj zapletenih variantah imena morda ne odražajo bistva funkcije, da bi jo prikrili).

  6. Preverite dokumentacijo in komentarje:
    Preglejte dokumentacijo in komentarje pogodbe za omembe funkcij črne liste. Razvijalci pogosto podajajo informacije o tem, kako naj se uporabljajo določene funkcije, vključno s črno listo.

  7. Preverite zunanje klice (call) ali dogodke (event):
    Iščite zunanje klice ali dogodke, ki se lahko sprožijo, ko se naslov doda ali odstrani iz črne liste. To lahko razkrije, kako pogodba komunicira s tujimi komponentami na podlagi dejanj, povezanih s črno listo.

  8. Ocenite posodobitvene in upravljavske sposobnosti kode pogodbe:
    Ocenite pametno pogodbo za mehanizme posodabljanja ali upravljanja, ki omogočajo spremembe v logiki njenega črnjenja. Razumevanje, kako so posodobitve upravljane, je ključno za predvidevanje potencialnih sprememb v funkcionalnosti črne liste.

  9. Preverite logiko črne liste v drugih funkcijah:
    Preučite druge funkcije v pogodbi za preverjanje, ali je določenim dejanjem pred izvedbo določenih ukrepov določen naslov na črni listi.

  10. Odkrijte primere uporabe in tokenomiko:
    Razumite scenarije uporabe in tokenomiko projekta. Če je projekt povezan z upravljanjem naslovov uporabnikov ali ima funkcije, povezane z uporabniškimi pravicami, lahko obstaja razlog za črno listo.

  11. Zabeležite dogodke:
    Bodite pozorni na prisotnost dogodkov, povezanih z dejanji črnjenja. Dogodki se pogosto uporabljajo za beleženje pomembnih sprememb stanja, kar zagotavlja preglednost v obnašanje pogodbe.

  12. Zaščita pred omejitvijo plina:
    Pazite na funkcije, ki imajo zaščito pred omejitvijo plina. Čeprav gre lahko za implementacijo varnostne funkcije, se lahko uporablja tudi za nadzor ali omejevanje delovanja nekaterih kritičnih funkcij pogodbe.

  13. Pogojne pogoje, odvisne od časa:
    Preverite časovno odvisne pogoje, povezane s črno listo. Na primer, pogodbe lahko izvajajo zakasnitve glede brisanja ali druge časovno občutljive mehanizme.

  14. Neodvisne preglede:
    Poiščite pametne pogodbe, ki so bile neodvisno pregledane s strani priznanih revizijskih podjetij. Poročila o reviziji zagotavljajo vpogled v varnost in funkcionalnost pogodbe.

  15. Pregled skupnostnih povratnih informacij:
    Preverite skupnostne forume, družabna omrežja ali uradne komunikacijske kanale za razprave o prisotnosti in uporabi funkcij črne liste. Uporabniki lahko ponudijo dragocene vpoglede in pomisleke.


  16.  

splošni nasveti

Pri analizi pametne pogodbe je ključnega pomena, da razumete vse njene funkcije in funkcionalnosti. Ti nasveti vam bodo pomagali prepoznati in oceniti prisotnost funkcij črne liste, kar vam omogoča informirane odločitve pri interakciji s pogodbo.

Kadar je mogoče, izbirajte pogodbe, ki so skladne z uveljavljenimi standardi (npr. ERC-20). Ti standardi so pogosto pregledani in uživajo ugled zanesljivosti.

 

Upamo, da so vam ti primeri pomagali bolje razumeti sheme Črne liste v pametnih pogodbah.

 

Ker je vse informacije v blockchainu odprto (seveda pod pogojem, da je vir kode pogodbe preverjen), lahko oboroženi s tem znanjem samostojno preučite pametne pogodbe in prepoznate različne prevare.

Vendar pa smo mi že vse naredili namesto vas! Prijavite se na premium naročnino in pridobite dostop do ekskluzivnih filtrov za funkcije pametne pogodbe in svežih analiz. Povečajte svoje možnosti za uspešno vlaganje v donosne žetone.

Lep pozdrav, ekipa Lotus Market.

All posts

Connect to a wallet

Metamask