web3.eth.compile.solidity не компилируется

Я пытаюсь развернуть контракт через свой интерфейс через API web3. Однако ничего не компилируется, и нет адреса контракта или ABI для взаимодействия с развернутым контрактом (если он развернут) и получения информации (т.е. строки "petros"). Я также попробовал исходный код в виде одной строки. Ниже мой код:

  var source = "" + 
    "contract demo {\n" +
    "   string public name = 'Petros';\n" +
    "   function changeName(string _newName){\n" +
    "     name = _newName;\n" +
    "   }\n" +
    "}\n"; 

var compiled = web3.eth.compile.solidity(source,
    function(err,res){ //necessary callback function
      console.log(JSON.stringify(res));
});
Теперь web3.eth.compile.solidity устарел, он не будет работать !!!!!!!
Работает до версии go-ethereum v1.5.9. Для более новых версий вам необходимо скомпилировать код Solidity вне geth.

Ответы (4)

Сначала проверьте, установили ли вы Solc : solc --versionЗатем, если ваш код не будет работать, попробуйте вместо этого использовать следующий:

 var source = 'contract demo {string public name = "Petros"; function changeName(string _newName){name = _newName; } }'; 

  var compiled = web3.eth.compile.solidity(source);

   console.log(compiled);
Спасибо за ваш вклад, у меня установлен solc. Предоставленный вами код не будет работать, поскольку в web3.eth.compile.solidity() нет функции обратного вызова. Объект MetaMask Web3 не поддерживает синхронные методы. Однако вместо этого мой код скомпилирован = web3.eth.compile.solidity(source,function(err,res){console.log(res)}); компилируется правильно, хотя я не получаю возврата для console.log(скомпилировано); команда. Возможно, я на неправильном пути, но я хочу развернуть контракт и иметь возможность взаимодействовать с ним. например получить строку "petros"
Я отредактировал вопрос, чтобы сделать себя более ясным и правильным

Сейчас web3.eth.compile.solidityудалили. Это не работает. Будет ошибка, если вы вызовете его.

Error: The method eth_compileSolidity does not exist/is not available

Пожалуйста, проверьте страницу. https://github.com/ethereum/web3.js/issues/1000 И вы можете использовать Remix, или solcjs в nodejs, или двоичный файл solc. См. документ http://solidity.readthedocs.io/en/develop/installing-solidity.html .

ОТВЕЧАТЬ:

var Web3 = require('web3');
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545"));
var source = 'contract demo {string public name = "Petros"; function changeName(string _newName){name = _newName; } }'; 
var compiled = web3.eth.compile.solidity(source);
var abi = compiled['<stdin>:demo'].info.abiDefinition;
В чем была проблема и как ваш ответ ее исправить? Спасибо!
@Laxmana, я точно не помню, в чем была проблема, так как много месяцев назад я закончил этот проект, но я думаю, что он не был подключен к узлу Ethereum, поэтому он не мог развернуть контракт. поэтому, установив провайдера web3, все заработало. Обратите внимание, что в более новой версии geth компилятор solc не включен в geth, поэтому, вероятно, этот код все равно не будет работать.

Поскольку web3.eth.compile.solidity устарел, нам нужно развернуть наши смарт-контракты вне geth. Это может быть достигнуто с помощью solc.

Развертывание контракта с помощью solc:

npm i solc

Создайте файл для развертывания: deploy_Hello_World.js

const fs = require('fs');
const solc = require('solc');
const Web3 = require('web3');
const web3 = new Web3(new Web3.providers.HttpProvider(http://localhost:8545));
const input = fs.readFileSync('/path/to/HelloWorld.sol');
const output = solc.compile(input.toString(), 1);
const bytecode = output.contracts[':HelloWorld'].bytecode;
const abi = JSON.parse(output.contracts[':HelloWorld'].interface);
const gasEstimate = web3.eth.estimateGas({ data: '0x' + bytecode });
const contract = web3.eth.contract(abi);

contract.new({ data: '0x' + bytecode, from: web3.eth.coinbase, gas: gasEstimate }, (err, res) => {
    if (err) {
        console.log(err);
        return;
    } else {
        if (res.address) {
            console.log('Deployed contract address: ' + res.address);
        }
    }
});