учебник — Удаление контракта с помощью selfdestruct()


Этот туториал предназначен для тех, кто имеет базовые знания о Ethereum и смарт-контрактах, кто немного знаком с Solidity.
Цель создания этого блога — записать подробную историю работы и мою памятку по изучению dApps.
Если вы также заинтересованы и хотите испачкать руки, просто следуйте приведенным ниже шагам и получайте удовольствие!~

Предварительные условия

  • Remix

начало работы

Описание контракта

В Solidity есть функция selfdestruct(). Когда функция вызывается, контракт, содержащий функцию selfdestruct(), будет удален из блокчейна. Затем функция заставляет отправить ETH обратно эфиру владельцу контракта или на адрес контракта, указанный владельцем, даже если контракт не имеет функции обратного действия.

См. следующий пример:


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Kill {
    constructor () payable {}
    fallback() external payable {}
    receive() external payable {}

    function kill () external {
        selfdestruct(payable(msg.sender));
    }
    function testCall() external pure returns (string memory) {
        return "Tst called";
    }
    function contractBal() external view returns (uint) {
        return address(this).balance;
    }
    function ownerBal() external view returns (uint) {
        return msg.sender.balance;
    }
}

contract Helper {
    function getBalance() external view returns (uint) {
        return address(this).balance;
    }
    function kill(Kill _kill) external {
        _kill.kill();
    }
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Первый контракт Kill имеет функции receive() и fallback(), которые позволяют контракту отправлять и передавать ETH на другой адрес. Функция kill() содержит selfdestruct(), которая «убьет» контракт Kill. Функции testCall(), contractBal() и ownerBal() возвращают строку, баланс ETH контракта и баланс ETH владельца соответственно. Но эти три функции будут неработоспособны после выполнения kill().

Второй контракт Helper может быть способен «убить» контракт Kill без наличия запасной функции, и Helper получит ETH баланс контракта Kill после его завершения.

Тестирование контракта с помощью Remix

  • 1. Контракт Kill

Перед выполнением kill():


После выполнения kill():

  • 2. Помощник по контракту

После выполнения kill() остаток контракта Kill передается Helper:

Оцените статью
Procodings.ru
Добавить комментарий