Я хочу сохранить строку из скрипта в node.js в блокчейн. Это контракт.
pragma solidity ^0.4.0;
contract SimpleStorage {
string storedData;
function set(string x) {
storedData = x;
}
function get() constant returns (string) {
return storedData;
}
}
Чтобы развернуть контракт в сети (в моем случае testnet), мне нужно создать экземпляр контракта. Чтобы создать экземпляр и развернуть его, мне нужны 3 вещи: библиотека web3, abi и адрес контракта:
var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
abi = JSON.parse(....) //==> I got abi following this tutorial(https://medium.com/@mvmurthy/full-stack-hello-world-voting-ethereum-dapp-tutorial-part-1-40d2d0d807c2)
StoreContract = web3.eth.contract(abi);
contractInstance = VotingContract.at('CONTRACT ADDRESS');
//And now I can use contract function
contractInstance.set(string data)
Итак, мой вопрос....Как мне получить адрес контракта???
Вам нужен адрес и ABI, чтобы вызвать контракт. Перед вызовом контракта его необходимо развернуть. У вас есть только определение аби. Вам нужно развернуть контракт, дав его майнить, и получить адрес. Использовать,
var simpleStorage = StoreContract.new(your_parameters ,{from:web3.eth.accounts[0], data: compiled_code , gas: gas_amount}, call_back_function)
Как только контракт будет добыт, он вернет что-то вроде этого:
Contract mined! address: contract_address
где вы можете найти адрес контракта по адресу contract_address
Обратитесь к базовому примеру приветствия , представленному на веб-сайте Ethereum, для подробного объяснения начала работы со смарт-контрактами.
ОБНОВЛЕНИЕ-1:
Если вы внимательно прочитали сообщение в блоге , на которое вы ссылались, то ясно, что вам нужно отправить транзакцию для развертывания контракта (в нем также есть несколько хороших диаграмм).
Это фрагмент кода из сообщения в блоге,
abiDefinition = JSON.parse(compiledCode.contracts[':Voting'].interface)
VotingContract = web3.eth.contract(abiDefinition)
byteCode = compiledCode.contracts[':Voting'].bytecode
// the following line is what you need to do get the address
deployedContract = VotingContract.new(['Rama','Nick','Jose'],{data: byteCode, from:
web3.eth.accounts[0], gas: 4700000})
deployedContract.address
contractInstance = VotingContract.at(deployedContract.address)
и из того, что ты выложил,
var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
abi = JSON.parse(....) //==> I got abi following this tutorial(https://medium.com/@mvmurthy/full-stack-hello-world-voting-ethereum-dapp-tutorial-part-1-40d2d0d807c2)
//at this point you need to send the transaction using "StoredContract.new(params,transaction details, callback[optional]);"
StoreContract = web3.eth.contract(abi);
contractInstance = VotingContract.at('CONTRACT ADDRESS');
Вам не нужен адрес для развертывания контракта, вам просто нужно отправить транзакцию с деталями контракта. После развертывания контракта (после майнинга транзакции) он выводит адрес, который вы можете использовать для вызова конкретного экземпляра.
ОБНОВЛЕНИЕ-2:
Вы можете развернуть несколько экземпляров одного и того же контракта, отправив транзакции, и они будут храниться по разным адресам. Вы можете использовать конкретный экземпляр, используя соответствующий адрес (например, для вызова функции, такой как setter в вашем случае). См. следующий ответ, размещенный здесь .
Точно так же, как код может быть в исходной форме или преобразован/скомпилирован в исполняемую форму, то же самое относится и к контрактам.
Из исходного кода можно создать множество копий исполняемой формы.
В форме исходного кода контракт в Solidity подобен классу в терминах ООП: он может создаваться много раз и может быть унаследован.
Создание исполняемого контракта обычно включает 2 шага:
преобразование исходного кода в байт-код виртуальной машины Ethereum (EVM) развертывание EVM в блокчейне Ethereum Один и тот же исходный код контракта или EVM можно развертывать в блокчейне много раз. Каждый экземпляр развернутого контракта имеет уникальный адрес.
Ачала Диссанаяке
contractInstance = VotingContract.at('CONTRACT ADDRESS');
этого бытьStoreContract
не должноVotingContract