Contract-Development

長度參數在哪裡結束,實際字元串在 abi 編碼字元串中開始?

  • March 31, 2020

假設我決定對一個很長的字元串進行 ABI 編碼(出於這個問題的目的,我剛剛選擇了一個由https://www.lipsum.com/feed/html生成的任意 5 段 lorem ipsum 文本)並得到以下內容(縮短)abi 編碼字元串:

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000b63224c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e205072616573656e74207068617265747261206d61737361206e657175652c206964206665726d656e74756d207175616d20646170696275732073697420616d65742e2043726173206d6f6c65737469652066656c6973206163206d61737361207072657469756d2072757472756d2e205072616573656e7420616c69717565742c20657820696420617563746f72206f726e6172652c206e65717565206d65747573207665686963756c612070757275732c20657520706f72747469746f72206c6967756c6120747572706973207363656c657269737175652073617069656e2e2051756973717565206d6f6c6c69732075726e612065752073617069656e20657569736d6f642c2073697420616d65742070686172657472612065737420636f6e73656374657475722e20416c697175616d2076756c7075746174652074656d706f72207363656c657269737175652e204e756c6c616d20616320656c656d656e74756d2065782e204e756e632076656c2076756c707574617465206e657175652c2061742076656e656e61746973206a7573746f2e20416c697175616d207365642073656d206c6962657

我該如何解碼呢?我知道填充後字元串的前幾個十六進製字元用於指定長度,但是如何確定代表長度的十六進製字元在哪裡結束以及字元串的實際 utf-8 編碼從哪裡開始呢?

如果您使用的是 web3,則可以使用以下程式碼對其進行編碼:

web3.eth.abi.encodeParamter('string', <lorem_ipsum_text>)

然後,您可以使用以下內容對輸出進行解碼:

web3.eth.abi.decodeParamter('string', <lorem_ipsum_encoded_string>)


編碼基於契約 ABI 規範。很難通過,但這些文件有你問題的所有答案。

在您的範例中:

0000000000000000000000000000000000000000000000000000000000000020

這是字元串的位置(動態參數)。這是字元串所在的位置,但不是數據本身

0000000000000000000000000000000000000000000000000000000000000b63224c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e205072616573656e74207068617265747261206d61737361206e657175652c206964206665726d656e74756d207175616d20646170696275732073697420616d65742e2043726173206d6f6c65737469652066656c6973206163206d61737361207072657469756d2072757472756d2e205072616573656e7420616c69717565742c20657820696420617563746f72206f726e6172652c206e65717565206d65747573207665686963756c612070757275732c20657520706f72747469746f72206c6967756c6120747572706973207363656c657269737175652073617069656e2e2051756973717565206d6f6c6c69732075726e612065752073617069656e20657569736d6f642c2073697420616d65742070686172657472612065737420636f6e73656374657475722e20416c697175616d2076756c7075746174652074656d706f72207363656c657269737175652e204e756c6c616d20616320656c656d656e74756d2065782e204e756e632076656c2076756c707574617465206e657175652c2061742076656e656e61746973206a7573746f2e20416c697175616d207365642073656d206c6962657...

這是數據本身。解碼後,這將產生 Lorem Ipsum 文本。

引用自:https://ethereum.stackexchange.com/questions/82028