¿Cómo implementar y llamar a un contrato? Dirección necesaria de antemano?

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?

En el código publicado aquí no contractInstance = VotingContract.at('CONTRACT ADDRESS');debería serStoreContractVotingContract

Respuestas (1)

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.

Ok, lo intentaré, gracias. Solo la última pregunta: ¿está bien el contrato? En rojo en alguna parte, podría ser un problema con el parámetro de cadena
No, espera... Tengo una duda... Necesito la dirección del contrato para implementar mi contrato, pero para tener la dirección del contrato primero tengo que implementar mi contrato. Estoy un poco confundido.
Estoy usando TestRPC fwi
Creo que se menciona claramente en la publicación de blog a la que se refiere aquí . déjame actualizar la respuesta relacionada con la publicación del blog.
Entonces... (solo para asegurarme de que te he entendido) una vez implementado, ¿puedo usar esa dirección para crear una nueva instancia de mi contrato?
una instancia de un contrato se implementa en una dirección particular. Puede iniciar muchas instancias en diferentes direcciones. Lo que haces con la dirección es llamar a esa instancia en particular
Actualicé la respuesta de nuevo
Ok, entonces no puedo hacer lo que pensé... Necesito pasar algunos datos, contenidos en una cadena, en un script js al contrato. Así que necesito llamar a una instancia del contrato en mi script y usar la función set, como este contractInstance.set (cadena de datos) Pensé que podría usar esa dirección para una nueva instancia de mi contrato, pero como dijiste, la dirección se refiere a esa instancia en particular ... Entonces, ¿cómo podría hacer eso? ( perdon por la doble pregunta..)
hasta ahora escribí todas las líneas de cmd. ¿Podría usar esta var simpleStorage = StoreContract.new(your_parameters,{from:web3.eth.accounts[0], data: compiled_code , gas: gas_amount}, call_back_function) en el script js? Usando mi cadena "datos" como "sus_parámetros)
¿Cómo funcionaría este código, si usamos "compilación de trufas" o "implementación de trufas"? Puedo hacer que las cosas funcionen para nuevas instancias. Pero, si trato de cargar desde una dirección, nada funciona.
¿Cómo obtener el abi de un contrato público implementado para cuya dirección solo ahora desde etherescan?