Documentation
了解日誌的低級介面
這個問題是關於日誌的低級介面,Solidity 文件。
在給定的範例中,我們能夠正常發出事件:
pragma solidity ^0.4.0; contract ClientReceipt { event Deposit( address indexed _from, bytes32 indexed _id, uint _value ); function deposit(bytes32 _id) public payable { // Events are emitted using `emit`, followed by // the name of the event and the arguments // (if any) in parentheses. Any such invocation // (even deeply nested) can be detected from // the JavaScript API by filtering for `Deposit`. emit Deposit(msg.sender, _id, msg.value); } }
或者在低級別:
pragma solidity ^0.4.10; contract C { function f() public payable { bytes32 _id = 0x420042; log3( bytes32(msg.value), bytes32(0x50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb20), bytes32(msg.sender), _id ); } }
在範例之後有這個註釋:
其中長十六進制數等於
keccak256("Deposit(address,hash256,uint256)")
,事件的簽名。問題:
1)什麼是hash256?
2)為什麼不是字節32?
3)hash256 == bytes32?
更新:這是文件中的錯誤,已通過#3814拉取請求修復。
我在 remix 中嘗試了這個算法,結果發現給定的註釋具有誤導性(至少對我而言)。
工作範例是
bytes32(keccak256("Deposit(address,bytes32,uint256)"))
.因此,回答問題:
hash256 == bytes32
理論上是正確的,但是hash256
!=bytes32
當您需要將其作為參數傳遞給keccak256
函式時(是的,坦率地說,非常瑣碎)。工作範例:
pragma solidity ^0.4.21; contract Demo { event Deposit( address indexed _from, bytes32 indexed _id, uint256 _value ); function highLevelEvent() public { bytes32 _id = 0x420042; emit Deposit(msg.sender, _id, 123); } function lowLevelEvent() public { bytes32 _id = 0x420042; log3( bytes32(123), bytes32(keccak256("Deposit(address,bytes32,uint256)")), bytes32(msg.sender), _id ); } }