Solidity

Solidity:有沒有辦法儲存solidity程式碼的開始時間?now() 函式僅返回 block.timestamp

  • November 19, 2019

我想獲得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每次都會返回。沒有其他隱藏的寶石可以幫助獲得預期的結果。

另外值得一提的是,所有的處理和結果都需要被所有節點複製,現在和將來。諸如持續時間或給定節點的準確時鐘之類的主觀因素將不起作用,因為它不是確定性的。因此,我認為理論上是不可能的。

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/77599