Solidity中OpenZeppelin AccessControl的hasRole返回false问题咨询
你调用hasRole方法时传入的角色标识计算逻辑错误,是导致查询结果不符合预期的核心原因。
合约中定义的ROLE_MINTER是对字符串"ROLE_MINTER"执行keccak256哈希运算得到的bytes32值,但你前端代码中使用web3.utils.fromAscii('ROLE_MINTER')生成的只是字符串转ASCII编码的十六进制值,没有经过哈希计算,两者值完全不一致,因此查询不到对应角色持有状态。
修复方案
将前端生成角色标识的代码替换为keccak256哈希计算即可,正确代码如下:
// 原错误写法 // const minterHex = web3.utils.fromAscii('ROLE_MINTER') // 修正后写法 const minterHex = web3.utils.keccak256('ROLE_MINTER') const result = await factoryContract.methods.hasRole(minterHex, OWNER_ADDRESS).call({ from: OWNER_ADDRESS });
此前的铸造逻辑运行正常,是因为合约内部做角色校验时用的是提前计算好的正确哈希值,部署者确实持有ROLE_MINTER角色,仅前端查询时参数错误才返回了false。
内容的提问来源于stack exchange,提问作者Benedict Lewis
相关产品推荐
相关产品推荐

