Нужна помощь с развертыванием библиотеки Solidity

У меня проблема с простой конфигурацией библиотеки, и мне нужен совет, чтобы решить эту проблему.

Контекст: локальная частная цепочка блоков

Версия:

> web3.version
{
  api: "0.18.1",
  ethereum: "0x3f",
  network: "260674",
  node: "Geth/v1.5.8-stable-f58fb322/darwin/go1.7.5",
}

Код прочности:

pragma solidity ^0.4.9;

library BasicLib {
    function add(uint into, uint val) returns(uint) {
        return into + val;
    }
}


contract Basic {
    uint public data;

    function increase() {
        data = BasicLib.add(data, 10);
    }    
}

Затем я использую javascript web3 для компиляции. Я публикую BasicLib с contract.new({data: code, gas:1000000}) и получаю правильный адрес после майнинга.

Я беру этот адрес, удаляю "0x" и заменяю __BasicLib____ заполнителем основного кода контракта, и результат выглядит хорошо

BasicLib.address: "0x8de8e5f4b91b67915a07279f9095155fa0ed5114"
Basic.code: "0x6060604052341561000c57fe5b5b6101048061001c6000396000f300606060405263ffffffff60e060020a60003504166373d4a13a8114602a578063e8927fbc146049575bfe5b3415603157fe5b60376058565b60408051918252519081900360200190f35b3415605057fe5b6056605e565b005b60005481565b738de8e5f4b91b67915a07279f9095155fa0ed511463771602f7600054600a6000604051602001526040518363ffffffff1660e060020a028152600401808381526020018281526020019250505060206040518083038186803b151560bf57fe5b60325a03f4151560cb57fe5b505060405151600055505b5600a165627a7a72305820e35203973e69040bc9a24c63526485e87946e2f2b688172fcda1e89f2beb09060029"

Затем я развертываю базовый контракт, он добывается, и я получаю адрес. Все идет нормально. Я тестирую функцию увеличения (), и она добывается, но поле данных не увеличивается.

Теперь приступаю к изучению вопроса

  1. Я проверяю Квитанцию ​​транзакции и вижу, что весь газ израсходован.
  2. Увеличиваю газ до 10000000 и пробую снова. Опять расходуется полный газ
  3. Тогда мне интересно, что происходит с этой простой функцией. Поэтому я звоню
> B.increase.estimateGas()
4712388      <-- this is the block gas limit !!!
  1. Затем я говорю, давайте запустим отладку, чтобы увидеть, где в коде evm есть цикл.
> var deb = debug.traceTransaction("0x233b27c9a7ad577b0860261b23bd9ab544df1513839fce2b7800fd286eab8a51")
> deb.structLogs.length
90        <- so nothing extraordinary here


> deb
{
  gas: 1000000,       <-- ok, i passed a good amount of gas
  returnValue: "",
  structLogs: [{
      depth: 1,
      error: null,
      gas: 978725,    
      gasCost: 3,
      memory: null,
      op: "PUSH1",
      pc: 0,
      stack: [],
      storage: {}
  }, {
      depth: 1,
      error: null,
      gas: 978722,
      gasCost: 3,
      memory: null,
      op: "PUSH1",
      pc: 2,
      stack: ["0000000000000000000000000000000000000000000000000000000000000060"],
      storage: {}
  }, { ...  I CUT THE DETAILS HERE .... }, {
  depth: 1,
  error: {},
  gas: 7,
  gasCost: 978317,
  memory: ["0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000060", "771602f700000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000000", "0000000a00000000000000000000000000000000000000000000000000000000"],
  op: "DELEGATECALL",   <-- This is the last OP code called
  pc: 196,
  stack: ["00000000000000000000000000000000000000000000000000000000e8927fbc", "0000000000000000000000000000000000000000000000000000000000000056", "0000000000000000000000008de8e5f4b91b67915a07279f9095155fa0ed5114", "00000000000000000000000000000000000000000000000000000000771602f7", "00000000000000000000000000000000000000000000000000000000000000a4", "0000000000000000000000000000000000000000000000000000000000000020", "0000000000000000000000000000000000000000000000000000000000000060", "0000000000000000000000000000000000000000000000000000000000000044", "0000000000000000000000000000000000000000000000000000000000000060", "0000000000000000000000008de8e5f4b91b67915a07279f9095155fa0ed5114", "00000000000000000000000000000000000000000000000000000000000eed65"],
  storage: {}   }]

Итак, я делаю вывод, что код не зацикливается, а просто останавливается на DELEGATECALL и останавливается без ошибок.

Что, черт возьми, я здесь делаю не так. Должна быть связь с библиотекой, но при использовании Remix Solidity Browser, подключенного к моей цепочке блоков и позволяющего ему развернуть библиотеку до контракта, она ведет себя так же.

Посоветуйте пожалуйста.

Ответы (1)

Вы должны инициализировать свой частный блокчейн genesis.json, указав, что homesteadBlockон начинается с более раннего блока:

Wocket:ESE bok$ more genesis.json 
{
    "config": {
        "homesteadBlock": 10
    },
    "nonce": "0",
    "difficulty": "0x400",
    "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x",
    "gasLimit": "0x3B4A1B44",
    "alloc": {}
}

Затем инициализируйте свой блокчейн, используя следующие команды:

Wocket:ESE bok$ geth --datadir mydatadir init genesis.json
Wocket:ESE bok$ geth --datadir mydatadir --mine --minerthreads 1 console

Подробнее см. Как обновить значение homesteadBlock по умолчанию в моем частном блокчейне Ethereum?

Спасибо. До сих пор я читал много материала, но я не выбрал, что реализация библиотеки была только для версии блокчейна Homestead. Я также теперь понимаю, что Ethereum — это Homestead только с блока 1500000. Со всеми этими изменениями/форками в Ethereum (DAO, будущее изменение на PoS) я начинаю терять веру в стабильность Ethereum :-(
За этим трудно угнаться, но экосистема Ethereum просто прекрасна и все еще быстро развивается.
Ожидается ли это от блокчейна? Мне нужна долгосрочная надежность с моей стороны. Но пусть сначала созреет. Это еще не настоящая производственная среда для бизнеса, а скорее игровая площадка.
Что ж, воссоздание моего частного блокчейна с помощью этого homesteadBlock устранило проблему. Благодарю.