Solidity - Bibliotecas
As bibliotecas são semelhantes aos contratos, mas destinam-se principalmente à reutilização. Uma Biblioteca contém funções que outros contratos podem chamar. O Solidity tem certas restrições ao uso de uma Biblioteca. A seguir estão as principais características de uma Biblioteca Solidity.
As funções da biblioteca podem ser chamadas diretamente se não modificarem o estado. Isso significa que funções puras ou de visualização só podem ser chamadas de fora da biblioteca.
A biblioteca não pode ser destruída, pois é considerada sem estado.
Uma biblioteca não pode ter variáveis de estado.
Uma biblioteca não pode herdar nenhum elemento.
Uma biblioteca não pode ser herdada.
Exemplo
Experimente o código a seguir para entender como uma biblioteca funciona no Solidity.
pragma solidity ^0.5.0;
library Search {
function indexOf(uint[] storage self, uint value) public view returns (uint) {
for (uint i = 0; i < self.length; i++) if (self[i] == value) return i;
return uint(-1);
}
}
contract Test {
uint[] data;
constructor() public {
data.push(1);
data.push(2);
data.push(3);
data.push(4);
data.push(5);
}
function isValuePresent() external view returns(uint){
uint value = 4;
//search if value is present in the array using Library function
uint index = Search.indexOf(data, value);
return index;
}
}
Execute o programa acima usando as etapas fornecidas no capítulo Aplicativo Solidity First .
Note - Selecione Teste no menu suspenso antes de clicar no botão implantar.
Resultado
0: uint256: 3
Usando Para
A diretiva using A for B; pode ser usado para anexar funções de biblioteca da biblioteca A a um determinado tipo B. Essas funções usarão o tipo de chamador como seu primeiro parâmetro (identificado usando self).
Exemplo
Experimente o código a seguir para entender como uma biblioteca funciona no Solidity.
pragma solidity ^0.5.0;
library Search {
function indexOf(uint[] storage self, uint value) public view returns (uint) {
for (uint i = 0; i < self.length; i++)if (self[i] == value) return i;
return uint(-1);
}
}
contract Test {
using Search for uint[];
uint[] data;
constructor() public {
data.push(1);
data.push(2);
data.push(3);
data.push(4);
data.push(5);
}
function isValuePresent() external view returns(uint){
uint value = 4;
//Now data is representing the Library
uint index = data.indexOf(value);
return index;
}
}
Execute o programa acima usando as etapas fornecidas no capítulo Aplicativo Solidity First .
Note - Selecione Teste no menu suspenso antes de clicar no botão implantar.
Resultado
0: uint256: 3