![](/img/bg-single.png)
Wie erkennt man BlackList DeFi-Token?
![](https://lotusmarket.io/storage/files/how-to-identify-blacklist-defi-token/cover.png)
Wir setzen die Artikelserie fort, die sich mit der Beschreibung betrügerischer Schemata in Smart Contracts befasst. Heute werden wir Smart Contracts mit Black List-Funktionen (BlackList) analysieren.
Die Gefahren von Smart Contracts mit Black List-Funktionen:
Smart Contracts, die Blacklist-Funktionen enthalten, bergen bestimmte Risiken und Probleme sowohl für das Projekt als auch für seine Benutzer. Hier sind einige der mit Blacklist-Funktionen verbundenen Gefahren:
- Zentralisierte Kontrolle: Blacklist-Funktionen bieten oft zentrale Kontrolle für den Vertragsinhaber oder Administratoren.
- Missbrauch der Blacklist für unfaire Praktiken: Missbraucher (einschließlich des Vertragsinhabers) können die Blacklist nutzen, um bestimmte Adressen zu zielen. Dies kann das Einfrieren oder die Einschränkung der Funktionalität von Konten ohne guten Grund umfassen.
- Mangelnde Transparenz: Die Existenz von Blacklist-Funktionen, insbesondere wenn sie nicht dokumentiert sind, kann zu mangelnder Transparenz führen. Benutzer sind möglicherweise nicht über die Kriterien für die Blacklist oder das Blacklist-Verfahren informiert.
- Sicherheitsrisiken: Wenn die Blacklist nicht sicher implementiert ist, besteht das Risiko von Schwachstellen, die es unbefugten Parteien ermöglichen könnten, die Blacklist zu manipulieren, was zu unbefugtem Einfrieren oder Transfer von Mitteln führen könnte.
- Vertrauensverlust der Benutzer: Die Existenz von Blacklist-Funktionen kann das Vertrauen der Benutzer untergraben, da ihre Vermögenswerte ohne klare Regeln auf die Blacklist gesetzt werden können.
- Token-Beschlagnahme: Angreifer können die Blacklist nutzen, um Token oder Vermögenswerte von bestimmten Adressen ohne angemessene Rechtfertigung zu beschlagnahmen. Dies kann zu erheblichen finanziellen Verlusten führen.
Wie können Sie unabhängig feststellen, ob solche Bedrohungen in Smart Contracts vorhanden sind?
Bei der Validierung eines Smart Contracts können bestimmte Schritte unternommen werden, um festzustellen, ob eine Bedrohung im Zusammenhang mit Blacklist-Funktionen besteht:
- Lesen und studieren Sie vor der Arbeit mit einem Smart Contract sorgfältig seinen Code, einschließlich aller Funktionen im Zusammenhang mit der Blacklist. Suchen Sie nach Funktionen, die mit Blacklisting, Einfrieren oder der Begrenzung der Kontofunktionalität zusammenhängen. Überprüfen Sie, ob Funktionen vorhanden sind, die das Hinzufügen oder Entfernen von Adressen aus der Blacklist ermöglichen.
- Analysieren Sie, wer Eigentum oder administrativen Kontrolle über den Vertrag hat. Bewerten Sie den Grad der Kontrolle und der Rechte, die mit dem Eigentümer oder Administratoren verbunden sind.
- Untersuchen Sie die Vertragsdokumentation, um zu verstehen, wie die Blacklist-Funktionen verwendet werden sollen. Suchen Sie nach Informationen zu den Governance-Mechanismen, die die Verwendung der Blacklist steuern.
- Bewerten Sie die Transparenz: Stellt der Vertrag sicher, dass die Kriterien für die Blacklist transparent sind? Überprüfen Sie, ob klare Verfahren zur Beseitigung von Fehlalarmen oder zur Entfernung von Adressen aus der Blacklist vorhanden sind.
- Sicherheitsaudits: Überprüfen Sie, ob der Smart Contract Sicherheitsaudits von renommierten Drittanbieterunternehmen durchlaufen hat.
- Machen Sie sich mit dem Feedback aus der Community oder Online-Foren über die Verwendung von Blacklists im Projekt vertraut. Seien Sie auf rote Fahnen aufmerksam, die von Community-Mitgliedern über unfaire Praktiken oder mangelnde Transparenz erhoben werden.
- Durch eine gründliche Analyse und Berücksichtigung der oben genannten Faktoren sind Sie besser in der Lage, die mit Blacklist-Funktionen in Smart Contracts verbundenen Risiken zu bewerten. Bleiben Sie auf dem neuesten Stand der Entwicklungen in unserer Community (Telegram-Kanal) und besten Praktiken zur Betrugserkennung (unser Blog und YouTube-Kanal).
Gute Nachrichten: Unser Security Scanner findet alle gängigen (auch versteckten) Blacklist-Funktionen (BlackList) zu 99,9%. Nutzen Sie unser Premium-Abonnement und schützen Sie Ihre Mittel vor Bedrohungen.
Als Nächstes werden wir uns einige der häufigsten Beispiele für Blacklist-Funktionen ansehen, die unsere Plattform erfolgreich erkennt.
Beachten Sie, dass es sich hierbei um vereinfachte Beispiele handelt und die tatsächliche Implementierung abweichen kann. Bei der Analyse von Smart Contracts sollten Sie immer eine gründliche Codeüberprüfung durchführen und kontextabhängige Faktoren berücksichtigen.
Beispiel 1: Grundlegende Funktionalität der Black List
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;
}
}
Erkennungstipps:Suchen Sie nach Funktionen (wie addToBlackList und removeFromBlackList), die Zugriffsmodifikatoren (nurOwner) haben. Das Vorhandensein solcher Modifikatoren bedeutet, dass nur der Eigentümer die Blacklist ändern kann.
Beispiel 2: Blacklist mit Gebührenmechanismus (BlackList mit Gebühr)
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;
}
}
Erkennungstipps:Definieren Sie Funktionen (wie addToBlackListWithFee), die eine Gebühr (msg.value) erfordern, um auf die Blacklist gesetzt zu werden. Dies ist ein sehr gefährliches Signal.
Beispiel 3: Blacklist mit zeitabhängigen Bedingungen
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;
}
}
Erkennungstipps:Definieren Sie Funktionen (z.B. addToBlackListTimed), die blockzeitabhängige Bedingungen für die Blacklist festlegen. Dies wird typischerweise für verzögerte oder zeitgesteuerte Blacklists verwendet.
Beispiel 4: Blacklist mit Ereignisprotokollierung
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);
}
}
Erkennungstipps:Ereignisprotokollierung: Achten Sie auf Ereignisse, die Blacklist-Aktionen protokollieren. Ereignisse gewährleisten Transparenz und sind sehr wichtig für die Überwachung von Vertragsaktionen. Man könnte sagen, dass dies die sicherste Art der BlackList ist, da Entwickler diese Funktion nicht verbergen, sondern alle Aufrufe offen in Ereignisprotokollen protokollieren.
Beispiel 5: Blacklist mit Whitelist-Funktionen (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;
}
}
Erkennungstipps:Whitelist-Funktionalität: Achten Sie auf Verträge, die gleichzeitig sowohl Blacklist- als auch Whitelist-Funktionen haben. Eine solche Doppelfunktionalität kann Auswirkungen auf Token-Transfers ohne Wissen des Eigentümers oder andere betrügerische Aktivitäten haben.
Beispiel 6: Blacklist mit Governance-Kontrolle (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;
}
}
Erkennungstipps:Identifizieren Sie Verträge, bei denen die Blacklisting-Aktivitäten der Kontrolle durch externe Vertragsmanager unterliegen. Bei der Prüfung eines Smart Contracts sollten Sie den Code sorgfältig analysieren und auf Zugangskontrollen, Zahlungsmechanismen, zeitabhängige Bedingungen, Ereignisprotokollierung, Schutzmechanismen gegen Umgehungen und andere wichtige Faktoren achten. Berücksichtigen Sie außerdem die Besonderheiten des Projekts und seiner Ziele bei der Bewertung der Auswirkungen der Verwendung der Blacklist-Funktionen.
Beispiel 7: Blacklist mit Notstopp
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;
}
}
Erkennungstipps:Der Notstopp-Mechanismus kann einige Funktionen anhalten, einschließlich Änderungen an der Blacklist.
Beispiel 8: Blacklist mit dynamischen Bedingungen
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;
}
}
>
Erkennungstipps:Blacklisting kann oft auf bestimmten Bedingungen oder Ereignissen basieren. Untersuchen Sie sorgfältig die Funktionen, die überprüft werden, bevor die Blacklist aktiviert wird. Diese Funktionen enthalten die Logik zum Hinzufügen des Eigentümers zur Blacklist; in diesem Beispiel ist die Bedingung für das Hinzufügen, dass der Kontostand des Kontos über der angegebenen Schwelle liegt.
Beispiel 9: Zeitverzögerte Entfernungs-Blacklist (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;
}
}
Erkennungstipps:Identifizieren Sie Verträge, bei denen die Entfernung aus der Blacklist zeitlich begrenzt ist. Oft werden in solchen Fällen Zeitspannenberechnungen basierend auf block.timestamp verwendet.
Beispiel 10: Blacklist mit Gaslimiten (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;
}
}
Erkennungstipps:Identifizieren Sie Verträge, bei denen bestimmte Funktionen wie das Blacklisting Gaslimiten unterliegen.
Beispiel 11: Blacklist mit externer Integration über 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");
}
}
Erkennungstipps:Seien Sie vorsichtig bei Verträgen, die auf externe Oracles angewiesen sind, um Blacklisting-Entscheidungen zu treffen. Überprüfen Sie immer die Zuverlässigkeit und Transparenz der Oracles, die ein Smart Contract verwendet.
Beispiel 12: Blacklist mit Interaktion mit einem externen Vertrag
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);
}
}
Erkennungstipps:Seien Sie bei Verträgen vorsichtig, die bei der Blacklist-Entscheidungsfindung mit externen Verträgen interagieren, insbesondere wenn der Quellcode des externen Vertrags nicht überprüft wurde.
Beispiel 13: Blacklist mit dynamischer Schwelle (Dynamische Schwelle)
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;
}
}
Erkennungstipps:Identifizieren Sie Verträge, bei denen die Blacklisting-Schwelle dynamisch ist und im Laufe der Zeit durch den Eigentümer festgelegt werden kann (durch Aufrufen bestimmter Vertragsmethoden).
Allgemeine Tipps zur Identifizierung von Blacklist-Funktionen (BlackList)
- Suchen Sie nach Funktionen, die die Adressliste (Mapping) ändern:
Untersuchen Sie den Smart Contract-Code, um Funktionen zu identifizieren, die die Adressliste ändern, wie das Hinzufügen oder Entfernen von Adressen. - Überprüfen Sie den zugrunde liegenden Zugriff des Eigentümers:
Blacklist-Funktionen haben oft Zugriffsbeschränkungen, die nur dem Vertragsinhaber oder Administratoren die Ausführung ermöglichen. Suchen Sie nach der Verwendung des onlyOwner-Modifiers oder ähnlichen Zugriffskontrollmechanismen. - Prüfen Sie die Konstruktorfunktion:
Die Konstruktorfunktion legt den initialen Zustand des Vertrags fest. Prüfen Sie, ob in der Konstruktorfunktion Adressbindungen oder Listen initialisiert werden, die auf eine Blacklist hinweisen könnten. - Analysieren Sie die Logik der Modifier:
Untersuchen Sie die Logik von Modifiern vom Typ onlyOwner, um zu verstehen, unter welchen Bedingungen Funktionen im Zusammenhang mit Blacklisting ausgeführt werden können. - Suchen Sie nach Schlüsselbegriffen:
Suchen Sie nach Schlüsselwörtern wie "BlackList", "addBlackList", "removeBlackList" oder ähnlichen Begriffen im Smart Contract-Code. In einfachen Fällen haben diese Funktionen oft ähnliche Namen; in komplexeren Varianten spiegeln die Namen möglicherweise nicht die Funktion wider, um sie zu verschleiern. - Überprüfen Sie die Dokumentation und Kommentare:
Lesen Sie die Dokumentation und die Vertragskommentare durch, um Hinweise auf Blacklist-Funktionen zu erhalten. Entwickler geben oft Informationen darüber, wie bestimmte Funktionen, einschließlich Blacklisting, verwendet werden sollten. - Überprüfen Sie externe Aufrufe (call) oder Events:
Suchen Sie nach externen Aufrufen oder Events, die ausgelöst werden können, wenn eine Adresse der Blacklist hinzugefügt oder entfernt wird. Dies kann Einblick geben, wie der Vertrag mit externen Komponenten basierend auf den Aktionen im Zusammenhang mit der Blacklist interagiert. - Bewerten Sie die Update- und Managementfähigkeiten des Vertragscodes:
Evaluieren Sie den Smart Contract auf Update-Mechanismen oder Governance-Strukturen, die Änderungen an der Blacklist-Logik ermöglichen. Das Verständnis, wie Updates verwaltet werden, ist entscheidend, um potenzielle Änderungen an der Blacklist-Funktionalität vorherzusehen. - Überprüfen Sie die Blacklist-Logik in anderen Funktionen:
Untersuchen Sie andere Funktionen im Vertrag auf Überprüfungen, um festzustellen, ob eine Adresse auf der Blacklist steht, bevor bestimmte Aktionen durchgeführt werden. - Erkunden Sie die Anwendungsfälle und Tokenomics:
Verstehen Sie die Anwendungsszenarien und Tokenomics des Projekts. Wenn das Projekt mit der Verwaltung von Benutzeradressen zusammenhängt oder Funktionen im Zusammenhang mit Benutzerrechten hat, könnte es Gründe für die Blacklist geben. - Event-Logging:
Beachten Sie das Vorhandensein eines Event-Logs, das mit Blacklisting-Aktionen verbunden ist. Events werden häufig verwendet, um bedeutende Zustandsänderungen zu protokollieren und Transparenz über das Vertragsverhalten zu bieten. - Gaslimit-Schutz:
Seien Sie vorsichtig bei Funktionen, die Gaslimit-Schutz haben. Dies kann eine Implementierung einer Sicherheitsfunktion sein, kann aber auch verwendet werden, um die Leistung bestimmter kritischer Vertragsfunktionen zu steuern oder zu begrenzen. - Zeitabhängige Bedingungen:
Überprüfen Sie zeitabhängige Bedingungen im Zusammenhang mit Blacklisting. Zum Beispiel können Verträge Zeitverriegelungen bei Löschung oder andere zeitabhängige Mechanismen implementieren. - Unabhängige Prüfungen:
Suchen Sie nach Smart Contracts, die von renommierten Prüfungsgesellschaften unabhängig geprüft wurden. Prüfberichte geben Einblick in die Sicherheit und Funktionalität des Vertrags. - Überprüfen Sie das Community-Feedback:
Überprüfen Sie Community-Foren, soziale Medien oder offizielle Kommunikationskanäle auf Diskussionen über die Präsenz und Verwendung von Blacklist-Funktionen. Benutzer können wertvolle Einblicke und Bedenken liefern.
Beim Analysieren eines Smart Contracts ist es entscheidend, ein vollständiges Verständnis seiner Features und Funktionalitäten zu haben. Diese Tipps helfen Ihnen, das Vorhandensein von Blacklist-Funktionen zu identifizieren und zu bewerten, was Ihnen ermöglicht, informierte Entscheidungen über die Interaktion mit dem Vertrag zu treffen.
Wo möglich, wählen Sie Verträge, die etablierten Standards entsprechen (z.B. ERC-20). Diese Standards werden oft genau untersucht und haben einen Ruf für Zuverlässigkeit.
Wir hoffen, dass Ihnen diese Beispiele geholfen haben, Blacklist-Schemata in Smart Contracts besser zu verstehen.
Da alle Informationen in der Blockchain offen sind (vorausgesetzt natürlich, dass der Quellcode des Vertrags überprüft ist), können Sie mit diesem Wissen selbständig Smart Contracts untersuchen und verschiedene Betrugsschemata identifizieren.
Aber wir haben bereits alles für Sie erledigt! Melden Sie sich für ein Premium-Abonnement an und erhalten Sie Zugang zu exklusiven Filtern für Smart Contract-Funktionen und aktuellen Analysen. Erhöhen Sie Ihre Chancen, erfolgreich in profitable Tokens zu investieren.
Mit freundlichen Grüßen, das Lotus Market Team.