界: Time and State
分散式運算與時間和狀態相關。也就是說,為了使多個元件進行通訊,必須共用狀態,並且這一切都需要時間。
大多數的程式設計師將他們的工作擬人化。他們想採用一種控制執行緒來執行整個程式,就像他們必須自己完成這項工作一樣。但是,現代的電腦可以非常快速地切換工作,並且在多核心多 CPU 或分散式系統中,兩個事件可能恰好同時發生。瑕疵急於填補程式設計師在程式執行模型與實際情況之間的差距。這些瑕疵與執行緒、處理序、時間和資訊之間的意外互動有關。這些互動透過共用狀態發生:信號、變數、檔案系統,以及基本上任何可以儲存資訊的項目。
Often Misused: Block Values
Abstract
函數使用
block.timestamp
或 block.number
做為時間的 Proxy。Explanation
與
由於區塊鏈的去中心化性質,節點只能在一定程度上同步時間。使用
至於
範例 1:以下程式碼使用
block.timestamp
或 block.number
相關的值通常由開發人員用來觸發與時間相關的事件,但是,這些值通常給人一種用起來通常不安全的時間感。由於區塊鏈的去中心化性質,節點只能在一定程度上同步時間。使用
block.timestamp
充其量是不可靠的,在最壞的情況下,惡意挖礦者可以更改其區塊的時間,只要他們認為這樣做有好處。至於
block.number
,即使可以預測區塊之間的時間 (大約14秒),區塊時間也不是恆定的,並且可能會根據網路活動而異。如此一來,對於與時間相關的計算來說,block.number
並不可靠。範例 1:以下程式碼使用
block.number
,在一定時間過後才會解鎖資金。
function withdraw() public {
require(users[msg.sender].amount > 0, 'no amount locked');
require(block.number >= users[msg.sender].unlockBlock, 'lock period not over');
uint amount = users[msg.sender].amount;
users[msg.sender].amount = 0;
(bool success, ) = msg.sender.call.value(amount)("");
require(success, 'transfer failed');
}
References
[1] Enterprise Ethereum Alliance Don't misuse block data
[2] Standards Mapping - CIS Azure Kubernetes Service Benchmark 2.0
[3] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 2.0
[4] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 3
[5] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[6] Standards Mapping - Smart Contract Weakness Classification SWC-116
desc.structural.solidity.swc116