Gibt es eine Möglichkeit, in JavaScript namentlich auf die Variablen von Ethereum Smart Contract zuzugreifen? [abgeschlossen]

Angenommen, ich habe einen einfachen Smart Contract:

contract Simple {
    string32 message;

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

Wie kann ich messagein JavaScript einfach über den Namen auf die Variable zugreifen? Es sieht so aus, als gäbe es eine Möglichkeit, Funktionen in JS abzubilden , aber Variablen scheinen nur auf komplizierte Weise zugänglich zu sein :

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

Antworten (3)

Beachten Sie, dass diese Frage automatisch reddit zugeordnet und dort beantwortet wurde.

Wenn Sie Ihre Zustandsvariablen als deklarieren public, wird vom Compiler automatisch eine Funktion zum Lesen ihrer Werte erstellt (" Zugriffsfunktion "). Wenn Sie die von web3.js bereitgestellte reichhaltige Schnittstelle verwenden , können Sie ein JavaScript-Vertragsobjekt erstellen und dieses einfach aufrufen message(), um den entsprechenden Wert zu erhalten.

Für Arrays und Mappings generiert der Compiler eine Funktion mit zusätzlichen Argumenten, die den Indizes entsprechen. Beispielsweise ist mapping(uint => uint[]) public data;die Funktion für eine Variable äquivalent zu function data(uint x, uint y) constant returns (uint) { return data[x][y]; }.

Hmm, ich habe versucht, die publicFunktion zu verwenden. Ich habe die Funktion zum Vertragsdeskriptor hinzugefügt, aber jetzt, wo ich sie aufrufe, denkt das Javascript, dass ich eine Transaktion an den Vertrag senden möchte, um diese Funktion aufzurufen ...
Welche Version von web3.js verwenden Sie? Die aktuellste sollte automatisch zwischen einem Ortsgespräch und einer Transaktion entscheiden, bei älteren musste man explizit sein. Können Sie den JSON für die ABI für den Vertrag posten?
@RobMyers Ich versuche, es in AlethZero v0.8.2 auszuführen. Mein aktueller Testcode ist unter github.com/ThePiachu/EtherTest verfügbar .
Sie scheinen einen veralteten Solidity-Compiler zu verwenden. string32wurde durch ersetzt bytes32und auch Ihre Schnittstelle json sieht unvollständig aus.
@chriseth Hmm, interessant. Dann werde ich wohl mal eine "cutting edge" Version ausprobieren müssen...
@chriseth Kannst du erklären, was du mit der "Accessor-Funktion" meinst? Ich bin zu diesem Link gegangen, und er wurde verschoben, und der Ausdruck "Accessor-Funktion" ist nirgendwo auf der neuen Seite. Ich möchte auf eine Zeichenfolge zugreifen, die ich in einen Vertrag codiert habe. Am liebsten möchte ich es im Blockchain-Explorer sehen.
@stone212 der Begriff wurde zwischenzeitlich in "Getter" umbenannt.
Wer trägt die Kosten für das Lesen dieser Daten und wohin geht die Anfrage? Ist es etwas, das ETH-Knoten kostenlos zur Verfügung stellen müssen?

Sie sollten es sich ansehen web3.eth.contract- es sollte genau das haben, was Sie brauchen. https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethcontract

Hier ist ein JavaScript-Code für Node.JS zum Lesen von a

  • Sie benötigen den Contract Solidity-Quellcode, um ABI zu erhalten

  • Mit diesen ABI- und web3-Komfortmethoden können Sie die Vertragsdaten auslesen

Beispiel:

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));
ja! Danke sehr! spart mir viel zeit! rette meinen Tag!