![](/img/bg-single.png)
Смарт-контракты с функцией BlackList
![](https://lotusmarket.io/storage/files/how-to-identify-blacklist-defi-token/cover.png)
Продолжаем серию статей, посвященных описанию мошеннических схем в смарт-контрактах. Сегодня мы разберем смарт-контракты с функцией Черного списка (BlackList).
Опасности смарт-контрактов с функцией BlackList:
Смарт-контракты, включающие функцию Черного списка, несут в себе определенные риски и проблемы как для проекта, так и для его пользователей. Вот некоторые из опасностей, связанных с функциями "черного списка":
- Централизованный контроль: Функции Черного списка часто предоставляют централизованный контроль владельцу контракта или администраторам.
- Злоупотребление черным списком для недобросовестной практики: Злоумышленники (включая владельца контракта), могут использовать черный список для воздействия на конкретные адреса. Это может включать замораживание или ограничение функциональности учетных записей без веских на то оснований.
- Отсутствие прозрачности: Наличие функции черного списка, особенно если она не документирована, может привести к отсутствию прозрачности. Пользователи могут не знать о критериях составления черного списка или о процедуре исключения из него.
- Риски для безопасности: Если BlackList реализован ненадежно, существует риск возникновения уязвимостей, которые могут позволить неавторизованным лицам манипулировать черным списком, что может привести к несанкционированному замораживанию или переводу средств.
- Недоверие пользователей: Существование функции черного списка может подорвать доверие пользователей, поскольку их активы могут быть внесены в черный список без четких правил.
- Конфискация токенов: Злоумышленники могут использовать черный список для конфискации токенов или активов с определенных адресов без должных оснований. Это может привести к существенным финансовым потерям.
Как самостоятельно определить наличие подобных угроз в смарт-контрактах?
При проверке смарт-контракта можно предпринять определенные шаги, чтобы определить наличие угрозы, связанной с функциями черного списка:
- Прежде чем приступить к работе со смарт-контрактом, внимательно прочитайте и изучите его код, включая все функции, связанные с составлением черного списка. Ищите функции, связанные с черным списком, замораживанием или ограничением функциональности учетных записей. Проверьте, есть ли функции, позволяющие добавлять или удалять адреса из черного списка.
- Проанализируйте, кто имеет право собственности или административного контроля над контрактом. Оцените степень контроля и права, связанные с владельцем или администраторами.
- Изучите документацию контракта, чтобы понять, как предполагается использовать функцию черного списка. Ищите информацию о механизмах управления, которые контролируют использование черного списка.
- Оцените прозрачность: обеспечивает ли контракт прозрачность критериев составления черного списка. Проверьте, существуют ли четкие процедуры устранения ложных срабатываний или удаления адресов из черного списка.
- Аудиты безопасности: проверьте, проходил ли смарт-контракт аудит безопасности, проводимый авторитетными сторонними компаниями.
- Ознакомьтесь с отзывами сообщества или онлайн-форумов об использовании черных списков в проекте. Будьте внимательны к любым тревожным сигналам, поднятым членами сообщества, касающимся недобросовестной практики или недостаточной прозрачности.
- Проведя тщательный анализ и приняв во внимание вышеуказанные факторы, вы сможете лучше оценить риски, связанные с функциями черного списка в смарт-контрактах. Будьте в курсе последних событий в нашем сообществе (Телеграм-канал) и лучших практик по выявлению мошенничества (наш Блог и YouTube-канал).
Хорошие новости: наш Сканер безопасности находит все распространенные (в том числе скрытые) функции Черных списков (BlackList) в 99,9% случаев. Используйте нашу премиум подписку и защитите свои средства от угроз.
Далее мы рассмотрим несколько наиболее распространенных примеров функции 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;
}
}
Советы по обнаружению:Ищите функции (например, addToBlacklist и removeFromBlacklist), имеющие модификаторы доступа (onlyOwner). Наличие подобных модификаторов означает, что только владелец (Owner) может изменять черный список.
Пример 2: Черный список с механизмом взимания платы (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;
}
}
Советы по обнаружению:Определите функции (например, addToBlacklistWithFee), которые требуют взимания платы (msg.value) для внесения в черный список. Это является очень опасным сигналом.
Пример 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: Черный список с регистрацией событий (Events)
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: Черный список с функцией белого списка (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;
}
}
Советы по обнаружению:Функциональность "белого списка": Обращайте внимание на контракты, в которых одновременно присутствуют функции "черного" и "белого" списков. Такая двойная функциональность может иметь последствия для передачи токенов без ведома их владельца или других мошеннических действий.
Пример 6: Черный список с контролем управления (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;
}
}
Советы по обнаружению:Определите контракты, в которых действия по составлению черных списков подлежат контролю со стороны внешних управляющих контрактов. При рассмотрении смарт-контракта внимательно проанализируйте код, обращая внимание на контроль доступа, механизмы оплаты, условия, зависящие от времени, регистрацию событий, защиту от обхода и другие важные факторы. Кроме того, при оценке последствий использования функции черного списка учитывайте специфику проекта и его цели.
Пример 7: Черный список с аварийной паузой (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;
}
}
Советы по обнаружению:Механизм аварийной паузы может приостановить работу некоторых функций, включая изменения в черном списке.
Пример 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: Черный список с удалением по времени (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;
}
}
Советы по обнаружению:Выявляйте контракты, в которых удаление из черного списка ограничено по времени. Часто в таких случаях используются расчеты времени, основанных на block.timestamp.
Пример 10: Черный список с лимитами по газу (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;
}
}
Советы по обнаружению:Определите контракты, в которых определенные функции, например, составление черного списка, зависят от лимитов газа.
Пример 11: Черный список с внешней интеграцией с Оракулом (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");
}
}
Советы по обнаружению:Будьте внимательны к контрактам, которые при принятии решений о внесении в черный список полагаются на внешние Оракулы. Всегда проверяйте надежность и прозрачность Оракулов, которые использует смарт-контракт.
Пример 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: Черный список с динамическим порогом (Dynamic Threshold)
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)
- Ищите функции, изменяющие список адресов (mapping):
Изучите код смарт-контракта, чтобы выявить те функции, которые изменяют список адресов, например, добавляют или удаляют адреса. - Проверьте наличие доступа только для владельца (Owner):
Функции черного списка часто имеют ограничения доступа, позволяющие выполнять их только владельцу контракта или администраторам. Ищите использование модификатора onlyOwner или аналогичных механизмов контроля доступа. - Проверьте функцию-конструктор constructor():
Функция-конструктор задает начальное состояние контракта. Проверьте, не инициализируются ли в конструкторе какие-либо адресные связки или списки, что указывает на наличие черного списка. - Изучите логику модификаторов:
Проанализируйте логику модификаторов типа onlyOwner, чтобы понять, при каких условиях могут выполняться функции, связанные с черным списком. - Поиск ключевых терминов:
Найдите в коде смарт-контракта такие ключевые слова, как "blacklist", "addBlacklist", "removeBlacklist" или аналогичные термины (в самых простых случаях эти функции имеют подобные названия, в более сложных вариантах названия могут не отображать суть функции, чтобы замаскировать ее). - Проверьте документацию и комментарии:
Просмотрите документацию и комментарии к контракту на предмет упоминания функций, связанных с черными списками. Разработчики часто предоставляют информацию о том, как следует использовать те или иные функции, включая черный список. - Проверьте внешние вызовы (call) или события (event):
Ищите внешние вызовы или события, которые могут быть инициированы при добавлении адреса в черный список или его удалении. Это может дать представление о том, как контракт взаимодействует с внешними компонентами на основе действий, связанных с черным списком. - Оцените возможности обновления и управления кодом контракта:
Оцените смарт-контракт на предмет наличия механизмов обновления или структур управления, позволяющих вносить изменения в логику его работы с черным списком. Понимание того, как осуществляется управление обновлениями, очень важно для прогнозирования потенциальных изменений в функциональности черных списков. - Проверяйте логику черного списка в других функциях:
Изучите другие функции контракта на предмет наличия проверок, позволяющих определить, находится ли адрес в черном списке, перед выполнением определенных действий. - Рассмотрите сценарии использования и токеномику:
Разберитесь в сценариях использования и токеномике проекта. Если проект связан с управлением адресами пользователей или имеет функции, связанные с правами пользователей, то, возможно, есть причина для включения черного списка. - Регистрация событий:
Обратите внимание на наличие журнала событий, связанных с действиями по созданию черного списка. События часто используются для регистрации значительных изменений состояния, обеспечивая прозрачность поведения контракта. - Защита от ограничения газа:
С осторожностью относитесь к функциям, имеющим защиту от превышения лимита газа. Хотя это может быть реализация функции безопасности, она также может использоваться для контроля или ограничения выполнения некоторых критически важных функций контракта. - Зависимые от времени условия:
Проверьте наличие зависящих от времени условий, связанных с внесением в черный список. Например, в контрактах могут быть реализованы временные блокировки на удаление или другие механизмы, чувствительные к времени. - Независимые аудиты:
Ищите смарт-контракты, прошедшие независимый аудит со стороны авторитетных аудиторских фирм. Аудиторские отчеты дают представление о безопасности и функциональности контракта. - Изучите отзывы сообщества:
Проверьте форумы сообщества, социальные сети или официальные каналы связи на предмет обсуждения наличия и использования функции черного списка. Пользователи могут высказать ценные соображения и опасения.
При анализе смарт-контракта крайне важно иметь полное представление о его особенностях и функциональных возможностях. Приведенные советы помогут выявить и оценить наличие функции черного списка, что позволит принимать взвешенные решения о взаимодействии с контрактом.
По возможности выбирайте контракты, соответствующие устоявшимся стандартам (например, ERC-20). Эти стандарты часто подвергаются тщательной проверке и имеют репутацию надежных.
Надеемся, что эти примеры помогли Вам лучше разобраться со схемами Черных списков (BlackList) в смарт-контрактах.
Поскольку вся информация в блокчейне открыта (конечно, при условии верифицированного исходного кода контракта), то вооружившись этими знаниями Вы можете самостоятельно изучать смарт-контракты и выявлять различные схемы скама.
Однако, мы все уже сделали за Вас! Подключайте премиум подписку и откройте для себя доступ к эксклюзивным фильтрам по функциям смарт-контрактов и свежую аналитику. Повысьте шансы на успешные инвестиции в прибыльные токены.
С уважением, команда Lotus Market.