En un patrón de diseño graduable, cómo configurar los contratos permitidos o el propietario durante la implementación de contratos inteligentes

Antecedentes funcionales:

Contratos para patrón de diseño actualizable: ProofDB.sol: contrato para almacenar los datos. Proof.sol : contrato que contiene la lógica de negocio. Registry.sol: contrato que contiene la última versión de Proof.sol

Flujo: la aplicación Frontend llama primero al contrato Registry.sol para obtener la última versión de Proof.sol (contrato lógico). Después de recibir la última versión, realiza llamadas a la función respectiva. Los contratos de Proof.sol ejecutan la llamada y sotres el estado en ProofDB.sol.

**Migrations script:**

Sequence of deployment:
deployer.deploy(Mortal).then(() => {
return deployer.deploy(ProofDB)
}).then(() => {
return deployer.deploy(Proof, ProofDB.address);
}).then(() => {
return deployer.deploy(Registry, Proof.address);
})



**Code from ProofDB.sol**     
Contract ProofDB.sol {

        constructor() public {
            owner = message.sender;
        }

        modifier onlyAllowedContractOrOwner {
            require (allowedContracts[msg.sender] != true && msg.sender != owner,"Should be a owner");
            _;
        }

        function addAllowedContractOrOwner(address _addr)
        public
        onlyOwner 
        returns(bool) {
            if( allowedContracts[_addr] == false ) {
                allowedContracts[_addr] = true;
                allowedContractsKeys.push(_addr);
                return true;
            }
            return false;
        }

    }

Planteamiento del problema:

Para garantizar que los contratos no sean vulnerables al ataque. Quiero restringir el acceso a ProofDB.sol solo a contratos y propietarios seleccionados. ¿Cómo puedo hacer durante la implementación? ¿Cómo puedo invocar el contrato ProofDB.sol durante la implementación para pasar la lista de usuarios permitidos y contratos que pueden acceder a ella?

Asunto:

  1. No puedo pasar los argumentos del constructor porque ProofDB.sol debería implementarse primero en la secuencia. En ese momento no sé la dirección de Proof.sol.
  2. ¿Hay alguna manera de pasar los contratos y propietarios permitidos a ProofDB.sol durante la implementación sin hacerlo manualmente?

Respuestas (1)

Aquí hay un boceto.

pragma solidity 0.4.24;

contract DB {

  address public owner;
  mapping(address => bool) public allowedContracts;

  modifier onlyAllowedContracts() {
      require(allowedContracts[msg.sender]);
      _;
  }

  modifier onlyOwner {
      require(msg.sender == owner);
      _;
  }

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

  function isAllowedContract(address check) public view returns(bool isIndeed) {
      return allowedContracts[check];
  }

  function addAllowedContract(address newContract) public onlyOwner returns(bool success) {
      require(!isAllowedContract(newContract));
      allowedContracts[newContract] = true;
      return true;
  }

  function removeAllowedContract(address newContract) public returns(bool success) {
      require(isAllowedContract(msg.sender));
      allowedContracts[newContract] = false;
      return true;
  }

  function insertNewDataRecords() public onlyAllowedContracts returns(bool success) {
      // do something
      return true;
  }
}

Separé a los escritores de contratos del propietario. No necesita la complejidad adicional de un modificador uno u otro porque el propietario siempre puede agregarse a sí mismo a la lista de escritores permitidos.

Espero eso ayude.

Entiendo su punto de que el propietario siempre puede agregar o eliminar contratos permitidos. Pero cuando se realiza una implementación con trufa, puede ser realmente difícil tomar las direcciones del último contrato manualmente y agregarlas al contrato de almacenamiento. Quiero saber si hay alguna forma en que la función addAllowedContractOrOwner() se pueda activar con la última versión del contrato lógico.