Wie bekomme ich eine Variable aus dem Smart Contract mit web3 und abi?

Ich verwende web3.js und versuche, einen Wert der Variablen aus dem Smart Contract zu entnehmen.

Mein Code dafür ist:

var contract = web3.eth.contract(abi).at(address);

wobei abi - json-Array und Adresse - gültige Arbeitsadresse.

Ein Teil des abi json-Objekts ist

{
      "constant": true,
      "inputs": [],
      "name": "weiRaised",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "type": "function"
},

Wenn ich diesen Code verwende:

console.log(contract.abi[0].abi[6].name);

Ich sehe "weiRaised" in der Konsole.

Aber wenn ich benutze

console.log(contract.abi[0].abi[6].inputs);

Ich sehe "undefiniert".

Was mache ich falsch? Wie kann ich die Variable aus dem Smart Contract erhalten, basierend auf abi und web3.js?

Antworten (4)

Nachdem ich Sachen auf der Konsole gedruckt hatte, ließ mich Gott vor Freude einschlafen =)

var contract = web3.eth.contract(abi).at(address);
async function getContractPublicVariable() {
    const weiRaised = await contract.methods.weiRaised.call().call();
}

so die idee istcontract.methods.VARIABLENAME.call().call();

Eine andere Idee istcontract.methods.VARIABLENAME().call();

Web3.js bildet die ABI-Funktionen automatisch auf den Vertragsgegenstand ab, von dem Sie zurückkommen web3.eth.contract(abi).at(address).

Das bedeutet, dass Sie auf den Wert der Variablen zugreifen können, indem Sie Folgendes tun:

let weiRaisedValue = contract.weiRaised.call()

console.log(contract.weiRaised.call()); - TypeError: contract.weiRaised ist nicht definiert
@Sergei Verwenden Sie web3 v1.0? In diesem Fall sollte es sein contract.methods.weiRaised.call().then(function (res) { console.log(res); }). Weitere Informationen finden Sie in der web3 v1.0 -Dokumentation .
console.log (web3.version); ergibt dies: Object { api: "0.20.2", node: Getter, getNode: e(), network: Getter, getNetwork: e(), ethereum: Getter, getEthereum: e(),whisper: Getter, getWhisper: e () }
Ihr Code gibt mir diesen Fehler: TypeError: contract.methods is undefined

Ich werde ab web3.js 1.6.0 eine aktualisierte Antwort geben (ich habe Moralis als meinen Anbieter für web3.js verwendet).

import Web3 from 'web3';       
const web3Js = new Web3(Moralis.provider);
            var contract = new web3Js.eth.Contract(ContractJSON.abi, ContractAddress);
            const variable = await contract.methods.variableName.call().call();
Das Doppelte call()sieht seltsam aus, es sieht besser aus mit contract.methods.variableName().call(), indem man ()nach dem Namen ein einzelnes verwendet .call().

2022 WebJs 1.7.3

Wenn jemand im Jahr 2022 damit zu kämpfen hat, dann ist dies die Lösung


import Web3 from "web3";

const web3 = new Web3(provider);
const myContract = new web3.eth.Contract(
      jsonInterface,
      address,
    );
this.age = await myContract.methods.getAge().call();

Dies ist die generische Form. Und es ist ein asynchroner Anrufawait myContract.methods.getVariableName().call();