バックグラウンド
ブロックチェーン プラットフォームの各トランザクションはスマート コントラクトによって記述され、各トランザクションがチェーンに正常にアップロードされるには、まずマイナー (チェーンにアップロードされるノード、つまり新しいノード) によってマイニングされる必要があります。採掘されたブロックは検証のために検証者 (検証のためにブロックチェーンで採掘に成功したノード) に引き渡されます. 検証が成功した場合, ブロックはチェーンにアップロードされます; 検証が失敗した場合、データはチェーンへのアップロードを拒否されます。では、検証の成功と検証の失敗をどのように判断するのでしょうか。
まず、マイナーはローカルでトランザクションを実行します。つまり、実行のためにブロックチェーン プラットフォームのトランザクション キューからトランザクションの一部を取得し、特定のルール (コンセンサス) に従ってネットワーク全体の検証ノードに実行結果を送信します。機構)確認とまとめのため。検証ノードによって要約された結果がほとんどの結果を満たしている場合、つまり、実行後のトランザクション結果がマイナーによって送信された実行結果と同じである場合、検証ノードは同意し、結果が異なる場合は拒否します.
ただし、スマート コントラクトの実行プロセスでは、すべてのトランザクションがシリアルに実行されます。これは、既存のスマート コントラクトの仮想マシンには同時実行の機能がないため、現在のマルチコア プロセッサの時代では、これは間違いなく問題を引き起こします。ブロックチェーンのスループットが非常に低くなります。この投稿では、スマート コントラクトの実行に同時実行性を追加し、効率とスループットを向上させることができます。主に、ソフトウェア トランザクショナル メモリ システム (STM) を使用してスマート コントラクト トランザクションを同時に実行するための効率的なフレームワークを開発しています。
並列化プロセス
ブロックチェーンのスマートコントラクトで並列処理を行うためには、まずトランザクションの依存関係を解決する必要があります。ほとんどのスマート コントラクト トランザクションのデータ セットからわかることは、トランザクション依存関係のあるトランザクションはトランザクション全体の 20% しか占めていないということですが、正確性を確保するために、一連のトランザクションにトランザクション依存のトランザクションがあることを分析する必要があります。トランザクション セット。つまり、トランザクション依存関係を持つすべてのトランザクションに対してトランザクション依存関係グラフを作成し、トランザクション セット内のすべてのトランザクションに対してトランザクション依存関係パーティションを作成し、これらのトランザクション依存関係パーティションを異なるスレッドに割り当てて実行する必要があります。すべてのトランザクションを実行する 1 つのスレッドは非効率性に依存します。
この記事では、データベース管理システムの複数の同時実行プロトコルをスマート コントラクトに導入することでスマート コントラクトの並列化を実現し、複数バージョンのデータベース システムを組み合わせて最適な同時実行制御モデルを見つけることも紹介します。導入された最終的な比較モデルには、Basic Time Stamp Ordering (BTO)とMulti-Version Time stamp Ordering (MVTO)が含まれます。マルチスレッド実行の効果により、シリアル実行と比較してマイニング実行で3.6倍、3.7倍、バリデータ検証で40.8倍、47.1倍の効率を実現しています。
トランザクションはパーティションに依存します
しかし、競合する 2 つのトランザクションについてはどうでしょうか。例:
(a) この図の (a) は、並行して実行される 2 つのトランザクション T1 と T2 が、ブロックチェーン内のデータに属する同じデータ x を書き込むことを示しています。図 (b) と (c) は主に、競合するトランザクションが異なる順序で実行されると、結果が異なることを示しています。つまり、トランザクション T1 とトランザクション T2 が同じデータに対してトランザクション競合を起こしている場合、マイナーが並列に実行されると、T1 が最初に実行され、T2 が後で実行され、x の最終的な値は 20 になります。 while in the verifier 並列実行を行うと、T2 が先に実行され、T1 が後で実行されるため、x の値は 10 になります。
他の論文の上記の問題に対するこの解決策は、トランザクションの依存関係を持つトランザクション間にロックを構築して、トランザクションをロールバックできるようにし、最終的にトランザクションの実行がシリアル実行であることを保証することです。
この記事で採用しているのは、ソフトウェア トランザクション メモリでタイムスタンプ プロトコルを使用して、最終結果の一貫性を確保することです。ソフトウェア トランザクショナル メモリでタイムスタンプ プロトコルを使用すると、上記の問題を解決できるのはなぜですか? タイムスタンプ プロトコルが実際に何を達成するかをご覧ください...
タイムスタンプ プロトコル
単一バージョン タイムスタンプ プロトコル
基本的な定義
-
タイムスタンプ ソート プロトコルは、タイムスタンプに基づいてトランザクションをソートするために使用されます。トランザクションの順序は、トランザクション作成の昇順に他なりません。
-
古いトランザクションは優先度が高いため、最初に実行されます。トランザクションのタイムスタンプを決定するために、プロトコルはシステム時間または論理カウンターを使用します。
-
実行時に競合するトランザクションのペア間の順序を管理するために、ロックベースのプロトコルが使用されます。ただし、トランザクションが作成されると、タイムスタンプ ベースのプロトコルが機能し始めます。
-
T1 と T2 の 2 つのトランザクションがあるとします。トランザクション T1 が 007 時刻にシステムに入り、トランザクション T2 が 009 時刻にシステムに入ったとします。T1 は優先度が高いため、最初にシステムに入り、最初に実行されます。
-
タイムスタンプ順序付けプロトコルは、データに対する最後の「読み取り」および「書き込み」操作のタイムスタンプも維持します。
基本的
基本的なタイムスタンプ順序付けプロトコルは次のように機能します。
- トランザクション Ti が読み取り (X) 操作を発行するたびに、次の条件がチェックされます。
- W_TS(X) >TS(Ti) の場合、操作は拒否されます。
- W_TS(X) <= TS(Ti) の場合、操作を実行します。
すべてのデータ項目のタイムスタンプを更新します。
- トランザクション Ti が Write(X) 操作を発行するたびに、次の条件がチェックされます。
- TS(Ti) < R_TS(X) の場合、操作は拒否されます。
- TS(Ti) < W_TS(X) の場合は操作を拒否して Ti をロールバックし、そうでない場合は操作を実行します。
の:
-
TS(TI) は、トランザクション Ti のタイムスタンプを表します。
-
R_TS(X) は、データ項目 X の読み取りタイムスタンプを表します。
-
W_TS(X) は、データ項目 X の書き込みタイムスタンプを表します。
マルチバージョン タイムスタンプ プロトコル
マルチバージョンのタイムスタンプ順序付け手法では、システム内の各トランザクションに対して、トランザクションの実行開始前に一意のタイムスタンプが割り当てられます。トランザクション T のタイムスタンプは TS(T) です。各データ項目 X に対して、一連のバージョン <X 1 、X 2 、X 3 、... XK > が関連付けられています。
データ項目 (X) のバージョン Xi ごとに、システムは次の 3 つのフィールドを維持します。
- バージョンの値。
- Read_TS(Xi): X i の読み取りタイムスタンプは、バージョン X i の読み取りに成功したトランザクションの最大タイムスタンプです。
- Write_TS(Xi): X i の書き込みタイムスタンプは、バージョン X i の書き込みに成功したトランザクションの最大タイムスタンプです。
シリアル化可能性を確保するために、次の 2 つのルールが使用されます。
トランザクション T がデータ項目 X の読み取り要求と書き込み要求を発行するとします。X i を、X のすべてのバージョンの中で最大の Write_TS(X i ) を持ち、TS(T) 以下のバージョンとする。
- ルール 1: トランザクション T が Read(X) 要求を送信すると仮定します。Read_TS(X i )<TS(T) の場合、システムは Xi i の値をトランザクション T に返し、Read_TS(X i ) の値を TS( T)
- ルール 2: トランザクション T が Write(X) 要求 TS(T) < Read_TS(X) を発行すると、システムはトランザクション T を中止します。一方、TS(T) = Write_TS(X) の場合、システムは X の内容を上書きし、TS(T) > Write_TS(X) の場合、X の新しいバージョンを作成します。
機構
隣接リストの方法を使用して、ブロックの依存関係グラフを作成します。以下の図に示すように:
ここで、ts はトランザクションを送信したときのタイムスタンプ (一意)、AU id AU_{id}あゆ_私はトランザクション Ti に対して実行されたアトミック ユニットの ID。vNode ノードをデクリメントされた状態に維持するために、inCnt を 0 に初期化します。依存関係がある場合、依存関係を持つ inCnt を対応する値に変更できます (実行されたeNext と vNext は、依存関係グラフで依存関係グラフを構築するためのエッジ接続ポイントです。
ディペンデンシー グラフの構築方法のアルゴリズムは、主にロックフリー ライブラリの 5 つのアルゴリズム (addVert()、addEdge()、searchLocal()、searchGlobal()、decInCount()) を使用します。(特定のアルゴリズムは、接続テーブルを構築するためのアルゴリズムに似ています)
パラレルマイニングのプロセス
- 取引プラットフォームから取引を取得する
- トランザクション計算を並行して実行し、各変数の最終状態を計算します
- 競合テーブル (またはトランザクション依存関係グラフ) を生成する
- 前のブロックのハッシュ値を計算する
- 最終ブロック内で生成する必要がある値を生成します
- 検証のためにすべての検証ノードにプッシュ
要約する
主に、単一バージョンのタイムスタンプ プロトコルと複数バージョンのタイムスタンプ プロトコルの間でスマート コントラクトの並列実行の結果を比較します. 主にスマート コントラクトにおけるトランザクション メモリ システム (STM) の適用に偏っているため、この記事の参考値は主にタイムスタンプの使い方と数式の証明。
付録 - アルゴリズム
簡易オークション契約
line2: オークション取引のアドレス
line3: オークション終了時刻
line5: 最高オークション主催者のアドレス
line6: 最高オークション主催者の入札額
line7: 最高オークション主催者のアドレスと入札額を接続する
機能:
- 現在の時間がオークション時間を超えているため、例外がスローされます
- 入札者の入札額が現在の価格よりも低い場合、例外がスローされます
- 妥当な時間内に高額入札者と記録的な入札者と入札を行う