Как вызвать библиотечную функцию из контракта? => [ошибка] Не удалось сохранить код контракта, проверьте количество газа. неопределенный

Когда я скомпилировал следующий код в « https://ethereum.github.io/browser-solidity/ », он дал мне два кода развертывания Web3 для:

var libraryContract  = web3.eth.contract(...); //Web3 deploy code
var contractContract = web3.eth.contract(...); //Web3 deploy code

Затем я копирую и вставляю код развертывания Web3 для (libraryContract, ContractContract) в geth, чтобы добывать мои контракты.

Мой код (большую часть я обрезал для простоты):

library Library {
    function func () constant returns (uint8) {
        return 5;
    }
}

contract Contract {
    uint8 value;
    function call_library_function () {
        value = Library.func();
    }
}

Код развертывания Web3 «Библиотеки» работает отлично, но когда я пытаюсь добыть код развертывания Web3 «Контракта», я получаю следующую ошибку:

> Ошибка: код контракта не может быть сохранен, пожалуйста, проверьте количество газа. неопределенный

Если я удалю следующую строку из моего кода ссылки на контракт, только что сгенерированный код развертывания Web3 «Контракта» сработает! без каких-либо проблем:

value = Library.func();

[В] Мой вопрос: как я могу решить эту проблему? Что я должен сделать, чтобы вызвать мою функцию внутри библиотеки из контракта, что позволит мне ее майнить?

Как я настроил свою частную цепочку блоков Ethereum: см. следующую ссылку: Как я могу обновить значение homesteadBlock по умолчанию в моей частной цепочке блоков Ethereum?

Спасибо за вашу ценную помощь и время.

Ответы (1)

Из метода контракта библиотеки сбой # 2831 :

Вероятно, вы запускаете geth с параметром --dev для создания частной сети? В этом случае используйте подкоманду init для создания частной цепочки. Инструкции можно найти в вики. Или используйте тестовую сеть.

Проблема в том, что этот код использует функцию delegatecall , добавленную в выпуске homestead . Флаг --dev использует номер блока homestead основной сети, который равен 1150000 . Любая транзакция до этого блока столкнется с недопустимым кодом операции, потребит весь газ, и все изменения состояния будут отменены.

Чтобы обойти эту проблему:

...

Файл конфигурации Genesis поддерживает раздел конфигурации. В настоящее время единственное, что вы можете настроить , это номер блока усадьбы . Если вы не укажете его, по умолчанию будет использоваться номер основной сети, который равен 1150000. Таким образом, ваш контракт будет работать после этого блока.

Попробуйте следующий файл генезиса:

{
  "config":{
     "homesteadBlock":"5"
  },
  "nonce":"0x0000000000000042",
  "timestamp":"0x0",
  "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData":"0x0",
  "gasLimit":"0x8000000",
  "difficulty":"0x400",
  "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase":"0x3333333333333333333333333333333333333333",
  "alloc":{

  }

}

Если контракт развернут в блоке <5, это создаст проблему с лимитом газа.

Развернутый в блоке >= 5, он должен работать по назначению.

Дополнительную информацию об использовании файла genesis можно найти на geth init, каковы аргументы? .



Обновление 10:33 14 окт 2016

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


1. Настройте genesis.json

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": {}
}


2. Файл паролей

Я создал файл паролей, testpasswordсодержащий пароль моей учетной записи


3. Скрипт инициализации блокчейна

Я создал скрипт для инициализации моего блокчейна:

Wocket:ESE bok$ more 02_runGethGenesisInit 
#!/bin/sh

geth --datadir /Users/bok/ESE/gethgenesis init /Users/bok/ESE/genesis.json
geth --datadir /Users/bok/ESE/gethgenesis --password testpassword account new

И я использовал chmod 700 02_runGethGenesisInit, чтобы установить исполняемый бит.


4. Скрипт приватного узла

Я создал скрипт для запуска моей приватной gethноды в режиме майнинга:

Wocket:ESE bok$ more 02_runGethGenesis 
#!/bin/sh

geth --datadir /Users/bok/ESE/gethgenesis --unlock 0 --password /Users/bok/ESE/testpassword --rpc --rpccorsdomain '*' --mine --minerthreads 1 console

И я использовал chmod 700 02_runGethGenesis, чтобы установить исполняемый бит.


5. Надежность браузера

Я скачал Browser Solidity с https://github.com/ethereum/browser-solidity/tree/gh-pages .

Я разархивировал файлы и загрузил index.htmlих в свой веб-браузер.


6. Начните все это

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

Wocket:ESE bok$ ./02_runGethGenesisInit 

Я запустил свой узел, используя следующую команду, и уже некоторое время запускаю его:

Wocket:ESE bok$ ./02_runGethGenesis
...
I1015 09:56:14.364062 miner/worker.go:342] 🔨  Mined block (#5210 / f881b1be). Wait 5 blocks for confirmation
I1015 09:56:14.364333 miner/worker.go:539] commit new work on block 5211 with 0 txs & 0 uncles. Took 281.474µs
I1015 09:56:14.364360 miner/worker.go:435] 🔨 🔗  Mined 5 blocks back: block #5205
I1015 09:56:14.364492 miner/worker.go:539] commit new work on block 5211 with 0 txs & 0 uncles. Took 114.592µs
I1015 09:56:16.394886 miner/worker.go:342] 🔨  Mined block (#5211 / 420c7edc). Wait 5 blocks for confirmation
I1015 09:56:16.395189 miner/worker.go:539] commit new work on block 5212 with 0 txs & 0 uncles. Took 262.993µs
I1015 09:56:16.395222 miner/worker.go:435] 🔨 🔗  Mined 5 blocks back: block #5206


7. Тестирование режима усадьбы

Я загрузил тестовый скрипт @TjadenHessиз Как я могу обновить значение homesteadBlock по умолчанию в моей частной цепочке блоков Ethereum? в браузере Solidity:

contract TestHomestead{
    function test () returns(bool){
        return address(4).delegatecall(1);
    }
}

Я подключил Solidity Browser к своему локальному частному узлу, щелкнув значок блока и выбрав Web3 Provider . Затем я нажал « Создать » , чтобы развернуть указанный выше контракт в блокчейне. Я нажал тест, и сообщение Transaction cost: 21657 gas.показывает, что мой блокчейн находится в режиме Homestead.

введите описание изображения здесь

введите описание изображения здесь

Примечание. Если я изменю функцию, чтобы сделать ее константой function test () constant returns(bool){, я получу следующие результаты для блокчейна в режиме Homestead — true :

введите описание изображения здесь

См. раздел 9 ниже для сообщения, отображаемого, когда блокчейн находится в режиме, отличном от Homestead.


8. Тестирование исходного кода библиотечного вызова

Я немного изменил исходный код вызова библиотеки, чтобы сделать valueпеременную общедоступной, и загрузил ее в Browser Solidity:

library Library {
    function func () constant returns (uint8) {
        return 5;
    }
}

contract Contract {
    uint8 public value;
    function call_library_function () {
        value = Library.func();
    }
}

Я нажал Create , чтобы развернуть код, call_library_function , чтобы выполнить метод, и value , чтобы просмотреть результат вызова функции библиотеки:

введите описание изображения здесь

введите описание изображения здесь

Успех

Сообщение Transaction cost: 41914 gas.и значение valueпоказывают, что вызов библиотечной функции выполнен успешно.


9. Что происходит, когда мой узел находится в режиме, отличном от усадьбы

Я подключил Browser Solidity к geth --devблокчейну:

geth --dev --datadir /Users/bok/ESE/gethdata --unlock 0 --password /Users/bok/ESE/testpassword --rpc --rpccorsdomain '*' --mine --minerthreads 1 console

Я запустил тот же тестовый код Homestead, чтобы получить сообщение Требуемый газ превышает лимит: 50000000 , показывающий, что этот --devблокчейн находится в режиме, отличном от Homestead:

введите описание изображения здесь

Примечание. Если я изменю функцию, чтобы сделать ее константой function test () constant returns(bool){, я получу следующие результаты для блокчейна, отличного от режима Homestead — false :

введите описание изображения здесь

Спасибо, сэр. У вас сработало, когда лимит газа обновился до 5000000?
Извини. Мой браузер Solidity в данный момент отключен. Восстановление моего ноутбука в качестве обновления программного обеспечения привело к тому, что он перестал работать. Разверните свой контракт без list.append("abc","111"); и проверьте, сколько газа он требует. Затем добавьте еще 10% и посмотрите, решит ли это вашу проблему. Я отмечаю, что вы пишете свой код, а затем развертываете его gethнапрямую. Вы должны иметь возможность подключить Browser Solidity к своему локальному gethэкземпляру, выбрав поставщика Web3 на третьем значке слева — см. изображение экрана в ethereum.stackexchange.com/a/8970/1268 .
Хорошо, я пробую ваше предложение. Я запускаю geth на своем частном блокчейне Эфириума. Я заставил запустить geth -targetgaslimit "994712388". Мой лимит газа увеличился с 470000 до 500000. Браузер Solidity всегда дает 470000 за использование газа, поэтому я вручную обновляю значение «gas: <int>» для контракта. Надеюсь, я найду газ, который контракт будет добыт.
Если вы хотите выполнить развертывание через geth, см. пошаговое руководство ethereum.stackexchange.com/questions/2751/… для примера того, как указать газ для развертывания по контракту.
Я обновил лимит газа до «15529600», все та же ошибка.
Я сделал предложение, но снова кажется, что это не сработает. Я все еще работаю над этим. Спасибо за вашу помощь.
Я обновил свой ответ ссылкой на использование файла генезиса.
Спасибо, сэр, основываясь на ваших рекомендациях, я обновил свой вопрос о том, как я создал свой частный блокчейн Ethereum. Но все же это дает мне ту же ошибку. Что-то не так в том, как я создал свой частный блокчейн Эфириума?
Я обновил свой ответ пошаговым руководством по успешному развертыванию вызова библиотечной функции.
Большое спасибо :) Я ценю вашу ценную помощь. Я работаю над этим, чтобы заставить его работать на моей стороне.
Ну работает!!
Можно ли сделать ваш ответ также с помощью solc? @BokkyPooBah
Можно ли обновить ваш ответ с помощью нового браузера Solidity? Графический интерфейс браузера Solidity был изменен, и я не могу развернуть через него свой контракт :( @BokkyPooBah