Ich habe einen Vertrag A
, der eine Vertragsinstanz hat B
, dh B b
.
Contract A
ruft eine Funktion von contract B
über die Instanz auf, dh b.func()
.
Der Vertrag B
ist zustandslos, dh keine globalen nicht konstanten Variablen.
Ich habe mich daher entschieden, es als library
.
Danach A
bekomme 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 func
von external
auf ä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, external
nachdem ich die auf a internal
"reduziere" ?contract
library
AKTUALISIEREN:
Ich denke ich habe es:
Der library
Code wird in das "eingebettet", contract
das ihn importiert (wie ein Makro in C, wenn Sie so wollen).
Dann können nur Funktionen, die entweder private
, internal
oder sind public
, innerhalb des Vertrags aufgerufen werden, während external
Funktionen nur außerhalb des Vertrags aufgerufen werden können.
Also meine Frage ist eigentlich:
Wie kann ich die Tatsache vereinbaren, dass diese Funktionen internal
bei Nutzung durch einen Vertrag und external
beim Zugriff über Web3
(zu Testzwecken) verfügbar sein sollen?
Danke schön!
internal
Versuchen 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()
.
func
(anstelle eines Bibliotheks- und "Proxy" -Vertrags).
balajipachai