library ECVerify
se 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
.
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 ECVerify
no 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 Foo
contrato 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 .
ivicaa
ecv.ecverify(hash, sig, signer)
es una llamada de biblioteca y debe ejecutarse como llamada delegada?ética