Hallo ... brauche Hilfe für das College

Meine Idee für das College war, einen Vertrag abzuschließen, bei dem der Gesamtbetrag aus dem Vertrag zu gleichen Teilen zwischen 2 Partnern im Testnetz aufgeteilt wird. Ich verwende Mist und habe zwei Brieftaschen (Konten), eine heißt MainAcc und die andere Partner1. Ich kann meinen Vertrag online verschieben, es gibt keine Fehler im Compiler. Ich kann ihn in die Blockchain verschieben, aber wenn ich zu meinem Vertrag gehe und eine Funktion withdrawaufrufe und einen Benutzer auswähle, beginnt die Verarbeitung, alles sieht gut aus und die Transaktion wird abgebaut, aber kein Äther wurde von Vertrag zu Partner oder MainAcc verschoben.

Wenn ich es remixe, funktioniert es. Ich kann Geld zwischen Konten senden, habe aber eine Warnung --- Gasanforderung der Funktion PayCheck.withdraw() hoch: unendlich. Wenn der Gasbedarf einer Funktion höher ist als die Sperrgasgrenze, kann sie nicht ausgeführt werden. Bitte vermeiden Sie Schleifen in Ihren Funktionen oder Aktionen, die große Speicherbereiche ändern (dazu gehört das Löschen oder Kopieren von Arrays im Speicher) – vielleicht funktioniert es deshalb nicht auf TestNet

Ich bin wirklich verzweifelt, habe ein ganzes Seminar über Smart Contracts (Geschichte, Idee, Kryptowährung, Blockchain, Vorteile usw.) und Ethereum als größte Plattform gemacht und brauche nur diesen einfachen Vertrag, um es mit einem coolen Beispiel zu beenden :(

Vielen Dank im Voraus!

pragma solidity ^0.4.18;

contract PayCheck {

    address[] employees = [0xE83fad0b5EdF2999c29a00199Ca9B773A4627239, 0x118531D9C6C9114c8B999Ac1197778d1669Fc6c6];

    mapping (address => uint) withdrawnAmounts;

    constructor() payable public{
    }

    function () payable public{
    }

    modifier canWithdraw() {
        bool contains = false;

        for(uint i = 0; i < employees.length; i++) {
            if(employees[i] == msg.sender) {
                contains = true;
            }
        }
        require(contains);
        _;
    }

    function withdraw() canWithdraw public{
        uint amountAllocated = address(this).balance/employees.length;
        uint amountWithdrawn = withdrawnAmounts[msg.sender];
        uint amount = amountAllocated - amountWithdrawn;
        withdrawnAmounts[msg.sender] = amountWithdrawn + amount;
        if (amount > 0) {
            msg.sender.transfer(amount);
        }

    }

}

Antworten (1)

Es funktioniert gut für mich.

Anfangs war ich etwas verwirrt, als ich es in Remix testete und ich nirgendwo sehen konnte, dass der Ether empfangen wurde. Am Ende scheint es, dass Remix nirgendwo angezeigt wird, wenn Sie Ether in der Transaktion erhalten (außer vielleicht im Adressguthaben oben rechts).

Am Ende habe ich etwas Protokollierung (und geänderte Adressen) hinzugefügt und hier können Sie sehen, dass es funktioniert:

pragma solidity ^0.4.18;

contract PayCheck {

    address[] employees = [0xca35b7d915458ef540ade6068dfe2f44e8fa733c, 0x118531D9C6C9114c8B999Ac1197778d1669Fc6c6];

    mapping (address => uint) withdrawnAmounts;

    constructor() payable public{
    }

    function () payable public{
    }

    modifier canWithdraw() {
        bool contains = false;

        for(uint i = 0; i < employees.length; i++) {
            if(employees[i] == msg.sender) {
                contains = true;
            }
        }
        require(contains);
        _;
    }

    event DebugLog(string, uint256);

    function withdraw() canWithdraw public{
        uint amountAllocated = address(this).balance/employees.length;
        uint amountWithdrawn = withdrawnAmounts[msg.sender];
        uint amount = amountAllocated - amountWithdrawn;
        withdrawnAmounts[msg.sender] = amountWithdrawn + amount;
        if (amount > 0) {
            emit DebugLog("balance before", msg.sender.balance);
            msg.sender.transfer(amount);
            emit DebugLog("balance after", msg.sender.balance);
        }

    }
}

Ich hoffe, Sie wissen auch, dass dieser Code nur zu Demonstrationszwecken gültig ist - er hat viele Unterlauf-/Überlauffehler und andere Validierungsprobleme.