Как получить развернутый экземпляр контракта в консоли трюфеля, который был развернут без миграции?

У меня есть контракт, развернутый с трюфелем в локальной тестовой сети testrpc. Этот контракт имеет функцию, которая развертывает новый контракт.

Этот новый контракт я могу проверить по адресу в консоли testrpc примерно так:

  Transaction: 0x85a7f17406536dd9618c6647d7d0595a2cee7e7e065ffc08a99e58aa5473ab71
  Contract created: 0x1104c5adf4476aec333ee687c725eacc8d417a7c
  Gas usage: 2642382
  Block Number: 7
  Block Time: Mon Feb 26 2018 19:27:25 GMT+0900 (JST)

Но как я могу использовать этот новый контракт в консоли трюфеля для взаимодействия? Файл json контракта (ABI и т. д.) был создан в buildкаталоге трюфеля, но поскольку контракт не перенесен, я не могу использовать эту команду:

MyNewContract.deployed().then(_app => { app = _app })
app.showMeTheMoney()

Кто-нибудь знает, как в консоли трюфеля я могу взаимодействовать с контрактами, развернутыми через другие контракты?

Ответы (2)

Вы можете вручную изменить файл контракта в каталоге сборки, чтобы включить адрес, но в конечном итоге он будет перезаписан, поэтому это не лучший способ сделать это.

Более того deployed(), предназначен для использования в смысле синглтона. Если ваш контракт не является одноэлементным, вам не следует запрашивать его через deployed().

Если у вас есть следующее созвездие: контракт A (singleton) создает экземпляр контракта B, тогда вы можете сохранить ссылку(и) на B в A и запросить ее из JavaScript.

Пример

contract A {
    B[] public arrayOfBs;
    function create() returns (B) {
        B b = new B();
        arrayOfBs.push(b);
        return b;
    }
}

deployer.deploy(A);
...
A.deployed()
    .then(a => {return a.arrayOfBs(idx)})
    .then(bAddr => {return B.at(b)})
    .then(b => {b.showMeTheMoney()})

Если B должен быть синглтоном, вам нужно изменить свой сценарий миграции и развернуть его следующим образом.

deployer.deploy(A); 
deployer.deploy(B);

Затем вы сможете запросить его через B.deployed().

Есть ли какая-нибудь трюфельная функция, с помощью которой j может получить экземпляр пользовательского развернутого контракта?
Да. Как и в web3, вы можете использовать Contract.at(addr).
Но вы имеете в виду, что требуется сохранить ссылку в контракте А? Может ли эта сохраненная ссылка также находиться в массиве ссылок? Не могли бы вы привести небольшой пример, как сохранить ссылку контракта B в A, так как B будет много, а A только один.
Я обновил ответ. Если вы можете набросать свои контракты, возможно, я смогу привести вам лучший пример.
Уважаемый @ivicaa Спасибо за отличный ответ. Я попытался реализовать ваш ответ, но столкнулся с другой проблемой. Я открыл новый вопрос здесь: ethereum.stackexchange.com/questions/41023/… Было бы здорово, если бы вы могли взглянуть!

Кто-нибудь знает, как в консоли трюфеля я могу взаимодействовать с контрактами, развернутыми через другие контракты?

Чтобы увидеть список контрактов, уже развернутых в сети Truffle Develop, работает эта команда:

truffle(develop)> networks [--clean]

Network: develop (id: 4447)
  Migrations: 0xfb88de099e13c3ed21f80a7a1e49f8caecf10df6
  MyNewContract: 0xf204a4ef082f5c04bb89f7d5e6568b796096735a