Events
dYdX 事件日誌簽名雜湊
dYdX 在他們的SoloMargin合約中有一個名為 LogDeposit(address indexed accountOwner, uint256 accountNumber, uint256 market, BalanceUpdate update, address from) 的事件。我正在嘗試使用以下程式碼為此獲取簽名雜湊:
from Crypto.Hash import keccak keccak_hash = keccak.new(digest_bits=256) keccak_hash.update(b'LogDeposit(address,uint256,uint256,BalanceUpdate,address)') print(keccak_hash.hexdigest())
這會產生以下簽名雜湊:ad66b490ac5d24d41e7e33a2a9ac6645bf66b577553f31d1e2917df2f83f15a6。但是,我認為這是不對的。當我在 etherscan 中搜尋此主題時,沒有返回任何內容。
我想知道它是否與 BalanceUpdate 參數有關。我習慣於搜尋地址和uint256等其他類型,但是我沒有見過,不知道我這樣做是否正確。
在計算使用結構的事件的簽名時,每個結構都表示為它包含的變數類型的元組。要為您的問題創建元組,我們需要查看
SoloMargin
.根據發佈到Etherscan的原始碼,我提取了創建事件所需的程式碼:
pragma solidity 0.5.7; pragma experimental ABIEncoderV2; contract SoloMiningLogEvent { struct Wei { bool sign; uint256 value; } struct Par { bool sign; uint128 value; } struct BalanceUpdate { Wei deltaWei; Par newPar; } event LogDeposit( address indexed accountOwner, uint256 accountNumber, uint256 market, BalanceUpdate update, address from ); }
我們可以看到它
BalanceUpdate
由兩個結構組成:
Wei
,一個元組(bool,uint256)
Par
,一個元組(bool,uint128)
所以我們的元組表示
BalanceUpdate
是:((bool,uint256),(bool,uint128))
因此,生成雜湊的整個簽名寫為:
LogDeposit(address,uint256,uint256,((bool,uint256),(bool,uint128)),address)
這導致雜湊:
0x2bad8bc95088af2c247b30fa2b2e6a0886f88625e0945cd3051008e0e270198f