トランザクションがブロックに取り込まれる順番はマイナーに依存するため、意図した順番でトランザクションが実行されないことがあります。
この問題はTransaction-Ordering Dependenceと呼ばれています。
サンプルコードを作成し、この問題を検証していきます、
実装
Transaction-Ordering Dependence問題を確認するための、サンプルコードは下記の通りです。
マーケットプレイスを表現したスマートコントラクトになります。
[ソースコード]
1 | pragma solidity ^0.4.11; |
このコードのポイントは次の通りです。
- 売り手がコントラクトを生成します。
- 買い手がコントラクトにトランザクションを発行することで購入が成立します。
- コントラクトは1個あたりの値段と在庫数をステートに保持しています。
- 値段はupdatePrice関数を実行することで、売り手が更新します。
- 買い手はbuy関数をetherの送金を伴う形で呼び出すことで購入可能です。
- 送金額がbuy関数の引数の購入数に1個あたりの値段をかけた値以上で、在庫がある場合に購入できます。
次回は、このスマートコントラクトをデプロイし、geth上で動作確認できるようにコントラクト変数を定義します。