如何从以太坊中的其他合约调用合约函数

  • 本文关键字:其他 调用 函数 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"。主要思想是这 2 个合约是不同的。我发布合约 A,然后发布合约 B,它调用 A。

我该怎么做? 像这样的东西,但从合同...

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

大致是这样的,但有一个问题。

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

这是一个基本的语法。通过将迎宾员与杀手一起包含在源文件中来拾取 ABI;也就是说,编译器可以"看到它"。

目前为止,一切都好。

出现的问题是,由于if(msg.sender==owner),Greeter将忽略该命令。不会的。这将是杀手得到的任何地址。

在部署 Greeter 之前,对此的一个可能的解决方案是预测对changeOwner()功能的需求,通常仅保留给当前所有者。

希望对您有所帮助。

相关内容

最新更新