如何用Ethers.js在前端读取Solidity智能合约的Mapping?
解决Ethers.js读取Solidity Mapping数据的问题
问题根源
你的代码存在两个关键错误:
- 合约中定义的mapping变量是
votesOf,但你代码里调用的是isVoted,变量名完全不匹配 - Solidity中
public修饰的mapping会自动生成同名的getter函数,Ethers.js需要通过函数调用的方式获取数据,而非直接通过属性访问
正确实现代码
async function get_voting_results() { // 修正变量名,并用函数调用方式传入地址参数 const vote_result = await contract.votesOf("0xF2F823bAA7CABe76b35ad97a5039c20D36edd9a2"); console.log(vote_result.toString()); // 转成字符串避免BigNumber格式显示问题 }
补充说明
- Solidity为public mapping生成的getter函数签名是
function votesOf(address) external view returns (uint256),必须以contract.votesOf(address)的形式调用 - Ethers.js返回的
uint256是BigNumber类型,直接打印会显示对象结构,用toString()可以转成可读的十进制字符串 - 如果调用仍失败,检查合约实例初始化是否正确:比如ABI是否完整、链ID是否匹配、合约地址是否正确
内容的提问来源于stack exchange,提问作者Maaz Ahmed
相关产品推荐
相关产品推荐

