Die Bibliothek wird automatisch in den Vertrag aufgenommen

Umfeld:

  • alle Verträge verwendenpragma solidity ^0.4.17;
  • der Compiler ist0.4.18+commit.9cf6e910.Emscripten.clang
  • Betriebssystem ist MacOS X

Mein Token-Vertrag verwendet eine Math-Bibliothek, die so definiert ist

library Math {...

Im Token-Vertrag wird es importiert und dann einfach in den Funktionen verwendet

import "../Math.sol";
...
data.setBalances(src, Math.sub(data.balances(src), wad));

Ich habe den Vertrag mit Truffle Compiler kompiliert und den resultierenden Bytecode verwendet, um den Vertrag darin bereitzustellenparity

Das Überraschende ist, dass es funktioniert und ich würde gerne verstehen, warum. Die Bibliothek wird im Bytecode nicht erwähnt. Ich würde so etwas erwarten, ____Math____aber das ist nicht vorhanden.

Antworten (1)

Es scheint, dass die neueste Version von Solidity (oder vielleicht davor) die Verwendung von Bibliotheken verbessert hat und jetzt internalFunktionen in den aufrufenden Vertrag kopiert werden, um sie mit JUMPstatt verwenden zu könnenDELEGATECALL

aus der Solidity- Dokumentation zu Bibliotheken :

Darüber hinaus sind interne Funktionen von Bibliotheken in allen Verträgen sichtbar, so als ob die Bibliothek ein Basisvertrag wäre. Natürlich verwenden Aufrufe interner Funktionen die interne Aufrufkonvention, was bedeutet, dass alle internen Typen übergeben werden können und Speichertypen als Referenz übergeben und nicht kopiert werden. Um dies in der EVM zu realisieren, wird der Code interner Bibliotheksfunktionen und aller darin aufgerufenen Funktionen in den aufrufenden Vertrag gezogen und JUMPanstelle einer DELEGATECALL.