2017-04-06 45 views
1

調用合同函數從其他合約我有復仇如何復仇

contract mortal { 
    address owner; 
    function mortal() { owner = msg.sender; } 

    function kill() { if (msg.sender == owner) selfdestruct(owner); } 
} 

contract greeter is mortal { 
    string greeting; 

    function greeter(string _greeting) public { 
     greeting = _greeting; 
    } 
    function greet() constant returns (string) { 
     return greeting; 
    } 
} 

部署合同「迎賓」我想創造另一個合同,這將調用函數從我的第一份合同「殺」。主要想法是這2份合同是不同的。我發佈合同A,然後發佈合同B,其中調用A.

我該怎麼做? 這樣的事情,但是從合同...

var contract = web3.eth.contract(contractAddress, ABI); 
contract.call().kill(); 

回答

1

大約是這樣的,但有一個問題。

pragma solidity ^0.4.6; 

contract Mortal { 
    address owner; 
    function Mortal() { owner = msg.sender; } 

    function kill() { if (msg.sender == owner) selfdestruct(owner); } 
} 

contract Greeter is Mortal { 
    string greeting; 

    function Greeter(string _greeting) public { 
    greeting = _greeting; 
    } 
    function greet() constant returns (string) { 
    return greeting; 
    } 
} 

contract Killer { 

    function destroyVictim(address victim) { 
    Greeter g = Greeter(victim); 
    g.kill(); 
    } 
} 

這是一個基本的語法。通過在源文件中包含Greeter和Killer,ABI得到提升;也就是說,編譯器可以「看到它」。

到目前爲止,這麼好。

出現的問題是由於if(msg.sender==owner),Greeter將忽略命令。它不會。這將是任何殺手獲得的地址。

在部署Greeter之前對此可能的解決方案是預計需要一個changeOwner()函數,通常只保留給當前所有者。

希望它有幫助。