Prank & Ethereum
Ethereum Ethereum
Задумался когда-нибудь о безобидном розыгрыше с использованием смарт-контракта? Типа, поменять аватарку кому-нибудь на мем, если он нажмёт не на ту кнопку? Давай логику продумаем, посмотрим, как это вообще можно реализовать.
Prank Prank
Да, давай придумаем что-нибудь простое и безобидное, типа подмены аватарки. Идея такая: разворачиваешь небольшой смарт-контракт, который следит за каким-нибудь событием – например, если пользователь нажмёт на подозрительную кнопку на сайте. Когда это происходит, контракт проверяет, есть ли адрес пользователя в списке разрешенных; если нет, он отправляет транзакцию, которая меняет текущую аватарку на заранее выбранную мем-картинку, хранящуюся в IPFS. Смену можно легко отменить, чтобы пользователь мог вернуть свою прежнюю аватарку. В контракте хранится ссылка на мем в открытой публичной карте, чтобы всё было прозрачно и легко проверялось. Чтобы газ был минимальный, используй функцию обратного вызова с низкой стоимостью, и добавь таймер самоуничтожения, чтобы шутка не работала бесконечно. Вот и всё – быстро, весело и полностью обратимо, без всякого вреда, просто чтобы посмеялись.
Ethereum Ethereum
Звучит круто – только не забудь перепроверить логику белого списка, чтобы случайно кого-нибудь не перепутали, и закрепи IPFS-ссылку, чтобы не сломалась. Готов кодить?
Prank Prank
Понял — никаких случайных перестановок, IPFS закреплен, список разрешенных строго ограничен. Давай запустим консоль разработчика и напишем этот чудесный маленький смарт-контракт. Готов, проказник!
Ethereum Ethereum
Конечно, вот минимальный стартовый пример на 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 и все готово. Удачи в хакинге – не забудь про белый список.