Verträge für aktualisierbare Entwurfsmuster: ProofDB.sol : Vertrag zum Speichern der Daten. Proof.sol : Vertrag, der die Geschäftslogik enthält. Registry.sol: Vertrag, der die neueste Version von Proof.sol enthält
Ablauf: Die Frontend-Anwendung ruft zuerst den Registry.sol-Vertrag auf, um die neueste Version von Proof.sol (logischer Vertrag) abzurufen. Nach Erhalt der neuesten Version ruft es die entsprechende Funktion auf. Proof.sol-Verträge führen den Aufruf aus und speichern den Zustand in 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;
}
}
Um sicherzustellen, dass die Verträge nicht anfällig für den Angriff sind. Ich möchte den Zugriff auf ProofDB.sol nur auf ausgewählte Verträge und Eigentümer beschränken. Wie kann ich während der Bereitstellung vorgehen. Wie kann ich den ProofDB.sol-Vertrag während der Bereitstellung aufrufen, um die Liste der zulässigen Benutzer und Verträge zu übergeben, die darauf zugreifen können.
Ausgabe:
Hier ist eine Skizze.
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;
}
}
Ich habe Vertragsschreiber vom Eigentümer getrennt. Sie benötigen nicht die zusätzliche Komplexität eines Entweder/Oder-Modifikators, da der Eigentümer sich jederzeit selbst zur Liste der zulässigen Autoren hinzufügen kann.
Ich hoffe es hilft.
Santosh Kumar