Cómo llamar a un contrato de biblioteca

library ECVerifyse implementa en 0x3bbb367afe5075e0461f535d6ed2a640822edb1c en la red de prueba de Ropsten.

¿Cómo invoco function ecverify(bytes32 hash, bytes sig, address signer) returns (bool) {}ese contrato de biblioteca desde un archivo contract foo.

Respuestas (1)

Una biblioteca es similar a un contrato y puede usar un contrato abstracto para declarar su interfaz y luego invocar (como la función de llamada del contrato implementado ).

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
    }
}

La característica principal de una biblioteca es que su código se ejecuta en el contexto del contrato de llamada. library ECVerifyno accede al almacenamiento, por lo que el código simple anterior funciona, pero se trata y ejecuta como cualquier contrato que no sea de biblioteca.

El otro caso es una biblioteca que accede al almacenamiento, entonces su Foocontrato debe tener el almacenamiento definido correctamente: la biblioteca escribirá en el almacenamiento de su contrato.

Los documentos de Solidity tienen un ejemplo de un library Set, que necesita un mapping(uint => bool). Esto significa que su contrato debe tener este mapeo. Cada vez que la biblioteca escribe en la asignación, escribe en la asignación de su contrato.

Aquí está:

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; }
  ...

y un ejemplo de definición del mapeo en Foo:

contract Foo {
    Set.Data knownValues;

En ¿Cuáles son los pasos para compilar e implementar una biblioteca en Solidity? se proporciona otro ejemplo de cómo vincular y llamar a una biblioteca .

De su ejemplo anterior: ¿cómo sabe el compilador que ecv.ecverify(hash, sig, signer)es una llamada de biblioteca y debe ejecutarse como llamada delegada?
@ivicaa Tiene razón, la llamada delegada no se usa para ECVerify: la llamada delegada no es necesaria porque ECVerify no accede al almacenamiento. (Como se menciona en esta respuesta, el último enlace y el ejemplo de Set proporcionan más detalles sobre cómo vincular y llamar a una biblioteca que accede al almacenamiento).