Solidity
Solidity:有沒有辦法儲存solidity程式碼的開始時間?now() 函式僅返回 block.timestamp
我想獲得solidity程式碼的開始時間,所以我使用了now() previous,它只在solidity啟動時返回block.timestamp。
有沒有辦法儲存或知道 Solidity 程式碼的開始時間,這在其他程式語言中通常是經過的時間。在 Javascipt 的情況下,計算程式碼的執行時間很簡單,如下所示。
var start; var end; var elapsed; function startTime() { start = new Date(); }; function endTime() { end = new Date(); elapsed = end - start; }
我試圖計算這樣的時間差,但它只顯示了 now 函式的塊時間戳。有什麼辦法可以在solidity中找到開始時間嗎?
最簡潔的答案是不。
您正在嘗試做的事情與該平台的工作方式無關。關於時間時間的正常假設不適用。關於執行時間的正常直覺不適用。
blockTime 是唯一的,無可否認的,與可用時間時間的連接。
我會再分解一下。
節點處理所有交易,但它們不會同時了解區塊。在時間方面,開始時間對於處理事務的每個節點都是唯一的。結束時也一樣。除了節點何時開始處理它,其他因素也在起作用,例如節點性能。
因此,開始時間取決於您觀察到的節點,結束時間也是如此。每個人都在不同的時間聽到這個區塊,他們是否聽到了一個已經處理過的交易——過去是由網路處理的。一個節點最希望做的就是盡快趕上“現在”。除了他們自己的表現之外,沒有辦法衡量交易的開始、完成或持續時間。交易在區塊到達之前就已經完成了。
將塊視為一組有序且即時執行的事務。這被認為發生的那一刻是該塊的時間戳。
pragma solidity 0.5.11; contract Elapsed { function stopwatch() public view returns(uint duration) { uint start = now; for (uint i=0; i<9999; i++) { // busy busy busy } uint end = now; duration = end - start; } }
這足以讓 Remix 佔用幾秒鐘,但它
0
每次都會返回。沒有其他隱藏的寶石可以幫助獲得預期的結果。另外值得一提的是,所有的處理和結果都需要被所有節點複製,現在和將來。諸如持續時間或給定節點的準確時鐘之類的主觀因素將不起作用,因為它不是確定性的。因此,我認為理論上是不可能的。
希望能幫助到你。