首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过中继/入门级合同进行函数调用

如何通过中继/入门级合同进行函数调用
EN

Ethereum用户
提问于 2017-07-11 10:36:30
回答 1查看 1.3K关注 0票数 4

我正在尝试创建一个入门级合同(一个入口点):

Relay.sol

代码语言:javascript
复制
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

代码语言:javascript
复制
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对象吗?

这看起来像可升级合同的副本这里,但我的问题不是写可升级的合同,而是从初级合同中调用我们合同的功能:即入门合同的概念是如何工作的?

提前感谢

EN

回答 1

Ethereum用户

发布于 2017-07-11 11:27:39

是的,您可以使用Relay契约的一个实例来调用Access2契约的链接实例的函数。

我创建了下面的最小示例,您可以在混炼中进行测试:

代码语言:javascript
复制
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合同中有一个小问题:

代码语言:javascript
复制
function Access2(){
Relay r=new Relay(this);
}

这里,thisAccess2当前实例的地址(它不是Relay类型的)。因为您没有在那个r对象上调用任何东西,所以一切都很好。但是,在尝试访问不存在的函数时,很可能会出现运行时错误(因为您将Access2实例分配给Relay类型的对象)。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/20972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档