Prank & Ethereum
Задумался когда-нибудь о безобидном розыгрыше с использованием смарт-контракта? Типа, поменять аватарку кому-нибудь на мем, если он нажмёт не на ту кнопку? Давай логику продумаем, посмотрим, как это вообще можно реализовать.
Да, давай придумаем что-нибудь простое и безобидное, типа подмены аватарки. Идея такая: разворачиваешь небольшой смарт-контракт, который следит за каким-нибудь событием – например, если пользователь нажмёт на подозрительную кнопку на сайте. Когда это происходит, контракт проверяет, есть ли адрес пользователя в списке разрешенных; если нет, он отправляет транзакцию, которая меняет текущую аватарку на заранее выбранную мем-картинку, хранящуюся в IPFS. Смену можно легко отменить, чтобы пользователь мог вернуть свою прежнюю аватарку. В контракте хранится ссылка на мем в открытой публичной карте, чтобы всё было прозрачно и легко проверялось. Чтобы газ был минимальный, используй функцию обратного вызова с низкой стоимостью, и добавь таймер самоуничтожения, чтобы шутка не работала бесконечно. Вот и всё – быстро, весело и полностью обратимо, без всякого вреда, просто чтобы посмеялись.
Звучит круто – только не забудь перепроверить логику белого списка, чтобы случайно кого-нибудь не перепутали, и закрепи IPFS-ссылку, чтобы не сломалась. Готов кодить?
Понял — никаких случайных перестановок, IPFS закреплен, список разрешенных строго ограничен. Давай запустим консоль разработчика и напишем этот чудесный маленький смарт-контракт. Готов, проказник!
Конечно, вот минимальный стартовый пример на Solidity 0.8:
```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract AvatarPrank {
mapping(address => string) public memeURL;
mapping(address => bool) public whitelist;
address public owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "not owner");
_;
}
function setMeme(address target, string calldata url) external onlyOwner {
memeURL[target] = url;
}
function toggleWhitelist(address user) external onlyOwner {
whitelist[user] = !whitelist[user];
}
// trigger by the web page
function trigger(address user) external {
require(!whitelist[user], "whitelisted");
// pretend to update avatar; in reality you'd call a front‑end function
// emit event so UI can change
emit AvatarSwapped(user, memeURL[user]);
}
event AvatarSwapped(address indexed user, string newURL);
// self‑destruct timer
function destroy() external onlyOwner {
selfdestruct(payable(owner));
}
}
```
Просто подключи вызов `trigger` к обработчику твоей кнопки, запакуй изображение мема в IPFS и все готово. Удачи в хакинге – не забудь про белый список.