如何调试Solidity智能合约开发过程中的Parser Error错误
错误修复说明
你的代码存在4处可直接导致编译报错的问题,以及1处逻辑缺失问题,修复方案如下:
- mapping定义使用了HTML转义后的
=>符号,Solidity语法要求映射的键值分隔符直接写=> - 0.4.22之后的Solidity版本不再支持「构造函数名与合约名一致」的写法,必须统一使用
constructor关键字定义构造函数,且0.8.x版本构造函数默认权限为public,无需额外加public修饰符 - 构造函数的动态数组参数
movieNames没有显式指定数据位置,0.8.x版本要求引用类型的函数参数必须标注memory或calldata voteForMovie函数只有读取mapping的逻辑,没有实现投票累加的功能- 语法细节:数组类型和参数名之间缺少空格,不符合Solidity编码规范
修复后完整代码
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; contract Rating { mapping (bytes32 => uint8) public ratingsReceived; bytes32[] public movieList; constructor(bytes32[] memory movieNames) { movieList = movieNames; } function totalVotesFor(bytes32 movie) view public returns (uint8) { return ratingsReceived[movie]; } function voteForMovie(bytes32 movie) public { ratingsReceived[movie] += 1; } }
Remix调试验证步骤
- 将修复后的代码粘贴到Remix编辑器,选择0.8.10及以上版本的Solidity编译器即可正常编译通过
- 部署合约时,在构造函数参数栏传入转换为bytes32格式的电影名数组即可完成初始化
- 调用
voteForMovie方法传入对应电影的bytes32值完成投票,调用totalVotesFor即可查询对应电影的累计票数
内容的提问来源于stack exchange,提问作者Olumide Lawal
相关产品推荐
相关产品推荐

