Как устранить ошибку при развертывании смарт-контракта в Ethereum? - PullRequest
0 голосов
/ 28 декабря 2018

При попытке скомпилировать умный контракт с помощью solc-js я получаю сообщение об ошибке

Кришна: Голосование за кришнаканкипати $ node deploy.js Компиляция контракта assert.js: 350 throw err;^
AssertionError [ERR_ASSERTION]: указан неверный обратный вызов.

let compilerInput = {
     'Voter': fs.readFileSync('Voter.sol', 'utf8')
};

console.log('Compiling the contract')
// Compile and optimize the contract
let compiledContract = solc.compile(compilerInput, 1);

// Get compiled contract
let contract = compiledContract.contracts['Voter:Voter'] // Voter contract from Voter file.

 // Save contract's ABI
let abi = contract.interface;
fs.writeFileSync('abi.json', abi);

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Обязательно прочтите solc docs для solc v0.5.0 +, чтобы убедиться, что вы корректируете изменения в компиляторе Solidity.

Что-то подобное должно быть совместимо споследняя версия solc:

// Note: You should be defining your contract sources as objects now.
// Note: You must also provide the compiler output selection as well.
const compilerInput = {
    language: "Solidity",
    sources: {
        'Voter': { content: fs.readFileSync('Voter.sol', 'utf8') }
    },
    settings: {
      outputSelection: {
        "*": {
          "*": [ "abi", "evm.bytecode" ]
        }
      }
    }
};

console.log('Compiling the contract')
// Note: You have to pass the input in with JSON.stringify now.
const compiledContract = JSON.parse(solc.compile(JSON.stringify(compilerInput)));

if(compiledContract.errors) {
    compiledContract.errors.forEach(err => console.log(err.formattedMessage));
}

// Note: This changed slightly since I'm using JSON.parse above.
const contract = compiledContract.contracts['Voter'].Voter; // Voter contract from Voter file.

// Note: This is now called 'abi' and not 'interface'
const abi = contract.abi;
fs.writeFileSync('abi.json', JSON.stringify(abi, null, 2));

Вам также потребуется обновить функцию deployContract, чтобы синхронизировать ее с solc v0.5.0 +

async function deployContract(web3, contract, sender) {
    let Voter = new web3.eth.Contract(JSON.parse(JSON.stringify(abi)));
    let bytecode = '0x' + contract.evm.bytecode.object;
    let gasEstimate = await web3.eth.estimateGas({data: bytecode});

    // The rest should work fine...
}
0 голосов
/ 28 декабря 2018

Вы неправильно используете solc-js.Вам нужно упорядочить ввод, и вы передаете 1 вместо обратного вызова импорта.Пожалуйста, прочитайте документы, прежде чем отправлять вопросы: https://github.com/ethereum/solc-js

Подумайте об использовании etherjs, намного лучшая документация и более надежная, чем web3.

...