【问题标题】:Solidity: change a the value of a variable in a smart contract already publishedSolidity:更改已发布的智能合约中变量的值
【发布时间】:2017-04-20 18:52:20
【问题描述】:

我正在尝试更改区块链中合约中变量的值。我已经扣除了它的代码,是这样的:

pragma solidity ^0.4.8;
contract Trial {
   address public owner;
   address public person;
   uint initialEther;
   function Trial(address _person) payable {
       owner = msg.sender;
       person = _person;
       initialEther = msg.value;
   }
   modifier only_person() {
       if (msg.sender!=person && tx.origin!=person) throw;
       _;
   }


   function() payable {}  

   bytes4 public signature = bytes4(sha3("libraryFunction()"));
   bool variableToBeChanged = false;
   function libraryInvocation(address libraryAddress) only_person {
       bool doSomething = libraryAddress.delegatecall(signature);
       if (variableToBeChanged) {
           .....
      }
   }
}

假设我有正确的库函数签名,我要做的是更改“variableToBeChanged”的值,以便执行 if 中的代码。 可能有一种方法可以使用具有正确名称的函数创建一个库,并以某种方式插入汇编代码来更改变量的值。但这就像用原子弹杀死一只蚂蚁。我正在寻找更简单的方法来做到这一点。 我也知道这份合同不安全,我试图了解这是否可能,并且我想了解这对一份合同来说有多大风险。

【问题讨论】:

    标签: ethereum dynamic-library solidity smartcontracts


    【解决方案1】:

    如果没有函数改变变量,这是不可能的。一旦部署了合约代码,它就是最终的,无法更改。您需要部署一个新合约。

    您可以通过检查特定钱包地址的 msg.sender 属性来控制允许哪个钱包调用该函数的合约。

    address owner = 0x2FD4...;
    if(msg.sender != owner) throw;
            //code afterwards)
    

    【讨论】:

    • 我不这么认为。我确信在这样的合同中是可能的。例如,假设创建一个这样的库:paste.ofcode.org/8bgCLXjdHb7cNY4ETM72bn。这会改变一些变量的值。
    • 我不知道这是如何工作的。但是您不能在部署后更改合同。你需要函数来改变变量。
    • 它之所以有效,是因为用于动态合约的委托调用。通过这种方式可以更新合同。
    • 我刚刚注意到该代码中有一个错误。在负载的返回中有一个 bool 应该是 bytes32
    猜你喜欢
    • 2022-08-05
    • 2021-11-28
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多