solidity高級理論(三):時間單位與view

solidity高級理論(三):時間單位與view

關鍵字:時間單位、view、Gas優化

solidity使用自己的本地時間單位

變量 now 將返回當前的unix時間戳(自1970年1月1日以來經過的秒數)。

注意:Unix時間傳統用一個32位的整數進行存儲。這會導致“2038年”問題,當這個32位的unix時間戳不夠用,產生溢出,使用這個時間的遺留系統就麻煩了。所以,如果我們想讓我們的 DApp 跑夠20年,我們可以使用64位整數表示時間,但爲此我們的用戶又得支付更多的 gas。

Solidity 還包含秒(seconds),分鐘(minutes),小時(hours),天(days),周(weeks) 和 年(years) 等時間單位。它們都會轉換成對應的秒數放入 uint 中。所以 1分鐘 就是 60,1小時是 3600(60秒×60分鐘),1天是86400(24小時×60分鐘×60秒),以此類推。

下面是一些使用時間單位的實用案例:

uint lastUpdated;

// 將‘上次更新時間’ 設置爲 ‘現在’
function updateTimestamp() public {
  lastUpdated = now;
}

// 如果到上次`updateTimestamp` 超過5分鐘,返回 'true'
// 不到5分鐘返回 'false'
function fiveMinutesHavePassed() public view returns (bool) {
  return (now >= (lastUpdated + 5 minutes));
}

view關鍵字

當用戶從外部調用一個view函數,是不需要支付一分 gas 的。

這是因爲 view 函數不會真正改變區塊鏈上的任何數據 - 它們只是讀取。因此用 view 標記一個函數,意味着告訴 web3.js,運行這個函數只需要查詢你的本地以太坊節點,而不需要在區塊鏈上創建一個事務(事務需要運行在每個節點上,因此花費 gas)。

所以,在查詢數據的時候最好放在帶有view的函數中。

注意:如果一個 view 函數在另一個函數的內部被調用,而調用函數與 view 函數的不屬於同一個合約,也會產生調用成本。這是因爲如果主調函數在以太坊創建了一個事務,它仍然需要逐個節點去驗證。所以標記爲 view 的函數只有在外部調用時纔是免費的。

知識星球二維碼380.png

發佈了44 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章