¿Hay alguna forma de acceder a las variables de Ethereum Smart Contract por nombre en JavaScript? [cerrado]

Digamos que tengo un contrato inteligente simple:

contract Simple {
    string32 message;

    function Simple() {
        message = "Hello world!";
    }
}

¿Cómo puedo acceder fácilmente a la messagevariable por nombre en JavaScript? Parece que hay alguna forma de mapear funciones en JS , pero parece que solo se puede acceder a las variables de una manera complicada :

var storageObject = web3.eth.storageAt(contractAddress);
document.getElementById('fullName').innerText = web3.toAscii(storageObject['0x']) + ' ' + web3.toAscii(storageObject['0x01']);

Respuestas (3)

Tenga en cuenta que esta pregunta se asignó automáticamente a reddit y se respondió allí.

Si declara sus variables de estado como public, el compilador creará automáticamente una función para leer sus valores (" función de acceso "). Si usa la interfaz enriquecida proporcionada por web3.js , puede crear un objeto de contrato de javascript y simplemente invocarlo message()para obtener el valor respectivo.

Para matrices y asignaciones, el compilador generará una función que tiene argumentos adicionales que corresponden a los índices. Por ejemplo, para una variable mapping(uint => uint[]) public data;la función será equivalente a function data(uint x, uint y) constant returns (uint) { return data[x][y]; }.

Hmm, intenté usar la publicfunción. Agregué la función al descriptor del contrato, pero ahora que lo llamo, el javascript piensa que quiero enviar una transacción al contrato para invocar esa función...
¿Qué versión de web3.js estás usando? El más actual debería decidir entre una llamada local y una transacción automáticamente, con los más antiguos había que ser explícito. ¿Puede publicar el JSON para el ABI para el contrato?
@RobMyers Estoy tratando de ejecutarlo en AlethZero v0.8.2. Mi código de prueba actual está disponible en github.com/ThePiachu/EtherTest .
Parece que usa un compilador de solidez obsoleto. string32ha sido reemplazado por bytes32y también su interfaz json parece incompleta.
@chriseth Hmm, interesante. Tendré que probar una versión "vanguardista" entonces...
@chriseth ¿Puede explicar a qué se refiere con la "función de acceso"? Fui a ese enlace, se movió y la frase "función de acceso" no está en ninguna parte de la nueva página. Lo que quiero es acceder a una cadena que codifiqué en un contrato. Preferiblemente quiero verlo en el explorador de blockchain.
@stone212, mientras tanto, se cambió el nombre del término a "captador".
¿Quién paga el costo de leer esos datos y a dónde va la solicitud? ¿Es algo que los nodos ETH tienen que proporcionar de forma gratuita?

Debería comprobarlo web3.eth.contract, debería tener exactamente lo que necesita. https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethcontract

Aquí hay un código JavaScript para que Node.JS lea un

  • Necesita el código fuente del contrato Solidity para obtener ABI

  • Con estos métodos de conveniencia ABI y web3 puede leer los datos del contrato

Ejemplo:

var Web3 = require('web3');
var solc = require("solc");
var fs = require('fs');

// Connect to a geth server over JSON-RPC
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

console.log("Talking with a geth server", web3.version.api);

// Read standard token contract from https://www.ethereum.org/token
var sourceCode = fs.readFileSync('sol/token.sol','utf8')
var compiled = solc.compile(sourceCode);
var abiArray = compiled.contracts["MyToken"].interface;
abiArray = JSON.parse(abiArray);

// Create a proxy object to access the smart contract
var MyContract = web3.eth.contract(abiArray);

// instantiate by address
var address = "0x091cc7F4ACA751a6b8A4101715d6B07CD4232341";
var contractInstance = MyContract.at(address);

// All public variables have automatically generated getters
// http://bitcoin.stackexchange.com/a/38079/5464
var result = {
  "totalSupply": contractInstance.totalSupply(),
  "symbol": contractInstance.symbol(),
  "name": contractInstance.name(),
};
console.log(JSON.stringify(result));
¡sí! ¡Muchas gracias! ahorrame mucho tiempo! ¡salva mi día!