Documentation

了解日誌的低級介面

  • April 12, 2018

這個問題是關於日誌的低級介面,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
       );
   }
}

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