Ist der block.timestamp-Wert in Solidity Sekunden oder Millisekunden?

Ich block.timestampmöchte in einem meiner Verträge verwenden und ich möchte wissen, ob das block.timestampSekunden wie in Python oder Millisekunden wie in Java oder ein anderer Wert ist?

Kann es auch sicher verwendet werden, um block.timestampzu überprüfen, ob seit der letzten Aktualisierung 30 Tage vergangen sind oder ähnliches?

Das blocks.timestampist ein Unix-Zeitstempel. Es hat also die vollständigen Informationen über Datum, Stunden, Minuten und Sekunden (in UTC), als der Block erstellt wurde.
Ich danke Ihnen für Ihre Antwort. Ich weiß es sehr zu schätzen und für die Bereitstellung weiterer Details und Erläuterungen.
Bitte lesen Sie auch diesen Beitrag zum gleichen Thema: ethereum.stackexchange.com/questions/68064/…

Antworten (4)

Aus der Solidity-Dokumentation ( hier und hier ):

... Zeitstempel des aktuellen Blocks in Sekunden seit der Epoche

Zu deiner anderen Frage:

Ist es auch sicher, block.timestamp zu verwenden, um zu überprüfen, ob seit der letzten Aktualisierung 30 Tage vergangen sind, oder so etwas?

Ihre Frage ist nicht ganz klar, aber wenn Sie die Gültigkeit eines Zeitstempels über einen bestimmten Zeitraum in Frage stellen, sollte diese vorherige Antwort sie abdecken: Ist block.timestamp für längere Zeiträume sicher?

Danke für den Hinweis auf die Dokumentation. Ich habe es irgendwie vermisst, es sind Sekunden. Nehmen wir an, ich habe einen Zeitstempelwert festgelegt: lastUpdated in einem vorherigen Block. In einem zukünftigen Block überprüfe ich, ob lastUpdated die 30 Tage überschritten hat oder ob ich keine Aktion ausführen soll. Wäre das ein sicherer Scheck? Angenommen, der Zeitunterschied ist angemessen (Reihenfolge der Tage) und nicht zu nahe?
30 Tage werden gut funktionieren. Es sollte im schlimmsten Fall innerhalb einer halben Stunde oder so genau sein

block.timestampist ein uint256Wert in Sekunden seit der Epoche.

Es ist sicher zu vergleichen wie:

function f(uint start, uint daysAfter) {
    if (block.timestamp >= start + daysAfter * 1 days) { ... }
}

oder

if (block.timestamp > start + 30 days) { ... }

Zeiteinheiten sind hilfreich für einige Berechnungen mit der Einschränkung:

Vorsicht bei Kalenderrechnungen mit diesen Einheiten, denn nicht jedes Jahr hat 365 Tage und nicht einmal jeder Tag hat wegen Schaltsekunden 24 Stunden. Aufgrund der Tatsache, dass Schaltsekunden nicht vorhergesagt werden können, muss eine genaue Kalenderbibliothek von einem externen Orakel aktualisiert werden.

Wie definiere ich "Start"-Variable. Soll ich einfach machen: uint250 start = 1512918335?
start = block.timestamp(jetzt) ​​oder start = 23 daysetc
Es ist nicht sicher, auf diese Weise zu vergleichen, insbesondere für die von Ihnen gezeigte Logik, bei der Sie überprüfen, ob mindestens eine bestimmte Mindestzeit verstrichen ist, da block.timestampsie beliebig weit in der Zukunft liegen kann, solange sie größer als ist der übergeordnete Zeitstempel: ethereum.stackexchange.com/a/428/82179 ethereum.stackexchange.com/a/432/82179
@LukeHutchison ethereum.stackexchange.com/questions/5927/… hat einige Antworten, warum block.timestampes am Ende nicht beliebig weit in der Zukunft liegt.
@eth sieht so aus, als wären einige Implementierungen viel strenger als die Spezifikation. Danke für die Information.

1-timestamp ist der Unix-Zeitstempel, um ihn also in ein normales Datum umzuwandeln, verwenden Sie http://www.epochconverter.com/ , er gibt an, wann der Block erstellt wurde.

2-um zu antworten, ob es sicherer ist, block.timestamp <30 Tage zu verwenden: ja, weil der Miner den Zeitstempel um 900 Sekunden ändern könnte .

Schön, dass ich diesen Weg benutze, seit ich deinen Kommentar gesehen habe. Lassen Sie mich fragen: Falls ich die Tage im Konstruktor verbringen möchte, wie kann ich das tun? Muss ich Tage in Sekunden angeben oder darf sie beispielsweise wie "1 Woche" vergehen?

block.timestamp ist möglicherweise nicht die richtige Zeit, da sie vom Miner festgelegt wird. Daher hängt es von der Genauigkeit der Bergmannsuhr ab.

Der aktuelle block.timestamp muss größer sein als der übergeordnete block.timestamp. Dies wird im Protokoll festgelegt. Einige Blöcke haben sogar 1s Unterschied.

Blockchain hat keine Uhr, da dies eine Synchronisierung aller Knoten bedeuten würde, und das wäre fast unmöglich zu erreichen.