Я пытаюсь скомпилировать что-то, что отражает шаблон, и получаю следующую ошибку из ремикса:
"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 ();
}
}
Проблема в том, что он не компилируется.
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 ();
}
}
Надеюсь, поможет.
CAOS
Роб Хитченс B9lab
tx.origin
всегда представляет угрозу безопасности в списке «не использовать». То, как я рефакторинг, копирует то, что вы имели раньше, именно так, как и предполагалось, без риска. Я не уверен, что вы пытаетесь сделать с резервным резервом. Контракт C просто поглощает средства, не имея возможности их снять. Сложно сказать, куда ты идешь с этим.CAOS
Роб Хитченс B9lab
CAOS