Не удалось сохранить код контракта. Проверьте количество газа. [Цеппелин, Truffle.js, Ропстен]

У меня возникла проблема с развертыванием простого токена-контракта в сети Ropsten.

Ошибка: «Не удалось сохранить код контракта, проверьте количество газа».

Я много раз пытался изменить значения газа в файле «Truffle.js», также кажется, что у меня нет никаких абстрактных функций в файле «TestToken.sol».

Программное обеспечение обновлено. Но я до сих пор не могу понять, в чем проблема, я всего лишь новичок, поэтому, пожалуйста, помогите мне, буду очень признателен!

// truffle.js
require('dotenv').config();
const HDWalletProvider = require("truffle-hdwallet-provider");
module.exports = {
  networks: {
development: {
  host: "localhost",
  port: 9545,
  gas: 6712390,
  network_id: "*"
},
ropsten: {
    provider: function() { 
      return new HDWalletProvider(process.env.MNENOMIC, "https://ropsten.infura.io/" + process.env.INFURA_API_KEY) },
    network_id: 3,
    gas: 4700000,
    },
  }
};

//TestToken.sol

pragma solidity ^0.4.24;


import "zeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol";
import "zeppelin-solidity/contracts/math/SafeMath.sol";


contract TestToken is ERC20Basic {
    using SafeMath for uint;
    string public name;
    string public symbol;
    uint8 public decimals;
    uint public _totalSupply;


    mapping(address => uint) balances;
    mapping(address => mapping(address => uint)) allowed;


    function TestToken() public {
        name = "TestToken";
        symbol = "tttest";
        decimals = 18;

        _totalSupply = 4000000000000000000000000000;
        balances[0xE3FdfaAF08F4778c7E88Ed1E31696745ed610328] = _totalSupply;
        Transfer (address(0), 0xE3FdfaAF08F4778c7E88Ed1E31696745ed610328, _totalSupply); 
     }
}
PS номер порта я сначала использовал 7545, на всякий случай если будет кто предложит поменять
Есть ли идентификатор транзакции?
@RaghavSood это правильный? 0xd2860dcb2466e064955a46f1f40e40c5e898f87dd6f33f2a94c0874fdd2842f7
2_deploy_contract.js выглядит следующим образом: const TestToken = артефакты.require("./TestToken.sol"); module.exports = function(deployer) {deployer.deploy(TestToken); };
Второй , похоже, развернул контракт, но не сгенерировал событие, поэтому он может быть неправильным.
@RaghavSood Я только что снова запустил команду миграции, 0x3e2be8283ed37112c65cecf6bfb0e42ad8b835a04d2372765ef937859dc7037e
Похоже, ваш tx пытается развернуть пустой код 0x, а это означает, что что-то в вашем исходном коде препятствует его правильной компиляции.
@RaghavSood, как вы думаете, что мешает этому? Я прикрепил свой файл token.sol, есть что-то странное? где обычно причина может скрываться?

Ответы (2)

Ваш TestTokenнаследуется непосредственно от ERC20Basic. ERC20Basicявляется interface. Это означает, что TestTokenон должен реализовать объявленные абстрактные методы, ERC20Basicпрежде чем его можно будет развернуть.

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

Совет: вместо наследования от OpenZeppelin ERC20Basicиспользуйте StandardToken. Он реализует все функции, необходимые для создания токена ERC-20.

Документы:

Попробуйте этот контракт:

pragma solidity 0.4.24;

import "http://github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol";
import "http://github.com/OpenZeppelin/openzeppelin-solidity/contracts/math/SafeMath.sol";

contract TestToken is StandardToken {
    using SafeMath for uint;
    string public name;
    string public symbol;
    uint8 public decimals;
    uint public _totalSupply;


    mapping(address => uint) balances;
    mapping(address => mapping(address => uint)) allowed;


    constructor() public {

        name = "TestToken";
        symbol = "tttest";
        decimals = 18;
        _totalSupply = 4000000000000000000000000000;
        balances[0xE3FdfaAF08F4778c7E88Ed1E31696745ed610328] = _totalSupply;
        emit Transfer (address(0), 0xE3FdfaAF08F4778c7E88Ed1E31696745ed610328, _totalSupply); 
    }
}
Привет, Хенк, звучит как реальное решение, но я попытался его изменить. импортировать "zeppelin-solidity/contracts/token/ERC20/BasicToken.sol"; импортировать "zeppelin-solidity/contracts/token/ERC20/ERC20.sol"; импортировать "zeppelin-solidity/contracts/math/SafeMath.sol"; контракт TestToken - это ERC20, BasicToken {
Пытается развернуть тестовый токен (0x0d0a79027660c068ab739450f9c301b720d7e60ecece055c69d09b4018f07bfb) и выдает ту же ошибку «Состояние сети неизвестно. Проверьте успешные транзакции вручную. Ошибка: код контракта не может быть сохранен, проверьте количество газа».
Вы хотели использовать это — github.com/OpenZeppelin/openzeppelin-solidity/blob/master/… ?
Да, попробуйте с StandardToken. BasicTokenреализует ERC20Basic, StandardTokenреализует и то , ERC20Basicи другоеERC20
Я уже изменил эти части, все еще получаю ту же ошибку. Но компилируется нормально. Выше я отправил вам tx код.
Вы уже нашли решение?

Эта ошибка обычно вызвана либо проблемами с газом (менее типичный сценарий), либо проблемами в коде.

Вы пробовали сначала развернуть в Ganache? Если нет, попробуйте это. Если это удастся, то, скорее всего, действительно проблема с газом.

Раньше у меня была такая же проблема целую вечность, но кто-то предложил добавить магическое число для лимита газа в truffle.js. Раньше у меня было 4000000, но потом я попробовал это магическое число, и оно сработало. Не уверен, была ли это просто какая-то проблема со временем или магическое число действительно помогло.

Вот как выглядит мой Ropsten (и это сработало):

ropsten:  {
         network_id: 3,
         host: "localhost",
         port:  8545,
         gas: 4867350,
         gasPrice: 10000000000 // 10 gwei
        },
Спасибо, приятель, к сожалению, число для меня не волшебное :(
Да, я попробую развернуть в Ganache, если не найду ответа. Мои коды token.sol приведены выше. Можете ли вы обнаружить какие-либо ошибки или странные вещи, мешающие нормальному развертыванию?