Evm

非結構化儲存代理。變數沒有被覆蓋?

  • August 20, 2019

使用委託呼叫時,我的印像是代理中聲明的儲存槽將被實現覆蓋。

非結構化儲存實現聲明了 bytes32 變數,這些變數指示代理中的儲存位置以查找所有者、實現等。

為什麼在將交易委託給執行合約時這些 bytes32 變數不會被覆蓋?實施契約的例子似乎沒有考慮到這些已經聲明的變數。

contract OwnedUpgradeabilityProxy is Proxy {
bytes32 private constant ownerPosition = keccak256("org.zeppelinos.proxy.owner");
bytes32 private constant implementationPosition = keccak256("org.zeppelinos.proxy.implementation");

function upgradeTo(address newImplementation) public onlyProxyOwner {
  address currentImplementation = implementation();
  setImplementation(newImplementation);
}

function implementation() public view returns (address impl) {
  bytes32 position = implementationPosition;
  assembly { impl := sload(position) }
}

聲明了變數,constant這意味著它們被硬編碼到字節碼中。因此,它們不佔用儲存槽。

鑑於要散列的數據是已知的,計算出的散列很容易在實施契約中重現。計算出的雜湊相當於偽隨機儲存位置,不太可能被實施契約覆蓋。

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/69756