Solidity

計算 Keccak256 inline solidity 組件時出現氣體異常

  • April 1, 2018

我正在嘗試編寫一個簡單的函式,它應該使用 Solidity 內聯彙編函式返回傳入 uint 的 Keccak256,但是當嘗試在 remix 上執行函式時,它會返回氣體異常,有人可以幫我解決這個問題嗎?

  pragma solidity ^0.4.18;


contract HashedTimelock {


       address sender = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c;
       address receiver = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
       bytes32 hashlock = 0x731dc163f73d31d8c68f9917ce4ff967753939f70432973c04fd2c2a48148607; // sha-2 sha256 hash
       uint  timelock = 1522660821; // UNIX timestamp seconds - locked UNTIL this time

  function HashedTimelock() payable{}


   function withdraw(bytes32 _preimage)
       external returns(bytes32 sample)
   {
       uint  timenow = now;
       assembly {
           // first check if the pre image matches with internal hashlockMatches
           // check the timelock
           // use selfdestruct to transfer the funds
           if eq(1,lt(timenow, sload(timelock_slot))){
              let selfptr := mload(add(_preimage, 0x20))
              sample := keccak256(selfptr, 32)

           }
       }

   }



}

這是我想出的解決方案。

function withdraw(bytes32 _preimage)
   external view returns(bytes32 sample)
{
   uint  timenow = now;
   assembly {
       let freemem_pointer := mload(0x40)
       mstore(add(freemem_pointer,0x00), _preimage)
       sample := keccak256(freemem_pointer, 32)
       }

}

首先,我將函式更改為 a view,因為目前您不會更改合約的狀態。

其次,關於程式碼本身,keccak256必須在記憶體中的數據上使用,根據文件here(您可以在黃皮書中找到相同的資訊)。所以,我們需要先將數據寫入記憶體。這篇文章告訴你更多關於你可以在哪裡寫的資訊。

一旦完成,就結束了。您只需分配samplekeccak256.

keccak256PS:既然該功能已經在 Solidity 中實現,為什麼要為此使用彙編?

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