根据文档,应该可以从一个合约中创建出新合约:

contractAddress = new OwnedToken(name);

当我从合约中调用此方法时,我收到的地址似乎就是一个普通的地址而不是合约。

这是否有可能呢?(我记得我在某处看过只有普通账户可以发送合约创建交易)?

原文地址

2 人回答 0

2 个回答
投票数
最旧发布
最近发布

回答发布于 2018-09-07 16:08:22

这是否有可能呢?(我记得我在某处看过只有普通账户可以发送合约创建交易)?

这绝对有可能。

当我从合约中调用此方法时,我收到的地址似乎就是一个普通的地址而不是合约。

我不确定你说的是哪一种地址。下面这段代码设计可以行得通:

contract Factory {
    address[] newContracts;

    function createContract (bytes32 name) {
        address newContract = new Contract(name);
        newContracts.push(newContract);
    } 
}

contract Contract {
    bytes32 public Name;

    function Contract (bytes32 name) {
        Name = name;
    }
}

newContracts数组中,你将获得由Factory合约创建的新合约地址。

然后,如果要从Factory合约中创建的第一个合约中调用Name,则你应该这么用:

con.Name();

定义之后:

Contract con = Contract(newContracts[0]);
||
||

回答发布于 2018-09-07 16:08:22

我没有足够的资格来评论Hcharlanes的回答,但是因为我在它的回答上浪费了一个小时的时间,并且很多其他人正在使用他的示例,这行代码:

Names[i] = con.Name();

是错误的。你无法分配动态数组的末尾。 必须这么做:

Names.push(con.Name());

不崩溃,但当然这代码并没有任何实际意义。 你可能是希望在创建合约时立即将Name放入该数组。 示例除了这点其他都很棒! 希望有所帮助!

||
||

回答发布于 2018-09-07 16:08:22

这是否有可能呢?(我记得我在某处看过只有普通账户可以发送合约创建交易)?

这绝对有可能。

当我从合约中调用此方法时,我收到的地址似乎就是一个普通的地址而不是合约。

我不确定你说的是哪一种地址。下面这段代码设计可以行得通:

contract Factory {
    address[] newContracts;

    function createContract (bytes32 name) {
        address newContract = new Contract(name);
        newContracts.push(newContract);
    } 
}

contract Contract {
    bytes32 public Name;

    function Contract (bytes32 name) {
        Name = name;
    }
}

newContracts数组中,你将获得由Factory合约创建的新合约地址。

然后,如果要从Factory合约中创建的第一个合约中调用Name,则你应该这么用:

con.Name();

定义之后:

Contract con = Contract(newContracts[0]);
||
||

回答发布于 2018-09-07 16:08:22

我没有足够的资格来评论Hcharlanes的回答,但是因为我在它的回答上浪费了一个小时的时间,并且很多其他人正在使用他的示例,这行代码:

Names[i] = con.Name();

是错误的。你无法分配动态数组的末尾。 必须这么做:

Names.push(con.Name());

不崩溃,但当然这代码并没有任何实际意义。 你可能是希望在创建合约时立即将Name放入该数组。 示例除了这点其他都很棒! 希望有所帮助!

||
||

回答发布于 2018-09-07 16:08:22

这是否有可能呢?(我记得我在某处看过只有普通账户可以发送合约创建交易)?

这绝对有可能。

当我从合约中调用此方法时,我收到的地址似乎就是一个普通的地址而不是合约。

我不确定你说的是哪一种地址。下面这段代码设计可以行得通:

contract Factory {
    address[] newContracts;

    function createContract (bytes32 name) {
        address newContract = new Contract(name);
        newContracts.push(newContract);
    } 
}

contract Contract {
    bytes32 public Name;

    function Contract (bytes32 name) {
        Name = name;
    }
}

newContracts数组中,你将获得由Factory合约创建的新合约地址。

然后,如果要从Factory合约中创建的第一个合约中调用Name,则你应该这么用:

con.Name();

定义之后:

Contract con = Contract(newContracts[0]);
||
||

回答发布于 2018-09-07 16:08:22

我没有足够的资格来评论Hcharlanes的回答,但是因为我在它的回答上浪费了一个小时的时间,并且很多其他人正在使用他的示例,这行代码:

Names[i] = con.Name();

是错误的。你无法分配动态数组的末尾。 必须这么做:

Names.push(con.Name());

不崩溃,但当然这代码并没有任何实际意义。 你可能是希望在创建合约时立即将Name放入该数组。 示例除了这点其他都很棒! 希望有所帮助!

||
||