Я отправляю токен со учетной записи A на B. Учетная запись, которая выполняет транзакцию, — C. Удивительно, но транзакция действительна и работает нормально. Почему?
Это означает, что я, будучи эмитентом транзакции, могу заставить произвольную учетную запись A передавать токены произвольной учетной записи B? Не означает ли это, что таким образом я могу буквально украсть токены, учитывая, что B — это какой-то другой мой адрес.
Я почти уверен, что мне здесь не хватает какой-то фундаментальной вещи.
Полезная нагрузка JSON RPC для изображения вопроса такова:
{
"jsonrpc": "2.0",
"method": "eth_sendTransaction",
"params": [
{
"to": "0x5928ead021bd523e6d3531de920d78b7a02efa60",
"from": "0xef2b050377007e45ba43d9c2bf0d7acc2039c112",
"data": "0x23b872dd000000000000000000000000d8e05701eFf33acfDA0A8e24C04070347703c72C000000000000000000000000ad9c9b5085bec8e8013296dc12bd9cecad102356000000000000000000000000000000000000000000000000000000005a9187bf",
"gas": "0x3d0900",
"gasPrice": "0x51f4d5c00"
}
],
"id": 1
}
Транзакция произошла в ropsten
сети, и ее можно увидеть здесь: https://ropsten.etherscan.io/tx/0x3a1d9800565e93a7ff0e85958dcf49a9e7752d099f4b061598e8b73f1e453814 .
Здесь:
0x5928ead021bd523e6d3531de920d78b7a02efa60
- адрес контракта,0xef2b050377007e45ba43d9c2bf0d7acc2039c112
– эмитент транзакции (тот, кто будет платить комиссию за транзакцию),0xd8e05701eFf33acfDA0A8e24C04070347703c72C
— пользователь А, фактически создатель контракта, который владеет всеми токенами; тот, чьи токены крадут ,0xad9c9b5085bec8e8013296dc12bd9cecad102356
– пользователь B, тот, кому дарят токены.Почему эта сделка действительна?
Взгляните на этот токен-контракт по адресу https://ropsten.etherscan.io/address/0x5928ead021bd523e6d3531de920d78b7a02efa60#code .
function transferFrom(address _from, address _to, uint _value) returns (bool success) {
if (_from == 0x0 && _to == 0x0) throw;
if (balanceOf[_from] >= _value && _value > 0) {
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
Transfer(_from, _to, _value);
return true;
}
return false;
}
Функция transferFrom
не проверяет, кто является инициатором транзакции, поэтому любой может перевести от кого угодно.
Этот токен реализует только два метода из ERC20, и реализует их некорректно. Для правильной реализации используйте либо zeppelin-solitidy
библиотеку, либо посмотрите https://theethereum.wiki/w/index.php/ERC20_Token_Standard .
В стандарте ERC20 отправитель может утвердить третью сторону для перевода от его имени. Это называется допуском и выполняется с помощью метода append(). Это необходимо для работы в таких случаях, как децентрализованный обмен.
Ниже приводится хорошо написанная статья о ERC20 и хорошее объяснение разрешения. https://medium.com/@jgm.orinoco/understanding-erc-20-token-contracts-a809a7310aa5
улыбка