So rufen Sie einen Bibliotheksvertrag auf

library ECVerifywird auf 0x3bbb367afe5075e0461f535d6ed2a640822edb1c im Ropsten-Testnetz bereitgestellt.

Wie rufe ich function ecverify(bytes32 hash, bytes sig, address signer) returns (bool) {}diesen Bibliotheksvertrag aus einer contract foo.

Antworten (1)

Eine Bibliothek ähnelt einem Vertrag, und Sie können einen abstrakten Vertrag verwenden, um seine Schnittstelle zu deklarieren und dann aufzurufen (wie Calling function from deployt contract ).

contract ECVerify {
    function ecverify(bytes32 hash, bytes sig, address signer) returns (bool);
}

contract Foo {
    ECVerify ecv = ECVerify(0x3bbb367afe5075e0461f535d6ed2a640822edb1c);

    function callEcv(bytes32 hash, bytes sig, address signer) {
        bool b = ecv.ecverify(hash, sig, signer);
        // handle b
    }
}

Das Hauptmerkmal einer Bibliothek besteht darin, dass ihr Code im Kontext des aufrufenden Vertrags ausgeführt wird. library ECVerifygreift nicht auf den Speicher zu, sodass der obige einfache Code funktioniert, aber er wird wie jeder Nicht-Bibliotheksvertrag behandelt und ausgeführt.

Der andere Fall ist eine Bibliothek, die auf Speicher zugreift, dann Foosollte Ihr Vertrag den Speicher korrekt definiert haben: Die Bibliothek schreibt in den Speicher Ihres Vertrags.

Solidity -Dokumente haben ein Beispiel für eine library Set, die eine benötigt mapping(uint => bool). Das bedeutet, dass Ihr Vertrag diese Zuordnung haben sollte. Immer wenn die Bibliothek in das Mapping schreibt, schreibt sie in das Mapping in Ihrem Vertrag.

Hier ist:

library Set {
  // We define a new struct datatype that will be used to
  // hold its data in the calling contract.


  struct Data { mapping(uint => bool) flags; }
  ...

und ein Beispiel für die Definition der Zuordnung in Foo:

contract Foo {
    Set.Data knownValues;

Ein weiteres Beispiel für das Verknüpfen und Aufrufen einer Bibliothek finden Sie unter Was sind die Schritte zum Kompilieren und Bereitstellen einer Bibliothek in Solidity?

Aus Ihrem obigen Beispiel: Woher weiß der Compiler, dass ecv.ecverify(hash, sig, signer)es sich um einen Bibliotheksaufruf handelt und als Delegataufruf ausgeführt werden muss?
@ivicaa Sie haben Recht, Delegatecall wird nicht für ECVerify verwendet: Delegatecall wird nicht benötigt, da ECVerify nicht auf den Speicher zugreift. (Wie in dieser Antwort erwähnt, enthalten der letzte Link und das Set-Beispiel weitere Details zum Verknüpfen und Aufrufen einer Bibliothek, die auf Speicher zugreift.)