Я пытаюсь развернуть контракт через свой интерфейс через 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));
});
Сначала проверьте, установили ли вы 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);
Сейчас 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;
Поскольку 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);
}
}
});
Нарендранат Редди
ПетросМ