Ich versuche, eine einfache Funktion zu schreiben, die mir Keccak256 eines eingehenden uint mit der Solidity-Inline-Assembly-Funktion zurückgeben sollte, aber es gibt mir keine Gasausnahme zurück, wenn ich versuche, die Funktion auf Remix auszuführen, kann mir jemand helfen, das Problem hier zu beheben?
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)
}
}
}
}
Hier ist die Lösung, die ich mir ausgedacht habe.
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)
}
}
Erstens habe ich die Funktion in a geändert, view
da Sie den Vertragsstatus vorerst nicht ändern.
Zweitens muss der Code selbst gemäß der Dokumentation hierkeccak256
für Daten im Speicher verwendet werden (dieselben Informationen finden Sie im gelben Papier ). Also müssen wir die Daten zuerst in den Speicher schreiben. In diesem Beitrag erfahren Sie mehr darüber, wo Sie es schreiben können.
Wenn es fertig ist, ist es vorbei. sample
Sie müssen nur das Ergebnis von zuweisen keccak256
.
PS: Warum Assembler dafür verwenden, da die keccak256
Funktion bereits in Solidity implementiert ist?
Elisa Drion
NaN
Aniket
NaN
Elisa Drion
let selfptr := mload(add(_preimage, 0x20))
Elisa Drion
NaN