2017-04-20 223 views
0

我试图更改区块链中合同中变量的值。我已经扣除它的代码是这样的:Solidity:更改已发布的智能合约中变量的值

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中的代码。 可能有一种方法可以创建一个具有专有名称的函数的库,并以某种方式插入汇编代码来更改变量的值。但就像用原子弹杀死一只蚂蚁一样。我正在寻找更简单的方法来做到这一点。 我也知道这个合同是不安全的,我试图理解这是否可能,并且我想知道这对合同有多大的风险。

回答

2

没有函数改变变量是不可能的。一旦合同代码被部署,这是最终的,不可能有任何改变。你需要部署一份新的合同。

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

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

我不这么认为。我确信,在这样的合同中,这是可能的。例如,假设要创建一个这样的库: https://paste.ofcode.org/8bgCLXjdHb7cNY4ETM72bn。 这会改变一些变量的值。 – Pietro

+1

我不知道这是如何工作的。但是,您无法在部署后更改合同。您需要功能来更改变量。 – Simon

+0

由于用于动态合同的委托调用,它工作正常。通过这种方式可以更新合同。 – Pietro