Proxy-Vertrag aktualisiert Geschäftsdaten nicht

Ich möchte einen Proxy-Vertrag einrichten, mit dem meine Benutzer interagieren können. Der Proxy-Vertrag ist ein Speichervertrag, der das Alter des Benutzers vorerst speichert. Wenn ich anrufe, writeDataum mein Alter zu aktualisieren, erwarte ich, dass mein Logikvertrag aufgerufen wird, um das Update dort auszuführen.

Wenn ich den folgenden Code in Remix ausführe, kann ich die userDataZuordnung nicht aktualisieren. Wenn ich ein Alter von 30 eingebe, gibt es 0 für BEIDE Verträge zurück, also gehe ich davon aus, dass der Anruf fehlschlägt. Wenn ich jedoch writeData für den Logikvertrag aufrufe, schreibt er einwandfrei. Ich nehme an, dass mit meinem Delegiertenruf etwas nicht stimmt.

Ich folge https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/ (unter Delegatecall-based proxy pattern ) und ich habe meine Zustandsvariablen richtig bestellt, also erwarte ich es nicht versehentlich an meine Proxy-Adresse zu schreiben.

Was mache ich hier falsch?

Speicher-/Proxy-Vertrag :

pragma solidity ^0.4.23;

// Storage contract
contract HealthcareStorage  {

  mapping (address => uint8) public userData;

  address public logicContract;
  address public owner;

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

  function updateContract(address _newAddress) public returns (bool) {
    require(msg.sender == owner);
    logicContract = _newAddress;

    return true;
  }

  function writeData(uint8 _age) public {
   logicContract.delegatecall(bytes4(keccak256("writeData(uint8)",_age)));
  }
}

Logikvertrag :

pragma solidity ^0.4.23;

import { HealthcareStorage } from "./HealthcareStorage.sol";

// Logic contract - Upgradeable
contract HealthcareLogic{

  mapping (address => uint8) public userData;


  function writeData(uint8 _age) public returns (bool) {
    userData[msg.sender] = _age;

    return true;
  }

}

Antworten (1)

Es stellte sich heraus, dass diese Zeile ausgeschaltet war:

logicContract.delegatecall(bytes4(keccak256("writeData(uint8)",_age)));

Es sollte sein:

logicContract.delegatecall(bytes4(keccak256("writeData(uint8)")),_age);