Analysieren Sie den Gasverbrauch und die Vertragsgestaltung

Angenommen, ich habe den folgenden Vertragscode:

pragma solidity ^0.4.23;

contract pensCollection{

    struct Pen{
        uint productCode;
        address ownerAddress;
    }

    address public owner;

    // history of a pen.
    mapping(uint => address[]) public __history;

    // One account can hold many pens.
    mapping(address => Pen[]) public __inventary;

    constructor () public{
        owner = msg.sender;
    }


    function addPen(uint _productCode, address _ownerAddress) public returns (address) {


        Pen memory _pen = Pen({
            productCode : _productCode,
            ownerAddress : _ownerAddress
            });
        __inventary[_ownerAddress].push(_pen);

        // Add history entry for this new pen.
        __history[_productCode].push(_ownerAddress);

        return msg.sender;
    }

    function exchangePen(address _buyer, uint _productCode) public returns (bool) {

       // Search for pen in the inventary.
        for (uint i = 0; i < (__inventary[msg.sender].length); i++) {

            // If I find it then change its owner address.
            if (__inventary[msg.sender][i].productCode == _productCode) {

                Pen memory _pen = Pen(
                    {
                    productCode : _productCode,
                    ownerAddress : _buyer
                    });
                __inventary[_buyer].push(_pen);
                __history[_productCode].push(_buyer);

                delete __inventary[msg.sender][i];
                return true;
            }
        }

        return false;
    }

    function getHistoryForPen(uint _productCode) public view returns (address[]) {
        return __history[_productCode];
    }
}

Dieser Vertrag sollte es Benutzern ermöglichen, eine Reihe von Stiften in einem Smart Contract zu registrieren. Es gibt eine Zuordnung, in der ich für jede Besitzeradresse ein Array habe, Penin dem Pen eine Struktur ist. Ich kann Stift zur Sammlung ( __inventaryVariable) hinzufügen, indem ich die Methode verwende addPen(...). Außerdem kann ich Stifte umtauschen mit der Funktion exchangePen(...), bei der der angegebene Stift an die Käuferadresse übertragen und vom alten Besitzer entfernt wird. Es gibt auch ein Array namens __history, in dem alle Bewegungen (Verkäufe/Käufe) registriert sind, und der Benutzer kann dieses Array abrufen, indem er die entsprechende Methode aufruft. Wenn ich diesen Code mit Remix online kompiliere, bekomme ich die Warnung vor dem Gasverbrauch, denn wenn ich richtig liege, ist das Speichern von Daten im Vertragszustand eine schlechte Praxis, die viel Benzin kostet und dazu führen kann, dass die Laufzeitausnahme ausgeht Gas.

Eine meiner Fragen ist: Wie kann ich diese Ausnahme verursachen? Wie viele Stifte sollte ich einführen, bevor eine gasLimit-Ausnahme auftritt?

Die andere Frage ist: Soll ich einen Vertrag einsetzen, der nur einen Stift mit der Methode zur Übertragung und zur Geschichte darstellt? Ich meine, ist der folgende Vertrag besser als der vorherige?

pragma solidity ^0.4.23;

contract PenContract{

    struct Pen{
        uint productCode;
        address ownerAddress;
    }

    address public owner;
    Pen public _pen;

    // history of a pen.
    address[] public __history;


    constructor (uint _productCode, address _ownerAddress) public{
        owner = msg.sender;
        _pen.productCode = _productCode;
        _pen.ownerAddress = _ownerAddress;

        // Add history entry for this new pen.
        __history.push(_ownerAddress);
    }


    function exchangePen(address _buyer) public returns (bool) {
        _pen.ownerAddress = _buyer;
        __history.push(_buyer);
        return true;            
    }

    function getHistoryForPen() public view returns (address[]) {
        return __history;
    }
}

Mit anderen Worten, angesichts der Tatsache, dass die Bereitstellung eines intelligenten Vertrags 32.000 Gas kostet ( hier ), ist es besser, einen Vertrag zu haben, der alle Stifte verwaltet und mit dem Sie andere hinzufügen können (was möglicherweise das Problem des Gaslimits verursacht), oder es ist besser einen Vertrag für jeden Stift einzusetzen (kann das auch das Problem verursachen?) ?

Vielen Dank im Voraus.

Antworten (2)

Mögliches Duplikat: Erstellen mehrerer Verträge oder Einzelvertrag mit Struktur

Weitere dynamische Array-Typen können auf 2^256-1 Elemente anwachsen.

Ich hoffe, es hilft: Ich speichere Daten immer in Zuordnungen und nicht in Arrays. Arrays können sehr teuer werden, wie Sie sagten. So können Sie Ihre Stifte in Mappings speichern und diese dann mit einer View-Funktion durchlaufen, die nichts kostet. Nur eine Anmerkung, keine vollständige Antwort 😉

Viel Glück mit dem Vertrag

Narper