Wie erhalte ich eine Vertragsinstanzadresse für die Web3 1.0-Vertrags-API?

Mit truffle-contract war alles, was Sie tun mussten, um die Vertragsinstanz zu erhalten, ungefähr so:

const getContract = require('truffle-contract')
const contractJSON = require('./MyContract.json')

const contract = getContract(contractJSON)
contract.setProvider(web3.currentProvider)

const instance = await contract.deployed()
return instance
  • Bitte beachten Sie, dass die MyContract.jsonDatei das Build-Artefakt von Truffle ist.

Aber da die von truffle-contract erstellte Instanz anstelle des PromiEvents , das mit Version 1.0 von Web3 geliefert wurde, Versprechungen zurückgibt, entschied ich, dass ich das reguläre v1.0 Web3 verwenden wollte, um die Vertragsinstanz zu erhalten. Mit anderen Worten, ich wollte mich nicht mehr auf Trüffelverträge verlassen.

Leider bin ich mit der Vertrags-API im neuen 1.0 Web3 nicht so vertraut. Das ist mein Versuch:

const contract = new web3.eth.Contract(contractJSON.abi)
contract.methods.get().call()

Die erste Zeile ist in Ordnung, aber die zweite Zeile wirft den folgenden Fehler:

Für diesen Vertragsgegenstand ist noch keine Adresse eingestellt, bitte legen Sie zuerst eine Adresse fest.

Ich sehe, dass dies sinnvoll ist, da die Dokumentation zu besagen scheint, dass Sie eine Adresse festlegen können, damit sie weiß, wo die bereitgestellte Instanz zu finden ist.

Bedeutet das, dass ich zu meiner Truffle Console (auch bekannt als testrpc) gehen müsste, um die Vertragsadresse zu finden und diese jedes Mal zu kopieren und einzufügen? Ich hoffe nicht, denn mit Truffle-Contract musste ich nur die JSON-Datei einfügen und es hat es für mich herausgefunden.

Wie soll ich diese Adresse bekommen und weitergeben?

Ja, Sie müssen die Adresse angeben. Ich nehme an, das MyContract.jsonmuss die Adresse enthalten, also könntest du sie einfach von dort aus lesen, wenn du willst.
@smarx, aber MyContract.json (dh das Truffle-Build-Artefakt) enthält nicht die Adresse. Dies liegt daran, dass es sich um ein Build-Artefakt der Vertragsdefinition handelt, nicht um ein Artefakt einer bereitgestellten Instanz. Doch truffle-contract scheint in der Lage zu sein, es herauszufinden.
Wenn man in den Quellcode für Truffle-Contract eintaucht, sieht es so aus, als würde er etwas Seltsames tun, wie zu versuchen, zu überprüfen, in welchem ​​​​Netzwerk es sich befindet, und dann irgendwie vergleichen, um zu sehen, ob dieser Vertrag bereitgestellt wird oder nicht, und dann, um welche Adresse es sich handelt. Ich kann mir aber nicht erklären, wie es das macht.
Sehen Sie sich das JSON in an build/contracts. Nach einer schnellen Suche sieht es für mich so aus, als ob Sie dort die Adresse finden sollten. Ich benutze Truffle selbst nicht, also habe ich nichts zur Hand, um darin herumzustöbern, sorry.
Das ist der JSON, von dem ich spreche. Es hat nicht die Adresse.
Ah, ich glaube, ich habe es gefunden, lassen Sie mich eine Antwort schreiben. Danke fürs Helfen.

Antworten (1)

Ich konnte nicht finden, wo die Adresse gespeichert war, weil die JSON-Datei, die ich genommen habe, eine veraltete Version war. Es war eine, die generiert wurde, bevor ich auf Truffle migrierte. Es stellt sich heraus, dass die JSON-Datei jedes Mal aktualisiert wird, wenn Truffle seine Migrationen durchführt. Und damit wird die Adresse der bereitgestellten Vertragsinstanz hinzugefügt.

Ich musste tief in ihre Dokumente graben, um sie hier zu finden: https://github.com/trufflesuite/truffle/tree/develop/packages/truffle-contract-schema#networks

Von dort aus war es einfach, die vorinstallierte Adresse zu finden. Der endgültige Code sieht in etwa so aus:

const networkId = await web3.eth.net.getId()
const deployedAddress = contractJSON.networks[networkId].address
const contract = new web3.eth.Contract(contractJSON.abi, deployedAddress)