代码之家  ›  专栏  ›  技术社区  ›  Henry Kim

是否可以修改另一个合同中的变量值?

  •  14
  • Henry Kim  · 技术社区  · 6 年前

    我可以从 here

    但我找不到如何修改另一个合同的变量。

    以下是合同A的示例,

    contract A {
        uint public target;
    }
    

    这是合同B的例子

    contract B {
        function edit_A_a() public {
            A.target = 1;  // some kind of this
        }
    }
    

    我想修改的值 target 来自合同B的变量。

    此外,假设所有操作都是在稳定合同级别执行的。

    谢谢

    2 回复  |  直到 6 年前
        1
  •  14
  •   user94559    6 年前

    将状态变量声明为 public 生成公共getter,但不是setter。如果希望另一个合同修改合同的状态变量,则必须自己编写一个函数:

    contract A {
        uint public target;
        function setTarget(uint _target) public {
            target = _target;
        }
    }
    
    contract B {
        A a = Test(0x123abc...);  // address of deployed A
        function editA() public {
            a.setTarget(1);
        }
    }
    
        2
  •  6
  •   ReyHaynes    6 年前

    不,不能直接编辑合同的变量。那将是一场安全噩梦。

    您只能通过接口使用外部合同提供的公共/外部功能。如果该函数本身是 setter 并允许您更改变量,只有这样才有可能。

    合同A:

    contract A {
        uint myVariable = 1
    
        function setMyVariable(uint _newVar) public {
            myVariable = _newVar;
        }
    }
    

    合同B:

    interface A {
        function getMyVariable() view public returns(uint);
    }
    
    function setMyVariable(uint _newVar) public onlyOwner {
        A a = A([CONTRACT A ADDRESS HERE])
        a.setMyVariable(_newVar);
    }