Solidity
msg.data 可以用作標識符嗎?
我正在查看這裡的多重簽名錢包實現,我看到 sha3(
msg.data
,block.number
) 的用法被用作標識符。裡面到底是什麼
msg.data
,為什麼它足夠獨特,可以用來製作標識符?它不只包含有關如何呼叫契約的資訊嗎?如果我用相同的參數呼叫契約,這意味著它會是一樣的嗎?
msg.data
通常是ABI編碼資訊,向合約指示要呼叫的函式和參數。如果使用相同的參數呼叫合約,使用標準工具
msg.data
將是相同的。但是,對於每個塊,使用block.number
as in對其進行散列sha3(msg.data, block.number)
將產生完全不同的結果。注:
msg.data
具有延展性。 例如,可以在msg.data
不更改將在合約中呼叫的函式的情況下附加額外的尾隨零。使用標準工具(如 web3.js)不會創建額外的尾隨零,但您應該在msg.data
用作標識符時檢查您的案例,以確保延展性不會導致問題或漏洞。(在問題中的特定錢包案例中,
msg.data
所有者的延展性似乎只會對他們自己或其他所有者造成混淆。)