eth_call¶
只读调用智能合约(不上链、不消耗 energy)。
- 源码:
framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java#getCall - 端口:FullNode
8545/ Solidity8555
请求参数¶
| 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|
params[0] |
object | 是 | CallArguments 对象,见下表 |
params[1] |
string | object | 是 | 区块标识:tag 字符串,或包含 blockNumber(非负 0x-hex 或十进制)或 blockHash(严格的 32 字节 hex)的对象。字符串 tag 只支持 latest;对象形式会检查引用区块是否存在,但执行仍使用 latest state |
CallArguments 字段(framework/src/main/java/org/tron/core/services/jsonrpc/types/CallArguments.java):
| 字段 | 默认值 | 说明 |
|---|---|---|
from |
0x0000000000000000000000000000000000000000 |
调用者地址 |
to |
必填 | 合约地址 |
value |
"" |
转入合约的 callValue(sun,hex) |
data |
null |
calldata(4 字节 selector + ABI 编码参数) |
input |
null |
data 的别名;两者同时设置时,eth_call 优先使用 input |
gas / gasPrice / nonce |
不使用 | — |
input 使用更严格的 execution API hex 规则:必须带 0x 前缀,且 hex 位数为偶数;"" 可作为空 bytes。data 为兼容旧客户端保留较宽松解析。
对于 params[1],字符串 block tag 必须为 latest。EIP-1898 object 形式接受已存在的 blockNumber / blockHash 并检查该区块存在,但调用仍基于 latest state 执行,不做历史状态执行。额外的对象属性会被忽略;若两个 selector 同时存在,blockNumber 优先。
# 例:调用 Nile testnet 上 Tether USD(USDT)的 symbol() 函数
curl -X POST https://nile.trongrid.io/jsonrpc \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc":"2.0","id":1,"method":"eth_call",
"params":[{
"to":"0xeca9bc828a3005b9a3b909f2cc5c2a54794de05f",
"data":"0x95d89b41"
},"latest"]
}'
响应¶
合约 view / pure 函数的返回值(拼接所有 constantResult 段),hex 编码。
下例为上面 curl 调用 Nile testnet 抓回的真实响应(USDT 的 symbol() 返回 ABI 编码后的字符串 "USDT":偏移 0x20 + 长度 0x4 + UTF-8 字节 5553445400...):
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000"
}
异常响应¶
| 触发条件 | 错误码 | message |
|---|---|---|
params[1] 既不是 string 也不是 object |
-32600 |
invalid json request |
params[1] object 形式中 blockNumber / blockHash 都缺失 |
-32600 |
invalid json request |
params[1] 中 blockNumber 不是合法的非负 hex/十进制高度 |
-32602 |
invalid block number |
params[1] 中 blockHash 不匹配 (0x)?[0-9a-fA-F]{64} |
-32602 |
invalid hash value |
params[1] 中指定的块不存在 |
-32000 |
header not found 或 header for hash not found |
params[1] tag 是 earliest / pending / finalized / safe |
-32602 |
TAG [earliest \| pending \| finalized \| safe] not supported |
字符串形式的 params[1] 是具体 hex 或十进制高度(即便有效) |
-32602 |
QUANTITY not supported, just support TAG as latest |
from / to 地址非法 |
-32602 |
透传 message |
input 不是严格 hex |
-32602 |
透传 JsonRpcApiUtil.requireValidHex 校验信息 |
value 不是合法 hex |
-32602 |
invalid param value: invalid hex number |
合约校验失败(如 to 非合约、参数不匹配等) |
-32600 |
ContractValidateException 透传 message(无 message 时 fallback Contract validate error :) |
EVM 执行 REVERT |
-32000 |
message + (若 revert 数据以 Error(string) 选择器开头)解析后的字符串;error.data 携带原始 revert hex |
| 其他执行/编码错误 | -32000 |
透传 message(双引号被替换为单引号) |