OpenZeppelin / openzeppelin-labs

A space for the community to interact and exchange ideas on the OpenZeppelin platform. Do not use in production!
https://openzeppelin.com/
MIT License
376 stars 116 forks source link

Proxy does not change state variable #139

Open kevindaizj opened 5 years ago

kevindaizj commented 5 years ago

I am trying to test proxy pattern in Remix, which connected to my private chain with Web3 Provider. By the way, miner is working all the time. After invoking add function of Proxy contract, the state variable total of Proxy contract has not change. But with Javascript VM, it changed as expected.

Here is the code:

pragma solidity ^0.5.0;

contract Proxy {

    address public implement;
    // with Web3 Provider, it didn't change. 
    // but with Javascript VM, It changed as expected.
    uint public total;  

    function changeImpl(address _impl) public returns(bool) {
        implement = _impl;
        return true;
    }

    // according to proxy pattern, this should be fallback function.
    // i change it as named function just for convenience
    function add(uint a, uint b) external {
        address _impl = implement;
        assembly {
            let ptr := mload(0x40)
            calldatacopy(ptr, 0, calldatasize)
            let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)
        }
    }
}

contract ImplContract {

    address public implement;
    uint public total;

    function add(uint a, uint b) public returns(uint) {
        total = a + b;
        return total;
    }
}

I am so confused why same code make different outcome. Any help would be appreciated.