Как получить адрес экземпляра контракта для контрактного API Web3 1.0?

С truffle-contract все, что вам нужно было сделать, чтобы получить экземпляр контракта, было примерно так:

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
  • Обратите внимание, что MyContract.jsonфайл является артефактом сборки от Truffle.

Но поскольку экземпляр, созданный truffle-contract, возвращает обещания вместо PromiEvent , который был в версии 1.0 Web3, я решил, что хочу использовать обычную версию 1.0 Web3, чтобы получить экземпляр контракта. Другими словами, я больше не хотел полагаться на трюфельный контракт.

К сожалению, я не так хорошо знаком с контрактным API в новой версии 1.0 Web3. Это моя попытка:

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

Первая строка в порядке, но вторая строка выдает следующую ошибку:

Для этого объекта контракта еще не задан адрес, сначала укажите адрес.

Я вижу, что это имеет смысл, потому что в документации, похоже, указано, что вы можете установить адрес, чтобы он знал, где найти развернутый экземпляр.

Означает ли это, что мне придется заходить в свою консоль Truffle (также известную как testrpc), чтобы найти адрес контракта и каждый раз копировать и вставлять его? Я очень надеюсь, что нет, потому что с truffle-contract все, что мне нужно было сделать, это просто включить файл JSON, и он понял это за меня.

Как я должен получить этот адрес и передать его?

Да, нужно указать адрес. Я предполагаю, что это MyContract.jsonдолжно включать адрес, чтобы вы могли просто прочитать его оттуда, если хотите.
@smarx, но MyContract.json (то есть артефакт сборки Truffle) не содержит адреса. Это связано с тем, что это артефакт сборки определения контракта, а не артефакт развернутого экземпляра. Тем не менее, трюфель-контракт, кажется, может это понять.
Копаясь в исходном коде трюфельного контракта, похоже, что он делает что-то странное, например, пытается проверить, в какой сети он находится, а затем как-то сравнивает, чтобы увидеть, развернут ли этот контракт, а затем какой у него адрес. Я не могу понять, как он это делает, хотя.
Посмотрите на JSON в build/contracts. Судя по быстрому поиску, мне кажется, что именно здесь вы должны найти адрес. Я сам не пользуюсь Truffle, поэтому у меня нет ничего подходящего, чтобы ковыряться, извините.
Это JSON, о котором я говорю. У него нет адреса.
Ах, я думаю, что нашел это, позвольте мне написать ответ. Спасибо за помощь.

Ответы (1)

Я не мог найти, где хранится адрес, потому что файл JSON, который я взял, был устаревшей версией. Он был сгенерирован до того, как я перешел на Truffle. Оказывается, файл JSON обновляется каждый раз, когда Truffle запускает свои миграции. И при этом он добавит адрес развернутого экземпляра контракта.

Мне пришлось покопаться в их документах, чтобы найти их здесь: https://github.com/trufflesuite/truffle/tree/develop/packages/truffle-contract-schema#networks .

Оттуда было легко найти предварительно развернутый адрес. Окончательный код выглядит примерно так:

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