首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工厂合同恢复

工厂合同恢复
EN

Stack Overflow用户
提问于 2022-05-01 12:07:51
回答 1查看 43关注 0票数 0

我试图创建一个工厂合同,我称之为DAG:

代码语言:javascript
复制
pragma solidity >=0.7.0 <0.9.0;
import "./Agent.sol";

    contract DAG {
    
        address[] agents;
    
        function createDAG() public returns (address) {
            // create root agent
            address[] memory parentsOfRoot;
            address rootAddress = createAgent(parentsOfRoot);
    
    
            // create child
            address[] memory parentsOfChild;
            parentsOfChild[0] = rootAddress;
            createAgent(parentsOfChild);
    
            return rootAddress;
            
        }
        function createAgent(address[] memory _parents) public returns(address) {
            Agent agent = new Agent(_parents);
            agents[agents.length - 1] = address(agent);
            return address(agent);        
        }
    }

它的目的是建立一个类似于一个连接的代理列表。

代码语言:javascript
复制
pragma solidity >=0.7.0 <0.9.0;

contract Agent {

    address[] parents;

    constructor(
        address[] memory _parents
    ){
        parents = _parents;
    }

    function getParents() public view returns (address[] memory) {
        return parents;
    }
}

由于某些原因,当我在createDAG中调用RemixIDE时,会得到以下错误:

处理DAG.createDAG待决..。处理DAG.createDAG错误: VM错误:还原。

还原事务已恢复到初始状态。注意:如果您发送值,则应支付被调用的函数,而您发送的值应小于当前余额。调试事务以获得更多信息。

有人能帮我理解为什么我不能打电话给createDAG吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-01 13:34:17

您的代码片段试图将其分配到数组的第0次索引中,但此时不存在此索引。这会抛出一个“越界”异常。

代码语言:javascript
复制
address[] memory parentsOfChild; // 0 items
parentsOfChild[0] = rootAddress; // trying to assign the first item (index 0)

目前(v0.8)不可能调整内存中数组的大小,因此需要用已经预先定义的长度初始化数组。

代码语言:javascript
复制
address[] memory parentsOfChild = new address[](1); // 1 empty item
parentsOfChild[0] = rootAddress;

然后就会遇到另一个逻辑错误。函数createAgent()还试图为“越界”索引赋值。

agents数组为空时,此片段试图分配给索引-1。

代码语言:javascript
复制
agents[agents.length - 1] = address(agent);

如果要向agents数组添加新项,可以使用数组的.push()成员函数。

代码语言:javascript
复制
// instead of `agents[agents.length - 1] = address(agent);`
agents.push(address(agent));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72076546

复制
相关文章

相似问题

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