library ECVerify
wird 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
.
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 ECVerify
greift 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 Foo
sollte 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?
ivicaa
ecv.ecverify(hash, sig, signer)
es sich um einen Bibliotheksaufruf handelt und als Delegataufruf ausgeführt werden muss?eth