使用Java Web3J获取ERC1155钱包余额的实现方法问询
ERC1155余额查询实现方案(Web3j环境)
你当前的代码存在3个核心错误,且调用逻辑选择有误,按以下方式修正即可正常查询:
现有代码问题说明
- 方法名拼写错误:ERC1155标准的余额查询方法为
balanceOf,你编写的balancedOf多了冗余字符d,合约无法匹配到对应方法会直接调用失败。 - 返回值类型定义错误:
balanceOf方法的返回值是uint256类型的余额数值,不是你定义的Bool类型,类型不匹配会导致返回结果解码失败。 - 调用逻辑选择错误:余额查询是链上只读操作,不需要构造签名交易、不需要调用
ethSendRawTransaction(该方法仅用于发送需要上链、消耗Gas的写入类交易),直接通过eth_call接口即可完成查询,无Gas消耗。
正确实现代码
1. 构造正确的合约调用方法
首先修正方法名、入参、返回值类型,完成调用数据编码:
import org.web3j.abi.FunctionEncoder; import org.web3j.abi.TypeReference; import org.web3j.abi.datatypes.Address; import org.web3j.abi.datatypes.Function; import org.web3j.abi.datatypes.generated.Uint256; import java.math.BigInteger; import java.util.Arrays; import java.util.List; // 构造balanceOf调用方法 Function balanceOfFunction = new Function( "balanceOf", Arrays.asList( new Address(ethAddress), // 待查询的钱包地址 new Uint256(tokenId) // 待查询的ERC1155代币ID ), Arrays.asList(new TypeReference<Uint256>() {}) ); String encodedCallData = FunctionEncoder.encode(balanceOfFunction);
2. 发起eth_call只读请求
构造调用参数,直接连接节点发起请求,不需要签名:
import org.web3j.protocol.core.DefaultBlockParameterName; import org.web3j.protocol.core.methods.request.Transaction; import org.web3j.protocol.Web3j; // 构造eth_call交易对象,from地址可填零地址 Transaction callTx = Transaction.createEthCallTransaction( "0x0000000000000000000000000000000000000000", erc1155ContractAddress, // ERC1155合约的部署地址 encodedCallData ); // 发起请求,读取最新区块状态下的余额 String callResult = web3j.ethCall(callTx, DefaultBlockParameterName.LATEST) .send() .getValue();
3. 解码返回结果获取余额
import org.web3j.abi.FunctionReturnDecoder; import org.web3j.abi.datatypes.Type; List<Type> decodedResult = FunctionReturnDecoder.decode(callResult, balanceOfFunction.getOutputParameters()); Uint256 balanceValue = (Uint256) decodedResult.get(0); // 转换为BigInteger类型即可直接使用 BigInteger erc1155Balance = balanceValue.getValue();
补充提示:如果需要批量查询一个地址下的多个ERC1155代币余额,可以调用ERC1155标准的
balanceOfBatch方法,传入地址数组、代币ID数组,即可一次性拿到多资产余额,减少RPC请求次数,实现逻辑和上述流程一致,仅需调整入参和返回值的类型定义即可。
内容的提问来源于stack exchange,提问作者juminoz
相关产品推荐
相关产品推荐

