界: Time and State

分散型計算とは、時間と状態に関するものです。つまり、複数のコンポーネントが通信するためには、状態を共有しなければならず、そのためには時間がかかります。

ほとんどのプログラマーは、自分の仕事を人であるかのように考えています。彼らは、自分で仕事をしなければならない場合、自分がするのと同じように、1 つのスレッドのコントロールでプログラム全体を実行することを考えます。しかし、最近のコンピュータは、タスクの切り替えが非常に速く、マルチコア、マルチ CPU、分散システムなどでは、2 つのイベントが全く同時に発生することもあります。不具合は、プログラマーが考えたプログラムの実行方法のモデルと、現実に起きていることとのギャップを埋めるために押し寄せます。これらの欠陥は、スレッド、プロセス、時間、および情報の間の予期せぬ相互作用に関連しています。これらの相互作用は、セマフォ、変数、ファイル システムなど、基本的には情報を保存できるあらゆるものを含む共有状態を通じて行われます。

Often Misused: Block Values

Abstract
関数が、block.timestamp または block.number を時間のプロキシとして使用しています。
Explanation
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
[3] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 2
[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