cosmos/ethermint

An example of using eth_getProof is needed

zhiqiangxu opened this issue · 2 comments

For native cosmos proof, we can use merkle.ProofRuntime's VerifyValue against Header.AppHash.

But how to do that with the proof returned by eth_getProof?

The proof returned by eth_getProof is like this:

{"address":"0x2a88feb48e176b535da78266990d556e588cfe06","balance":"0x0","codeHash":"0x45b501b894b983d55f8ecf35d15c48ea02031f475cdaf7cfb7727bf017f649a6","nonce":"0x1","storageHash":"0x0000000000000000000000000000000000000000000000000000000000000000","accountProof":["ops:\u003ctype:\"iavl:v\" key:\"\\001*\\210\\376\\264\\216\\027kS]\\247\\202f\\231\\rUnX\\214\\376\\006\" data:\"\\351\\010\\n\\346\\010\\n.\\0102\\020\\214\\255\\250\\002\\030\\227\\274\\220\\001* Ws;\\216\\201\\342\\254\\0243\\344\\350\\025\\270k\\234-\\260\\353\\n\\007v\\257P\\022^\\277\\037\\224\\374N\\221\\236\\n.\\0100\\020\\212\\255\\236\\001\\030\\227\\274\\220\\001* \\363\\315\\350T\\005\\022\\\"N\\326|EVr\\230\u0026\\322/\\025JuNV\\3259\\324$\\266\\224\\023\\215\\037\\017\\n-\\010.\\020\\267\\227O\\030\\227\\274\\220\\001\\\" nXp\\265D\\241\\377\\340\\000p\\346K\\221@]\\250\\210(\\232u\\346\\306f\\326}z\\277\\225q\\014HJ\\n-\\010*\\020\\207\\314'\\030\\227\\274\\220\\001* \\024\\363\\325\\357\\006g\\222z\\036\\305\\243\\177\\307\\003(^\\016\\312\\024\\027g\\3219\\265\\200ip\\252\\201\\243~\\325\\n-\\010(\\020\\344\\350\\023\\030\\227\\274\\220\\001* \\304\\364\\250\\210\\322\\361Q\\346\\230Q/\u0026\\356\\033e\\371H\\242\\335\\214\\231l\\262YnA\\372\\366\\360\\357z\\336\\n-\\010\u0026\\020\\224\\362\\t\\030\\227\\274\\220\\001\\\" \\263\\351\\226)z\\272\\343\\221 \\273p\\340\\360\\000\\035\u003cS\\321\\337\\034\\004\\262B#\\032*\\035\\272mv\\352h\\n-\\010$\\020\\263\\367\\004\\030\\227\\274\\220\\001\\\" Fo\\261\\177\\360\\377I\\262\\010\\016\\316\\324\\337V\\336)\\370\\356\\346+Y\\216\\203\\224\\257\\313\\320\\214U\\332\\330\\225\\n-\\010\\\"\\020\\276\\274\\002\\030\\214\\274\\220\\001\\\" \\345\\202\\270`o}\\016\\271mr\\340\\t\\237\\326\\200\\031\\271\\237\\244pYl\\233rgN\\2053V[\\220\\357\\n-\\010 \\020\\227\\236\\001\\030\\374\\273\\220\\001\\\" \\262\\304\\214k+\\022\\026\\252\\353\\306\\340\\204\\2753\\272\\020\\355\\204\\323\\177\\363\\253\\005`\\344\\224S\\226\\224\\026\\307\\245\\n,\\010\\036\\020\\357O\\030\\372\\273\\220\\001\\\" -+R|?\\200\\304\\276\\211\\0201\\265\\357\\346\\365`\\254V\\025\\370c \\260\\315\\242\\324\\3539\\275\\021\\251\\242\\n,\\010\\034\\020\\263'\\030\\372\\273\\220\\001* f{\\371\\213a\\206.\\201d\\337\\247\\024\\031\\324\\372\\022\\327\\215\\356!2\\362\\253\\246-\u0026g\\303'\\231\\010\\273\\n,\\010\\032\\020\\214\\023\\030\\212\\272\\220\\001* \\\\_Q\\237\\023\\3328p=\\223\\003\\263m\\320\\216\\332\\366\\007\\350\\360\\315\\366:\\317\\231\\3169\\345w\\375;(\\n,\\010\\030\\020\\251\\t\\030\\204\\270\\220\\001\\\" \\315\\312\\342o\\273R\\001,\\201\\255\\2124\\rm\\031r\\204\\3125\\224\\224\\252x\\024\\221gD-mI \\224\\n,\\010\\026\\020\\335\\004\\030\\201\\267\\220\\001\\\" u\\217X\\0368\\210q\\242\\207K\\351D7\\372\\177\\335\\000\\213\\r\\343\\240\\354\\356\\270\\036Ts$\\304\\0235\\247\\n,\\010\\024\\020\\306\\002\\030\\201\\267\\220\\001* \\2344\\244yd\\305\\004\\344G\\211+\\371]\\242\\357\u003c\\377\\221\\373eV\\226\\355\\254\\253\\341z\\3723\\326\\215\\027\\n,\\010\\022\\020\\244\\001\\030\\201\\267\\220\\001* \\210l\\342\\243\\324\\343O\\321~`\u003c\\331jv\\201%\\360\\031\\025\\\"\\222\\213\\002\\311P\\2365\\016-Yz\\273\\n+\\010\\020\\020Z\\030\\201\\267\\220\\001* 3K\\277\\257\\021\\\\\\000\\245\\313$\\376~\\200\\301\\2251/\\264t\\030\\335\\276\\361\\303\\210*\\357Y\\236\\213\\276\\226\\n+\\010\\014\\020$\\030\\321\\216\\217\\001\\\" lf\\033\\331n_\\030\\356Y\\276H\u0026\\216\\347\\021B\\354\\245\\036\\343\\253\\365(\\355N$v5\\264\\226\\210l\\n+\\010\\n\\020\\022\\030\\321\\216\\217\\001\\\" \\375\\3067\\360\\233@\\023C\\3161\\234\\347\\341\\345\\344\\261F\\230\\207\\304\\317\\2763o\\300\\235\\016\\352\\321L\\2468\\n+\\010\\010\\020\\013\\030\\321\\216\\217\\001\\\" \\315gb\\031\\266\\251\\241\\035\\302\\365\\351P\\270\\242\\353\\244)\\246\\272\\212\\255\\255+ \\236\\374\\245\\326\\277\\277\\024\\222\\n+\\010\\006\\020\\007\\030\\321\\216\\217\\001* ;;\u003e_\\216\\2700\\246\\nF\\234-\\3564\\245\\001c\\315^d\\020\\372B\\273\\334S\\306\\372\\356$\\323,\\n+\\010\\004\\020\\004\\030\\321\\216\\217\\001* \\343\u0026f\\025\\223\\307\\014M\\020\\351\\223\\377\\230\\240P\\2759o\\036\\347\\300\\210\\215\\324\\3607\\222\\322,\u003e\\363}\\n+\\010\\002\\020\\002\\030\\321\\216\\217\\001\\\" \\344\\377\\246Ne\\227D\\230\\007\\320\\002\\377??#\\024I\\024\\033\\362\\265\\2711\\301\\271\\371\\216\\364\\344\\320\\2536\\032\u003e\\n\\025\\001*\\210\\376\\264\\216\\027kS]\\247\\202f\\231\\rUnX\\214\\376\\006\\022 \\031\\276\\221s\\345i8\\232\\336\\326\\277\\303\\357\\215\\303u\\274\\2330\\243\\001;\\370\\215\\212\\212Z\\247{K\\350\\362\\030\\321\\216\\217\\001\" \u003e ops:\u003ctype:\"multistore\" key:\"acc\" data:\"\\207\\007\\n\\204\\007\\n4\\n\\007ammswap\\022)\\n'\\010\\227\\274\\220\\001\\022 _\\3356\\310\\215\\3706\\236\\320ef\\002\\316:\\355Z\\237\\222cY\\341\\007\\207e\\216\\330\\303\\320R\\014\\244\\203\\n\\017\\n\\004lock\\022\\007\\n\\005\\010\\227\\274\\220\\001\\n0\\n\\003dex\\022)\\n'\\010\\227\\274\\220\\001\\022 v3G\\255]\\222m\\257\\226\\330\\316\\360\\227\\202\\255/x\\323\\036v\\310\\013z\\350h_\\226JL\\370\\007\\337\\n5\\n\\010slashing\\022)\\n'\\010\\227\\274\\220\\001\\022 \\014\\327L\\266\\207\\202\\217;-@\\252\\334\\2373z\\nV\\301wK3\\332|\\t[\\241\\tR\\325\\330]\\007\\n4\\n\\007staking\\022)\\n'\\010\\227\\274\\220\\001\\022 \\277\\034\\270{\\200\\252B\\304\\375\\325\\253ao@\\347N\\356\\020\\000|]J\\327D\\\"\\267\\376Wy\\035=\\247\\n9\\n\\014distribution\\022)\\n'\\010\\227\\274\\220\\001\\022 tb.\\2619[/\\236\\264o/\\263\\1776\\326S\\3716A\\007,\\356\\017\\245\\2431[\\356\\2573\\347\\337\\n7\\n\\ntoken_pair\\022)\\n'\\010\\227\\274\\220\\001\\022 u~$\\270\\231\\027\\242\\365.\u0026\\276\\273\\035i\\013\\346\\302\\037eRc\\227$\\312M\\210\\365\\322\\261t\\316\\315\\n0\\n\\003acc\\022)\\n'\\010\\227\\274\\220\\001\\022 \\203\\017K\\352\\3664\\373\\310\\240\\013g\\016\\252f\\3538`\\202\\3131r\\322\\3748\\225\\275\\035\\014c\\340\\367\\374\\n3\\n\\006params\\022)\\n'\\010\\227\\274\\220\\001\\022 Q\\261\\345\\252UW\\177\\344d\\362\\306\\002{\\033!\\020\\371\\310}\\253|S\\2139\\302\\3356l\\342\\365\\244\\262\\n0\\n\\003evm\\022)\\n'\\010\\227\\274\\220\\001\\022 \\273m(\\372\\024Q(\\005\\026\\000\\367\u003c\\243\\245X\\307:\\337^Jc\\347,\\226\\322\\022\\201\\300\\210\\200\\234\\354\\n\\023\\n\\010evidence\\022\\007\\n\\005\\010\\227\\274\\220\\001\\n2\\n\\005order\\022)\\n'\\010\\227\\274\\220\\001\\022 k\\\"\\316\\266\u003c\\013\\350\\307\\211_\\350\\020\\024\\212|\\253v\\030\\270g\\200r\\366\\347R]\u003c\\177\\370\\023\\314\\352\\n2\\n\\005token\\022)\\n'\\010\\227\\274\\220\\001\\022 \\314\\031\\353\\274\\252\\265\\227\\343\\276#\\300)C\\325\\312\\240\\21607#i\\001\\341\\247\\265\\216\\345r\\371\\026\\377\\204\\n0\\n\\003gov\\022)\\n'\\010\\227\\274\\220\\001\\022 \\227\\357t\\0355\\341\\356P\\003\\320To{n;=\\374\\355\\267\\020;*\\266\\301\\232\\371{\\352\\220/\\177\\373\\n1\\n\\004farm\\022)\\n'\\010\\227\\274\\220\\001\\022 \\036A z6\\350\\3745\\323\\2638\\030\\334M\\334;\\235jE\\227\\361u\\322S\\263,\\210\\2517\\242{V\\n3\\n\\006supply\\022)\\n'\\010\\227\\274\\220\\001\\022 \\033Dv\\010\\356\\271R\\257\\224\\373\\234\\347\\242\\352\\347ZE\\203p)o\\242\\036\\232\\235\\014\\000Q\\340\\025\\027\\270\\n1\\n\\004main\\022)\\n'\\010\\227\\274\\220\\001\\022 \\261\\234\\360\\230\\264;\u003c}Ty\\237\\357\\tD\\252\\225\\t\\237\\202\\335\\302\\031\\372\\014\\200\\222\\344R\\242\\202\\277A\\n\\022\\n\\007upgrade\\022\\007\\n\\005\\010\\227\\274\\220\\001\\n1\\n\\004mint\\022)\\n'\\010\\227\\274\\220\\001\\022 G\\240\\rt\\372\\252C\\317\\373\\343\\264\\350\\021\\312\\341\\351N\\317\\360\\247o4\\202\\026x\\020\\271*\\211\\277\\253\\217\" \u003e "],"storageProof":[{"key":"0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49","value":"0x4784eefeda430bc9d5b38bcb4087cb9af36aafa6fb02df2ad9af911bdd532611","proof":[""]}]}

UPDATE

I tried to verify the okexchain(which is based on ethermint)'s proof the same as other ethereum forks here:

https://github.com/zhiqiangxu/okex-verify/blob/master/main.go#L106

but in the end got an error saying:

proof node 0 (hash 84d45200a5b3e03ba79acff3bc83a3fdbf232cedf646a74e4b49174f62efccfb) missing

the 84d45200a5b3e03ba79acff3bc83a3fdbf232cedf646a74e4b49174f62efccfb is the hex of Header.Root of the header verifying against.

hey @zhiqiangxu, as far as I understand, eth_getProof is the RPC endpoint to proof an account value in evm module merkle tree which is a different storage from other cosmos modules. I'm not sure if they are compatible. Here and here are some info about how to use eth_getProof, hope they're useful to you .

@freddyli7 Thanks for your reply.

But this issue is not about the usage of eth_getProof itself, but rather how to use the ethermint adapted version of eth_getProof.

I have used eth_getProof to verify heco/ethereum/bsc transactions before(with code like this), their eth_getProof is standard and works very well.

One weird thing I found is that the ethermint eth_getProof returns only account proof, no storage proof, as can be checked in the eth_getProof response pasted above, the storage value does exist, but the storage proof is empty.