Zugriffsebene der Bibliotheksfunktion

Ich habe einen Vertrag A, der eine Vertragsinstanz hat B, dh B b.

Contract Aruft eine Funktion von contract Büber die Instanz auf, dh b.func().

Der Vertrag Bist zustandslos, dh keine globalen nicht konstanten Variablen.

Ich habe mich daher entschieden, es als library.

Danach Abekomme ich beim Kompilieren von Vertrag folgende Fehlermeldung:

TypeError:
Member "func" not found or not visible after argument-dependent lookup in type(library B)

Ich kann das Problem lösen, indem ich die Zugriffsebene von funcvon externalauf ändere internal.

Das hindert mich jedoch daran, die Funktion über Web3(Python) aufzurufen.

Kann mir bitte jemand dieses seltsame Verhalten erklären, dh warum muss ich die Zugriffsebene der Funktion von auf reduzieren, externalnachdem ich die auf a internal"reduziere" ?contractlibrary

AKTUALISIEREN:

Ich denke ich habe es:

Der libraryCode wird in das "eingebettet", contractdas ihn importiert (wie ein Makro in C, wenn Sie so wollen).

Dann können nur Funktionen, die entweder private, internaloder sind public, innerhalb des Vertrags aufgerufen werden, während externalFunktionen nur außerhalb des Vertrags aufgerufen werden können.

Also meine Frage ist eigentlich:

Wie kann ich die Tatsache vereinbaren, dass diese Funktionen internalbei Nutzung durch einen Vertrag und externalbeim Zugriff über Web3(zu Testzwecken) verfügbar sein sollen?

Danke schön!

Ich habe versucht, den obigen Fehler zu reproduzieren, aber ich konnte es nicht. Könnten Sie bitte Ihren Vertragscode teilen?

Antworten (1)

internalVersuchen Sie , in der Bibliothek zu verwenden , und erstellen Sie dann eine öffentliche Funktion, die als Proxy für die Bibliothek fungiert, wie z.

contract A {
  function func() public returns (?) {
    return b.func();
  }
}

Hinweis: Ich habe ein ?im Deskriptor des Rückgabetyps gelassen, da der Rückgabetyp b.func()nicht in der Frage angegeben wurde. Füllen Sie es mit dem Typ aus, der von zurückgegeben wird b.func().

Ich habe darüber nachgedacht, aber dann - was bringt es, überhaupt mit dieser Bibliothek zu beginnen? Ich könnte es auch einfach als Vertrag mit einer Öffentlichkeit deklarieren func(anstelle eines Bibliotheks- und "Proxy" -Vertrags).