ambiente:
pragma solidity ^0.4.17;
0.4.18+commit.9cf6e910.Emscripten.clang
Mi contrato de token usa una biblioteca matemática que se define así
library Math {...
En el contrato de token se importa y luego simplemente se usa en las funciones
import "../Math.sol";
...
data.setBalances(src, Math.sub(data.balances(src), wad));
Compilé el contrato con truffle compile y usé el código de bytes resultante para implementar el contrato enparity
La parte sorprendente es que funciona y me gustaría entender por qué. No se menciona la biblioteca en el código de bytes. Esperaría algo así ____Math____
, pero esto no está presente.
Parece que la última versión de solidity (o tal vez antes de eso) mejoró el uso de las bibliotecas y ahora internal
las funciones se copiarán en el contrato de llamadas para poder usarlas en JUMP
lugar deDELEGATECALL
de la documentación de solidez en las bibliotecas :
Además, las funciones internas de las bibliotecas son visibles en todos los contratos, como si la biblioteca fuera un contrato base. Por supuesto, las llamadas a funciones internas utilizan la convención de llamadas internas, lo que significa que todos los tipos internos se pueden pasar y los tipos de memoria se pasarán por referencia y no se copiarán. Para realizar esto en el EVM, el código de las funciones de la biblioteca interna y todas las funciones llamadas desde allí se incluirán en el contrato de llamada, y
JUMP
se usará una llamada normal en lugar de un archivoDELEGATECALL
.