Использование constructor () и резервной функции в одном контракте приводит к ошибке

Я пытаюсь скомпилировать что-то, что отражает шаблон, и получаю следующую ошибку из ремикса:

"browser / ballot.sol: 26: 3: DeclaError: Функция с одинаковыми именем и аргументами, определенными дважды. constructor () public {^ (Соответствующая исходная часть начинается здесь и занимает несколько строк). browser / ballot.sol: 31: 3 : Другое объявление здесь: function () public payable {} ^ -------------------------- ^ "

код (если я закомментирую вторую резервную функцию, она работает):

 pragma solidity ^ 0.4 . 0 ; contract C { address public  owner ; address public  creator ; 

   constructor   ( address _creator )   public   { owner =  tx . origin ; creator =  _creator ; 
   } 

   function ()   public  payable {} 

   function  printOwner ()   public  view returns ( address h )   { h =  owner ; 
   } 

 } 

 //factory contract for C contract CFactory   { address public  owner ; address public  currentContractAddress ; 

   constructor ()   public   { owner =  msg . sender ; currentContractAddress =  address ( this ); 
   } 

   //function() public payable {} 

   function  test1 ()   public  returns ( address ){ C c =   new  C ( currentContractAddress ); 
     return  c . printOwner (); 
   } 

 } 

Ответы (1)

Проблема в том, что он не компилируется.

constructor Это не верно. В solc 0.4.22 вы можете сказать function constructor() но она является новой (сегодня), поэтому я использовал более традиционный метод «то же имя, что и контракт».

tx.orgin представляет собой угрозу безопасности, поэтому изменен на msg.sender с msg.sender .

 pragma solidity ^ 0.4 . 17 ; contract C { address public  owner ; address public  creator ; 

   function  C ( address _creator ,  address _owner )   public   { owner =  _owner ; creator =  _creator ; 
   } 

   function ()   public  payable {} 

   function  printOwner ()   public  view returns ( address h )   { h =  owner ; 
   } 

 } 

 //factory contract for C contract CFactory   { address public  owner ; address public  currentContractAddress ; 

   function   CFactory ()   public   { owner =  msg . sender ; currentContractAddress =  address ( this ); 
   } 

   //function() public payable {} 

   function  test1 ()   public  returns ( address ){ C c =   new  C ( currentContractAddress ,  msg . sender ); 
     return  c . printOwner (); 
   } 

 } 

Надеюсь, поможет.

Спасибо, я вижу, что это работает с использованием старого синтаксиса. Remix говорит мне использовать constructor (), как это описано в документах solidity.readthedocs.io/en/v0.4.22/contracts.html . Будет ли это работать, если я буду использовать только одну подлежащую оплате запасную функцию? Я использовал tx.origin только для установки владельца во время создания, я бы не стал использовать его для проверки привилегий в функциях, это все равно будет недостатком безопасности?
Возможно, я ошибаюсь по поводу нового синтаксиса конструктора. tx.origin всегда представляет угрозу безопасности в списке «не использовать». То, как я рефакторинг, копирует то, что вы имели раньше, именно так, как и предполагалось, без риска. Я не уверен, что вы пытаетесь сделать с резервным резервом. Контракт C просто поглощает средства, не имея возможности их снять. Сложно сказать, куда ты идешь с этим.
Оба контракта будут содержать оплачиваемую функцию и функцию снятия и / или самоуничтожения. Я мог бы на самом деле удалить функцию контракта из контракта без проблем. Но теперь я задаюсь вопросом об ошибке, которую я описал ранее, я хотел бы знать, если я неправильно понял что-то о том, как работают функции crontracts и fallback
Я думаю, вам нужно переформулировать это как новый вопрос.
Я знаю, наверное, мне было неясно. Проблема заключается в том, что constructor () и function () переводятся в один и тот же хеш, поэтому они должны иметь разные параметры. На данный момент я не уверен, является ли это неожиданным поведением или оно было сделано специально. Я пойду без резервной функции, учитывая, что в моем случае это не актуально