Каковы шаги для компиляции и развертывания библиотеки в Solidity?

У меня есть несколько библиотек документации о , но я пока не могу определить, какие шаги необходимы для компиляции и развертывания библиотеки, а затем для контракта, который ее использует. Поведение библиотеки в пределах прочности вполне понятно, но компиляция и привязка для меня не очевидны.

Ресурсы, с которыми я консультировался:

Вот пример контракта и библиотеки, которые я хотел бы получить:

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;
  }
}

Спасибо за вашу помощь!

26 голосов | спросил Raine 8 J000000Friday16 2016, 02:33:13

2 ответа


21

Сначала давайте сохраним оба этих файла в одном каталоге и запустим solc --optimize --bin MetaCoin.sol. Выход:

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

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

Если вы посмотрите внимательно (прокрутите вправо) на байт-код MetaCoin (aka binary), вы найдете несколько экземпляров __TestLib_______________________________. Это заполнители, в которых будет связан конечный адрес TestLib. Это означает, что для развертывания MetaCoin нам сначала нужно будет развернуть TestLib, а затем использовать solc, чтобы связать адрес TestLib с байт-кодом MetaCoin.

Мы можем развернуть TestLib, как и развернуть любой другой контракт. См. Как развернуть контракт в локальной перспективе узел с использованием браузера надежности? для примера. После его развертывания вам необходимо скопировать адрес развернутой библиотеки TestLib, которая требуется для связывания TestLib с бинарником MetaCoin. Чтобы выполнить привязку, используйте развернутый TestLib <address> и запустите:

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

Результат будет выглядеть почти так же, как и раньше, но теперь вместо __TestLib_______________________________ будут заменены значения <address>. Этот байт-код теперь можно использовать для развертывания MetaCoin в той же сети Ethereum, к которой вы использовали TestLib.

ответил redsquirrel 8 J000000Friday16 2016, 18:03:43
10

Чтобы добавить, можно вручную связать контракты (если вы хотите развернуть как библиотеку, так и контракт вместе). Самый простой способ - это просто заменить все вхождения заполнителей адресом.

Пример, взятый из моего собственного (измененного) кода:

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

testLib будет обычным контрактом web3, развернутым ранее, в то время как metaCoinBytecode будет байт-кодом MetaCoin, созданным solc. (В моем собственном коде я использую solc's -combined-json, чтобы получить его в хорошей форме для JS). Обратите внимание, что вам нужно снять префикс «0x», или связанный код будет недействительным.

ответил Matthew Schmidt 9 J000000Saturday16 2016, 01:27:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132