Ist ein Überlauf in diesem Smart Contract möglich?

function mint(address beneficiary) public payable {
    uint256 MTCToken = (msg.value/10000) * (10 ** uint256(18));
    uint256 teamToken = (MTCToken/100) * (5);
    balances[owner] += teamToken;
    balances[beneficiary] = balances[beneficiary] + (MTCToken - teamToken);
    totalSupply_ = totalSupply_ + (MTCToken);
}

Ich bin etwas verwirrt mit der genauen Länge des Überlauflimits. Ist es möglich, die Grenze in der obigen Funktion zu überschreiten?

Antworten (2)

Ein Überlauf ist möglich, aber wir können es nicht sagen, wenn wir nicht wissen, was die Art von Salden und totalSupply_ ist. Es könnte uint8 sein und dann wäre es sehr einfach, balances[owner] oder balances[beneficiary] oder totalSupply_ zu überlaufen

Wenn dies uint256 ist, dann ist es immer noch möglich, aber es müsste eine Menge ETH dafür gesendet werden. Es macht keinen Sinn.

Ich kenne Ihre Anforderungen nicht, daher kann ich nicht sagen, warum Sie mit 10 ** 18 multiplizieren.

uint256 MTCToken = (msg.value/10000) * (10 ** uint256(18));

msg.value ist in Wei, also nehme ich an, dass Sie hier einen Fehler haben. Es ist auch besser, zuerst zu multiplizieren und dann zu dividieren.

Ich bin etwas verwirrt mit der genauen Länge des Überlauflimits.

Antwort: Die Überlaufgrenze hängt vom Zielvariablentyp ab. Wenn Sie Ergebnisse im Typ uint8 speichern, beträgt der maximale Wert 255.

Also in diesem Beispiel:

pragma solidity 0.4.24;

  contract Overflow {
    uint8 iWantToBeCrossed;

    function OverflowMe() public
    {
        iWantToBeCrossed = 100;
        iWantToBeCrossed += 200;

    }

    function ShowMeTheValue () public   view returns (uint8){
        return iWantToBeCrossed;
    }
}

Die Funktion ShowMeTheValue gibt 44 zurück, nachdem Sie die OverflowMe-Funktion aufgerufen haben.

Geben Sie hier die Bildbeschreibung einFür uint256 benötigen Sie größere Werte. Theoretisch ist es also möglich, zu überlaufen, aber praktisch macht es keinen Sinn, weil Sie viel ETH zu Ihrem Vertrag schicken müssten.

Ein Überlauf ist technisch möglich, aber nicht sehr wahrscheinlich. Die höchstmögliche Zahl in einem uint256 ist (2^256)-1. Wenn jemand den gesamten vorhandenen Ether an diese Funktion senden würde, wäre MTCToken immer noch nur 9.7330305e+39, was nur ~133 der 256 Bits sind.

Beachten Sie, dass msg.value bereits in Wei ist, also wird die Multiplikation mit 10**18 Ihnen nicht geben, wie viel Wei es gibt. Außerdem würde ich vorschlagen, vor der Division zu multiplizieren, da die Division zu fehlenden Dezimalstellen führt. zB 12345/100*5 = 615 vs 617.