Странное поведение расчета твердости эфириума - PullRequest
0 голосов
/ 02 сентября 2018

Я написал ниже простой код солидности, чтобы вычислить некоторые числа. Но блокчейн ethereum дает разные выходы для каждой функции. Что-то не так с моим кодом или проблема с цепочкой цепочек ethereum?

Мой код солидности:

pragma solidity ^0.4.24;

contract Calculate {

    uint balance = 50000000000000000000;

    function done() public pure returns (uint) {
        return (50000000000000000000 / 3000) * 3000;
    }

    function fail() public view returns (uint) {
        return (balance / 3000) * 3000;
    }

}

Выход:

done() function returns 50000000000000000000

fail() function returns 49999999999999998000

Пожалуйста, проверьте живой пример здесь: https://ropsten.etherscan.io/address/0xf45a2a66be9835fdc9e1065875808616cb8e752e#readContract

1 Ответ

0 голосов
/ 02 сентября 2018

Я считаю, что проблема заключается в том, что в случае done компилятор фактически не генерирует код для выполнения вычислений. Вместо этого вычисление выполняется во время компиляции, и на его место ставится одна константа.

Компилятор, в отличие от EVM во время выполнения, поддерживает десятичную математику. Например. вы можете написать 0.5 ether несмотря на то, что EVM не имеет представления для числа 0,5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...