Почему эта «воровская» транзакция ERC20 действительна?

Я отправляю токен со учетной записи 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, тот, кому дарят токены.

Почему эта сделка действительна?

Ответы (2)

Взгляните на этот токен-контракт по адресу 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

Спасибо за комментарий, @Sumanth. Эта статья была познавательной!