Как развернуть и вызвать контракт? Адрес нужен заранее?

Я хочу сохранить строку из скрипта в 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)

Итак, мой вопрос....Как мне получить адрес контракта???

В размещенном здесь коде contractInstance = VotingContract.at('CONTRACT ADDRESS');этого быть StoreContractне должноVotingContract

Ответы (1)

Вам нужен адрес и 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 можно развертывать в блокчейне много раз. Каждый экземпляр развернутого контракта имеет уникальный адрес.

Хорошо, я попробую, спасибо. Последний вопрос: договор в порядке? Где-то я заметил, что это может быть проблема со строковым параметром.
Нет, подождите.. У меня есть сомнения.. Мне нужен адрес контракта, чтобы развернуть мой контракт, но для того, чтобы сначала получить адрес контракта, я должен развернуть свой контракт?? Я немного запутался
Я использую TestRPC fwi
Я думаю, что это ясно упоминается в сообщении блога, на которое вы ссылаетесь здесь . позвольте мне обновить ответ, относящийся к сообщению в блоге.
Итак... (просто чтобы убедиться, что я вас понял) после развертывания я могу использовать этот адрес для создания новой позиции моего контракта?
экземпляр контракта развертывается по определенному адресу. Вы можете инициировать множество экземпляров по разным адресам. То, что вы делаете с адресом, вызывает этот конкретный экземпляр
Я снова обновил ответ
Итак, я не могу сделать то, что я думал... Мне нужно передать некоторые данные, содержащиеся в строке, в js-скрипте в контракт. Поэтому мне нужно вызвать контракт в моем скрипте и использовать функцию set, как этот contractInstance.set(string data) Я думал, что могу использовать этот адрес для нового экземпляра моего контракта, но, как вы сказали, адрес относится к этому конкретному экземпляру... Итак, как я мог это сделать??( извините за двойной вопрос..)
до сих пор я писал все строки из cmd. Могу ли я использовать этот var simpleStorage = StoreContract.new(ваши_параметры, {из:web3.eth.accounts[0], данные: скомпилированный_код, газ: количество_газа}, call_back_function) в сценарии js? Используя мою строку «данные» в качестве «ваших_параметров»)
Как бы работал этот код, если бы мы использовали «компиляцию трюфеля» или «развертывание трюфеля». Я могу заставить вещи работать для новых экземпляров. Но если я попытаюсь загрузить с адреса, ничего не получится.
как получить abi публичного развернутого контракта, адрес которого я только сейчас получил от etherescan?