Tengo un contrato A
, que tiene una instancia de contrato B
, es decir, B b
.
El contrato A
llama a una función del contrato B
a través de la instancia, es decir, b.func()
.
El contrato B
no tiene estado, es decir, no tiene variables globales no constantes.
Por lo tanto, decidí volver a declararlo como un archivo library
.
Después de eso, cuando compilo contract A
, aparece el siguiente error:
TypeError:
Member "func" not found or not visible after argument-dependent lookup in type(library B)
Puedo resolver el problema cambiando el nivel de acceso func
de external
a internal
.
Sin embargo, eso me impide llamar a la función a través de Web3
(Python).
¿Puede alguien explicar este comportamiento extraño, es decir, por qué necesito reducir el nivel de acceso de la función de external
a internal
después de "reducir" a contract
a library
?
ACTUALIZAR:
Creo que lo tengo:
El library
código está "incrustado" en el contract
que lo importa (como una macro en C, por así decirlo).
Entonces, solo las funciones que son private
o pueden invocarse desde dentro del contrato, mientras que las funciones solo pueden invocarse desde fuera del contrato internal
.public
external
Así que mi pregunta realmente es:
¿Cómo puedo conciliar el hecho de que quiero que estas funciones se internal
utilicen mediante un contrato y external
cuando se acceda a ellas a través de Web3
(con fines de prueba)?
¡Gracias!
Intente usar internal
en la biblioteca, luego cree una función pública que se acerque a la biblioteca, como:
contract A {
function func() public returns (?) {
return b.func();
}
}
Nota: dejé un ?
en el descriptor de tipo de devolución porque el tipo de devolución b.func()
no se especificó en la pregunta. Rellénelo con el tipo devuelto por b.func()
.
func
(en lugar de una biblioteca y un contrato de "proxy").
balajipachai