调用Geth的eth_sign方法报invalid argument 0错误的原因排查
错误原因解析
问题核心
你调用的eth_sign方法参数格式完全不符合规范,导致Geth无法解析参数。
你发送的请求参数(错误示例)
{ "jsonrpc":"2.0", "id":1, "method": "eth_sign", "params": [ { "from": "0xDc89096c0E279933a7C99e13f1474A0a84320207", "gas": "0x55555", "maxFeePerGas": "0x1234", "maxPriorityFeePerGas": "0x1234", "input": "", "nonce": "0x0", "to": "0xCdde93eEDC6c911D33E7fe41DC05208E0630a4c0", "value": "0x1234" } ] }
收到的错误
{ "jsonrpc": "2.0", "id": 1, "error": { "code": -32602, "message": "invalid argument 0: json: cannot unmarshal non-string into Go value of type common.Address" } }
具体原因
eth_sign方法的参数要求是两个字符串:
- 第一个参数:要签名的账户地址(字符串格式)
- 第二个参数:要签名的数据(16进制字符串格式,通常以
0x开头)
而你传入的第一个参数是一个交易对象(JSON对象),不是字符串格式的地址,Geth试图把这个对象解析成common.Address类型(Go语言的地址类型,要求为字符串),因此抛出了"无法将非字符串反序列化为common.Address类型"的错误。
另外,如果你是想签名并发送交易,应该使用eth_sendTransaction或eth_signTransaction方法,而非eth_sign。eth_sign是用来对任意数据进行签名,并非处理交易的接口。
正确的eth_sign调用示例
{ "jsonrpc": "2.0", "id": 1, "method": "eth_sign", "params": [ "0xDc89096c0E279933a7C99e13f1474A0a84320207", "0x48656c6c6f20576f726c64" // 对应"Hello World"的16进制编码 ] }
若要处理交易的正确调用示例(eth_signTransaction)
如果你是要签名交易,应该使用eth_signTransaction,参数为交易对象:
{ "jsonrpc": "2.0", "id": 1, "method": "eth_signTransaction", "params": [ { "from": "0xDc89096c0E279933a7C99e13f1474A0a84320207", "gas": "0x55555", "maxFeePerGas": "0x1234", "maxPriorityFeePerGas": "0x1234", "input": "", "nonce": "0x0", "to": "0xCdde93eEDC6c911D33E7fe41DC05208E0630a4c0", "value": "0x1234" } ] }
内容的提问来源于stack exchange,提问作者Mahsum Akbas
相关产品推荐
相关产品推荐

