Nivel de acceso a función de biblioteca

Tengo un contrato A, que tiene una instancia de contrato B, es decir, B b.

El contrato Allama a una función del contrato Ba través de la instancia, es decir, b.func().

El contrato Bno 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 funcde externala 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 externala internaldespués de "reducir" a contracta library?

ACTUALIZAR:

Creo que lo tengo:

El librarycódigo está "incrustado" en el contractque lo importa (como una macro en C, por así decirlo).

Entonces, solo las funciones que son privateo pueden invocarse desde dentro del contrato, mientras que las funciones solo pueden invocarse desde fuera del contrato internal.publicexternal

Así que mi pregunta realmente es:

¿Cómo puedo conciliar el hecho de que quiero que estas funciones se internalutilicen mediante un contrato y externalcuando se acceda a ellas a través de Web3(con fines de prueba)?

¡Gracias!

Intenté reproducir el error anterior, sin embargo, no pude, ¿podría compartir su código de contrato, por favor?

Respuestas (1)

Intente usar internalen 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().

Pensé en esto, pero entonces, ¿cuál es el punto de tener esa biblioteca para empezar? También podría declararlo como un contrato con un público func(en lugar de una biblioteca y un contrato de "proxy").