From 241047951a9d454b0048d987b293e0438092a426 Mon Sep 17 00:00:00 2001 From: Ricardo Guilherme Schmidt <3esmit@gmail.com> Date: Fri, 1 Dec 2017 04:45:26 -0200 Subject: [PATCH] recovery alpha + ens based recoverer --- contracts/deploy/AbstractRecoverer.sol | 12 +++++++++++- contracts/deploy/BasicSystemStorage.sol | 8 +++----- contracts/deploy/DelegatedCall.sol | 4 ++-- contracts/deploy/ENSRecoverer.sol | 24 ++++++++++++++++++++++++ contracts/deploy/KillableModel.sol | 8 -------- contracts/deploy/RecoverableSystem.sol | 11 ++++++++--- contracts/ens/ENS.sol | 14 ++++++++++++++ contracts/ens/Resolver.sol | 5 +++++ 8 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 contracts/deploy/ENSRecoverer.sol create mode 100644 contracts/ens/ENS.sol create mode 100644 contracts/ens/Resolver.sol diff --git a/contracts/deploy/AbstractRecoverer.sol b/contracts/deploy/AbstractRecoverer.sol index a186fc4..1acf913 100644 --- a/contracts/deploy/AbstractRecoverer.sol +++ b/contracts/deploy/AbstractRecoverer.sol @@ -9,16 +9,26 @@ import "./BasicSystemStorage.sol"; * @dev Abstract recoverer contract that should be crafted to alter `address system` storage * in delegated logic contracts. */ -contract AnstractRecoverer is BasicSystemStorage { +contract AbstractRecoverer is BasicSystemStorage { /** * @dev will be callable in emergency state of RecorverableSystem */ function recoverSystem(address newSystem) public { require(msg.sender == consensusContract()); + require(isOk(newSystem)); system = newSystem; } + /** + * @dev checks if `_a` contains code + */ + function isOk(address _a) internal constant returns(bool r) { + assembly{ + r := gt(extcodesize(_a), 0) + } + } + /** * @dev returns the consesus contract, can be a multisig or other DAO * should be implemented by a child contract diff --git a/contracts/deploy/BasicSystemStorage.sol b/contracts/deploy/BasicSystemStorage.sol index ce95b34..3cd62e9 100644 --- a/contracts/deploy/BasicSystemStorage.sol +++ b/contracts/deploy/BasicSystemStorage.sol @@ -8,9 +8,7 @@ pragma solidity ^0.4.17; * avoid overwriting wrong storage pointers */ contract BasicSystemStorage { - /// protected zone start (RecorverableSystem vars) - address system; - address recover; - address watchdog; - /// protected zone end + address public system; + address public recover; + address public watchdog; } \ No newline at end of file diff --git a/contracts/deploy/DelegatedCall.sol b/contracts/deploy/DelegatedCall.sol index cbed2b4..8f42dea 100644 --- a/contracts/deploy/DelegatedCall.sol +++ b/contracts/deploy/DelegatedCall.sol @@ -11,14 +11,14 @@ contract DelegatedCall { * @dev delegates the call of this function */ modifier delegated { - require(_target().delegatecall(msg.data)); //require successfull delegate call to remote `_target()` + //require successfull delegate call to remote `_target()` + require(_target().delegatecall(msg.data)); assembly { let outSize := returndatasize let outDataPtr := mload(0x40) //load memory returndatacopy(outDataPtr, 0, outSize) //copy last return into pointer return(outDataPtr, outSize) } - assert(false); //should never reach here _; //never will execute local logic } diff --git a/contracts/deploy/ENSRecoverer.sol b/contracts/deploy/ENSRecoverer.sol new file mode 100644 index 0000000..a2b9149 --- /dev/null +++ b/contracts/deploy/ENSRecoverer.sol @@ -0,0 +1,24 @@ +pragma solidity ^0.4.17; + +import "./AbstractRecoverer.sol"; +import "../ens/ENS.sol"; + + +/** +* @title ENSRecoverer +* @author Ricardo Guilherme Schmidt (Status Research & Development GmbH) +* @dev Common abstract recoverer resolved from ens. +*/ +contract ENSRecoverer is AbstractRecoverer { + /** + * @dev resolves consensusContract from ens. + */ + function consensusContract() public constant returns(address) { + bytes32 node = ensNode(); + return ensRoot().resolver(node).addr(node); + } + + function ensNode() public constant returns(bytes32); + function ensRoot() public constant returns(ENS); + +} \ No newline at end of file diff --git a/contracts/deploy/KillableModel.sol b/contracts/deploy/KillableModel.sol index 0a7c217..c05bf51 100644 --- a/contracts/deploy/KillableModel.sol +++ b/contracts/deploy/KillableModel.sol @@ -17,14 +17,6 @@ contract KillableModel is BasicSystemStorage { watchdog = _watchdog; } - function changeWatchdog(address newWatchDog) public { - require(msg.sender == watchdog); - watchdog = newWatchDog; - } - - /** - * @dev Should be only possible to call this at Model. Never set watchdog var at instances. - */ function emergencyStop() public { require(msg.sender == watchdog); selfdestruct(watchdog); diff --git a/contracts/deploy/RecoverableSystem.sol b/contracts/deploy/RecoverableSystem.sol index 0883839..d97caad 100644 --- a/contracts/deploy/RecoverableSystem.sol +++ b/contracts/deploy/RecoverableSystem.sol @@ -9,8 +9,13 @@ import "./DelegatedCall.sol"; * @author Ricardo Guilherme Schmidt (Status Research & Development GmbH) * @dev Contract that recovers from dead system to recoverer. */ -contract RecoverableSystem is BasicSystemStorage, DelegatedCall { + contract RecoverableSystem is BasicSystemStorage, DelegatedCall { + /** + * @dev Requires at least valid _recoverer, that can elect the first system. + * @param _system the first system + * @param _recover the recoverer contract + */ function RecoverableSystem(address _system, address _recover) public { require(isOk(_recover)); system = _system; @@ -20,12 +25,12 @@ contract RecoverableSystem is BasicSystemStorage, DelegatedCall { /** * @dev delegatecall everything (but declared functions) to `_target()` */ - function () public delegated { + function () external payable delegated { //all goes to system (or recover) } /** - * @dev checks if system contains code + * @dev checks if system is not in recovery mode */ function isOk() public constant returns(bool a) { return isOk(system); diff --git a/contracts/ens/ENS.sol b/contracts/ens/ENS.sol new file mode 100644 index 0000000..42960e3 --- /dev/null +++ b/contracts/ens/ENS.sol @@ -0,0 +1,14 @@ +pragma solidity ^0.4.17; + +import "./Resolver.sol"; + + +contract ENS { + function owner(bytes32 node) public constant returns (address); + function resolver(bytes32 node) public constant returns (Resolver); + function ttl(bytes32 node) public constant returns (uint64); + function setOwner(bytes32 node, address owner) public; + function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public; + function setResolver(bytes32 node, address resolver) public; + function setTTL(bytes32 node, uint64 ttl) public; +} \ No newline at end of file diff --git a/contracts/ens/Resolver.sol b/contracts/ens/Resolver.sol new file mode 100644 index 0000000..f111f4f --- /dev/null +++ b/contracts/ens/Resolver.sol @@ -0,0 +1,5 @@ +pragma solidity ^0.4.17; + +contract Resolver { + function addr(bytes32 node) public constant returns (address); +} \ No newline at end of file