Blockchain
如何使用 eth_abi 編碼除參數之外的函式簽名
我想使用 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,它包含您可能需要執行此類任務的每個輔助函式。