Проблемы с переполнением/недополнением?

pragma solidity 0.5.1;

contract basics{
    using SafeMath for *;
    uint time;
    address payable sender;
    uint amount;
    event moneySent(address s,uint a);

    mapping(address=>person) public accounts;

    struct person {
        uint time;
        uint vault;
    }        

    function sendToContract() public payable{// isWithinLimits(msg.value){
        accounts[msg.sender].vault=accounts[msg.sender].vault.add(msg.value);
        accounts[msg.sender].time=now;
    }

    function takeFromContract() public payable{
        if(now>=accounts[msg.sender].time+10 seconds){
            msg.sender.transfer(accounts[msg.sender].vault);
            accounts[msg.sender].time=now;
        }           
    }
}

/**
 * @title SafeMath v0.1.9
 * @dev Math operations with safety checks that throw on error
 * change notes:  original SafeMath library from OpenZeppelin modified by Inventor
 * - added sqrt
 * - added sq
 * - added pwr
 * - changed asserts to requires with error log outputs
 * - removed div, its useless
 */
library SafeMath {

    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b)
        internal
        pure
        returns (uint256 c)
    {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        require(c / a == b, "SafeMath mul failed");
        return c;
    }

    /**
    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b)
        internal
        pure
        returns (uint256)
    {
        require(b <= a, "SafeMath sub failed");
        return a - b;
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b)
        internal
        pure
        returns (uint256 c)
    {
        c = a + b;
        require(c >= a, "SafeMath add failed");
        return c;
    }

    /**
     * @dev gives square root of given x.
     */
    function sqrt(uint256 x)
        internal
        pure
        returns (uint256 y)
    {
        uint256 z = ((add(x,1)) / 2);
        y = x;
        while (z < y)
        {
            y = z;
            z = ((add((x / z),z)) / 2);
        }
    }

    /**
     * @dev gives square. multiplies x by x
     */
    function sq(uint256 x)
        internal
        pure
        returns (uint256)
    {
        return (mul(x,x));
    }

    /**
     * @dev x to the power of y
     */
    function pwr(uint256 x, uint256 y)
        internal
        pure
        returns (uint256)
    {
        if (x==0)
            return (0);
        else if (y==0)
            return (1);
        else
        {
            uint256 z = x;
            for (uint256 i=1; i < y; i++)
                z = mul(z,x);
            return (z);
        }
    }
}

учитывая этот код, при запуске и тестировании, если отправить 10 000 eth из кошелька, содержащего 99 eth, кошелек покажет, что теперь он имеет 99 900 eth, а когда 10 000 будет отправлено снова, он вернется к 99 eth в кошельке. Может ли это быть ошибка недополнения или переполнения?

Ответы (1)

Нет.

Вы не вычитаете средства из msg.senderбаланса счета на этапе снятия средств. SafeMath предотвратит недополнение, поэтому учетные записи не смогут перерасходовать средства, если вы это сделаете.

Проблема, я думаю, зависит от вашей методологии тестирования.

если отправить 10 000 eth из кошелька, содержащего 99 eth, кошелек покажет, что теперь в нем 99 900 eth, и когда 10 000 будет отправлено снова, он вернется

Я не думаю, что это точно. Вы не можете отправить 10 000 eth из кошелька, в котором всего 99 eth. Невозможно. Вероятно, вы отправляете 10 000 вэй или какую-то другую меньшую единицу.

Я предполагаю, что реальная вероятная проблема заключается в том, что вы просите кошелек (отправить) или контракт (вывести) отправить больше средств, чем на самом деле есть, что также невозможно, поэтому он возвращается.

Неизвестно, как составить контракт, нарушающий правило, согласно которому никто не может отправлять средства, которых у него на самом деле нет.

Надеюсь, поможет.