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;
}
}
Ich glaube, das block.timestamp
ist 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.
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.
Richard Horrocks
Krunal Soni