Доступ к средствам, отправленным на адрес смарт-контракта

Если кто-то создает смарт-контракт (и является владельцем этого контракта), может ли этот человек собирать ETH и другие токены, которые отправляются на адрес смарт-контракта?

Возможный дубликат Как вывести эфир с контракта
Это надмножество возможного дубликата, поскольку он обращается к таким средствам, как токены, а не только к ETH.

Ответы (2)

Это возможно только в том случае, если создатель смарт-контракта сделает это возможным. Если в контракте не реализована какая-либо функция снятия(), то владелец может потерять средства безвозвратно.

Это фича, а не баг. Хотели бы вы, чтобы создатель смарт-контракта дельты эфира выводил весь эфир и токены из контракта по прихоти? Нет.

У смарт-контракта нет механизмов владельца или вывода средств, если только они не были закодированы в контракте. Это дает смарт-контрактам возможность быть ненадежными: можно использовать контракты, не доверяя владельцу, тщательно разбираясь в коде контракта.

Вывод токенов ERC-20

Если вы являетесь автором смарт-контракта и хотите иметь возможность выводить токены ERC-20, вам необходимо выполнить 2 шага.

Шаг 1: Добавьте этот интерфейс (подмножество ERC-20) выше вашего контракта.

contract Token {
    function transfer(address _to, uint _value) returns (bool success);
    function balanceOf(address _owner) constant returns (uint balance);
}

Шаг 2: Вот функция, которую вы можете добавить в свой контракт.

function withdrawTokens(address tokenContract) external onlyOwner {
    Token tc = Token(tokenContract);

    tc.transfer(owner, tc.balanceOf(this));
}

Это предполагает, что вы правильно написали и настроили себя как owner. Так как ваш контракт может получать много разных типов токенов, вам необходимо withdrawTokensот каждого tokenContract. Если ownerэто другой контракт, он также должен иметь withdrawTokensфункцию предотвращения застревания токенов в ownerконтракте.

Вывод эфира

Код проще:

function withdrawEther() external onlyOwner {
    owner.transfer(this.balance);
}

Опять же, если ownerэто другой контракт, он также должен иметь withdrawEtherфункцию предотвращения застревания эфира в ownerконтракте.

Еще одна ссылка: Как вывести эфир с контракта

Спасибо, а если контракт уже действующий и в нем нет такой функции, средства застревают? Можно ли его обновить, чтобы это можно было добавить?
@nikolaivkov Да, средства застрянут. Точно так же контракт также нельзя обновить, если в нем уже нет кода, позволяющего каким-либо образом обновить его.