我正在尝试创建一个入门级合同(一个入口点):
Relay.sol
pragma solidity ^0.4.8;
contract Relay {
address public currentVersion;
address public owner;
modifier onlyOwner() {
if (msg.sender != owner) {
throw;
}
_;
}
function Relay(address initAddr) {
currentVersion = initAddr;
owner = msg.sender;
}
function changeContract(address newVersion) public
onlyOwner()
{
currentVersion = newVersion;
}
function() {
if(!currentVersion.delegatecall(msg.data)) throw;
}
}还有我的合同
Access2.sol
pragma solidity ^0.4.8;
import './Storage.sol';
import './Relay.sol';
contract Access2{
Storage s;
address Storageaddress=0xcd53170a761f024a0441eb15e2f995ae94634c06;
function Access2(){
Relay r=new Relay(this);
}
function createEntity(string entityAddress,uint entityData)public returns(uint rowNumber){
s = Storage(Storageaddress);
uint row=s.newEntity(entityAddress,entityData);
return row;
}
function getEntityCount()public constant returns(uint entityCount){
s = Storage(Storageaddress);
uint count=s.getEntityCount();
return count;
}
}这两份合同都部署好了。
如果我使用Access2对象通过web3访问Access2方法,那么它工作得很好,但现在的问题是如何通过中继访问Access2方法。
我可以使用Relay对象吗?
这看起来像可升级合同的副本这里,但我的问题不是写可升级的合同,而是从初级合同中调用我们合同的功能:即入门合同的概念是如何工作的?
提前感谢
发布于 2017-07-11 11:27:39
是的,您可以使用Relay契约的一个实例来调用Access2契约的链接实例的函数。
我创建了下面的最小示例,您可以在混炼中进行测试:
contract target {
event something();
function doSomething() {
something();
}
}
contract relay {
target myTarget;
function relay() {
// this will deploy a new target contract, you could also just set its address
myTarget = new target();
}
function relayCall() {
myTarget.doSomething();
}
}要测试这一点,您可以创建一个relay实例(它在构造函数中创建一个target实例)。然后调用relayCall时,它将调用该target实例的doSomething函数。您将相应地看到调用事件something。
这并不重要,而是为了完整性:在您的Access2合同中有一个小问题:
function Access2(){
Relay r=new Relay(this);
}这里,this是Access2当前实例的地址(它不是Relay类型的)。因为您没有在那个r对象上调用任何东西,所以一切都很好。但是,在尝试访问不存在的函数时,很可能会出现运行时错误(因为您将Access2实例分配给Relay类型的对象)。
https://ethereum.stackexchange.com/questions/20972
复制相似问题