我试图创建一个工厂合同,我称之为DAG:
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);
}
}它的目的是建立一个类似于一个连接的代理列表。
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吗?
发布于 2022-05-01 13:34:17
您的代码片段试图将其分配到数组的第0次索引中,但此时不存在此索引。这会抛出一个“越界”异常。
address[] memory parentsOfChild; // 0 items
parentsOfChild[0] = rootAddress; // trying to assign the first item (index 0)目前(v0.8)不可能调整内存中数组的大小,因此需要用已经预先定义的长度初始化数组。
address[] memory parentsOfChild = new address[](1); // 1 empty item
parentsOfChild[0] = rootAddress;然后就会遇到另一个逻辑错误。函数createAgent()还试图为“越界”索引赋值。
当agents数组为空时,此片段试图分配给索引-1。
agents[agents.length - 1] = address(agent);如果要向agents数组添加新项,可以使用数组的.push()成员函数。
// instead of `agents[agents.length - 1] = address(agent);`
agents.push(address(agent));https://stackoverflow.com/questions/72076546
复制相似问题