In Solidity sind einige Eigenschaften wie z. B. block.timestamp
von Minern angreifbar und nicht (stark) durch das Protokoll geschützt. Wie wäre es block.number
, könnte ein Miner eine zufällig hohe Zahl einführen?
BEARBEITEN: Ich denke darüber nach, ein Spiel zu sichern, das Aktionen wie eine Auszahlung nach Ablauf einer bestimmten Zeitspanne erleichtert.
Die Blocknummer ist per Definition immer korrekt: Es ist die Nummer x in der Kette, weil sie über x-1 verkettet ist.
Wie Sie jedoch sagen block.timestamp
, kann ein wenig gespielt werden - oder mit der Zusammenarbeit der wirtschaftlichen Mehrheit der validierenden Knoten viel - was auch bedeutet, dass das Verhältnis von block.number
zur tatsächlichen Zeit gespielt werden kann. Wer also nicht darauf vertraut, dass a block.timestamp
vom 01.01.2017 wirklich ungefähr der 01.01.2017 sein wird, der kann sich auch nicht darauf verlassen, die Blöcke zu zählen, die bis zum 01.01.2017 abgebaut werden sollen.
PS. Die Leute können Ihnen möglicherweise hilfreichere Ratschläge geben, wenn Sie uns mitteilen, für welchen Zweck Sie sicher sein möchten und wovor Sie sicher sein möchten.
So if you don't trust that a block.timestamp of 2017-01-01 will really be approximately 2017-01-01, you can't rely on counting the blocks that are supposed to be mined between now and 2017-01-01 either.
: Wenn mein Spiel bei Blocknummer 1M beginnt und 100 Blöcke bis zur Auszahlung dauern sollte, könnte ich einfach überprüfen, ob wir bereits Block 1'000'100 erreicht haben. Ich vertraue hier dem Konsensalgorithmus, dass die Zeit dazwischen 100 * 14 Sekunden betrug und nicht nur ein einzelner Miner.block.number
ist es wesentlich sicherer als block.timestamp
das, was (bis zu einem gewissen Grad) von einem einzelnen Miner manipuliert werden kann. Da die Blockzeit nicht konstant ist, ist dies jedoch nur dann eine praktikable Lösung, wenn die genaue Zeit nicht benötigt wird. Richtig?block.timestamp
er innerhalb des Blockfensters leicht und kostenlos manipuliert werden kann (dh wenn Sie 15 Sekunden nach dem letzten Block abgebaut haben, könnten Sie es so tun). B. 3 Sekunden nach dem letzten Block), aber die Präzision, die Sie bei diesem Angriff verlieren, geht bereits verloren, wenn Sie Blockhöhe verwenden.block.timestamp
wenn es Ihnen um menschliche Zeit geht, um etwas über soziale Kanäle herauszufinden, oder Blockhöhe, wenn Ihnen die Möglichkeit wichtig ist, eine Transaktion durch einen automatisierten Prozess zu senden, oder beides, wenn Sie sich darum kümmern beide. 100 Blocks fühlt sich ein bisschen grenzwertig an.
Edmund Edgar
Mikko Ohtamaa
block.timestamp
Spekulationen in der Regel unbegründet sind.block.timestamp
ist in realen Szenarien sehr sicher.block.timestamp
ist für 99 % der Anwendungsfälle sicher. Wenn Sie Angst vor dem Frontrunning-Problem haben, dann löst die Verwendungblock.number
es nicht wirklich. Wenn Sie befürchten, dass Bergleute Ihre Transaktion durcheinander bringen, dann haben Sie eine Möglichkeit für andere Angriffsvektoren, die die Verwendungblock.number
nicht löst.