Wie kann die Zeitdifferenz durch block.number berechnet werden und wie unterscheidet sie sich von block.timestamp?

Ich habe mir den kürzlich von einigen Entwicklern erstellten Code angesehen, sie verwenden block.number + numbers, um den Zeitunterschied zu berechnen. Wenn ich beispielsweise Gelder für etwa 6 Monate oder 180 Tage sperren möchte, verwenden Entwickler block.number + (einige berechnete Zahlen 1296000 Blöcke), um die Anzahl der freizugebenden Gelder zu berechnen.

Ich würde gerne wissen, wie diese Berechnung mit dem Zeitraum funktioniert. Und warum nicht stattdessen block.timestamp verwenden? Ist block.number zuverlässig?

Hier ist das Code-Snippet. Es ist im Grunde ein Tresor, der die Token 180 Tage lang aufbewahrt.

contract Vault is SafeMath {

    // flag to determine if address is for a real contract or not
    bool public isVault = false;

    Token token;
    address multisig;
    uint256 unlockedAtBlockNumber;
    // 1296000 blocks = 6 months * 30 days / month * 24 hours / day * 60 minutes / hour * 60 seconds / minute / 12 seconds per block
    //uint256 public constant numBlocksLocked = 1296000;
    // smaller lock for testing
    uint256 public constant numBlocksLocked = 12;

    /// @notice Constructor function sets the Lunyr Multisig address and
    /// total number of locked tokens to transfer
    function Vault(address _Multisig) internal {
        if (_Multisig == 0x0) throw;
        token = Token(msg.sender);
        multisig = _Multisig;
        isVault = true;
        unlockedAtBlockNumber = safeAdd(block.number, numBlocksLocked); // 180 days of blocks later
    }

    /// @notice Transfer locked tokens to multisig wallet
    function unlock() external {
        // Wait your turn!
        if (block.number < unlockedAtBlockNumber) throw;
        // Will fail if allocation (and therefore toTransfer) is 0.
        if (!token.transfer(multisig, token.balanceOf(this))) throw;
        // Otherwise ether are trapped here, we could disallow payable instead...
        if (!multisig.send(this.balance)) throw;
    }

    // disallow payment after unlock block
    function () payable {
        if (block.number >= unlockedAtBlockNumber) throw;
    }

}
Hi. Können Sie einen Ausschnitt des Codes bereitstellen, nach dem Sie fragen?
Richard, ich habe den ursprünglichen Beitrag mit dem Beispielcode aktualisiert. Es ist im Grunde ein Tresor, der die Token für 180 Tage anhält. Die Berechnung erfolgt durch Blocknummernberechnung. Ich möchte verstehen, wie die Blocknummer hilft, die genauen Tage zu berechnen, an denen die Vermögenswerte angehalten werden.

Antworten (2)

Ich glaube, das block.timestampist das Datum/die Uhrzeit der Wanduhr, zu der der Block abgebaut wurde. Eine Blocknummer, die in der Zukunft auf der Grundlage eines anderen Blocks festgelegt wird, basiert auf einer Schätzung der Rate des Blockabbaus. Zum Beispiel beträgt die durchschnittliche/Zielblockzeit zum Zeitpunkt des Schreibens etwa ~17 Sekunden. Wenn Sie also eine Zeit 24 Stunden in der Zukunft per Blocknummer festlegen möchten, können Sie mit 24 * 60 * 60 / 17(Anzahl der Sekunden an einem Tag dividiert durch die Anzahl der Sekunden pro Block) ungefähr bestimmen, welche Blocknummer zu diesem Zeitpunkt abgebaut wird. Beachten Sie, dass Sie für Zeiten in der mittleren und fernen Zukunft die Eiszeit berücksichtigen müssen: Die Rate der Blockgenerierung wird sich absichtlich verlangsamen, um eine Hard Fork für Proof-of-Stake und in zu fördern In der Zwischenzeit lässt die Rentabilität des Bergbaus mit fortschreitender Eiszeit erheblich sinken (wenn in Eth angegeben).

Hier ist ein Simulator, um sich ein Bild davon zu machen, was passiert: https://gist.github.com/CJentzsch/c78768f9837afb8eef74 Beachten Sie, dass die Geschwindigkeit der Verlangsamung durch eine neuere Änderung des Ethereum-Protokolls verlangsamt wurde, sodass der Simulator nicht mehr verfügbar ist des Datums.

Vielen Dank für die Klarstellung. Es macht mir mehr Klarheit über die Berechnung. Aus diesem Grund habe ich eine Frage zur Zeitberechnung. Wie sicher ist die Verwendung von now() + (6 * 30 Tage) zur Berechnung des Zeitraums? Ich habe irgendwo ohne viel Klarstellung gelesen, dass Miner mit dem Datum und der Uhrzeit spielen könnten.
Ich denke, der Konsensalgorithmus ermöglicht es Minern, mit dem Datum innerhalb einer kleinen Grenze herumzuspielen, um einen Konsens für die Uhrverschiebung zu schaffen; Ein Konsens für die Wall-Clock-Zeit ist erforderlich, da sie zur Berechnung der Zielschwierigkeit verwendet wird. Wenn es beispielsweise 5 Sekunden gedauert hat, einen Block zu finden, und das Ziel 15 Sekunden beträgt, muss die Schwierigkeit nach oben angepasst werden, um die Zeit beizubehalten. Wenn kein Konsens erforderlich wäre, könnte ein Miner die Zeit des Blocks auf ein weit in der Zukunft liegendes Datum festlegen und mehrere Blöcke „instaminieren“, da die resultierende Schwierigkeit gering wäre.
Umgekehrt könnte jemand mit einer großen Menge an Hashing-Power, der versucht, einen Denial-of-Service auszulösen, die Schwierigkeit im Verhältnis zu seiner Mining-Power stärker erhöhen, indem er es so aussehen lässt, als wären die Blöcke „instaminiert“. Daher denke ich, dass die Verwendung des Zeitstempels ziemlich sicher sein sollte, es sei denn, das Netzwerk wurde kompromittiert/bösartig (in diesem Fall könnte es größere Probleme als einen Smart Contract geben), aber Sie sollten warten, bis sich jemand anderes einmischt. Ich bin kein Experte auf diesem Gebiet und habe noch keine Smart Contracts geschrieben.

Der Zeitstempel kann leicht über kurze Intervalle gespielt werden. Wenn beispielsweise Block n um 13:30:00 Uhr abgebaut wird, kann der Miner von Block n+1 den nächsten Block um 13:30:01 Uhr mit einem Zeitstempel versehen, selbst wenn er ihn erst um 13:30:25 Uhr wirklich abgebaut hat.

Wenn Sie über lange Intervalle mit dem Zeitstempel herumspielen, dann verwirren Sie auch die Anzahl der Blöcke, da sich die Schwierigkeit an die Anzahl der generierten Blöcke an den schneller wahrgenommenen Zeitablauf anpasst.

Ich denke, die Leute verwenden Blockzählungen in diesen Langzeitbeispielen, weil sie sich dadurch wie Cyber ​​fühlen. Wenn der Zeitraum lang ist und Ihr Ziel Sicherheit ist, anstatt sich wie in einem Science-Fiction-Roman zu fühlen, verwenden Sie einen Zeitstempel.

Ja, abgesehen von einigen Dingen würde ich argumentieren, dass die Blockhöhe genauer ist. Bergleute können nicht mit der Blockhöhe spielen, wie sie mit einem Zeitstempel spielen können, also würde die Berechnung nach Blockhöhe Ihnen helfen, eine Obergrenze für den Betrag festzulegen. von Transaktionen, die eine Funktion in Ihrem Smart Contract treffen können, während Timestamp dies nicht tun kann.