Go-Ethereum

乙太坊交易收據中的有效載荷欄位有什麼用?

  • August 31, 2021

如以下交易收據所示:https ://www.etherchain.org/tx/0xf6769d28b35ac24e2e89b6cebc835c16c4e616bd6e2f96d0eea337c7bd02605f

什麼是有效載荷欄位,有什麼用途?如何在其中放入/獲取數據?是否有 web3 功能來操縱它?

您提到的有效負載是data事務中的欄位。您可以通過 web3 使用它。見這裡

data: String - (可選)包含消息相關數據的字節字元串,或者在合約創建交易的情況下,初始化程式碼。

有效負載告訴合約您要呼叫哪個函式,以及執行該呼叫的相應參數值。

有效載荷的結構

有效負載由 2 個主要部分組成 - 函式選擇器及其參數值。假設您想在特定合約中呼叫特定函式:

transfer(address,uint256)

這就是有效載荷的形成方式(請注意以下內容是十六進制序列化的):

  1. 函式選擇器 - 獲取函式字元串的 Keccak-256 散列的前 4 個字節以及參數類型。(例如前 4 個字節transfer(address,uint256)給你0xa9059cbb
  2. 參數值 - 假設您要轉移到地址0x337c67618968370907da31dAEf3020238D01c9de,並發送10000令牌。您需要將這兩個值分別填充到 32 個字節,這將分別給您0x000000000000000000000000337c67618968370907da31dAEf3020238D01c9de0x0000000000000000000000000000000000000000000000008ac7230489e80000。確保令牌的單位正確(例如 1 Ether 等於 10^18 wei)。

最後,刪除0x上面每個十六進制編碼數據的前​​ 2 個索引,並將它們連接起來形成一個巨大的字元串,它為您提供以下內容:( a9059cbb來自散列函式簽名)+ 000000000000000000000000337c67618968370907da31dAEf3020238D01c9de(來自地址參數)+ 0000000000000000000000000000000000000000000000008ac7230489e80000(來自uint256 發送的令牌數量參數)。

因此,數據有效載荷如下:

a9059cbb000000000000000000000000337c67618968370907da31dAEf3020238D01c9de0000000000000000000000000000000000000000000000008ac7230489e80000

這本身就足以告訴特定合約您正在呼叫哪個函式,以及作為參數提供給它的值。

來源%20are%20called%20Invocations.)

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