Remix всегда выдает ошибку: превышен лимит газа в блоке

Уважаемые разработчики Ethereum.

На этой неделе я начал изучать Solidity и пытаюсь развернуть контракт через Remix, но это на самом деле не работает.

Среда выполнения установлена ​​как поставщик Web3.

(Поскольку книга, которую я сейчас читаю для изучения Solidity, просит меня сделать это, поэтому я также могу узнать о web3.js)

Вот мой код:

pragma solidity ^0.4.24;
contract MyToken {
    string public name;
    string public symbol;
    uint8 public decimals;

    mapping (address => uint256) public balanceOf;
    event Transfer(address _from, address _to, uint _value);

    constructor(string tokenName, string tokenSymbol, uint8 decimalUnits, uint256 initialSupply) public {
        name = tokenName;
        symbol = tokenSymbol;
        decimals = decimalUnits;
        balanceOf[msg.sender] = initialSupply;
        }

    function transfer(address _to, uint256 _value) public {
        require(_value <= balanceOf[msg.sender]);
        require(balanceOf[_to] + _value >= balanceOf[_to]);
        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;
        emit Transfer(msg.sender, _to, _value);
    }
}

Это весь код моего контракта, и когда я развертываю его на Remix, он продолжает возвращать ошибку, говорящую, что «превышен лимит газа в блоке».

Я сотни раз корректировал значение лимита газа и повторял попытки, но это все еще не работает.

Я также искал похожие вопросы на этом сайте и на других сайтах, но ничего не помогло.

Один из моих друзей обнаружил, что этот контракт можно развернуть на Metamask с лимитом газа 404941 и значением 1 gwei, поэтому я попробовал то же самое на Remix, но это не сработало.

Любая помощь, которую я могу использовать?

Заранее спасибо!

К какой сети подключен ваш MetaMask? Вы используете узел Geth? Ганаш? Трюфель? Инфура может?
Бьюсь об заклад, Гет. Я никогда не использовал никаких других, кроме geth.
geth --datadir "private-data" --networkid 15 --rpc --rpcapi "db,eth,net,web3,perosnal,miner" --rpccorsdomain "*" console Это именно то, что я набрал в cmd перед установкой работающая среда в качестве поставщика Web3.

Ответы (3)

Это связано с тем, что используемый газ превышает лимит блокирующего газа вашей сети; чтобы избежать этого, вы можете увидеть, каков текущий лимит газа блока, и увеличить его выше, чем газ, используемый для развертывания смарт-контракта.

Спасибо за ответ, но не могли бы вы сказать мне, как я могу проверить лимит газа и отрегулировать его? Я думаю, это то, что я вижу на вкладке «Выполнить» в Remix, но, как я уже писал в своем вопросе, это не сработало.
вы можете запустить этот cmd на консолиeth.getBlock("latest").gasLimit;
И поскольку run выбирает подключение к узлу, используя Running environment is set as Web3 Provider.то, как упоминал Хенк выше, к какому узлу вы подключаетесь?
geth --datadir "private-data" --networkid 15 --rpc --rpcapi "db,eth,net,web3,personal,miner" --rpccorsdomain "*" console Возможно, вы имеете в виду это? идентификатор сети 15. Это именно то, что я набрал в cmd
Итак, каков результат запуска eth.getBlock("latest").gasLimit;на консоли вашей сети?
И вы можете добавить еще один параметр --targetgaslimit '42000000'в свой cmd, чтобы увеличить лимит газа. Запустите свой узел и продолжайте увеличивать лимит газа до 42000000, пока майнинг продолжается. Со временем лимит газа стал бы настолько большим, что у вас больше не будет ошибки «Ошибка: превышен лимит газа блока».
Я получаю 5000 от eth.getBlock("latest").gasLimit; И где я должен поставить этот параметр? Когда я набираю строку "geth --datadir..."?
да, запуск cmd что-то вродеgeth --datadir ... --targetgaslimit '42000000'
Я только что попробовал это, и cmd возвращает неверную команду: «targetgaslimit», я что-то упустил? Большое спасибо за вашу помощь!
пожалуйста, вставьте свой полный cmd здесь, чтобы увидеть :)
Извините, я сделал глупую ошибку. Я забыл ввести -- перед targetgaslimit. Позвольте мне попробовать это снова :D
Я набрал --targetgaslimit 42000000 в конце строки прямо перед «консолью», но он все равно возвращает 5000, когда я ввожу eth.getBlock("latest").gasLimit; и все еще возвращает ту же ошибку... Я думаю, что где-то что-то упустил, но я не могу понять
Как я упоминал выше, gaslimitлимит газа будет увеличиваться до 42000000 по мере продолжения майнинга, но не сразу. попробуйте запустить eth.getBlock("latest").gasLimit;, чтобы получить текущийgaslimit
Итак, чтобы проверить это, я должен запустить «miner.start ()» и подождать?
да, или установите большое значение gasLimit в блоке генезиса и начните новую цепочку
Я ждал уже 8 минут, и он все еще возвращает 5000. Я думаю, что мне следует создать новый блок генезиса. Я обнаружил, что текущий предел газа составляет 0x8000000, и можно ли установить его как 0x42000000?
да, я думаю, что если блок не будет отчеканен, то он gaslimitостанется прежним. 0x42000000Вы можете без проблем установить

введите описание изображения здесьЯ могу развернуть тот же контракт на ремикс. Проверьте свой лимит газа при развертывании контракта, если он больше или равен 3000000, тогда вы сможете развернуть контракт.

Я понимаю, что ты новичок в этом. Некоторые из ваших формулировок предполагают возможную путаницу, которая может привести к этой ошибке.

пытаюсь развернуть контракт через Remix

Развернуть на что?

развернуто на Metamask

куда?

Я немного разобью это.

Нам приходится иметь дело с кодом, компиляторами, цепочками и инструментами. Remix, как вы знаете, является IDE, имеет виртуальную машину JavaScript, которая отлично подходит для поверхностного тестирования, и вы можете использовать ее для отправки скомпилированного кода в «настоящую» цепочку блоков Ethereum. Мы могли бы сказать «развернуто с помощью Remix», но все еще остается вопрос о развертывании чего? - Ринкеби, Ропстен, Кован и т. д. тестнеты или мейннет?

Точно так же MetaMask — это, по сути, устройство для подписи, и вы можете использовать его для отправки в тестовую сеть или основную сеть.

EVM, где это происходит, прошла через итерации протокола, известные как форки. Эти разветвления создают нетривиальные различия, которые должны учитываться компилятором, иначе байт-код не будет успешно развернут . EVM в настоящее время находится в стамбульской версии. Это довольно недавнее обновление, поэтому вам нужен относительно новый компилятор.

Эта строка:

pragma solidity ^0.4.24;

просто двусмысленно. Мы не можем быть уверены, какой компилятор вы используете, но IIRC, более старые компиляторы в нижнем диапазоне будут создавать байт-код, который не развертывается в Istanbul . Вы можете изменить компилятор на 0.5.x (я не уверен, где пол для Стамбула, поэтому стремитесь к высокой стороне), и вы будете на правильном пути. Есть критические изменения, поэтому вам нужно немного изменить конструктор - еще одна причина, по которой ^вводит в заблуждение.

pragma solidity 0.5.16;

contract MyToken {
    string public name;
    string public symbol;
    uint8 public decimals;

    mapping (address => uint256) public balanceOf;
    event Transfer(address _from, address _to, uint _value);

    constructor(string memory tokenName, string memory tokenSymbol, uint8 decimalUnits, uint256 initialSupply) public {
        name = tokenName;
        symbol = tokenSymbol;
        decimals = decimalUnits;
        balanceOf[msg.sender] = initialSupply;
        }

    function transfer(address _to, uint256 _value) public {
        require(_value <= balanceOf[msg.sender]);
        require(balanceOf[_to] + _value >= balanceOf[_to]);
        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;
        emit Transfer(msg.sender, _to, _value);
    }
}

Когда вы это сделаете, вам нужно будет выбрать правильный компилятор в Remix, иначе он будет жаловаться. После компиляции вы сможете без труда выполнить развертывание в основной или тестовой сети.

Надеюсь, поможет.