我正在尝试创建一个工厂合同,我称之为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;
}
}
由于某种原因,当我在RemixIDE中调用createDAG
时,我得到以下错误:
transaction to DAG。createDAG pending…交易到DAG.createDAG
revert事务已恢复到初始状态。注意:如果你发送value和value,被调用的函数应该是可支付的你寄出去的钱应该少于你现在的余额。调试交易获取更多信息。
谁能帮我理解为什么我不能呼叫createDAG
?
您的代码片段试图分配到数组的第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));