Truffle development получает новый экземпляр контракта с адреса контракта

truffle developЕсть ли способ получить экземпляр контракта с адреса контракта из консоли ?

У меня есть удаленный ec2 с установленным truffle/geth и работающим экземпляром truffle development. С локальной truffle developконсоли я развернул свои контракты в этой удаленной сети (используя файл truffle migrate --compile-all --reset --network remote_network_name). Контракты успешно развернуты, и у меня есть адрес, где хранится контракт.

В truffle developконсоли на удаленном сервере я попытался Contract_Name.deployed().then(function(instance) {app = instance; })получить экземпляр, но получаю сообщение Contract_Name is undefinedоб ошибке.

truffle developЕсть ли способ получить экземпляр контракта с адреса контракта с консоли на удаленном сервере ?

Может что-то вроде MyContract = new Contract.at("ContractAddress")?

Есть ли у удаленного экземпляра исходный код ваших контрактов? Если исходный код доступен, вы можете попробовать скопировать build/каталог с артефактами развертывания на удаленный сервер.
Спасибо Исмаил. У удаленных экземпляров нет исходного кода моих контрактов, и я хотел бы избежать копирования моей папки сборки на сервер. Например, если я развернул эти контракты в тестовой сети и у меня нет доступа к загрузке файлов на этот сервер, есть ли способ получить экземпляр контракта с адреса контракта? Возможно ли это без копирования папки сборки? Или Truffle нуждается в папке сборки для ссылки на ABI контракта?
Внутри каталога build/ есть файл .json для каждого контракта, внутри этого файла есть ABI контракта и адрес развертывания. Этого должно быть достаточно, чтобы получить развернутый экземпляр. Возможно, вы можете использовать что-то вроде github.com/trufflesuite/truffle-artifactor , чтобы обернуть артефакт в класс javascript, который можно использовать без копирования всего каталога.

Ответы (3)

Есть гораздо более простой способ использования трюфеля.

Сначала включите артефакт контракта, как при создании нового контракта в truffle.

пусть MyContract = артефакты.require("./MyContract.sol");

затем в сценарии:

let myContract = await MyContract.at('мой адрес контракта');

Таким образом, нет необходимости брать ABI из другого файла и т. д.

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

Лично я предпочитаю, чтобы в Truffle не нужно было знать или нуждаться в адресе моего развернутого контракта, чтобы получить его экземпляр. Возможно, вы не помните адрес вашего контракта или адрес был спрятан глубоко в терминале, поскольку новое содержимое продвигает старое содержимое дальше.
Чтобы получить развернутый экземпляр контракта, не зная адреса контракта, нужно использовать метод контракта deployed()следующим образом:

const deployedContractInstance = await MyContract.deployed()

Вот и все!

Теперь у вас есть доступ ко всем атрибутам и методам, предоставляемым вашим контрактом, например, вы можете получить адрес, просто выполнив deployedContractInstance.address.

Действительно отличный ответ! Вы не только объясняете причину предпочтения этого подхода, но и приводите соответствующий код и пример в очень кратком ответе.

Решено! Вам нужны две вещи, чтобы получить экземпляр контракта в удаленной сети:

  1. ABI вашего контракта — после развертывания вашего контракта в удаленной сети путем запуска truffle migrate --compile-all --reset --network remote_network_nameв вашей локальной консоли разработки truffle, Truffle создаст объектное представление json вашего контракта в вашем локальном build/каталоге. Внутри этого объекта json вы можете найти массив ABI вашего контракта.
  2. Адрес вашего контракта — после развертывания вашего контракта в удаленной сети адрес вашего контракта будет отображаться в вашей локальной консоли разработки трюфелей следующим образом:

Скриншот консоли разработки Truffle


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

  1. var MyContract = new web3.eth.Contract(abiArray);
  2. var contractInstance = await MyContract.at(contractAddress);

ПРИМЕЧАНИЕ. Предполагается, что вы используете web3.js версии 0.2xx. Если вы используете web3.js 1.0, обратитесь к этой документации .