
按 EIP-1474 调用 Ethereum JSON-RPC 时如何正确编码 Quantity 与 Data 参数【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPsEIP-1474Remote procedure call specification为标准 Ethereum RPC 接口定义了两类必须特殊编码的值Quantity与Data。当你用脚本或程序直接调用 Ethereum 节点的 JSON-RPC 端点时块号、gas、value、gasPrice 等字段按Quantity编码地址、哈希、合约调用数据等字段按Data编码两者规则不同编码写错会被节点以参数错误拒绝。本文依据 EIP-1474 正文和它引用的 EIP-1898给出两条编码规则、逐条自检表以及一条完整的curl调用与结果判定路径。适用前提你已有可访问的 Ethereum 节点 RPC 端点。EIP 文档中的命令统一用url占位执行前需替换为你自己的节点端点地址替换方式在首次出现时说明后文不再重复。另请注意 EIP-1474 的 frontmatter 中状态为Stagnant本文只描述该 EIP 明确规定的行为。JSON-RPC 请求的形状按 EIP 的规定Ethereum RPC 方法 MUST 使用 JSON-RPC request object 发起调用MUST 以 JSON-RPC response object 响应。文档给出的调用形式是curl发送 POST 请求curl -X POST --data { id: 1337, jsonrpc: 2.0, method: eth_getBalance, params: [0xc94770007dda54cF92009BFF0dE90c06F603a09f, latest] } url命令末尾的url是文档占位符替换为你节点的 RPC 端点。请求体四个成员为id、jsonrpc、method、params。对于对象形式的参数EIP 的参数表会逐个标注字段类型例如eth_estimateGas的第一个参数中data、from、to是Datagas、gasPrice、value是Quantitycurl -X POST --data { id: 1337, jsonrpc: 2.0, method: eth_estimateGas, params: [{ data: 0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675, from: 0xb60e8dd61c5d32be8058bb8eb970870f07233155, gas: 0x76c0, gasPrice: 0x9184e72a000, to: 0xd46e8dd67c5d32be8058bb8eb970870f07244567, value: 0x9184e72a }] } url成功时响应包含result成员文档示例eth_estimateGas的返回是Quantity{ id: 1337, jsonrpc: 2.0, result: 0x5208 }失败时响应包含error成员EIP 规定它 MUST 是含code与描述性message的对象例如文档示例{ id: 1337, jsonrpc: 2.0, error: { code: -32003, message: Transaction rejected } }Quantity四条强制规则与自检表EIP 对Quantity给出四条 MUST 规则Quantity值 MUST 是十六进制编码MUST 带0x前缀MUST 使用每字节最少的十六进制位数不允许前导零零 MUST 写作0x0。EIP 正文自带的合法/非法示例表保留原文标注ValueValidReason0xinvalidempty not a valid quantity0x0validinterpreted as a quantity of zero0x00invalidleading zeroes not allowed0x41validinterpreted as a quantity of 650x400validinterpreted as a quantity of 10240x0400invalidleading zeroes not allowedffinvalidvalues must be prefixed自检要点0x00与0x400虽然都是合法字符但带前导零的一律非法。组装块号、gas、value 这类字段时先把数值转成常规十六进制数不补零到固定宽度再加0x前缀零值只写0x0。Data三条强制规则与自检表Data的 MUST 规则是MUST 是十六进制编码MUST 带0x前缀MUST 每字节用两个十六进制数字表示。EIP 正文的示例表原文对后半部分用true/false标注此处照录ValueValidReason0xvalidinterpreted as empty data0x0invalideach byte must be represented using two hex digits0x00validinterpreted as a single zero byte0x41trueinterpreted as a data value of 650x004200trueinterpreted as a data value of 168960xf0f0ffalsebytes require two hex digits004200falsevalues must be prefixedData与Quantity最容易混淆的三处差异Data允许空值0x合法Quantity的0x非法零必须写0x0Data允许前导零0x004200合法Quantity必须去掉前导零Data的十六进制位数必须为偶数0xf0f0f7 位非法。一个典型的出错场景把存储读到的全零字节当块号传出去。同一个零作为数据字节应写0x00作为数量应写0x0。实际调用并判定结果以文档中eth_getBalance的示例为完整路径第一个参数是Data地址第二个参数是块号可以是Quantity或latest、earliest、pending之一。curl -X POST --data { id: 1337, jsonrpc: 2.0, method: eth_getBalance, params: [0xc94770007dda54cF92009BFF0dE90c06F603a09f, latest] } url文档示例的响应{ id: 1337, jsonrpc: 2.0, result: 0x0234c8a3397aab58 }判定方式响应带result且其Quantity字段符合上文规则示例中的0x0234c8a3397aab58无前导零说明请求被接受、编码正确注意这是文档示例输出实际数值随节点状态变化。响应带error时按 EIP 的错误码表定位。EIP 列出的全部错误码如下CodeMessageMeaningCategory-32700Parse errorInvalid JSONstandard-32600Invalid requestJSON is not a valid request objectstandard-32601Method not foundMethod does not existstandard-32602Invalid paramsInvalid method parametersstandard-32603Internal errorInternal JSON-RPC errorstandard-32000Invalid inputMissing or invalid parametersnon-standard-32001Resource not foundRequested resource not foundnon-standard-32002Resource unavailableRequested resource not availablenon-standard-32003Transaction rejectedTransaction creation failednon-standard-32004Method not supportedMethod is not implementednon-standard-32005Limit exceededRequest exceeds defined limitnon-standard-32006JSON-RPC version not supportedVersion of JSON-RPC protocol is not supportednon-standard对编码问题-32602Invalid params和-32000Invalid input是 EIP 中与参数本身有问题直接对应的两个码查不到资源如不存在的块对应-32001。分不清 Quantity 与 Data 时Block Identifier 对象EIP-1474 原文指出由于Data参数与Quantity参数无法清晰区分引用 EIP-1898 的格式来指定块。块参数可以是 JSON 对象字段为PropertyTypeDescriptionblockNumberQuantityThe block in the canonical chain with this numberblockHash与blockNumber互斥二者必须恰好设置一个DataThe block uniquely identified by this hashrequireCanonical可选boolean块不在 canonical chain 时是否抛错只能与blockHash同用默认falseEIP-1898 给出的受影响方法eth_getBalance、eth_getStorageAt、eth_getTransactionCount、eth_getCode、eth_call、eth_getProof。EIP-1898 还给出针对创世块的等价写法文档示例0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3是 Ethereum 主链创世块哈希earliest 0x0 { blockNumber: 0x0 } { blockHash: 0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3 } { blockHash: 0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3, requireCanonical: true }用blockNumber对象写法同时满足两条编码规则对象键明确声明了这是数量而不是数据blockNumber的值本身仍是合法Quantity。错误行为同样有规定块未找到时推荐抛-32001requireCanonical为true且块不在 canonical chain 时应抛不同于未找到的错误码推荐-32000以便调用方区分两种情况块未找到检查优先于 canonical 检查。限制EIP-1474 状态为Stagnant它描述的是该提案规定的 RPC 行为具体节点实现以各客户端为准。EIP 中对关键字MUST、SHOULD 等的解释依据 RFC-2119本文按必须/应当理解。eth_estimateGas的返回值可能显著高于交易实际使用的 gasEIP 原文提示了这一点不要把估算值当成固定预期。按上面顺序操作一次调用即可完成核对先用两条自检表检查params里每个Quantity/Data字段发出请求后看result是否存在、返回的十六进制值是否合规出现error时按错误码表对照-32602、-32000、-32001定位是编码、缺参还是资源问题。【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考