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;
}
}
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:
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.
Santosh Kumar