La biblioteca se incluye automáticamente en el contrato

ambiente:

  • todos los contratos utilizanpragma solidity ^0.4.17;
  • el compilador es0.4.18+commit.9cf6e910.Emscripten.clang
  • El sistema operativo es MacOS X

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.

Respuestas (1)

Parece que la última versión de solidity (o tal vez antes de eso) mejoró el uso de las bibliotecas y ahora internallas funciones se copiarán en el contrato de llamadas para poder usarlas en JUMPlugar 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 JUMPse usará una llamada normal en lugar de un archivo DELEGATECALL.