Digamos que tengo un contrato inteligente simple:
contract Simple {
string32 message;
function Simple() {
message = "Hello world!";
}
}
¿Cómo puedo acceder fácilmente a la message
variable 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']);
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]; }
.
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));
elpiachu
public
funció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...Rob Myers
elpiachu
criseth
string32
ha sido reemplazado porbytes32
y también su interfaz json parece incompleta.elpiachu
piedra.212
criseth
Domingo