Events

dYdX 事件日誌簽名雜湊

  • November 8, 2019

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

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