如何从以太坊的其他合同中调用合同功能

时间:2017-04-06 20:27:32

标签: ethereum

我已签订合同" greeter"在以太坊

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;
    }
}

我想创建另一个合同,它将调用函数" kill"从我的第一份合同。主要的想法是这两个合同是不同的。我发布合同A然后发布合同B,它叫A。

我怎么能这样做? 这样的事情,但来自合同......

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

1 个答案:

答案 0 :(得分: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()功能,通常仅为当前所有者保留。

希望它有所帮助。

相关问题