Quiero almacenar una cadena de un script en node.js a blockchain. Este es el contrato.
pragma solidity ^0.4.0;
contract SimpleStorage {
string storedData;
function set(string x) {
storedData = x;
}
function get() constant returns (string) {
return storedData;
}
}
Para implementar el contrato en la red (en mi caso, testnet), necesito crear una instancia del contrato. Para crear una instancia y desplegarla necesito 3 cosas: biblioteca web3, abi y dirección del contrato:
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)
Así que mi pregunta es... ¿Cómo obtengo la dirección del contrato?
Necesita dirección y ABI para invocar un contrato. Antes de invocar un contrato, debe implementarlo. Solo tienes la definición abi. Debe implementar el contrato permitiendo que se extraiga y obtener la dirección. Usar,
var simpleStorage = StoreContract.new(your_parameters ,{from:web3.eth.accounts[0], data: compiled_code , gas: gas_amount}, call_back_function)
Una vez que se extrae el contrato, devolverá algo como esto,
Contract mined! address: contract_address
donde puede encontrar la dirección del contrato en contract_address
Consulte el ejemplo de saludo básico proporcionado en el sitio web de Ethereum para obtener una explicación detallada sobre cómo comenzar con los contratos inteligentes.
ACTUALIZACIÓN-1:
Si lee atentamente la publicación de blog a la que se refirió, se da claramente que debe enviar una transacción para que se implemente el contrato (también tiene algunos diagramas agradables)
Este es el fragmento de código de la publicación del blog,
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)
y por lo que publicaste
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');
No necesita una dirección para implementar un contrato, solo necesita enviar una transacción con los detalles del contrato. Una vez que se implementa el contrato (después de que se extrae la transacción), generará la dirección que puede usar para llamar a la instancia en particular.
ACTUALIZACIÓN-2:
Puede implementar muchas instancias del mismo contrato enviando transacciones y se almacenan en diferentes direcciones. Puede usar una instancia particular usando la dirección respectiva (por ejemplo, para llamar a una función como setter en su caso). Consulte la siguiente respuesta publicada aquí .
Al igual que el código puede estar en forma de fuente, o convertido/compilado en forma ejecutable, lo mismo se aplica a los contratos.
A partir del código fuente, se pueden generar muchas copias del formulario ejecutable.
En forma de código fuente, un contrato en Solidity es como una clase en términos de programación orientada a objetos: se puede instanciar muchas veces y se puede heredar.
Hacer que un contrato sea ejecutable, generalmente implica 2 pasos:
convertir la fuente en el código de bytes de la máquina virtual de Ethereum (EVM) implementar la EVM en una cadena de bloques de Ethereum El mismo código fuente del contrato o EVM se puede implementar en una cadena de bloques muchas veces. Cada instancia de un contrato implementado tiene una dirección única.
Achala Dissanayake
contractInstance = VotingContract.at('CONTRACT ADDRESS');
debería serStoreContract
VotingContract