Verwenden einer Bibliothek zum Ändern des Speichers

Ich versuche, etwas über die Verwendung von Bibliotheken in Solidität zu lernen. Im folgenden Testvertrag setzt swapNumberLib Wert1 = Wert2 nicht erfolgreich. Ich dachte, Bibliotheken könnten auf die Speicherung eines Vertrags einwirken, wenn die Variablen an die Funktion übergeben würden - funktioniert es in diesem Fall nicht?

pragma solidity ^0.4.24;

library TestLibrary {
    function swapNumber(uint value1, uint value2) internal {
        value1 = value2;
    }
}

contract Test {
    uint public value1;
    uint public value2;

    constructor() public {
        value1 = 1;
        value2 = 2;
    }

    function swapNumberLib() public {
        TestLibrary.swapNumber(value1, value2);
    }

    function swapNumber() public {
        value1 = value2;
    }
}

Antworten (1)

Nach meinem Verständnis können die Bibliotheken auf den Vertragsspeicher zugreifen, aber der Punkt ist, dass uintes sich um einen Werttyp und nicht um einen Referenztyp handelt. Sie können den Speicherort also nicht angeben storage, um explizit auf die Speicherung des Vertrags zu verweisen.

Das heißt, wenn Bibliotheksfunktionen aufgerufen werden, wird deren Code im Kontext des aufrufenden Contracts ausgeführt, dh dieser zeigt auf den aufrufenden Contract, und es kann insbesondere auf den Speicher aus dem aufrufenden Contract zugegriffen werden.
Da eine Bibliothek ein isoliertes Stück Quellcode ist, kann sie nur auf Zustandsvariablen des aufrufenden Vertrags zugreifen, wenn sie explizit bereitgestellt werden (andernfalls hätte sie keine Möglichkeit, sie zu benennen).

aus dem doc

arrayund structsverhalten sich anders, da Sie auf deren Speicherung im Anrufvertrag hinweisen können:

pragma solidity ^0.4.24;

library TestLibrary {
    function setMyArray(uint[] storage value1) internal {
        value1[0] = 100;
    }
}

contract Test {
    uint[] public arr;

    constructor() public {
        arr = [1];
    }

    function setMe() public {
        TestLibrary.setMyArray(arr);
    }
}

storageWenn Sie aus diesem Beispiel entfernen setMyArray, funktioniert es nicht mehr. O.ä:

library TestLibrary {
    function setMyArray(uint[] storage value1, uint[] storage value2) internal {
        value1[0] = value2[0];
    }
}

contract Test {
    uint[] public arr;
    uint[] public arr1;

    constructor() public {
        arr = [1];
        arr1 = [2];
    }

    function setMe() public {
        TestLibrary.setMyArray(arr, arr1);
    }
}
Danke für die Auskunft! Wenn ich in Ihrem letzten Beispiel zu ändere value1[0] = value2[0], value1 = value2funktioniert es nicht mehr. Irgendeine Idee warum?
Nein, keine Ahnung ob es ein Bug ist oder nicht...