编译CommitteePrecompiled合约报错及.bin文件为空问题求助
Solidity合约编译问题解决
问题1:修复编译报错Contract "CommitteePrecompiled" should be marked as abstract.
原始合约代码
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6; contract CommitteePrecompiled{ function RegisterNode() public; function QueryState() public view returns(string memory, int ); function QueryGlobalModel() public view returns(string memory, int ); function UploadLocalUpdate(string memory, int256 ) public; function UploadScores(int256 , string memory) public; function QueryAllUpdates() public view returns(string memory); }
报错原因与修复方法
Solidity规则:包含未实现函数(只有声明、没有函数体{})的合约,必须标记为abstract,同时这些未实现的函数要加上virtual关键字,方便后续继承合约重写实现。
另外注意你修改后的合约里QueryAllUpdates()函数声明不完整,要补全返回值和virtual关键字。正确的修复后代码如下:
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6; abstract contract CommitteePrecompiled{ function RegisterNode() virtual public; function QueryState() virtual public view returns(string memory, int ); function QueryGlobalModel() virtual public view returns(string memory, int ); function UploadLocalUpdate(string memory, int256 ) virtual public; function UploadScores(int256 , string memory) virtual public; function QueryAllUpdates() virtual public view returns(string memory); }
问题2:解决抽象合约编译后生成空.bin文件的问题
空文件原因
抽象合约是不完整的合约,它包含未实现的函数,无法被实例化部署,因此编译器不会为它生成可执行的字节码(.bin文件),自然输出为空。
解决方法(二选一)
场景1:仅作为接口规范使用
如果这个合约只是用来定义交互规范,不需要部署,直接把abstract contract改成interface即可。Solidity的接口默认所有函数都是external且virtual,更贴合规范:
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6; interface CommitteePrecompiled{ function RegisterNode() external; function QueryState() external view returns(string memory, int ); function QueryGlobalModel() external view returns(string memory, int ); function UploadLocalUpdate(string memory, int256 ) external; function UploadScores(int256 , string memory) external; function QueryAllUpdates() external view returns(string memory); }
场景2:需要生成可部署字节码
如果要部署这个合约,必须实现所有未完成的函数,去掉abstract关键字,给每个函数添加函数体(哪怕是空实现):
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6; contract CommitteePrecompiled{ function RegisterNode() public {} function QueryState() public view returns(string memory, int ) { return ("", 0); } function QueryGlobalModel() public view returns(string memory, int ) { return ("", 0); } function UploadLocalUpdate(string memory, int256 ) public {} function UploadScores(int256 , string memory) public {} function QueryAllUpdates() public view returns(string memory) { return ""; } }
这样编译后就能生成正常的.bin字节码文件。
内容的提问来源于stack exchange,提问作者Sailor丶 JS
相关产品推荐
相关产品推荐

