У меня проблема с простой конфигурацией библиотеки, и мне нужен совет, чтобы решить эту проблему.
Контекст: локальная частная цепочка блоков
Версия:
> 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"
Затем я развертываю базовый контракт, он добывается, и я получаю адрес. Все идет нормально. Я тестирую функцию увеличения (), и она добывается, но поле данных не увеличивается.
Теперь приступаю к изучению вопроса
> B.increase.estimateGas()
4712388 <-- this is the block gas limit !!!
> 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, подключенного к моей цепочке блоков и позволяющего ему развернуть библиотеку до контракта, она ведет себя так же.
Посоветуйте пожалуйста.
Вы должны инициализировать свой частный блокчейн 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?
Геноль де Кадудаль
конфиденциальностьisahumanright.eth
Геноль де Кадудаль
Геноль де Кадудаль