Die Gaskosten für die Vertragserstellung hängen vom Code in der Bibliotheksfunktion ab?

Ich habe einen Vertrag fooContract, der eine fooLib-Bibliothek verwendet und fooLib.foo (LibStruct-Speicherparameter) aufruft.

Die Transaktionskosten zum Erstellen von fooContract scheinen vom Code in der Funktion fooLib.foo() abzuhängen, obwohl die Parameter unverändert sind.

Dh. Mit dem Solidity-Browser fooContract erstellen Kosten 3.185.059. Wenn ich den Code in fooLib.foo() auskommentiere, sinken die Erstellungskosten von fooContract auf 2.816.000 .

Soweit ich verstanden habe, sind Libs eine Möglichkeit, die Funktionalität für Verträge zu verschieben, die zu groß für das Blockgaslimit sind.

Übersehe ich hier einen Punkt?

Dieser Link könnte Ihnen helfen ethereum.stackexchange.com/a/2760/6237
Danke dafür, es ist in der Tat nützlich. Wobei ich hier nicht von den Transaktionskosten für den Aufruf von fooLib.foo() spreche, sondern von den Vertragserstellungskosten von fooContract.
Die Gaskosten bei der Erstellung hängen davon ab, was im Konstruktor und der Größe des kompilierten Codes passiert, sodass das, was Sie beschreiben, normal erscheint.

Antworten (2)

Ich vermute, dass Sie eine Bibliothek nicht so verwenden, wie sie beabsichtigt ist, um die Gaskosten in Ihrem Vertrag zu erzielen. Ich nehme an, was Sie tun, ist so etwas wie:

library fooLib {
    // foo code
}

contract fooContract is fooLib {
    // foo code
}

In diesem Fall müssen Sie beim Erstellen fooContractdie Kompilierungskosten für bezahlen fooLib. Was Sie tun möchten, ist, fooLib selbst bereitzustellen, festzulegen, wie mit der Bibliothek über eine interagiert werden interfacesoll, und die Bibliotheksadresse anzugeben, mit der während der Kompilierung von solc mit dem Compiler verknüpft werden soll fooContract. fooLibAuf diese Weise würden Sie die Kompilierungskosten beim Bereitstellen vermeiden fooContractund stattdessen nur die Transaktionsgebühren bezahlen, wenn Sie die Bibliothek verwenden.

Der folgende Stackexchange-Beitrag enthält eine solide detaillierte Beschreibung dieses Prozesses:

Ein sehr guter Aragon-Artikel dazu:

Der zweite Link in Ihrer Antwort ist nicht mehr aktiv. 404 Fehler

Die internen Funktionen in Bibliotheken werden zur Kompilierzeit in den aufrufenden Vertrag gezogen und JUMPanstelle einer DELEGATECALL. Aus Solidity-Dokumentation: http://solidity.readthedocs.io/en/v0.4.21/contracts.html#libraries

Was ist teurer, Jump- oder Delegate-Call? werden sie beide linear skalieren? zum Beispiel, wenn ich 5 Sprünge habe, sind die Anrufkosten für Delegierte = 5 * delegierter_Anruf_Jump_Kosten?