Gasmangel bei der Berechnung der Keccak256-Inline-Festigkeitsbaugruppe

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)

            }
        }

    }



}
Können Sie uns Informationen über den Fehler geben? Vielleicht geben Sie den tx-Hash?
Aktualisiert mit dem vollständigen Code, den Sie in Remix ausprobieren können, ignorieren Sie bitte die globalen Speichervariablen, die derzeit nichts tun -
Benutzt du Rosten?
Nicht nur die Verwendung von Javasscript VM in Remix, um den Code zu testen, remix.ethereum.org/…
Ich werde später tiefer darauf eingehen, aber der Fehler ist drinlet selfptr := mload(add(_preimage, 0x20))
Auf den ersten Blick denke ich, dass es daran liegt, dass Sie versuchen, Daten von einer Adresse (im Speicher) zu laden, die nicht existiert.
Mein Motiv hier ist also die Berechnung des keccak (p, n) auf Assembly-Ebene von _preimage. Ich versuche, den eingehenden preimage-Wert zu nehmen und keccak zu berechnen und seinen Wert zurückzugeben, aber es gibt mir immer wieder keine Gasausnahme

Antworten (1)

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, viewda 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. sampleSie müssen nur das Ergebnis von zuweisen keccak256.

PS: Warum Assembler dafür verwenden, da die keccak256Funktion bereits in Solidity implementiert ist?

Das hat funktioniert, danke Elisha für die ausführliche Erklärung :) In Bezug darauf, warum ich Assembly verwende, wollte ich nur sehen, wie hoch die Ausführungsgaskosten für HTLC sind, wenn wir Solidity und Inline-Assembly verwenden, es ist ein Experiment