Уважаемые разработчики 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, но это не сработало.
Любая помощь, которую я могу использовать?
Заранее спасибо!
Это связано с тем, что используемый газ превышает лимит блокирующего газа вашей сети; чтобы избежать этого, вы можете увидеть, каков текущий лимит газа блока, и увеличить его выше, чем газ, используемый для развертывания смарт-контракта.
eth.getBlock("latest").gasLimit;
Running environment is set as Web3 Provider.
то, как упоминал Хенк выше, к какому узлу вы подключаетесь?eth.getBlock("latest").gasLimit;
на консоли вашей сети?--targetgaslimit '42000000'
в свой cmd, чтобы увеличить лимит газа. Запустите свой узел и продолжайте увеличивать лимит газа до 42000000, пока майнинг продолжается. Со временем лимит газа стал бы настолько большим, что у вас больше не будет ошибки «Ошибка: превышен лимит газа блока».geth --datadir ... --targetgaslimit '42000000'
gaslimit
лимит газа будет увеличиваться до 42000000 по мере продолжения майнинга, но не сразу. попробуйте запустить eth.getBlock("latest").gasLimit;
, чтобы получить текущийgaslimit
gaslimit
останется прежним. 0x42000000
Вы можете без проблем
установитьЯ понимаю, что ты новичок в этом. Некоторые из ваших формулировок предполагают возможную путаницу, которая может привести к этой ошибке.
пытаюсь развернуть контракт через 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, иначе он будет жаловаться. После компиляции вы сможете без труда выполнить развертывание в основной или тестовой сети.
Надеюсь, поможет.
Хенк
пользователь44919
пользователь44919