Solidity: Как может контракт B, сгоревший из контракта A, сгенерировать другой контракт?

Как мы знаем, если мы хотим, чтобы контракт A в будущем создавал другой контракт: контракт B, когда мы развертываем контракт A, мы также помещаем код контракта B в транзакцию. Итак, мы отправляем в блокчейн следующий код для развертывания контракта А:

pragma solidity ^0.4.4;

contract Contract_A {

address public b_addr;
function Contract_A(){

 }
  function create() {
    Contract_B bb = new Contract_B();
    b_addr = address(bb); }

function fetch(){
    Contract_B cc = Contract_B(b_addr);
    cc.change();}    
}

contract Contract_B {

  uint public val;
  function Contract_B(){
   val=7;}
   function change(){
   val+=90;}
  }

Предположим, контракт B хочет создать другой контракт: контракт C в будущем.

Возникает вопрос : куда поместить код контракта C?

Ответы (1)

Я попробовал что-то подобное в Remix IDE, и это сработало.

pragma solidity ^0.4.4;

contract Contract_A {

address public b_addr;
function Contract_A(){

 }
  function create() {
    Contract_B bb = new Contract_B();
    b_addr = address(bb); }

function fetch(){
    Contract_B cc = Contract_B(b_addr);
    cc.change();}    
}

contract Contract_B {

    address public c_addr;
  uint public val;
  function Contract_B(){
   val=7;}
   function change(){
   val+=90;}

   function create() {

    Contract_C cc = new Contract_C();
    c_addr = address(cc); 

   }
}


contract Contract_C {

    //contract C code
}

Насколько я знаю, вы можете либо использовать функцию, определенную в контракте A, чтобы создать контракт B и вызвать его (каждый раз, когда вы вызываете функцию, будет создан экземпляр контракта B), либо вы можете назначить значение адреса созданного контракта B в самый первый раз и проверьте, установлен ли адрес при каждом вызове функции.

Спасибо за ответ! вопрос: Как мы можем взаимодействовать с контрактом Б (даже в ремиксе)? Нужно ли упоминать и контракт B, и контракт C? В общем, когда мы взаимодействуем с ContractA, нам нужен ABI всех трех контрактов; когда мы взаимодействуем с B, нам нужен ABI контракта B и C, а когда мы взаимодействуем с контрактом C, нам нужен ABI контракта C?
Насколько я знаю, вы можете либо использовать функцию, определенную в контракте A, чтобы создать контракт B и вызвать его (каждый раз, когда вы вызываете функцию, будет создан экземпляр контракта B), либо вы можете назначить значение адреса созданного контракта B в самый первый раз и проверьте, установлен ли адрес всякий раз, когда вызывается функция, это может выглядеть как одноэлементный шаблон и не будет создавать контракты B каждый раз, когда вы вызываете. И если вы вернете значение адреса B после его создания, вы можете напрямую вызвать B из может быть web3, в этом случае вам понадобится ABI
Да, я сделал; Спасибо. Для взаимодействия с контрактом B или C я использовал подход, поясняющий мой комментарий. Еще раз спасибо.
Да все верно. Тот, который упоминается в моем первом комментарии: ... Когда я взаимодействую с развернутым контрактом B, я должен включить ABI контракта B и C.
Большой! Удачи :)