Когда я скомпилировал следующий код в « 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?
Спасибо за вашу ценную помощь и время.
Из метода контракта библиотеки сбой # 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, каковы аргументы? .
Я настроил свой частный блокчейн, используя следующие процедуры:
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": {}
}
Я создал файл паролей, testpassword
содержащий пароль моей учетной записи
Я создал скрипт для инициализации моего блокчейна:
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
, чтобы установить исполняемый бит.
Я создал скрипт для запуска моей приватной 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
, чтобы установить исполняемый бит.
Я скачал Browser Solidity с https://github.com/ethereum/browser-solidity/tree/gh-pages .
Я разархивировал файлы и загрузил index.html
их в свой веб-браузер.
Я инициализировал свои данные блокчейна с помощью следующей команды:
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
Я загрузил тестовый скрипт @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.
Я немного изменил исходный код вызова библиотеки, чтобы сделать 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
показывают, что вызов библиотечной функции выполнен успешно.
Я подключил 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 :
альпер
конфиденциальностьisahumanright.eth
list.append("abc","111");
и проверьте, сколько газа он требует. Затем добавьте еще 10% и посмотрите, решит ли это вашу проблему. Я отмечаю, что вы пишете свой код, а затем развертываете егоgeth
напрямую. Вы должны иметь возможность подключить Browser Solidity к своему локальномуgeth
экземпляру, выбрав поставщика Web3 на третьем значке слева — см. изображение экрана в ethereum.stackexchange.com/a/8970/1268 .альпер
конфиденциальностьisahumanright.eth
geth
, см. пошаговое руководство ethereum.stackexchange.com/questions/2751/… для примера того, как указать газ для развертывания по контракту.альпер
альпер
конфиденциальностьisahumanright.eth
альпер
конфиденциальностьisahumanright.eth
альпер
альпер
альпер
solc
? @BokkyPooBahконфиденциальностьisahumanright.eth
альпер