С 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, и он понял это за меня.
Как я должен получить этот адрес и передать его?
Я не мог найти, где хранится адрес, потому что файл 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)
пользователь19510
MyContract.json
должно включать адрес, чтобы вы могли просто прочитать его оттуда, если хотите.АдрианМк
АдрианМк
пользователь19510
build/contracts
. Судя по быстрому поиску, мне кажется, что именно здесь вы должны найти адрес. Я сам не пользуюсь Truffle, поэтому у меня нет ничего подходящего, чтобы ковыряться, извините.АдрианМк
АдрианМк