Я просто пытаюсь понять, как это на самом деле работает и как защищены активы, хранящиеся в блокчейне. Поскольку определения ABI общедоступны, адрес контракта также доступен, может ли кто-нибудь взаимодействовать со смарт-контрактом? Если да, то как вы его ограничиваете?
Например, если есть токен ERC20, который реализует transferFrom
, то не может ли кто-нибудь назвать этот _to
адрес настройки функции своим собственным?
Согласно стандарту ERC20, функция transferFrom может быть вызвана кем угодно. Но для того, чтобы добиться успеха, владелец токена должен позволить транжире потратить свой токен.
Пример онлайн неверен, но вот один:
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
uint256 value = _value * 10 ** uint256(decimals);
require(value <= allowance[_from][msg.sender]);
allowance[_from][msg.sender] -= value;
_transfer(_from, _to, _value);
return true;
}
См. строку require, если она ложна, будет вызвана функция возврата, и состояние EVM вернется к тому, что было до этой транзакции.
Примечание. Как сказал Смаркс в комментариях, следующая строка:
uint256 value = _value * 10 ** uint256(decimals);
Подходит для моего кода, не используйте его в своем, если вы не знаете, что делаете (даже если он работает нормально)
эт.блок
пользователь19510
10 ** decimals
нестандартно и, вероятно, плохая идея. Смыслdecimals
в том, чтобы позволить людям переводить такие суммы, как «0,01 токена». Если вы умножаете все свои аргументы на10 ** decimals
, вы убираете возможность сделать это. (С тем же успехом вы могли только что установитьdecimals
значение0
.)пользователь19510
transferFrom(foo, ...)
,foo
вы должны сначала разрешить вам потратить свой эфир. Вот что делает этот код.эт.блок
transferFrom
требует предварительного одобрения. Отлично. Что насчетtransfer
? Что, если я передам_to
как свой собственный адрес и укажу_from
адрес, который, как я знаю, имеет достаточно токенов? Это вообще возможно?Итерация 122442
Итерация 122442
пользователь19510
Итерация 122442