添加addBallot函数后,Solidity编译器报'UnimplementedFeatureError'的原因?
Solidity编译错误原因分析
核心错误:Storage与Memory结构体数组的跨区域赋值限制
你遇到的UnimplementedFeatureError本质是Solidity编译器的机制限制:不支持直接将memory类型的结构体数组复制到storage区域。
具体来说:
- 函数内定义的
cands和voters_list是memory临时内存数组,仅在函数执行期间存在; ballots是storage类型的链上持久化数组,执行ballots.push(...)时,你试图将memory数组直接赋值给Ballot结构体中属于storage的数组字段(candidates、allowedVoters),这种跨存储区域的结构体数组批量复制操作,目前Solidity编译器并未实现支持。
附带的代码逻辑问题
除了上述核心限制,代码还有两处会引发问题的逻辑:
- Memory数组未初始化长度直接赋值:
cands[cands.length] = candidates[i];中,cands初始长度为0,直接通过索引赋值会触发数组越界错误。需要先初始化数组长度,比如:Candidate[] memory cands = new Candidate[](candidate_indexes.length); - Storage数组直接赋值给Memory数组:
voters_list = voters;试图将storage数组直接赋值给memory数组,这同样不符合Solidity的存储规则,必须通过循环逐个复制元素到memory数组中。
内容的提问来源于stack exchange,提问作者Ramon Rasheed
相关产品推荐
相关产品推荐

