Was sind die Schritte zum Kompilieren und Bereitstellen einer Bibliothek in Solidity?

Ich habe mehrere Dokumentationen über Bibliotheken, aber ich kann noch nicht ableiten, welche Schritte erforderlich sind, um eine Bibliothek zu kompilieren und bereitzustellen und dann einen Vertrag, der sie verwendet. Das Verhalten der Bibliothek innerhalb von Solidity ist ziemlich klar, aber das Kompilieren und Linken ist für mich nicht offensichtlich.

Ressourcen, die ich konsultiert habe:

Hier ist ein Beispielvertrag und eine Bibliothek, die ich zum Laufen bringen möchte:

MetaCoin.sol:

import "TestLib.sol";

contract MetaCoin {
  TestLib.Data data;
  address public owner;

  function MetaCoin() {
    owner = msg.sender;
    TestLib.Set(data, 2);
  }

  function GetData() constant returns(uint) {
    return TestLib.Get(data);
  }
}

TestLib.sol:

library TestLib {
  struct Data {
    uint n;
  }

  function Set(Data storage self, uint a) {
    self.n = a;
  }

  function Get(Data storage self) returns(uint) {
    return self.n;
  }
}

Danke für Ihre Hilfe!

Antworten (2)

Speichern wir zuerst diese beiden Dateien im selben Verzeichnis und führen Sie solc --optimize --bin MetaCoin.sol. Die Ausgabe ist:

======= MetaCoin =======
Binary: 
606060405260018054600160a060020a031916331790557f9447fa1700000000000000000000000000000000000000000000000000000000606090815260006064819052600260845273__TestLib_______________________________91639447fa179160a4916044818660325a03f41560025750505060c0806100846000396000f3606060405260e060020a600035046376b8e528811460245780638da5cb5b14608f575b005b60ad7ffc22471a000000000000000000000000000000000000000000000000000000006060908152600060648190529073__TestLib_______________________________9063fc22471a906084906020906024818660325a03f41560025750506040515191505090565b60b660015473ffffffffffffffffffffffffffffffffffffffff1681565b50604051602090f35b6060908152602090f3

======= TestLib =======
Binary: 
606060405260458060106000396000f3650302e3c5418550606060405260e060020a60003504639447fa178114602e578063fc22471a146037575b6007565b60243560043555005b600435546060908152602090f3

Wenn Sie sich den MetaCoin-Bytecode (auch Binärcode genannt) genau ansehen (nach rechts scrollen), finden Sie einige Instanzen von __TestLib_______________________________. Dies sind Platzhalter, wo die eventuelle Adresse von TestLib verlinkt wird. Das bedeutet, dass wir zum Bereitstellen von MetaCoin zuerst TestLib bereitstellen und dann solc verwenden müssen, um die Adresse von TestLib mit dem MetaCoin-Bytecode zu verknüpfen.

Wir können TestLib wie jeden anderen Vertrag bereitstellen. Siehe So stellen Sie einen Vertrag mithilfe des Solidity-Browsers in einem lokalen ausgeführten Knoten bereit? zum Beispiel. Nach der Bereitstellung müssen Sie die Adresse der bereitgestellten TestLib-Bibliothek kopieren, die erforderlich ist, um TestLib mit der MetaCoin-Binärdatei zu verknüpfen. Verwenden Sie zum Verknüpfen die bereitgestellte TestLib <address>und führen Sie Folgendes aus:

solc --optimize --bin MetaCoin.sol | solc --link --libraries TestLib:<address>

Die Ausgabe sieht fast genauso aus wie zuvor, aber jetzt __TestLib_______________________________wurden die Platzhalter durch den <address>Wert ersetzt. Dieser Bytecode kann nun verwendet werden, um MetaCoin in demselben Ethereum-Netzwerk bereitzustellen, in dem Sie TestLib bereitgestellt haben.

Ich verwende 3 verschiedene Bibliotheken in meinem Vertrag, aber ich bekomme nie die ___libraryName____________Ausgabe, egal ob ich sie verwende --optimizeoder nicht. Meine Solc-Version ist: 0.4.24+commit.e67f0147.Linux.g++

Außerdem ist es möglich, Verträge manuell zu verknüpfen (wenn Sie sowohl Bibliothek als auch Vertrag zusammen bereitstellen möchten). Am einfachsten ersetzen Sie einfach alle Vorkommen der Platzhalter durch die Adresse.

Ein Beispiel aus meinem eigenen (modifizierten) Code:

var linkedMetaCoinCode = metaCoinBytecode.replace(
  /_+TestLib_+/g,
  testLib.address.replace("0x", "")
);

testLib wäre ein normaler web3-Vertrag, der zuvor bereitgestellt wurde, während metaCoinBytecode der von solc produzierte Bytecode von MetaCoin wäre. (In meinem eigenen Code verwende ich --combined-json von solc, um es in einer schönen Form für JS zu erhalten). Beachten Sie, dass Sie das Präfix „0x“ entfernen müssen, da der verknüpfte Code sonst nicht gültig ist.

interessante Methode, das sieht gut aus