2017-04-20 11 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

動的契約に使用されるdelegatedcallが原因で機能します。このように契約を更新することができます。 – Pietro

関連する問題