Blockchain

如何使用 eth_abi 編碼除參數之外的函式簽名

  • November 16, 2021

我想使用 python 對合約的函式簽名以及參數和值進行編碼,更明確地說是 eth_abi 庫。


tokenA = "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"
tokenB = "0xe9e7cea3dedca5984780bafc599bd69add087d56"

abiEncoded = eth_abi.encode_abi(['address', 'address'], [tokenA, tokenB]).hex()

上面的程式碼對參數工作得很好,並返回了預期的結果,但是我不確定如何在 hash 中添加前導 4bytes (big-endian encoding) 簽名。

預期結果 0xe6a43905000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d56

我的結果 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d56

好吧,您的庫似乎沒有提供與 keccak256 的 abi.encodeWithSignature 的直接等效項,後者是必需的,以便獲取函式標識符。

您正在尋找的那 4 個字節是我剛才談到的內容的一部分:函式標識符。基本上,這些是函式簽名的 keccak256 的前 4 個字節。

0xe6a43905是 keccak256 的前 4 個字節:getPair(address,address)

使用 pysha3 模組的極簡解決方案:

import sha3
k = sha3.keccak_256()
k.update(b'getPair(address,address)')
print (k.hexdigest()[:8])
# OUTPUTS : e6a43905

但是您最好使用最新的Web3py,它包含您可能需要執行此類任務的每個輔助函式。

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