You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:06:03