Soliditätsmodifikatoren in der Bibliothek?

Ist es nicht möglich, Modifikatoren in Bibliotheken zu definieren? Ich frage mich wirklich warum, denn das sind einige Funktionen, die Sie immer wieder brauchen würden.

Wenn ich hypothetisch einen ownableModifikator implementieren und diesen in vielen meiner Verträge verwenden lassen möchte, müsste ich ihn in jedem meiner Verträge implementieren oder einen anderen Vertrag (keine Bibliothek) verwenden, der den Modifikator bereitstellt.

Ich habe https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol gesehen und sie implementieren die Funktionalität auch als Vertrag und nicht als Funktion, da Modifikatoren meiner Meinung nach nicht sein können auf Solidity-Bibliotheken zugegriffen?

Meine Frage: Soll ich jetzt meine Modifikatoren in meine abstrakten Verträge implementieren oder Modifikatoren in einem eigenen Vertrag definieren, wie es die Zeppelin-Jungs getan haben? Was sind die Vor-/Nachteile?

Antworten (1)

Die Bibliothek kann Modifikatoren definieren und verwenden, aber sie kann sie nicht exportieren. Modifikatoren sind Funktionen zur Kompilierzeit, eine Art Makro. Modifikatorcode wird vom Compiler für jede Methode ersetzt, die diesen Modifikator verwendet. Für komplexe Modifikatoren kann dies ein Problem sein, aber Sie können die Logik des Modifikators immer in eine Funktion (wahrscheinlich eine Bibliotheksfunktion) verschieben und dann innerhalb von Modifikator auf diese Funktion verweisen. Sie können auch allgemeine Modifikatoren in der Schnittstelle implementieren, um sie von mehreren Verträgen gemeinsam zu nutzen:

library Foo {
    modifier nonZero (uint x) {
        require (x != 0);
        _;
    }

    function isPrime (uint x) public nonZero (x) returns (bool) {
        // Complicated logic here
    }
}

interface Bar {
    modifier onlyPrime (uint x) {
        require (Foo.isPrime (x));
        _;
    }
}

contract Zoo is Bar {
    function fooBar (uint x) public onlyPrime (x) {
        // Here we know that x is prime!
    }
}