Solidity
計算 Keccak256 inline solidity 組件時出現氣體異常
我正在嘗試編寫一個簡單的函式,它應該使用 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(您可以在黃皮書中找到相同的資訊)。所以,我們需要先將數據寫入記憶體。這篇文章告訴你更多關於你可以在哪裡寫的資訊。一旦完成,就結束了。您只需分配
sample
給keccak256
.
keccak256
PS:既然該功能已經在 Solidity 中實現,為什麼要為此使用彙編?