Umfeld:
pragma solidity ^0.4.17;
0.4.18+commit.9cf6e910.Emscripten.clang
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.
Es scheint, dass die neueste Version von Solidity (oder vielleicht davor) die Verwendung von Bibliotheken verbessert hat und jetzt internal
Funktionen in den aufrufenden Vertrag kopiert werden, um sie mit JUMP
statt 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
JUMP
anstelle einerDELEGATECALL
.