Evm
非結構化儲存代理。變數沒有被覆蓋?
使用委託呼叫時,我的印像是代理中聲明的儲存槽將被實現覆蓋。
非結構化儲存實現聲明了 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
這意味著它們被硬編碼到字節碼中。因此,它們不佔用儲存槽。鑑於要散列的數據是已知的,計算出的散列很容易在實施契約中重現。計算出的雜湊相當於偽隨機儲存位置,不太可能被實施契約覆蓋。
希望能幫助到你。