(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2024-12-24
(54)【発明の名称】孤立トランザクションのためのデータ構造
(51)【国際特許分類】
G06F 21/64 20130101AFI20241217BHJP
G06F 16/182 20190101ALI20241217BHJP
【FI】
G06F21/64
G06F16/182
【審査請求】未請求
【予備審査請求】未請求
(21)【出願番号】P 2024531582
(86)(22)【出願日】2022-11-07
(85)【翻訳文提出日】2024-05-28
(86)【国際出願番号】 EP2022080934
(87)【国際公開番号】W WO2023104406
(87)【国際公開日】2023-06-15
(32)【優先日】2021-12-07
(33)【優先権主張国・地域又は機関】GB
(81)【指定国・地域】
(71)【出願人】
【識別番号】318001991
【氏名又は名称】エヌチェーン ライセンシング アーゲー
(74)【代理人】
【識別番号】100107766
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100229448
【氏名又は名称】中槇 利明
(72)【発明者】
【氏名】パウノイウ,アレクサンドル
(72)【発明者】
【氏名】ラライア,エンリケ
(57)【要約】
ブロックチェーンノードによって実行されるコンピュータにより実施される方法は、孤立トランザクションを表すデータ構造を維持するステップであって、孤立トランザクションは、利用不可トランザクションである少なくとも1つの親トランザクション及び/又は異なる孤立トランザクションである少なくとも1つの親トランザクションを有するブロックチェーントランザクションであり、利用不可トランザクションは、前記ブロックチェーンノードの検証パイプラインに利用できないトランザクションである、ステップ、を含み、前記データ構造は、ノード及びエッジの有向グラフを含み、前記グラフの各ノードは、各々の孤立トランザクション又は各々の利用不可トランザクションのいずれかを表し、各々の親ノードを各々の子ノードに接続する各エッジは、前記各々の子ノードによって表される前記各々のトランザクションのインプットによる、前記各々の親ノードによって表される前記各々のトランザクションのアウトプットの使用を表す。
【特許請求の範囲】
【請求項1】
ブロックチェーンノードによって実行されるコンピュータにより実施される方法であって、
孤立トランザクションを表すデータ構造を維持するステップであって、孤立トランザクションは、利用不可トランザクションである少なくとも1つの親トランザクション及び/又は異なる孤立トランザクションである少なくとも1つの親トランザクションを有するブロックチェーントランザクションであり、利用不可トランザクションは、前記ブロックチェーンノードの検証パイプラインに利用できないトランザクションである、ステップ、
を含み、
前記データ構造は、ノード及びエッジの有向グラフを含み、前記グラフの各ノードは、各々の孤立トランザクション又は各々の利用不可トランザクションのいずれかを表し、各々の親ノードを各々の子ノードに接続する各エッジは、前記各々の子ノードによって表される前記各々のトランザクションのインプットによる、前記各々の親ノードによって表される前記各々のトランザクションのアウトプットの使用を表し、
前記グラフの各ノードは、該ノードによって表される前記各々のトランザクションの各々のトランザクション識別子に関連付けられ、以下:
a)各々の入次数値であり、前記各々の入次数値は、以下:
i)前記各々のトランザクションが、利用不可トランザクション又は孤立トランザクションのいずれかである未知の数の親トランザクションを有することを示す第1値、又は
ii)前記各々のトランザクションが、利用不可トランザクション又は孤立トランザクションのいずれかである親トランザクションを有しないことを示す0の値、又は
iii)利用不可トランザクション又は孤立トランザクションのいずれかである、前記各々のトランザクションの各々の親トランザクションの数を示す値、
のうちの1つである入次数値、及び
b)各々のエッジによって該ノードに接続されている各々の子ノードが存在する場合には、各々の子ノードの各々の参照のリスト、
を含む、方法。
【請求項2】
前記データ構造は、前記孤立トランザクションの一部又は全部を含む、請求項1に記載の方法。
【請求項3】
各々の孤立トランザクションを表す前記グラフの1つの、一部の又は各々のノードは、前記各々の孤立トランザクションを含む、請求項2に記載の方法。
【請求項4】
各々の孤立トランザクションが前記データ構造内に所定の時間制限の間存在したことに応答して、前記データ構造から前記各々の孤立トランザクションを除去するステップ、
を含む請求項2に記載の方法。
【請求項5】
前記グラフの各ノードが、
c)該ノードにより表される前記各々のトランザクションの前記各々のトランザクション識別子、を含む、請求項1に記載の方法。
【請求項6】
ターゲット孤立トランザクションと、利用不可トランザクション又は孤立トランザクションのいずれかであるターゲットトランザクションの各々のターゲット親トランザクションのリストとを取得するステップと、
前記ターゲット孤立トランザクションを入力として使用して追加トランザクションアルゴリズムを呼び出すステップと、
を含み、
前記追加トランザクションアルゴリズムを呼び出すステップは、
前記グラフが前記ターゲット孤立トランザクションを表すターゲット子ノードを含むかどうかを決定するステップと、
前記決定するステップに基づいて、前記ターゲット子ノードを作成又は更新することによって前記グラフを更新するステップと、
を含む、請求項1に記載の方法。
【請求項7】
前記決定するステップは、前記グラフの各々のノードが前記ターゲット孤立トランザクションのターゲットトランザクション識別子に関連付けられているかどうかを決定するステップを含む、請求項6に記載の方法。
【請求項8】
前記決定するステップは、前記ターゲットトランザクション識別子を生成するステップを含む、請求項7に記載の方法。
【請求項9】
前記追加トランザクションアルゴリズムを呼び出すステップは、
ターゲット孤立ノードの各々のターゲット親トランザクションの前記リスト内の各ターゲット親トランザクションに対して、
前記グラフが、前記ターゲット孤立トランザクションの前記各々のターゲット親トランザクションを表す各々のターゲット親ノードを含むかどうかを決定するステップと、
前記決定するステップに基づいて、前記各々のターゲット親ノードを作成又は更新することによって前記グラフを更新するステップであって、前記各々のノードは、前記ターゲット子ノードへの各々の参照を含む、ステップと、
を含む、請求項6に記載の方法。
【請求項10】
前記各々のターゲット親ノードを作成するステップは、前記各々の親トランザクションが利用不可トランザクションである場合に、前記各々のターゲット親ノードの前記各々の入次数値を前記第1値として設定するステップを含む、請求項9に記載の方法。
【請求項11】
第1トランザクションを取得し、前記第1トランザクションを入力として解放トランザクションアルゴリズムを呼び出すステップ、を含み、
前記解放トランザクションアルゴリズムを呼び出すステップは、
前記第1トランザクションを表す前記グラフの第1ノードを識別するステップと、
前記第1ノードの前記入次数値が前記0の値として設定されている場合、前記第1トランザクションを前記検証パイプラインに送信し、前記グラフから前記第1ノードを除去するステップと、
を含む、請求項1に記載の方法。
【請求項12】
前記解放トランザクションアルゴリズムを呼び出すステップは、以下:
前記第1ノードによって参照される各々の子ノードに対して、
前記入次数値が正の数である場合、利用不可トランザクション又は孤立トランザクションのいずれかである各々の親トランザクションの数を減少させることによって、前記各々の入次数値を更新するステップと、
前記各々の子ノードを入力として前記解放トランザクションアルゴリズムを呼び出すステップと、
により前記グラフを更新するステップを含む、請求項11に記載の方法。
【請求項13】
前記各々の子ノードを入力として前記解放トランザクションアルゴリズムを呼び出すステップは、1つ以上の子トランザクションが前記検証パイプラインに送信される結果となり、前記方法は、前記第1トランザクション及び前記1つ以上の子トランザクションをトランザクションのバッチとして前記検証パイプラインに送信するステップを含む、請求項12に記載の方法。
【請求項14】
前記第1トランザクション及び前記1つ以上の子トランザクションを前記検証パイプラインの同じプロセッサに送信するステップを含む、請求項13に記載の方法。
【請求項15】
前記第1トランザクションは、各々の利用不可トランザクションであり、前記方法は、
各々のリスナを1つ、幾つか、又は各々の利用不可トランザクションに関連付けるステップと、
前記各々の利用不可トランザクションを取得することに応答して、前記各々のリスナが前記解放トランザクションアルゴリズムを呼び出すステップと、
を含む請求項11に記載の方法。
【請求項16】
前記検証パイプラインで利用可能になった1つ以上の各々の利用不可トランザクションについて定期的間隔で前記データ構造を検索するステップと、
前記検証パイプラインで利用可能になった少なくとも1つの各々の利用不可トランザクションを識別するステップであって、前記第1トランザクションは、前記識別された各々の利用不可トランザクションであり、前記解放トランザクションアルゴリズムを呼び出すステップは、前記識別するステップに応答するものである、ステップと、
を含む請求項11に記載の方法。
【請求項17】
前記解放トランザクションアルゴリズムは、以下:
前記検証パイプラインが、前記第1トランザクションは前記検証パイプラインに入ったこと又は前記検証パイプラインから出たことを前記データ構造に通知すること、
前記データ構造が、前記第1トランザクションは前記データ構造内で利用不可トランザクションとして表現されていると決定すること、
に応答して呼び出される、請求項11に記載の方法。
【請求項18】
コンピュータ機器であって、
1つ以上のメモリユニットを含むメモリと、
1つ以上の処理ユニットを含む処理機器と、
を含み、
前記メモリは、前記処理機器上で実行するよう構成されるコードを格納し、前記コードは前記処理機器上で実行すると請求項1に記載の方法を実行するよう構成される、コンピュータ機器。
【請求項19】
コンピュータ可読記憶装置上に具現化され、1つ以上のプロセッサ上で実行すると請求項1に記載の方法を実行するよう構成される、コンピュータプログラム。
【請求項20】
孤立トランザクションを表すデータ構造であって、孤立トランザクションは、利用不可トランザクションである少なくとも1つの親トランザクション及び/又は異なる孤立トランザクションである少なくとも1つの親トランザクションを有するブロックチェーントランザクションであり、利用不可トランザクションは、ブロックチェーンノードの検証パイプラインに利用できないトランザクションであり、
前記データ構造は、ノード及びエッジの有向グラフを含み、前記グラフの各ノードは、各々の孤立トランザクション又は各々の利用不可トランザクションのいずれかを表し、各々の親ノードを各々の子ノードに接続する各エッジは、前記各々の子ノードによって表される前記各々のトランザクションのインプットによる、前記各々の親ノードによって表される前記各々のトランザクションのアウトプットの使用を表し、
前記グラフの各ノードは、該ノードによって表される前記各々のトランザクションの各々のトランザクション識別子に関連付けられ、以下:
a)各々の入次数値であり、前記各々の入次数値は、以下:
i)前記各々のトランザクションが、利用不可トランザクション又は孤立トランザクションのいずれかである未知の数の親トランザクションを有することを示す第1値、又は
ii)前記各々のトランザクションが、利用不可トランザクション又は孤立トランザクションのいずれかである親トランザクションを有しないことを示す0の値、又は
iii)利用不可トランザクション又は孤立トランザクションのいずれかである、前記各々のトランザクションの各々の親トランザクションの数を示す値、
のうちの1つである入次数値、及び
b)各々のエッジによって該ノードに接続されている各々の子ノードが存在する場合には、各々の子ノードの各々の参照のリスト、
を含む、データ構造。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、孤立トランザクションを表すためのデータ構造を作成及び/又は維持する方法、及びデータ構造自体に関する。
【背景技術】
【0002】
ブロックチェーンとは、分散型ピアツーピア(P2P)ネットワーク(以下で「ブロックチェーンネットワーク」とも呼ばれる)内の複数のノードの各々において、ブロックチェーンの重複コピーが維持され広く公表される、分散データ構造の形態を指す。ブロックチェーンは、データのブロックのチェーンを含み、各ブロックは1つ以上のトランザクションを含む。所謂「コインベーストランザクション」以外の各トランザクションは、シーケンス内の先行するトランザクションをポイントする。シーケンスは、1つ以上のコインベーストランザクションまで遡る1つ以上のブロックに跨がってよい。コインベーストランザクションは以下で更に議論される。ブロックチェーンネットワークに提出されるトランザクションは、新しいブロックに含まれる。新しいブロックは、「マイニング」として知られる処理により生成される。「マイニング」は、複数のノードの各々が「proof-of-work」を実行するために競争する、つまり、ブロックチェーンの新しいブロックに含まれることを待っている順序付き及び妥当性確認済みの保留中のトランザクションの定義されたセットの提示に基づき、暗号パズルを解くことを含む。留意すべきことに、ブロックチェーンは幾つかのノードにおいてプルーニング(pruned)されてよく、ブロックの公開はブロックヘッダのみの公開を通じて達成できる。
【0003】
ブロックチェーン内のトランザクションは、以下の目的:デジタルアセット(つまり、多数のデジタルトークン)を運ぶこと、仮想台帳又はレジストリの中のエントリのセットを順序付けること、タイムスタンプエントリを受信し処理すること、及び/又はインデックスポインタを時系列にすること、のうちの1つ以上のために使用できる。ブロックチェーンの上に追加の機能をレイヤ化するために、ブロックチェーンを利用することもできる。例えば、ブロックチェーンプロトコルは、トランザクション内のデータに追加のユーザデータ又はインデックスを格納できるようにし得る。単一トランザクション内に格納できる最大データ容量に対する予め指定された限度は存在しない。従って、より複雑なデータを組み込むことができる。例えば、これは、ブロックチェーン内に電子文書(electronic document)、或いはオーディオ若しくはビデオデータを格納するために使用され得る。
【0004】
ブロックチェーンネットワークのノード(「マイナー」と呼ばれることがある)は、以下に詳細に説明する分散型トランザクション登録及び検証処理を実行する。つまり、この処理の間、ノードは、トランザクションの妥当性確認を行い、それらをブロックテンプレートに挿入し、それに対して有効なproof-of-work解を特定しようと試みる。有効な解が見付かると、新しいブロックはネットワークの他のノードへと伝播され、それにより、各ノードがブロックチェーンに新しいブロックを記録できるようになる。トランザクションをブロックチェーンに記録させるために、ユーザ(例えば、ブロックチェーンクライアントアプリケーション)は、伝播させるために、ネットワークのノードの1つにトランザクションを送信する。トランザクションを受信したノードは、proof-of-work解を見付けるために競争し、妥当性確認されたトランザクションを新しいブロックに組み込む。各ノードは、トランザクションが有効であるための1つ以上の条件を含む同じノードプロトコルを実施するよう構成される。無効なトランザクションは、伝播されず、ブロックに組み込まれることもない。トランザクションが妥当性確認され、それによってブロックチェーンに受け入れられたと仮定すると、(任意のユーザデータを含む)トランザクションは、従って、不変の公開レコードとしてブロックチェーンネットワークの各ノードに登録されインデックスされたままである。
【0005】
最新のブロックを生成するためにproof-of-workパズルを解くことに成功したノードは、標準的に、デジタルアセットの新しい量、つまりトークンの数を生成する「コインベーストランザクション(coinbase transaction)」と呼ばれる新しいトランザクションにより報酬を受ける。無効なトランザクションの検出及び拒否は、ネットワークのエージェントとして動作し及び不法行為を報告及び阻止するよう奨励される競合ノードの動作により実施される。情報の広範な公開により、ユーザはノードの性能を継続的に監査できる。単なるブロックヘッダの公開により、参加者はブロックチェーンの現下の完全性を保証できる。
【0006】
「アウトプットベースの」モデル(UTXOに基づくモデルと呼ばれることもある)では、所与のトランザクションのデータ構造は、1つ以上のインプット及び1つ以上のアウトプットを含む。任意の使用可能アウトプットは、先行するトランザクションシーケンスから導出可能なデジタルアセットの量を指定する要素を含む。使用可能アウトプットは、時にUTXO(unspent transaction output、未使用トランザクションアウトプット)と呼ばれる。アウトプットは、アウトプットの将来の償還(redemption)のための条件を指定するロックスクリプトを更に含んでよい。ロックスクリプトは、デジタルトークン又はアセットを妥当性確認し及び移転するために必要な条件を定義する述部(predicate)である。(コインベーストランザクション以外の)トランザクションの各インプットは、先行するトランザクション内のそのようなアウトプットへのポインタ(つまり参照)を含み、ポイントされたアウトプットのロックスクリプトをアンロックするためのアンロックスクリプトを更に含んでよい。従って、トランザクションのペアを考えるとき、それらを、第1トランザクション及び第2トランザクション(又は「ターゲット」トランザクション)と呼ぶ。第1トランザクションは、デジタルアセットの量を指定する、及びアウトプットをアンロックする1つ以上の条件を定義するロックスクリプトを含む、少なくとも1つのアウトプットを含む。第2ターゲットトランザクションは、第1トランザクションのアウトプットへのポインタと、第1トランザクションのアウトプットをアンロックするためのアンロックスクリプトとを含む、少なくとも1つのインプットを含む。
【0007】
このようなモデルでは、第2ターゲットトランザクションがブロックチェーンで伝播され記録されるブロックチェーンネットワークに送られるとき、各ノードで適用される有効性の基準の1つは、アンロックスクリプトが第1トランザクションのロックスクリプトで定義された1つ以上の条件の全てを満たすことである。もう1つは、第1トランザクションのアウトプットが、別の前の有効なトランザクションによって未だ償還されていないことである。これらの条件のうちのいずれかに従いターゲットトランザクションが無効であると分かった任意のノードは、該トランザクションを(有効なトランザクションとして)伝搬させず(しかし、無効なトランザクションを登録する場合がある)、ブロックチェーンに記録させるために新しいブロックに含めることもしない。
【発明の概要】
【0008】
ブロックチェーントランザクションはチェーンを形成する。これにより、1つのトランザクション(子トランザクション)のインプットが、チェーン内の前のトランザクション(親トランザクション)のアウトプットを参照する。チェーンには、任意の数のトランザクションを含めることができる。
【0009】
子トランザクションは、ブロックに含まれる前に、ブロックチェーンノードによって検証される必要がある。子トランザクションを検証するプロセスには、親トランザクションが存在することの確認、子トランザクションのアウトプットに分散されたデジタルアセットの量が、親トランザクションの参照されたアウトプットに関連付けられているデジタルアセットの量よりも大きくないことの確認など、親トランザクションの様々なチェックの実行や親トランザクションの使用が含まれる。
【0010】
ただし、ブロックチェーンノードは、必ずしもトランザクションのチェーンを順番に受信するとは限らない。例えば、親が到着する前に、又は祖父母が到着する前に、子トランザクションがノードに到着する場合がある。このようなトランザクションは、孤立トランザクションと呼ばれる。ブロックチェーンノードでは、親トランザクションが子トランザクションを検証する必要があるため、子トランザクションは検証されることができない。
【0011】
一部のブロックチェーンプロトコルでは、検証パイプラインを使用してトランザクションを処理及び検証する。検証パイプラインは、各々が特定のタスクを実行する一連のプロセッサを含む。少なくとも1つのプロセッサは、親トランザクションに基づいて子トランザクションを検証するタスクを負う。トランザクションを検証するための特定されたボトルネックは、子トランザクションが検証パイプラインに入り、そのアウトポイント(つまり、子トランザクションのインプットによって参照される前のトランザクションのアウトプット)の1つが、ブロックチェーンノードによって未だ未検出の親トランザクションに属する場合に発生する。これは、ブロックチェーンノードが子トランザクションの検証を繰り返し試行して失敗し、親トランザクションよりも子トランザクションの検証を優先するデッドロック問題につながる。
【0012】
本明細書に開示される一態様によると、ブロックチェーンノードによって実行されるコンピュータにより実施される方法であって、
孤立トランザクションを表すデータ構造を維持するステップであって、孤立トランザクションは、利用不可トランザクションである少なくとも1つの親トランザクション及び/又は異なる孤立トランザクションである少なくとも1つの親トランザクションを有するブロックチェーントランザクションであり、利用不可トランザクションは、前記ブロックチェーンノードの検証パイプラインに利用できないトランザクションである、ステップ、
を含み、
前記データ構造は、ノード及びエッジの有向グラフを含み、前記グラフの各ノードは、各々の孤立トランザクション又は各々の利用不可トランザクションのいずれかを表し、各々の親ノードを各々の子ノードに接続する各エッジは、前記各々の子ノードによって表される前記各々のトランザクションのインプットによる、前記各々の親ノードによって表される前記各々のトランザクションのアウトプットの使用を表し、
前記グラフの各ノードは、該ノードによって表される前記各々のトランザクションの各々のトランザクション識別子に関連付けられ、以下:
a)各々の入次数値であり、前記各々の入次数値は、以下:
i)前記各々のトランザクションが、利用不可トランザクション又は孤立トランザクションのいずれかである未知の数の親トランザクションを有することを示す第1値、又は
ii)前記各々のトランザクションが、利用不可トランザクション又は孤立トランザクションのいずれかである親トランザクションを有しないことを示す0の値、又は
iii)利用不可トランザクション又は孤立トランザクションのいずれかである、前記各々のトランザクションの各々の親トランザクションの数を示す値、
のうちの1つである入次数値、及び
b)各々のエッジによって該ノードに接続されている各々の子ノードが存在する場合には、各々の子ノードの各々の参照のリスト、
を含む、方法が提供される。
【0013】
本願明細書に開示される別の態様によると、孤立トランザクションを表すデータ構造であって、孤立トランザクションは、利用不可トランザクションである少なくとも1つの親トランザクション及び/又は異なる孤立トランザクションである少なくとも1つの親トランザクションを有するブロックチェーントランザクションであり、利用不可トランザクションは、ブロックチェーンノードの検証パイプラインに利用できないトランザクションであり、
前記データ構造は、ノード及びエッジの有向グラフを含み、前記グラフの各ノードは、各々の孤立トランザクション又は各々の利用不可トランザクションのいずれかを表し、各々の親ノードを各々の子ノードに接続する各エッジは、前記各々の子ノードによって表される前記各々のトランザクションのインプットによる、前記各々の親ノードによって表される前記各々のトランザクションのアウトプットの使用を表し、
前記グラフの各ノードは、該ノードによって表される前記各々のトランザクションの各々のトランザクション識別子に関連付けられ、以下:
a)各々の入次数値であり、前記各々の入次数値は、以下:
i)前記各々のトランザクションが、利用不可トランザクション又は孤立トランザクションのいずれかである未知の数の親トランザクションを有することを示す第1値、又は
ii)前記各々のトランザクションが、利用不可トランザクション又は孤立トランザクションのいずれかである親トランザクションを有しないことを示す0の値、又は
iii)利用不可トランザクション又は孤立トランザクションのいずれかである、前記各々のトランザクションの各々の親トランザクションの数を示す値、
のうちの1つである入次数値、及び
b)各々のエッジによって該ノードに接続されている各々の子ノードが存在する場合には、各々の子ノードの各々の参照のリスト、
を含む、データ構造が提供される。
【0014】
本開示は、孤立トランザクションを表す及び/又は組織化するための新規のデータ構造(「孤立プール」と呼ばれる)を提供する。孤立プールは、孤立トランザクションがブロックチェーンノードに到着したときにノードを追加又は更新することによって更新される。孤立トランザクションは検証パイプラインではなく孤立プールに送信されるため、デッドロックの問題を回避できる。同様に、必要な親トランザクションが利用可能になったときに孤立プールからノードの検証パイプラインに孤立トランザクションが解放されると、孤立プールが更新される。データ構造は、ノードとエッジの有向グラフを使用する。ここで、「ノード」は、グラフを作成及び/又は維持するブロックチェーンノードではなく、グラフの要素を表すために別のコンテキストで使用される。
【0015】
グラフ内の各ノード(「グラフノード」)は、孤立プール内のトランザクションを表す。より具体的には、各グラフノードは、孤立トランザクション又は利用不可トランザクションのいずれかを表す。利用不可トランザクション(「未検出トランザクション」(unseen transaction)とも呼ばれる)は、ブロックチェーンノードの検証パイプラインによって、又は一部の例では、ブロックチェーンノード全体によって認識されていない(見えていない)トランザクションである。孤立トランザクションは、孤立トランザクションの子トランザクション(つまり、子トランザクションの親が孤立トランザクションである)、又は未検出トランザクションの子である。
【0016】
各グラフノードは、そのノードによって表されるトランザクションを含むこともできる。代替として、トランザクションを別の場所に格納することもでき、一部の実施形態では、トランザクションの場所(例えばメモリアドレス)をグラフノードによって参照することもできる。
【図面の簡単な説明】
【0017】
本開示の実施形態の理解を助け、そのような実施形態がどのように実施され得るかを示すために、例としてのみ以下の添付の図面を参照する:
【
図1】ブロックチェーンを実装するためのシステムの概略ブロック図である。
【
図2】ブロックチェーンに記録されるトランザクションの幾つかの例を概略的に示している。
【
図3】トランザクションを処理するための特定のノードソフトウェアの概略ブロック図である。
【
図4】孤立プールを持つためのブロックチェーンノードの例の概略ブロック図である。
【
図6】孤立プールに追加されるノード(i)と更新されるノード(ii)を概略的に示す。
【
図7】孤立プールから削除されるノードを概略的に示す。
【発明を実施するための形態】
【0018】
1.例示的なシステムの概要
図1は、ブロックチェーン150を実装するための例示的なシステム100を示す。システム100は、典型的にはインターネットのような広域インターネットワークであるパケット交換ネットワーク101を含んでよい。パケット交換ネットワーク101は、パケット交換ネットワーク101内にピアツーピア(P2P)ネットワーク106を形成するように配置され得る複数のブロックチェーンノード104を含む。図示されないが、ブロックチェーンノード104は、ほぼ完全なグラフとして配置されてよい。各ブロックチェーンノード104は、従って、他のブロックチェーンノード104と高度に結合される。
【0019】
各ブロックチェーンノード104は、異なるピアに属するノード104のうちの異なるノード104を有す、ピアのコンピュータ装置を含む。各ブロックチェーンノード104は、1つ以上のプロセッサ、例えば、1つ以上の中央処理装置(CPU)、アクセラレータプロセッサ、特定用途向けプロセッサ、及び/又はフィールドプログラマブルゲートアレイ(FPGA)、及び特定用途向け集積回路(ASIC)のような他の機器を含む処理装置を含む。各ノードはまた、メモリ、すなわち、非一時的コンピュータ読み取り可能媒体又は媒体の形態のコンピュータ読み取り可能記憶装置を備える。メモリは、1つ以上のメモリ媒体、例えば、ハードディスクなどの磁気媒体、固体ドライブ(solid-state drive (SSD))、フラッシュメモリ又はEEPROMなどの電子媒体、及び/又は光ディスクドライブなどの光学的媒体を使用する1つ以上のメモリユニットを含んでもよい。
【0020】
ブロックチェーン150は、データのブロック151のチェーンを含み、ブロックチェーン150の各々のコピーは、分散型又はブロックチェーンネットワーク106内の複数のノード104の各々において維持される。上述のように、ブロックチェーン150のコピーを維持することは、必ずしも、ブロックチェーン150全体を格納することを意味しない。代わりに、各ブロックチェーンノード150が各ブロック151のブロックヘッダ(後述する)を格納する限り、ブロックチェーン150からデータを取り除くことができる。チェーン内の各ブロック151は、1つ以上のトランザクション152を含み、ここでは、この文脈におけるトランザクションは、一種のデータ構造を参照する。データ構造の性質は、トランザクションモデル又はスキームの一部として使用されるトランザクションプロトコルのタイプに依存する。所与のブロックチェーンは、全体を通して、1つの特定のトランザクションプロトコルを使用する。1つの一般的なタイプのトランザクションプロトコルでは、各トランザクション152のデータ構造は、少なくとも1つのインプット及び少なくとも1つのアウトプットを含む。各アウトプットは、資産としてのデジタルアセットの量を表す量を指定する。この例では、アウトプットが暗号的にロックされているのはユーザ103である(ロックを解除し、それによって償還又は使用するために、そのユーザの署名又は他の解を必要とする)。各インプットは、先行するトランザクション152のアウトプットを指し示し、それによって、トランザクションをリンクする。
【0021】
各ブロック151は、また、ブロック151への逐次的順序を定義するように、チェーン内の先に生成されたブロック151を遡ってポイントするブロックポインタ155を含む。(コインベーストランザクション以外の)各トランザクション152は、トランザクションのシーケンスに順序を定義するために、前のトランザクションへのポインタを含む(注:トランザクション152のシーケンスは、分岐することが許される)。ブロック151のチェーンは、チェーンの第1ブロックであったジェネシスブロック(genesis block (Gb))153にまで戻る。チェーン150の初期に1つ以上のオリジナルトランザクション152は、先行するトランザクションではなくジェネシスブロック153を指し示した。
【0022】
ブロックチェーンノード104の各々はトランザクション152を他のブロックチェーンノード104へ転送し、それにより、ネットワーク106に渡りトランザクション152を伝播させるよう構成される。各ブロックチェーンノード104は、ブロック151を生成し、同じブロックチェーン150の各々のコピーを自身の各々のメモリに格納するよう構成される。各ブロックチェーンノード104はまた、ブロック151に組み込まれるのを待つトランザクション152の順序付きセット(又はプール)154を維持する。順序付きプール154は、時に「メモプール(mempool)」と呼ばれる。この用語は、本願明細書では、任意の特定のブロックチェーン、プロトコル、又はモデルに限定されない。それは、ノード104が有効であるとして受け付けた、及びノード104が同じアウトプットを使用しようと試みる他のトランザクションを受け付けないよう義務付けられたトランザクションの順序付きセットを表す。
【0023】
所与の現在のトランザクション152jにおいて、インプット(又はその各々)は、トランザクションのシーケンスの中の先行トランザクション152iのアウトプットを参照するポインタを含み、このアウトプットが現在のトランザクション152jにおいて償還されるか又は「使用される(spent、消費される)」ことを指定する。使用又は償還は、金融資産の移転を必ずしも意味するものではないが、それは確かに1つの一般的な適用例である。より一般的には、使用は、アウトプットを消費すること、又はそれを別の以降のトランザクションにおける1つ以上のアウトプットに割り当てることとして記述することができる。一般に、先行するトランザクションは、順序付きセット154又は任意のブロック151内の任意のトランザクションであり得る。先行するトランザクション152iは、必ずしも、現在のトランザクション152jが生成された又はネットワーク106へ送信されたときに存在する必要はないが、先行するトランザクション152iは、現在のトランザクションが有効であるために存在し妥当性確認されている必要がある。従って、本願明細書で「先行する」は、ポインタによりリンクされた論理的シーケンスの中で先行するものを表し、必ずしも時系列の中での生成又は送信の時間を表さない。従って、それは、必ずしも、トランザクション152i,152jが順不同で生成され又は送信されることを排除しない(以下の親のない(orphan)トランザクションに関する議論を参照する)。先行するトランザクション152iは、等しく、祖先(antecedent)又は先行(predecessor)トランザクションと呼ばれ得る。
【0024】
現在のトランザクション152jのインプットは、インプット認可、例えば先行するトランザクション152iのアウトプットがロックされているユーザ103aの署名も含む。次に、現在のトランザクション152jのアウトプットは、新しいユーザ又はエンティティ103bに暗号的にロックすることができる。従って、現在のトランザクション152jは、先行するトランザクション152iのインプットに定義された量を、現在のトランザクション152jのアウトプットに定義された新しいユーザ又はエンティティ103bに移転することができる。ある場合には、トランザクション152は、複数のユーザ又はエンティティ間でインプット量を分割するために複数のアウトプットを有してもよいエンティティ(そのうちの1つは、お釣りを与えるために、元のユーザ又はエンティティ103aであってもよい)。幾つかの場合には、トランザクションが複数のインプットを有し、1つ以上の先行するトランザクションの複数のアウトプットから量をまとめ、現在のトランザクションの1つ以上のアウトプットに再分配することもできる。
【0025】
ビットコインのようなアウトプットに基づくトランザクションプロトコルによると、個人ユーザ又は組織のようなエンティティ103は、(手動で又はパーティにより利用されている自動処理によって)新しいトランザクション152jに作用したいとき、作用側エンティティは新しいトランザクションを自身のコンピュータ端末102から受信側へ送信する。作用側パーティ又は受信側は、結局、このトランザクションをネットワーク106のブロックチェーンノード104のうちの1つ以上(これらは、今日では、標準的にサーバ又はデータセンタであるが、原理的に他のユーザ端末も可能である)へと送信する。幾つかの例では、新しいトランザクション152jに作用するパーティ103が、トランザクションを、受信側ではなくブロックチェーンノード104のうちの1つ以上へと直接送信し得ることも排除されない。トランザクションを受信するブロックチェーンノード104は、各ブロックチェーンノード104に適用されるブロックチェーンノードプロトコルに従って、トランザクションが有効であるかどうかをチェックする。ブロックチェーンノードプロトコルは、典型的には、ブロックチェーンノード104に、新しいトランザクション152j内の暗号署名が、トランザクション152の順序付きシーケンスの中の前のトランザクション152iに依存する、期待される署名と一致することをチェックすることを要求する。このようなアウトプットに基づくトランザクションプロトコルの場合、これは、新しいトランザクション152jのインプットに含まれるパーティ103の暗号署名又は他の認証が、新しいトランザクションが使用する(又は「割り当てる」)行するトランザクション152jのアウトプットに定義された条件と一致することをチェックすることを含んでよく、この条件は、典型的には、新しいトランザクション152jのインプット内の暗号署名又は他の認証が、新しいトランザクションのインプットがリンクされた前のトランザクション152iのアウトプットをアンロックすることを少なくともチェックすることを含む。条件は、先行するトランザクション152iのアウトプットに含まれるスクリプトにより少なくとも部分的に定義されてよい。或いは、単にブロックチェーンノードプロトコルだけで固定することもできるし、或いは、これらの組み合わせによることもある。いずれにせよ、新しいトランザクション152jが有効であれば、ブロックチェーンノード104は、新しいトランザクションをブロックチェーンネットワーク106内の1つ以上の他のブロックチェーンノード104に転送する。これらの他のブロックチェーンノード104は、同じノードプロトコルに従って同じテストを適用し、新しいトランザクション152jを1つ以上の更なるノード104に転送し、以下で同様である。このようにして、新しいトランザクションは、ブロックチェーンノード104のネットワーク全体に伝播される。
【0026】
アウトプットベースのモデルでは、与えられ割り当てアウトプット(例えば、UTXO)が割り当てられる(又は使用される)かどうかの定義は、ブロックチェーンノードプロトコルに従って別の以降の(onward)トランザクション152jのインプットによって既に有効に償還されているかどうかである。トランザクションが有効であるための別の条件は、それが償還を試みる先行するトランザクション152iのアウトプットが、別のトランザクションによって未だ償還されていことである。ここでも、有効でない場合、トランザクション152jは、(無効であるとしてフラグが立てられ変更するために伝播されない限り)ブロックチェーン150に伝播又は記録されない。これは、取引者が同じトランザクションのアウトプットを複数回割り当てようとする二重支出を防ぐ。一方、アカウントベースモデルは、口座残高を維持することによって、二重支出を防ぐ。この場合も、トランザクションの順序が定義されているため、口座残高は、一度に単一の定義された状態を有する。
【0027】
妥当性確認トランザクションに加えて、ブロックチェーンノード104は、また、「proof -of -work」により支えられているマイニングと呼ばれるプロセスで、トランザクションのブロックを最初に作成するために競合する。ブロックチェーンノード104では、ブロックチェーン150に記録されたブロック151に未だ現れていない有効なトランザクションの順序付きプール154に新しいトランザクションが追加される。ブロックチェーンノードは、次に、暗号パズルを解くことを試みることにより、トランザクションの順序付きセット154からトランザクション152の新しい有効なブロック151を組み立てるために競争する。これは、典型的には、ノンス(nonce)が保留トランザクションの順序付きプール154の表現と連結され、ハッシュされるときに、ハッシュのアウトプットが所定の条件を満たすような「ノンス」値を探すことを含む。例えば、所定の条件は、ハッシュのアウトプットが、所定の数の先頭ゼロを有することであってもよい。これは、単に1つの特定の種類のproof-of-workパズルであり、他の種類が排除されないことに留意する。ハッシュ関数の特性は、インプットに関して予測不可能なアウトプットを持つことである。従って、この探索は、ブルートフォースによってのみ実行することができ、従って、パズルを解決しようとしている各ブロックチェーンノード104において、相当量の処理リソースを消費する。
【0028】
パズルを解いた第1ブロックチェーンノード104は、これをネットワーク106に通知し、その解を証明として提供する。この解は、ネットワーク内の他のブロックチェーンノード104によって簡単にチェックすることができる(ハッシュに対する解が与えられれば、ハッシュのアウトプットが条件を満たすことを確認することは簡単である)。第1ブロックチェーンノード104は、該ブロックを受け入れる閾値の他のノードの合意に、ブロックを伝播させ、従ってプロトコルルールを実施する。トランザクションの順序付きセット154は、次に、ブロックチェーンノード104の各々により、ブロックチェーン150内の新しいブロック151として記録されるようになる。また、新しいブロック151nにはブロックポインタ155が割り当てられ、チェーン内で前に作成されたブロック151n-1を指すようになっている。proof-of-work解を生成するために必要とされる例えばハッシュの形式の有意な量の労力が、ブロックチェーンプロトコルのルールに従うという第1ノード104の意図をシグナリングする。そのようなルールは、前に妥当性確認されたトランザクションと同じアウトプット使用するか又は割り当てる場合に有効としてトランザクションを受け付けないこと、或いは二重支払いとして知られいることを含む。一旦生成されると、ブロック151は、ブロックチェーンネットワーク106内のブロックチェーンノード104の各々で認識され、維持されるので、修正することができない。また、ブロックポインタ155は、ブロック151に順序を課す。トランザクション152は、ネットワーク106内の各ブロックチェーンノード104において順序付きブロックに記録されるので、これは、トランザクションの不変の公開台帳を提供する。
【0029】
パズルを解決するために常に競争している異なるブロックチェーンノード104は、いつ解を探し始めたか、又はトランザクションが受信された順序によって、いつでも未だ公開されていないトランザクションのプール154の異なるスナップショットに基づいてパズルを解いているかもしれないことに留意する。パズルを解く者は誰でも、最初に次の新しいブロック151nに含まれるトランザクション152を定義し、その順序で、未公開のトランザクションの現在のプール154が更新される。そして、ブロックチェーンノード104は、新たに定義された未公開トランザクションの順序付きプール154からブロックを作り出すために、競争を続ける。また、生じ得る「分岐(フォーク、fork)」を解決するためのプロトコルも存在する。これは、2つのブロックチェーンノード104が互いに非常に短い時間内にパズルを解き、ブロックチェーンの矛盾したビューがノード104の間で伝播する場合である。要するに、分岐の枝が伸びるときは常に、最長のものが最終的なブロックチェーン150になる。これは、同じトランザクションが両方の分岐に現れるので、ネットワークのユーザ又はエージェントに影響しないことに留意する。
【0030】
ビットコインブロックチェーン(及び殆どの他のブロックチェーン)によると、新しいブロック104を構成するのに成功したノードは、デジタルアセットの追加の定義された量を分配する新しい特別な種類のトランザクションの中でデジタルアセットの追加の承認された量を新たに割り当てる能力を与えられる(1人のエージェント又はユーザから別のエージェント又はユーザへとデジタルアセットの量を移転するエージェント間又はユーザ間トランザクションと異なる)。この特別な種類のトランザクションは、通常、「コインベーストランザクション」と呼ばれるが、「開始(initiation)トランザクション」又は「生成(generation)トランザクション」とも呼ばれることがある。それは標準に新しいブロック151nの第1トランザクションを形成する。proof-of-workは、この特別なトランザクションが後に償還できるように、新しいブロックを構成したノードがプロトコルルールに従うことを意図していることをシグナリングする。ブロックチェーンプロトコルルールは、この特別なトランザクションが償還できる前に、満期、例えば100ブロックを必要としてよい。通常の(非生成)トランザクション152は、そのアウトプットの1つに追加のトランザクション料を指定し、そのトランザクションが公開されたブロック151nを生成したブロックチェーンノード104に更に報酬を与えることが多い。この手数料は、通常、「トランザクション料」と呼ばれ、後述する。
【0031】
トランザクションの妥当性確認及び公開に関連するリソースのために、典型的には、少なくともブロックチェーンノード104の各々は、1つ以上の物理的サーバユニットを含むサーバ、又はデータセンタ全体の形態をとる。しかしながら、原理的に、任意の所与のブロックチェーンノード104は、ユーザ端末又は互いにネットワーク接続されたユーザ端末又はユーザ端末のグループの形態をとることができる。
【0032】
各ブロックチェーンノード104のメモリは、各々の1つ以上の役割を実行し、ブロックチェーンノードプロトコルに従ってトランザクション152を処理するために、ブロックチェーンノード104の処理装置上で動作するように構成されたソフトウェアを記憶する。ブロックチェーンノード104に属するいずれの動作も、各々のコンピュータ装置の処理装置上で実行されるソフトウェアによって実行され得ることが理解されよう。ノードソフトウェアは、アプリケーションレイヤにおける1つ以上のアプリケーション、又はオペレーティングシステムレイヤ若しくはプロトコルレイヤのような下位レイヤ、又はこれらの任意の組み合わせの中に実装されてよい。
【0033】
また、ネットワーク101には、消費者ユーザの役割を果たす複数のパーティ103の各々のコンピュータ装置102も接続されている。これらのユーザは、ブロックチェーンネットワークと相互作用できるが、トランザクションの妥当性確認及びブロックの構築には参加しない。これらのユーザ又はエージェントのうちの一部は、トランザクションにおいて送信側及び受信側として動作してよい。他のユーザは、必ずしも送信側又は受信側として動作することなく、ブロックチェーン150と相互作用してよい。例えば、幾つかのパーティは、ブロックチェーン150のコピーを格納する(例えば、ブロックチェーンノード104からブロックチェーンのコピーを取得した)記憶エンティティとして動作してよい。
【0034】
パーティ103の一部又は全部は、異なるネットワーク、例えば、ブロックチェーンネットワーク106の上に重ねられたネットワークの部分として結合されてよい。ブロックチェーンネットワークのユーザ(「クライアント」と呼ばれることが多い)は、ブロックチェーンネットワーク106を含むシステムの部分であると言うことができる。しかしながら、これらのユーザは、ブロックチェーンノードの要求される役割を実行しないので、ブロックチェーンノード104ではない。代わりに、各パーティ103は、ブロックチェーンネットワーク106と相互作用し、それにより、ブロックチェーンノード106に結合する(つまり通信する)ことにより、ブロックチェーン150を利用してよい。2つのパーティ103及び各々の機器102は、説明のために示されており、第1パーティ103a及びその各々のコンピュータ機器102a、ならびに第2パーティ103b及びその各々のコンピュータ機器102bである。より多くのこのようなパーティ103及びそれらの各々のコンピュータ機器102がシステム100に存在し、参加することができるが、便宜上、それらは図示されていないことが理解されよう。各パーティ103は、個人又は組織であってもよい。純粋に例示として、第1パーティ103aは、本明細書においてAliceと称され、第2パーティ103bは、Bobと称されるが、これは限定的なものではなく、本明細書においてAlice又はBobという言及は、各々「第1パーティ」及び「第2パーティ」と置き換えることができることは理解されるであろう。
【0035】
各パーティ103のコンピュータ機器102は、1つ以上のプロセッサ、例えば、1つ以上のCPU、GPU、他のアクセラレータプロセッサ、特定用途向けプロセッサ、及び/又はFPGAを備える各々の処理装置を備える。各パーティ103のコンピュータ機器102は、更に、メモリ、すなわち、非一時的コンピュータ読み取り可能媒体又は媒体の形態のコンピュータ読み取り可能記憶装置を備える。このメモリは、1つ以上のメモリ媒体、例えば、ハードディスクのような磁気媒体、SSD、フラッシュメモリ又はEEPROMのような電子媒体、及び/又は光学ディスクドライブのような光学媒体を使用する1つ以上のメモリユニットを含むことができる。各パーティ103のコンピュータ機器102上のメモリは、処理装置上で動作するように配置された少なくとも1つのクライアントアプリケーション105の各々のインスタンスを含むソフトウェアを記憶する。本明細書で与えられたパーティ103に帰属するいずれのアクションも、各々のコンピュータ装置102の処理装置上で実行されるソフトウェアを使用して実行され得ることが理解されよう。各パーティ103のコンピュータ機器102は、少なくとも1つのユーザ端末、例えばデスクトップ又はラップトップコンピュータ、タブレット、スマートフォン、又はスマートウォッチのようなウェアラブルデバイスを備えている。所与のパーティ103のコンピュータ装置102は、ユーザ端末を介してアクセスされるクラウドコンピューティングリソースのような、1つ以上の他のネットワーク化されたリソースを含んでもよい。
【0036】
クライアントアプリケーション105は、最初に、1つ以上の適切なコンピュータ読み取り可能な記憶媒体、例えばサーバからダウンロードされたもの、又はリムーバブルSSD、フラッシュメモリキー、リムーバブルEEPROM、リムーバブル磁気ディスクドライブ、磁気フロッピーディスク又はテープ、光ディスク、例えばCD又はDVD ROM、又はリムーバブル光学ドライブなどのリムーバブル記憶装置上で、任意の所与のパーティ103のコンピュータ機器102に提供され得る。
【0037】
クライアントアプリケーション105は、少なくとも「ウォレット」機能を備える。これには主に2つの機能を有する。これらのうちの1つは、各々のパーティ103が、ブロックチェーンノード104のネットワーク全体に渡って伝播され、それによってブロックチェーン150に含まれるべきトランザクション152を作成し、認可し(例えば署名し)、送信することを可能にすることである。もう1つは、現在所有しているデジタルアセットの量を各々のパーティに報告することである。アウトプットベースのシステムでは、この第2機能は、当該パーティに属するブロックチェーン150全体に散在する様々なトランザクション152のアウトプットの中で定義される量を照合することを含む。
【0038】
注:種々のクライアント機能が所与のクライアントアプリケーション105に統合されるとして説明されることがあるが、これは、必ずしも限定的ではなく、代わりに、本願明細書に記載される任意のクライアント機能が2つ以上の異なるアプリケーションのスーツに実装されてよく、例えばAPIを介してインタフェースし、又は一方が他方へのプラグインである。より一般的には、クライアント機能は、アプリケーションレイヤ、又はオペレーティングシステムのような下位レイヤ、又はこれらの任意の組合せにおいて実装され得る。以下は、クライアントアプリケーション105の観点で説明されるが、これは限定的ではないことが理解される。
【0039】
各コンピュータ機器102上のクライアントアプリケーション又はソフトウェア105のインスタンスは、ネットワーク106のブロックチェーンノード104の少なくとも1つに動作可能に結合される。これにより、クライアント105のウォレット機能は、トランザクション152をネットワーク106に送信することができる。クライアント105は、また、ブロックチェーンノード104にコンタクトして、各々のパーティ103が受信側である任意のトランザクションについてブロックチェーン150に問い合わせることができる(又は、実施形態では、ブロックチェーン150は、部分的にその公開視認性を通じてトランザクションの信頼を提供する公開的設備であるため、実際には、ブロックチェーン150内の他のパーティのトランザクションを検査する)。各コンピュータ機器102上のウォレット機能は、トランザクションプロトコルに従ってトランザクション152を形成し、送信するように構成される。上述のように、各ブロックチェーンノード104は、ブロックチェーンノードプロトコルに従いトランザクション152を妥当性確認し、トランザクション152をブロックチェーンネットワーク106全体に渡り伝播させるために、トランザクション152を転送するよう構成されるソフトウェアを実行する。トランザクションプロトコルとノードプロトコルは互いに対応し、所与のトランザクションプロトコルは所与のノードプロトコルと共に所与のトランザクションモデルを実装する。同じトランザクションプロトコルは、ブロックチェーン150内の全部のトランザクション152について使用される。同じノードプロトコルは、ネットワーク106内の全部のノード104について使用される。
【0040】
所与のパーティ103、例えばAliceがブロックチェーン150に含まれる新たなトランザクション152jを送信したいと望む場合、彼女は関連するトランザクションプロトコルに従って(彼女のクライアントアプリケーション105のウォレット機能を使用して)新たなトランザクションを作成する(formulate)。彼女は、次に、クライアントアプリケーション105からトランザクション152を、彼女が接続されている1つ以上のブロックチェーンノード104に送信する。例えば、これは、Aliceのコンピュータ102に最も良好に接続されているブロックチェーンノード104であってもよい。任意の所与のブロックチェーンノード104が新しいトランザクション152jを受信すると、ブロックチェーンノードプロトコル及びその各々の役割に従って、それを処理する。これは、最初に、新たに受信されたトランザクション152jが「有効」であるための特定の条件を満たしているかどうかをチェックすることを含み、その例については、簡単に詳述する。幾つかのトランザクションプロトコルでは、妥当性確認のための条件は、トランザクション152に含まれるスクリプトによってトランザクションごとに構成可能であってよい。或いは、条件は単にノードプロトコルの組み込み機能であってもよく、或いはスクリプトとノードプロトコルの組み合わせによって定義されてもよい。
【0041】
新たに受信されたトランザクション152jが、有効であるとみなされるテストに合格したという条件で(すなわち、「妥当性確認された」という条件で)、トランザクション152jを受信した任意のブロックチェーンノード104は、そのブロックチェーンノード104に維持されているブロックチェーンの順序付きセット154に、新たな妥当性確認済みトランザクション152を追加する。更に、トランザクション152jを受信する任意のブロックチェーンノード104は、妥当性確認済みトランザクション152をネットワーク106内の1つ以上の他のブロックチェーンノード104に伝播する。各ブロックチェーンノード104は同じプロトコルを適用するので、トランザクション152jが有効であると仮定すると、これは、ネットワーク106全体に間もなく伝播されることを意味する。
【0042】
所与のブロックチェーンノード104において維持される保留中トランザクションの順序付きプール154に入れられると、該ブロックチェーンノード104は、新しいトランザクション152を含む、彼ら各々のトランザクションのプールの最新バージョンについて、proof-of-workパズルを解く競争を開始する(他のブロックチェーンノード104は、トランザクションの異なるプール154に基づきパズルを解こうとしているが、誰であっても1番の者が、最新のブロック151に含まれるトランザクションのセットを定義することに留意する。)。最終的に、ブロックチェーンノード104は、Aliceのトランザクション152jを含む順序付きプール154の一部についてパズルを解くだろう。)。一旦、新しいトランザクション152jを含むプール154についてproof-of-workが行われると、それはブロックチェーン150内のブロック151のうちの1つの一部となる。各トランザクション152は、以前のトランザクションへのポインタから構成されるので、トランザクションの順序もまた、不変的に記録される。
【0043】
異なるブロックチェーンノード104は、最初に所与のトランザクションの異なるインスタンスを受信する可能性があり、従って、1つのインスタンスが公開(Publishing)されて新しいブロック151になる前に、どのインスタンスが「有効」であるかについて矛盾するビューを有することがあり、その時点で、全部のブロックチェーンノード104は公開されたインスタンスのみが有効なインスタンスであることに合意する。ブロックチェーンノード104が1つのインスタンスを有効であるとして受け入れ、次に第2インスタンスがブロックチェーン150に記録されていることを発見した場合、該ブロックチェーンノード104は、これを受け入れなければならず、最初に受け入れたインスタンス(つまり未だブロック151の中で公開されていないもの)を破棄する(つまり、無効であるとして扱う)。
【0044】
アカウントベースのトランザクションモデルの一部として、幾つかのブロックチェーンネットワークにより運用される別のタイプのトランザクションプロトコルを「アカウントベース」のプロトコルと呼ぶことがある。アカウントベースの場合、各トランザクションは、過去の一連のトランザクションにおいて、先行するトランザクションのUTXOに戻って参照することによって移転される量を定義するのではなく、絶対的な口座(アカウント)残高を参照することによって移転される。全てのアカウントの現在の状態は、ブロックチェーンと分離して、ネットワークのノードにより格納され、絶えず更新される。このようなシステムでは、トランザクションは、アカウントの連続したトランザクション記録(いわゆる「ポジション」)を用いて発注される。この値は、送信者により彼らの暗号署名の一部として署名され、トランザクション参照計算の一部としてハッシュされる。更に、任意的なデータフィールドもトランザクションに署名することができる。このデータフィールドは、例えば、前のトランザクションIDがデータフィールドに含まれている場合、前のトランザクションを遡ってポイントしてよい。
【0045】
2.UTXOベースのモデル
図2は、トランザクションプロトコルの例を示している。これは、UTXOベースのプロトコルの例である。トランザクション152(「Tx」と略す)は、ブロックチェーン150(各ブロック151は1つ以上のトランザクション152を含む)の基本的なデータ構造である。以下は、アウトプットベース又は「UTXO」ベースのプロトコルを参照して説明される。しかし、これは、全ての可能な実施形態に限定されるものではない。例示的なUTXOベースのプロトコルは、ビットコインを参照して説明されるが、他の例示的なブロックチェーンネットワーク上でも等しく実施できることに留意する。
【0046】
UTXOベースのモデルでは、各トランザクション(「Tx」)152は、1つ以上のインプット202及び1つ以上のアウトプット203を含むデータ構造を含む。各アウトプット203は、未使用トランザクションアウトプット(UTXO)を含んでもよく、これは、別の新しいトランザクションのインプット202のソースとして使用することができる(UTXOが未だ償還されていない場合)。UTXOは、デジタルアセットの量を指定する値を含む。これは、分散型台帳上のトークンの設定数を表す。また、他の情報の中でも、UTXOは、それが由来するトランザクションのトランザクションIDも含んでよい。トランザクションデータ構造はまた、ヘッダ201も含んでよく、ヘッダ201は、インプットフィールド202及びアウトプットフィールド203のサイズの指示子を含んでもよい。ヘッダ201は、トランザクションのIDも含んでもよい。実施形態において、トランザクションIDは、トランザクションデータ(トランザクションID自体を除く)のハッシュであり、ノード104に提出された未処理トランザクション152のヘッダ201に格納される。
【0047】
例えばAlice103aは、問題のデジタルアセットの量をBob103bに移転するトランザクション152jを作成したいと考えているとする。
図2において、Aliceの新しいトランザクション152jは「Tx
1」とラベル付けされている。これは、Aliceにロックされているデジタルアセットの量を、シーケンス内の先行するトランザクション152iのアウトプット203に取り入れ、その少なくとも一部をBobに移転する。先行するトランザクション152iは、
図2において「Tx
0」とラベル付けされている。Tx
0とTx
1は、単なる任意のラベルである。これらは、必ずしも、Tx
0がブロックチェーン151の第1トランザクションであること、又は、Tx
1がプール154の直ぐ次のトランザクションであることを意味しない。Tx
1は、未だAliceにロックされた未使用アウトプット203を有する任意の先行する(つまり祖先)トランザクションを指し示すことができる。
【0048】
先行するトランザクションTx0は、Aliceが彼女の新しいトランザクションTx1を作成するとき、又は少なくとも彼女がそれをネットワーク106に送信するときに、既に妥当性確認され、ブロックチェーン150のブロック151に含まれていてもよい。それは、その時点で既にブロック151のうちの1つに含まれていてもよく、あるいは、順序付きセット154内でまだ待機していてもよく、その場合、新しいブロック151にすぐに含まれることになる。或いは、Tx0及びTx1が生成されネットワーク106に送信されることができ、或いは、ノードプロトコルが「孤児(orphan)」トランザクションのバッファリングを許容する場合にはTx1の後にTx0が送信されることもできる。ここでトランザクションのシーケンスの文脈で利用される「先行する」及び「後の」という用語は、トランザクション内で指定されたトランザクションポインタ(どのトランザクションがどの他のトランザクションを指すかなど)によって定義されるシーケンス内のトランザクションの順序を指す。それらは、「先行する」及び「相続する」又は「祖先」及び「子孫」、「親」及び「子」、等により、等しく置き換えられ得る。これは、必ずしも、それらが作成され、ネットワーク106に送られ、又は任意の所与のブロックチェーンノード104に到達する順序を意味しない。それにもかかわらず、先行するトランザクション(祖先トランザクション又は「親」)を指す後続のトランザクション(子孫トランザクション又は「子」)は、親トランザクションが妥当性確認されない限り、妥当性確認されない。親の前にブロックチェーンノード104に到着した子は孤児とみなされる。それは、ノードプロトコル及び/又はノードの行動に応じて、親を待つために特定の時間、破棄又はバッファリングされることがある。
【0049】
先行するトランザクションTx0の1つ以上のアウトプット203のうちの1つは、本明細書でUTXO0とラベル付けされた特定のUTXOを含む。各UTXOは、UTXOによって表されるデジタルアセットの量を指定する値と、後続のトランザクションが妥当性確認されるために、従ってUTXOが正常に償還されるために、後続のトランザクションのインプット202の中のアンロックスクリプトによって満たされなければならない条件を定義するロックスクリプトとを含む。典型的には、ロックスクリプトは、特定のパーティ(それが含まれているトランザクションの受益者)に量をロックする。すなわち、ロックスクリプトは、標準的に以下のようなアンロック条件を定義する:後続のトランザクションのインプット内のアンロックスクリプトは、先行するトランザクションがロックされたパーティの暗号署名を含む。
【0050】
ロックスクリプト(別名scriptPubKey)は、ノードプロトコルによって認識されるドメイン固有の言語で書かれたコードの一部である。そのような言語の特定の例は、ブロックチェーンネットワークにより利用される「スクリプト」(Script,大文字S)と呼ばれる。ロックスクリプトは、トランザクションアウトプット203を使用するために必要な情報、例えば、Aliceの署名の必要条件を指定する。トランザクションのアウトプットには、アンロックスクリプトが現れる。アンロックスクリプト(別名:scriptSig)は、ロックスクリプトの基準を満たすために必要な情報を提供するドメイン固有の言語で書かれたコードの一部である。例えば、Bobの署名を含んでもよい。アンロックスクリプトは、トランザクションのインプット202に現れる。
【0051】
図示の例では、Tx0のアウトプット203のUTXO0は、ロックスクリプト[ChecksigPA]を含み、これは、UTXO0が償還されるために(厳密には、UTXO0を償還しようとする後続のトランザクションが有効であるために)、Aliceの署名SigPAを必要とする。[Checksig PA]は、Aliceの公開-秘密鍵ペアからの公開鍵PAの表現(つまりハッシュ)を含む。Tx1のインプット202は、Tx1を指すポインタ(例えば、そのトランザクションID、実施形態ではトランザクションTx0全体のハッシュであるTxID0による)を含む。Tx1のインプット202は、Tx0の任意の他の可能なアウトプットの中でそれを識別するために、Tx0内のUTXO0を識別するインデックスを含む。Tx1のインプット202は、更に、Aliceが鍵ペアからのAliceの秘密鍵をデータの所定の部分(暗号において「メッセージ」と呼ばれることもある)に適用することによって作成された、Aliceの暗号署名を含むアンロックスクリプト<SigPA>を含む。有効な署名を提供するためにAliceが署名する必要があるデータ(又は「メッセージ」)は、ロックスクリプトにより、又はノードプロトコルにより、又はこれらの組み合わせによって定義され得る。
【0052】
新しいトランザクションTx
1がブロックチェーンノード104に到着すると、ノードはノードプロトコルを適用する。これは、ロックスクリプトとアンロックスクリプトを一緒に実行して、アンロックスクリプトがロックスクリプトで定義されている条件(この条件は1つ以上の基準を含むことができる)を満たしているかどうかをチェックすることを含む。実施形態では、これは、2つのスクリプトの連結を含む。
【数1】
ここで、「||」は連結を表し、「<...>」はスタックにデータを配置することを意味し、「[...]」はロックスクリプトに含まれる機能である(本例では、スタックベースの言語)。同等に、スクリプトは。、スクリプトを連結するのではなく共通のスタックにより1つずつ実行されてよい。いずれの方法でも、一緒に実行する場合、スクリプトは、Tx
0のアウトプット内のロックスクリプトに含まれるAliceの公開鍵P
Aを利用して、Tx
1のインプット内のアンロックスクリプトが、データの期待部分に署名するAliceの署名を含むことを認証する。また、データの期待部分(「メッセージ」)も、この認証を実行するために含まれる必要がある。実施形態において、署名されたデータは、Tx
1の全体を含む(従って、データの署名された部分が既に本質的に存在するので、データの署名された部分を平文で指定する別個の要素が含まれる必要はない)。
【0053】
公開-秘密暗号法による認証の詳細は、当業者には周知であろう。基本的に、Aliceが彼女の秘密鍵を用いてメッセージに署名した場合、Aliceの公開鍵とそのメッセージが平文ならば、ノード104のような別のエンティティは、そのメッセージがAliceによって署名されていなければならないことを認証することができる。署名は、典型的には、メッセージをハッシュし、ハッシュに署名し、署名としてメッセージにこれをタグ付けすることによって、公開鍵の所有者が署名を認証することを可能にする。従って、実施形態では、特定のデータ片又はトランザクションの部分等に署名するという言及は、データ片又はトランザクションの部分のハッシュに署名することを意味し得る。
【0054】
Tx1内のアンロックスクリプトが、Tx0のロックスクリプトで指定された1つ以上の条件を満たす場合(示される例では、Aliceの署名がTx1内で提供され、認証されている場合)、ブロックチェーンノード104は、Tx1が有効であるとみなす。これは、ブロックチェーンノード104がTx1を保留トランザクションの順序付きプール154に追加することを意味する。ブロックチェーンノード104は、トランザクションTx1をネットワーク106内の1つ以上の他のブロックチェーンノード104に転送し、それによって、それがネットワーク106全体に伝播されることになる。一旦、Tx1が妥当性確認され、ブロックチェーン150に含まれると、これは、Tx0からのUTXO0を使用したものとして定義する。Tx1は、未利用トランザクションアウトプット203を利用する場合にのみ有効であることに留意されたい。別のトランザクション152によって既に使用されたアウトプットを使用しようとする場合、Tx1は、たとえ他の全ての条件が満たされていても無効となる。従って、ブロックチェーンノード104は、先行するトランザクションTx0において参照されたUTXOが既に使用されているかどうか(既に別の有効なトランザクションへの有効なインプットを形成しているかどうか)もチェックする必要がある。これが、ブロックチェーン150がトランザクション152に定義された順序を課すことが重要である理由の1つである。実際には、所与のブロックチェーンノード104は、トランザクション152が使用されたUTXO203をマークする別個のデータベースを維持することができるが、最終的には、UTXOが使用されたかどうかを定義するのは、ブロックチェーン150内の別の有効なトランザクションへの有効なインプットを既に形成しているかどうかである。
【0055】
所与のトランザクション152の全部のアウトプット203の中で指定された総量が全部のそのインプット202により指される総量より大きい場合、これは、殆どのトランザクションモデルにおいて無効の別の基礎である。従って、このようなトランザクションは、伝播されず、ブロック151に含まれることもない。
【0056】
UTXOベースのトランザクションモデルでは、所定のUTXOを全体として利用する必要があることに注意する。UTXOで定義されている量のうち、別の分量が使用されている一方で、ある分量を「残しておく」ことはできない。ただし、UTXOからの量は、次のトランザクションの複数のアウトプットに分割できる。例えば、Tx0のUTXO0で定義された量は、Tx1の複数のUTXOに分割できる。従って、AliceがBobにUTXO0で定義された量の全てを与えることを望まない場合、彼女は残りの量を使って、Tx1の第2アウトプットの中で自分自身にお釣りを与えるか、又は別のパーティに支払うことができる。
【0057】
特に、Aliceは、通常、彼女のトランザクション104をブロック151に含めることに成功したビットコインノード104のための手数料も含める必要がある。Aliceがそのような手数料を含まない場合、Tx0はブロックチェーンノード104によって拒否される可能性が高く、従って、技術的には有効であるが、それは伝播されず、ブロックチェーン150に含まれない(ノードプロトコルは、彼らが望まない場合には、ブロックチェーンノード104にトランザクション152を受け入れることを強制しない)。一部のプロトコルでは、トランザクション手数料は、独自の別個のアウトプット203を必要としない(すなわち、別個のUTXOを必要としない)。代わりに、インプット202によって示される総量と、所与のトランザクション152のアウトプット203で指定される総量との間の差は、トランザクションを公開するブロックチェーンノード104に自動的に与えられる。例えば、UTXO0へのポインタがTx1への唯一のインプットであり、Tx1は1つのアウトプットUTXO1しか持っていないとする。UTXO0で指定されたデジタルアセットの量がUTXO1で指定された量より多い場合、その差は、UTXO1を含むブロックを生成するproof-of-work競争の勝者であるノード104により割り当てられ(又は利用され)てよい。しかし、代替的又は追加的に、必ずしも、トランザクション152のUTXO203のうちの独自のものにおいて、トランザクション手数料を明示的に指定できることは除外されない。
【0058】
Alice及びBobのデジタルアセットは、ブロックチェーン150内の任意のトランザクション152の中で彼らにロックされたUTXOで構成されている。従って、典型的には、所与のパーティ103のアセットは、ブロックチェーン150を通して、様々なトランザクション152のUTXO全体に分散される。ブロックチェーン150内のどこにも、所与のパーティ103の総残高を定義する1つの数値は記憶されていない。各パーティへのロックされた、別の将来の(onward)トランザクションに未だ利用されていない全ての様々なUTXOの値をまとめることは、クライアントアプリケーション105におけるウォレット機能の役割である。ビットコインノード104のいずれかに格納されたブロックチェーン150のコピーをクエリすることにより、これを行うことができる。
【0059】
スクリプトコードは、概略的に表現されることが多い(すなわち、正確な言語を用いない)ことに注意する。例えば、特定の機能を表現するオペレーションコード(opcode、オペコード)を使用してよい。「OP_....」は、スクリプト言語の特定のオペコードを表す。例として、OP_RETURNは、ロックスクリプトの始めにあるOP_FALSEが先行するとき、トランザクション内にデータを格納することができ、それによってデータをブロックチェーン150に不変に記録することができるトランザクションの使用不可能アウトプットを生成するためのスクリプト言語のオペコードである。例えば、データは、ブロックチェーンに格納することが望ましい文書を含むことができる。
【0060】
通常、トランザクションのインプットは、公開鍵PAに対応するデジタル署名を含む。実施形態において、これは楕円曲線secp256k1を使用するECDSAに基づく。デジタル署名は、特定のデータに署名する。幾つかの実施形態では、所与のトランザクションについて、署名はトランザクションインプットの一部、及びトランザクションアウトプットの全部又は一部に署名する。署名するアウトプットの特定の部分はSIGHASHフラグに依存する。SIGHASHフラグは、通常、署名の最後に含まれる4バイトのコードであり、どのアウトプットが署名されるかを選択する(従って、署名の時点で固定される)。
【0061】
ロックスクリプトは、通常、各々のトランザクションがロックされているパーティの公開鍵を含んでいることを表す「scriptPubKey」と呼ばれることがある。アンロックスクリプトは、通常、対応する署名を提供することを表す「scriptSig」と呼ばれることがある。しかし、より一般的には、UTXOが償還される条件が署名を認証することを含むことは、ブロックチェーン150の全てのアプリケーションにおいて必須ではない。より一般的には、スクリプト言語は、任意の1つ以上の条件を定義するために使用され得る。従って、より一般的な用語「ロックスクリプト」及び「アンロックスクリプト」が好ましい。
【0062】
3.ノードソフトウェア
図3は、UTXO又はアウトプットに基づくモデルの例における、ネットワーク106の各ブロックチェーンノード104で実行され得るノードソフトウェア450の例を示す。別のエンティティが、ネットワーク106上でノード104として分類されずに、つまり、ノード104に必要なアクションを実行せずに、ノードソフトウェア450を実行できることに注意する。ノードソフトウェア450は、プロトコルエンジン451、スクリプトエンジン452、スタック453、アプリケーションレベルの決定エンジン454、及び1つ以上のブロックチェーン関連機能モジュールのセット455を含んでよいが、それらに限定されない。各ノード104は、合意モジュール455C(例えば、proof-of-work)、伝播モジュール455P、及び格納モジュール455S(例えば、データベース)の3つ全てを含むが、これらに限定されないノードソフトウェアを実行できる。プロトコルエンジン401は、標準的に、トランザクション152の異なるフィールドを認識し、それらをノードプロトコルに従い処理するよう構成される。トランザクション152j(Tx
j)が受信され、別の先行するトランザクション152i(Tx
m-1)のアウトプット(例えばUTXO)をポイントするインプットを有するとき、プロトコルエンジン451は、Tx
j内のアンロックスクリプトを識別し、それをスクリプトエンジン452に渡す。プロトコルエンジン451は、更に、Tx
jのインプットの中のポインタに基づき、Tx
iを識別し検索する。Tx
iはブロックチェーン150上で公開されてよい。この場合、プロトコルエンジンは、ノード104に格納されているブロックチェーン150のブロック151のコピーからTxiを取得できる。又は、Tx
iは、未だブロックチェーン150上で公開されていない可能性がある。その場合、プロトコルエンジン451は、ノード154によって保持されている未公開トランザクションの順序付きセット154からTx
iを取得することができる。いずれの方法も、スクリプトエンジン451は、Txiの参照されるアウトプットの中のロックスクリプトを識別し、これをスクリプトエンジン452に渡す。
【0063】
スクリプトエンジン452は、従って、Tx
iのロックスクリプト、及びTx
j対応するインプットからのアンロックスクリプトを有する。例えば、Tx
0及びTx
1が
図2に示されるが、同じことがトランザクションの任意のペアに適用され得る。スクリプトエンジン452は、前述のように2つのスクリプトを一緒に実行し、これらは、使用されているスタックに基づくスクリプト言語(例えばScript)に従い、スタック453にデータを置くことと、データを検索することとを含む。
【0064】
スクリプトを一緒に実行することにより、スクリプトエンジン452は、アンロックスクリプトがロックスクリプトの中で定義された1つ以上の基準を満たすか否か、つまり、それがロックスクリプトが含まれるアウトプットを「アンロック」するか否かを決定する。スクリプトエンジン452は、この決定の結果をプロトコルエンジン451に返す。スクリプトエンジン452は、アンロックスクリプトは対応するロックスクリプトの中で指定された1つ以上の基準を満たすと決定した場合、結果「真」を返す。その他の場合、それは結果「偽」を返す。
【0065】
アウトプットに基づくモデルでは、スクリプトエンジン452からの結果「真」は、トランザクションの有効性についての条件のうちの1つである。標準的に、同様に満たされなければならない、プロトコルエンジン451により評価される1つ以上の更なるプロトコルレベルの条件が更にあり、Txjのアウトプットの中で指定されたデジタルアセットの総量がそのインプットによりポイントされる総量を超えないこと、Txiのポイントされるアウトプットは別の有効なトランザクションにより未だ使用されていないこと、等である。プロトコルエンジン451は、1つ以上のプロトコルレベルの条件と一緒にスクリプトエンジン452からの結果を評価し、それら全部が真である場合、トランザクションTxjを妥当性確認する。プロトコルエンジン451は、トランザクションが有効であるかどうかの指示を、アプリケーションレベル決定エンジン454に出力する。Txjが実際に妥当性確認されたことのみを条件として、決定エンジン454は、合意モジュール455C及び伝播モジュール455Pの一方又は両方を、それらの各々のブロックチェーンに関連する機能をTxjに関して実行するよう制御することを選択してよい。これは、ブロック151に組み込むためにノードの各々の順序付きトランザクションセット154にTxjを追加する合意モジュール455Cと、ネットワーク106内の別のブロックチェーンノード104にTxjを転送する伝播モジュール455Pを含む。任意的に、実施形態では、アプリケーションレベル決定エンジン454は、これらの機能のうちのいずれか又は両方をトリガする前に、1つ以上の追加条件を適用してよい。例えば、決定エンジンは、トランザクションがだとうせされたこと、及び十分なトランザクション手数料が残されることの両方を条件としてのみ、トランザクションを公開することを選択してよい。
【0066】
用語「真(true)」及び「偽(false)」は、本願明細書では、必ずしも単一の2進数字(ビット)のみの形式で表現される結果を返すことに限定しないが、それは勿論1つの可能な実装であることに留意する。より一般的には、「真」は、成功又は肯定的な結果を示す任意の状態を表すことができ、「偽」は、不成功又は非肯定的な結果を示す任意の状態を表すことができる。例えば、アカウントに基づくモデルでは、「真」の結果は、署名の暗示的なプロトコルレベルの検証と、スマートコントラクトの追加の肯定的なアウトプットとの組み合わせにより示され得る(全体の結果は、両方の個々の結果が真である場合に、真を伝達すると考えられる)。
【0067】
4.孤立プール
図4は、本開示の実施形態を実施するように構成されたブロックチェーンノード104のコンポーネントを概略的に示す。ブロックチェーンノード104は、孤立プール401、トランザクションプール402、及び検証パイプライン403を含む。ブロックチェーンノード104は、例えば
図3を参照して説明したプロトコルエンジン451、スクリプトエンジン452などの他のコンポーネントを含んでもよいことが理解されよう。ブロックチェーンノード104は、例えばトランザクションのブロックを構築し、有効なトランザクションをブロックチェーンネットワーク106の他のノード104に伝播する目的で、トランザクションを受信して検証するように構成される。ブロックチェーンノード104は、トランザクションプール402を使用して、ノード104自体又は別のノード104のいずれかによって検証されたトランザクションを格納することができる。トランザクションプールは、
図1を参照して上述した順序付けられたプール154(又はメモプール、mempool)の形態をとることができる。
【0068】
前述したように、トランザクションはチェーンを形成し、第1トランザクション(「コインベーストランザクション」又は「生成トランザクション」)以外の、チェーン内の各トランザクションは、チェーン内の前のトランザクションを参照する。参照されるトランザクションは親トランザクションと呼ばれ、親を参照するトランザクションは子トランザクションと呼ばれる。子トランザクションは、複数の親トランザクションを持つことができる。子トランザクションを検証するために、検証パイプライン403は、子トランザクションによって参照される親トランザクションの各々を必要とする。親トランザクションがない場合、検証パイプラインは、子トランザクションの検証を繰り返し試行して失敗する可能性があり、その結果、デッドロックの問題が発生する。親トランザクションは、ブロックチェーンノード104に未だ到着していない(すなわちブロックチェーンノード104によって未検出である)か、少なくとも検証パイプライン403に到着していないため、検証パイプライン403で利用できない可能性がある。検出されていないトランザクションは、本明細書では、利用不可(unavailable)トランザクション又は未検出(unseen)トランザクションと呼ばれる。両方の用語は、互換的に使用することができる。
【0069】
孤立(orphan)トランザクションは、本明細書では、少なくとも1つの利用不可トランザクション及び/又は少なくとも1つの他の孤立トランザクションを参照する子トランザクションとして定義される。言い換えると、孤立トランザクションは、チェーン内の少なくとも1つのトランザクションが利用不可トランザクションであるトランザクションのチェーンに属する子トランザクションである。
【0070】
ブロックチェーンノード104は、孤立トランザクションを孤立プール401に格納するように構成される。本開示の実施形態は、孤立プール401を表すデータ構造を提供する。データ構造は、孤立プールへの孤立トランザクションの追加及び孤立プール401からの孤立トランザクションの解放を含む、孤立プール401における変更を反映しかつ可能にするために効率的に更新することができる。
【0071】
データ構造は、有向非巡回グラフの形態の複数のノード及びエッジを含む。ノードはエッジによって接続される。各ノードは、各々のエッジによって少なくとも1つの他のノードに接続される。ノードは、各々のノードによって複数の他のノードに接続されてもよい。各ノードは、親ノード、子ノード、又はその両方である。各ノードは、利用不可トランザクション又は孤立したトランザクションを表す。ノードを接続するエッジは、あるトランザクションの別のトランザクションによる参照を表す。すなわち、子ノードと親ノードとの間のエッジは、親ノードによって表される親トランザクションのアウトプットを参照する(すなわち使用する)子ノードによって表される子トランザクションのインプットによって形成され、これを表す。
【0072】
グラフは、孤立トランザクションと、ブロックチェーンノード104が認識している利用不可トランザクション、例えば、ブロックチェーンノード104に送信された孤立トランザクションと、これらの孤立トランザクションによって参照される利用不可トランザクションとの間の関係を表すために使用される。
【0073】
グラフの各ノードは、そのノードによって表されるトランザクションのトランザクション識別子に関連付けられる。例えば、ノードは、トランザクション識別子を含むことができる。他の例では、ノードは、トランザクション識別子に基づくノード識別子を含むことができ、例えば、ノード識別子は、トランザクション識別子のハッシュであることができる。
【0074】
グラフの各ノードは、入次数(indegree)値を含む。当該技術分野で知られているように、入次数値は、ノードに向けられた(すなわちノードに向かう)エッジの数を表す。実施形態では、入次数値は、3つのタイプの値の1つとして設定することができる。入次数値は、ノードに向けられたエッジの数が未定義であることを表す第1値(例えば、「undefined」(未定義))として設定することができ、ノードによって表されるトランザクションが利用不可トランザクションであることを示す。トランザクションが利用不可であるため、孤立又は利用不可親トランザクションの数(実際には、親トランザクション全体の数)は不明である。代わりに、入次数値は、ノードによって表されるトランザクションが利用不可又は孤立トランザクションである親トランザクションを持たないことを示すゼロ値(例えば、「0」)として設定することができる。言い換えると、0値は、トランザクションが孤立トランザクションではなくなり、検証パイプライン103に解放できることを示す。0値は、必ずしも数値0である必要はなく、別の形式を取ることができることに注意する。代わりに、入次数値は、ノードによって表されるトランザクションの、利用不可トランザクション又は孤立トランザクションのいずれかである親トランザクションの数を示す値(例えば正の整数)として設定することができる。
【0075】
グラフの各親ノードは、エッジによって親ノードに接続されている子ノードの参照のリストも含む。例えば、親ノードが2つの子ノードに接続されている場合、リストには、これら2つの子ノードへの各々の参照が含まれる。参照は、子ノードを識別する。言い換えると、参照はノード識別子である。ノード識別子は、子ノードによって表されるトランザクションのトランザクション識別子、例えばトランザクション識別子のハッシュに基づくことができる。他の例では、参照は、子ノードのメモリアドレスであることができる。
【0076】
図5は、孤立プールの例を表すグラフの例を示す。グラフは、各々の利用不可トランザクションを表す2つのノード501a、501b(楕円形で示す)と、各々の孤立トランザクションを表す4つのノード503a~dとを含む。矢印は、ノードを接続するエッジであり、トランザクションアウトプットの使用を表す。この例では、各ノードは、そのノードによって表されるトランザクションTx
iのトランザクション識別子TxID
iを含む。これらの例では、各ノードは、ノードを参照するために使用できるノード識別子N
TxIDiに関連付けられる。
【0077】
図5に示すように、各ノードは、入次数値を有する。利用不可トランザクションを表すノード501a、501bの入次数値は、この例では「undefined」(未定義)である第1値に設定される。孤立トランザクションを表すノード503a~dの入次数値は、親ノードの数に基づく。例えば、ノード503aは、ノード503b(ノード503aと異なる親ノードである)及びノード503c(ノード503aと同じ親ノードである)と同様に、単一の親ノードを有するため、入次数値1を有する。ノード503dは、2つの親ノードを有するため、入次数値2を有する。
【0078】
図5には、各親ノードの子ノードへの参照のリストも示されている。ノード501aはノード503aを参照し、ノード503aによって表される子トランザクションのインプットによって、ノード501aによって表される親トランザクションのアウトプットが使用されることを表している。この例では、ノード503c、503dは子ノードを参照していない。
【0079】
前述のように、孤立プール401は孤立トランザクションを含む。孤立トランザクションは、検証パイプライン403に解放できるようになるまで、一時的に孤立プールに保持される。
図5に示すように、孤立トランザクションは、各々のノードの一部としてグラフに格納することができる。例えば、ノードN
TxID2は、Tx
2を含む。他の例では、孤立トランザクションは、グラフとは別に格納することができる。
【0080】
孤立トランザクションは、1つ以上の他の理由、例えば、孤立トランザクションが最大許容時間制限より長く孤立プール上にあったために、孤立プール403から削除することができる。これは、孤立プールがブロックチェーンノードのメモリを占有しすぎないようにするのに役立つ。
【0081】
ブロックチェーンノード104は、例えばAlice103a及びBob103bのようなユーザから、又は他のノード104から、より多くの孤立トランザクションが取得されると、グラフを更新するように構成される。孤立トランザクション(「ターゲット孤立トランザクション」と呼ぶ)が受信されると、ブロックチェーンノード104は、どの親トランザクションが欠落しているか、又はそれ自体が孤立しているかを決定する。ブロックチェーンノード104は、ターゲット孤立トランザクションをインプットとしてアルゴリズム(本明細書では「add_transaction」(追加トランザクション)アルゴリズムと呼ぶ)を実行し、グラフを更新する。add_transactionアルゴリズムは、ターゲット孤立トランザクションがグラフの既存のノード、例えば利用不可トランザクションを表すノード501a又は501bによって表されるかどうかを決定する。例えば、アルゴリズムは、ターゲット孤立トランザクションのトランザクション識別子を検索することができる。各ノードがトランザクション識別子に基づくノード識別子、例えばトランザクション識別子のハッシュを含む例では、アルゴリズムは、該ノード識別子を検索することができる。
【0082】
ターゲット孤立トランザクションに対してノードが存在する場合、ノードは、後述するように更新される。ターゲット孤立トランザクションに対してノードが存在しない場合、ノードが作成され、必要に応じて、ノードと他のノードとの間に1つ以上のエッジが形成される。
【0083】
作成又は更新されたノードは、ターゲットノードと呼ばれる。ターゲットノードは、入次数値や子ノードへの参照のリストがある場合にはそのような必要な情報を使用して作成される。入次数値は、ターゲット孤立トランザクションの親トランザクションのうち、欠落しているかそれ自体が孤立しているトランザクションの数に基づく。孤立トランザクションは、作成されたターゲットノードの一部として含めることができる。ターゲットノードの更新には、グラフの1つ以上のエッジの更新、及び/又はノードの入次数値の更新が含まれる場合がある。
【0084】
利用不可トランザクション又は孤立トランザクションであるターゲットノードの親トランザクションごとに、アルゴリズムは、親トランザクションが各々のノードによって表されるかどうかを決定する。親トランザクションのノードが見つからない場合は、親ノードが作成される。利用不可トランザクションを表すノードの場合、入次数値は第1値に設定される。ターゲットノードへの参照が、作成された親ノードに追加される。親トランザクションのノードが既に存在する場合は、ターゲットノードへの参照が既存の親ノードに追加される。
【0085】
図6は、新しく取得した孤立トランザクションを表すノードを追加及び更新するプロセスの例を示している。
図6(i)では、孤立トランザクションTx
childに対して新しいノードN
TxIDchildが作成され、新しい親ノードN
TxIDiが作成される。この例では、親ノードは利用不可トランザクションを表す。
図6(ii)では、ここでも孤立トランザクションTx
childに対して新しいノードN
TxIDchildが作成され、今回は既に存在するノードN
TxID2が更新されて、Tx
childとTx
2の関係が反映される。
【0086】
ここで、孤立トランザクションを検証のために検証パイプライン403に解放するプロセスに移る。ブロックチェーンノード104は、利用不可トランザクション(すなわち、これまで利用不可トランザクションであったトランザクション)又は孤立トランザクションのいずれかであるトランザクション(「第1トランザクション」と呼ぶ)を取得する。ブロックチェーンノード104は、第1トランザクションをインプットとしてアルゴリズム(本明細書では「release_transaction」(解放トランザクション)アルゴリズムと呼ぶ)を実行するよう構成される。解放トランザクションアルゴリズムは、第1トランザクションを表すグラフ内のノードを識別する。ノードは、例えば第1トランザクションのトランザクション識別子に基づいて、ターゲットノードに対してターゲットノードが存在するかどうかを決定するadd_transactionアルゴリズムを説明するときに上述したのと同様の方法で、識別することができる。第1トランザクションを表すノードは、第1ノードと呼ばれる。第1ノードの入次数値が、第1値(例えば、undefined)又はゼロ値(例えば、0)のいずれかとして設定される場合、第1トランザクションは検証パイプライン403に送られる。第1ノードは、グラフから除去される。
【0087】
release_transactionアルゴリズムは、実行されることに応答して、第1ノードの各子ノードを更新するように構成することもできる。つまり、第1トランザクションの子トランザクションを表すノードがグラフに存在する場合は、それらが更新される。release_transactionアルゴリズムは、子ノードごとに、利用不可トランザクション又は孤立したトランザクションのいずれかである子トランザクションの親トランザクションの数を示す入次数値を減らす。幾つかの例では、更新された入次数値は、依然として、子トランザクションにそのような親トランザクションが1つ以上あることを示している場合がある。他の例では、更新された入次数値は0値である場合がある。これは、第1トランザクションが子トランザクションの唯一の親トランザクションであった場合に該当する。次に、release_transactionは、第1ノードの各子ノードに対して個別に実行される。これにより、更新された入次数値が0値として設定されている子ノードがグラフから削除され、その子ノードによって表される孤立トランザクションが検証パイプライン403に解放(リリース、release)される。従って、release_transactionアルゴリズムは、孤立していない全ての子トランザクションを削除しようとする再帰的なアルゴリズムである。
【0088】
図7は、利用不可トランザクションがブロックチェーンノード104に到着することに応答して、グラフから削除されるノード(影付きで示す)と、検証パイプライン403に解放される対応するトランザクションの例を示している。この例では、ノードN
TxID1とN
TxID5は利用不可トランザクションを表す。ノードN
TxID2、N
TxID3、N
TxID4、及びN
TxID6は孤立トランザクションを表す。この例では、release_transactionがTx
1をインプットとして呼び出されている。release_transactionは、削除できるN
TxID1の子ノードと、パイプラインに解放された対応するトランザクションを識別する。この例では、N
TxID1は1つの子ノードN
TxID2を有する。release_transactionは、N
TxID2に対応する孤立トランザクションをパイプライン403に解放できることを決定し、グラフからノードN
TxID2を削除する。その後、release_transactionは、削除できるN
TxID2の子ノードと、パイプラインに解放された対応するトランザクションを識別する。この例では、N
TxID2は2つの子ノードN
TxID3とN
TxID4を有する。release_transactionは、N
TxID3に対応する孤立トランザクションをパイプライン403に解放できることを決定し、グラフからノードN
TxID3を削除する。ノードN
TxID4に対応するトランザクションは、未だ利用できないノードN
TxID5によって表される別の親Tx
5を持つため、パイプライン403に解放することはできない。
【0089】
release_transactionアルゴリズムは、トポロジの並べ替えアルゴリズムと似ている。グラフ内のノードは、入次数値に基づいてレベルごとに並べ替えることができる。例えば、祖父母(レベル0)、親(レベル1)、子(レベル2)などである。release_transactionアルゴリズムは、最下位レベル0から開始して、そのレベルのノードを削除しようとする。子ノードの入次数値が更新される。レベル1に属していた1つ以上のノードが、レベル0に属するようになってよい。再び、レベル0のノードが削除される。子ノードの入次数値が更新される。このプロセスは、それ以上子ノードを削除できなくなるまで繰り返される。
【0090】
release_transactionアルゴリズムは、トランザクションの孤立を解除するためにプール全体を調べない。release_transactionアルゴリズムは、関連する入次数値(ゼロ値)を持つノードのみを特定し、子孫トランザクションの孤立の解除を繰り返し試行する。また、release_algorithmは、未検出であった(すなわち、以前は利用不可であった)1つの検出された(すなわち、新たに利用可能になった)トランザクションのみで開始される。反復の(及び再帰的)性質は解放アルゴリズムに固有であり、孤立プール管理を1つのエンティティ(プール自体)に集中させる。release_transactionアルゴリズムは、各孤立トランザクションを一度だけ処理するだけでよい。
【0091】
release_transactionアルゴリズムは、実行されると、一度に1つではなく、複数の解放されたトランザクションを同時に1回で、すなわち、トランザクションのバッチとして検証パイプラインに送信することができる。
【0092】
幾つかの実施形態では、ブロックチェーンノード104は、複数の検証パイプライン403を有し、各々が、トランザクションを検証する同じ操作を実行するように構成される。すなわち、ノード104は、検証パイプラインの複数のインスタンスを有することができる。別の例として、検証パイプライン403自体は、複数のサブパイプライン、及び/又は同じ操作を実行するように構成された複数のプロセッサを含むことができる。言い換えると、検証パイプライン403は、マルチスレッド化することができる。release_transactionアルゴリズムは、解放されたトランザクションの1つ以上を同じパイプライン403、同じサブパイプライン、又は同じプロセッサに送信することができる。あるいは、解放されたトランザクションは、異なるパイプライン403、サブパイプライン、又はプロセッサに分散することができる。
【0093】
特に有利なオプションは、release_transactionアルゴリズムによって解放されたトランザクションのチェーンを同じパイプライン403、サブパイプライン、又はプロセッサに送信することである。これにより、チェーン内の各親トランザクションがチェーン内の次の子トランザクションの検証の一部として使用されるため、検証速度が向上し、通信オーバヘッドが削減される。
【0094】
前述のように、release_transactionは、孤立トランザクションを孤立プール401から解放し、対応するノードをグラフから除去するために実行される。release_transactionアルゴリズムは、リスナによってトリガされてもよい。これらの例では、孤立トランザクションを表すノードがグラフに追加されるときなどに、各利用不可トランザクションがリスナに関連付けられる。利用不可トランザクションが検証パイプライン403に入ると、関連付けられたリスナがトリガされ、利用不可トランザクションをインプットとしてrelease_transactionアルゴリズムがトリガされる。実際には、各リスナは、パイプラインに入るトランザクションの可視性を持ち、他のコード、すなわちrelease_transactionアルゴリズムを呼び出すように構成されたコードの一部である。
【0095】
別の例として、ブロックチェーンノード104は、検証パイプライン403によって確認された利用不可トランザクションを表すノードについて、例えば定期的間隔でグラフを検索するように構成されてもよい。そのようなノードがグラフ内に存在する場合、release_transactionがトリガされ、対応する利用不可トランザクションをインプットとして実行される。
【0096】
別の例として、release_transactionアルゴリズムは、トランザクションが検証パイプライン403に入る(オプションで、通過する)ことに成功するたびにトリガされてもよい。トランザクションは、パイプライン403を通過すれば、その子トランザクションを検証するためにパイプライン403により利用可能になる。検証パイプライン403は、トランザクションを見たことを孤立プール401に通信し、孤立プール401がトランザクションを待っているかどうかを尋ねる。孤立プールがトランザクションを待っている場合は、release_transactionアルゴリズムがトリガされる。
【0097】
5.孤立プールの実装例
このセクションは、記載された実施形態の特定の実装の詳細を提供し、ブロックチェーンノード104内の孤立トランザクションのプールを配置する方法の例を示す。未検出トランザクションは、検証パイプライン403によって未だ検出されていないトランザクションとして定義され、孤立プール401内のトランザクションによって使用されているアウトプットを含む。トランザクションは、そのインプットのうちの1つが未検出トランザクションのアウトプットをアンロックすると、孤立する。更に、孤立トランザクションのアウトプットをアンロックするトランザクションは、孤立したと表される。
【0098】
孤立プールは、すべての未検出トランザクション又は孤立トランザクションの使用グラフを格納することによって構成される。使用グラフは、ノードが未検出トランザクション又は孤立トランザクションである有向非循環グラフ(directed acyclic graph (DAG))である。ノードN1からN2への有向エッジは、ノードN1に関連付けられたトランザクションのアウトプットを使用するノードN2に関連付けられたトランザクションを表す。
【0099】
トランザクションID TxIDに関連付けられている各ノードはN
TxIDによって示され、次の情報が含まれる(例えば、
図5のノードに見られるように)。
・利用可能な場合、トランザクションTx
・入次数の数値は次のように定義される:
-undefined(未定義):トランザクション自体は未検出トランザクションである;
-0:トランザクションは孤立しておらず、パイプラインに解放できる;
-任意の正の整数値:未検出又は孤立している親トランザクションの数である。
・現在トランザクションのアウトプットのうちの1つをアンロックする孤立子トランザクションに関連付けられている子ノードへの参照(例えば該子ノードのメモリアドレス)のリスト。
【0100】
孤立プールの使用グラフは、上記のように定義されたすべてのノードの集合によって表される。孤立プールの例示的な概要は、
図5に与えられる。
図5では、トランザクションID TxID
2は、2つの子ノードN
TxID3とN
TxID4への参照を持つノードN
TxID2によって表される。これは、未検出トランザクションid TxID
1の何らかのアウトプットを使用し、トランザクションTx
2を含むので、これは1つの親を有する(in=1)。
【0101】
以下では、二重使用の試行がパイプラインレベルで処理されることを前提としている。そのため、孤立プール401でチェックを実行して二重使用の試行をシグナリングする必要がない。
【0102】
add_transaction手順は、トランザクションTx
childと、未検出又は孤立している親トランザクションのリストを取り入れる。親トランザクションのリストは、トランザクションTx
childを検証しようとするときにパイプラインによって収集される。このプ手順は、トランザクションTx
childを使用グラフに追加する。トランザクションインプットの1つが、孤立プールの使用グラフに含まれていない未検出トランザクションに関連付けられているアウトプットをアンロックすると、この関数はパイプラインで未検出トランザクションをリッスンする。
インプット:ransaction Tx
child、k個の欠落した親トランザクションのリストTxID
i、i=1,…,k
実行手順:
1.トランザクションTx
childからトランザクションID TxID
childを計算する。
2.TxID
childが使用グラフのデータ構造に存在する場合は、対応するノードN
Txchildを取得し、トランザクションTx
childを割り当てる(例えば、
図6(ii))。取得を最適化するために、トランザクションID TxIDを対応するノードに関連付けるハッシュマップデータ構造Hを使用できる。例えば、ノードN
TxIDが作成された場合、H(TxID)=N
TxIDと設定する。
3.それ以外の場合は、入次数値をkに設定して新しいノードを作成する(例えば、
図5のトランザクションTxID
4には2つの親がある)。
4.欠落しているトランザクションTxID
iごとに、次のようになる:
a.トランザクションIDがTxID
iのノードが使用グラフに存在しない場合は、入次数値をundefinedに設定してノードN
TxIDiを作成し、そのノードを使用グラフに追加する(例えば、
図6(i))。それ以外の場合は、N
TxIDiを取得する。
b.N
TxIDchildが未だ追加されていない場合は、N
TxIDiの子のリストにN
TxIDchildを追加する。
【0103】
release_transactions手順は、パイプラインによって見えているトランザクションをインプットとして取り入れる。孤立プール内のどの子トランザクションを解放してパイプラインに送信できるかを決定する。この場合、これらの子トランザクションは孤立プールから削除され、検証のためにトランザクションIDに関連付けられているハンドラに送信される。他の例では、TxIDによって、トランザクションを処理するハンドラが決定される場合がある。
インプット:トランザクションTx
実行手順:
1.トランザクションTxからトランザクションID TxIDを計算する。
2.トランザクションID TxIDに関連付けられているノードNTxIDを決定する。
3.ノードNTxIDの入次数値が0の場合は、検証のためにトランザクションTxを送信する。
4.NTxIDの子のリスト内の子ノードNTxIDchildごとに、次のコマンドを実行する:
a.NTxIDchildの入次数値を1だけ減らす。
b.インプットTxchildでrelease_transactionsを呼び出して、子トランザクションの削除を試みる。
5.NTxIDの入次数値がundefined又は0の場合は、ノードNTxIDを削除する。
【0104】
release_transaction関数では、トポロジの並べ替えアルゴリズムを使用できる。これは、Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2001), Introduction to Algorithms (2nd ed.), MIT Press and McGraw-Hill, pp.549-552, ISBN 0-262-03293-7 [Section 22.4]で説明されている。
【0105】
図7の例は、ノードN
TxID1に関連付けられている未検出トランザクションがパイプラインに入ったときに、検証のために送信されるノードを示している。手順release_transactionsは、ノードN
TxID1、N
TxID2、及びN
TxID3を削除する。
【0106】
各トランザクションTxを検証のためにハンドラに送信する(手順4b)代わりに、手順release_transactionsはトランザクションを収集し、1つ以上のバッチでハンドラに送信できる。解放のためにトランザクションをバッチ処理する場合は、トランザクションのチェーン(例えば、Tx2、Tx3)を、Tx1を検証しているのと同じStepProcessorに送信するという更なる方法もある。チェーン内の各親トランザクションは同じStepProcessorによって検証されるため、他のStepProcessorとの通信オーバヘッドを削減することで、トランザクションTx2とTx3の検証速度を向上させることができる。ここで、StepProcessorは、特定の機能を実行することを任務とするパイプライン403内のエンティティである。
【0107】
以下では、孤立プールをブロックチェーンノード104と統合するために使用できる3つの方法を、手順release_transactionsの呼び出し方法に関連して説明する。
【0108】
第1オプションは、未検出トランザクションごとにリスナを追加することである。手順add_transactionを使用して孤立プールにトランザクションが追加されるたびに、未検出親トランザクションは全てリスナに関連付けられる。未検出親トランザクションがパイプラインに入ると、リスナがトリガされ、未検出トランザクションをインプットとして使用して手順release_transactionsが呼び出される。
【0109】
次の方法はリスナを追加する。
インプット:トランザクションID TxID
実行手順:
1.トランザクションID TxIDに基づいてハンドラを決定する。
2.ハンドラに関連付けられているStepProcessorにリスナを追加する。
【0110】
この戦略の実装では、競合状態を考慮する必要がある。例えば、手順4bの前に親トランザクションがパイプラインで処理される可能性がある。
【0111】
リスナでパイプラインをオーバーロードする代わりに、別のオプションでは、孤立プールを定期的間隔で調べる(例えば毎秒)。孤立プール内で未検出として見えるトランザクションがパイプラインによって検出された場合は、release_transactionsを呼び出す。
【0112】
次の手順が時間間隔ごとに実行される。
1.孤立プール内の全ての未検出トランザクションTxに対して、
a.パイプラインに要求を送信して、トランザクションTxが見えたかどうかを確認する。
b.トランザクションTxが見えた場合は、Txをインプットとしてrelease_transactionsを呼び出す。
【0113】
解放を最適化するために、世代別ガベージコレクション技術で使用される「殆どのオブジェクトが若いうちに死ぬ(most objects die young)」という発見的観察を適用することができる。本発明の文脈では、これは最近追加された孤立トランザクションが孤立プールから削除される可能性が高いことを意味する。次に、上記のステップの応答性を向上させるために、孤立プールに追加された時間の降順で、未検出トランザクションを格納することができる。
【0114】
最後に、降順を維持しながら、使用グラフから未検出トランザクションをすばやく追加及び削除するために、優先順位キューを実装することができる。
【0115】
もう1つのオプションは、パイプラインの具体的なStepProcessor Sを通過した後に、トランザクションTxの孤立した子(存在する場合)を解放することである。
【0116】
次の手順が実行される。
1.StepProcessor Sを正常に通過した全てのトランザクションTxに対して、
a.Txをインプットとしてrelease_transactionsを呼び出す。
【0117】
各ノードは、メモリプール402と同様に、独自のバージョンの孤立プール401を有する。孤立トランザクションは、その有効性を決定できないため、ネットワーク106内の他のノードに伝播されない。孤立トランザクションでノード104をオーバーロードすることによってサービス拒否攻撃が試みられた場合、そのノード104の孤立プール401のみがサイズを増加させる。サイズが特定の閾値を超えないようにするために、孤立トランザクションごとに時間制限を課すことができ、その後、孤立トランザクションはプールから削除される。
【0118】
6.その他の注意事項
開示された技術の他の変形例又は使用事例は、本明細書で開示されると、当業者に明らかになり得る。本開示の範囲は、記載された実施形態によって限定されるものではなく、添付の特許請求の範囲によってのみ限定される。
【0119】
例えば、上述の幾つかの実施形態は、ビットコインネットワーク106、ビットコインブロックチェーン150、及びビットコインノード104の観点で説明された。しかしながら、ビットコインブロックチェーンは、ブロックチェーン150の1つの特定の例であり、上述の説明は任意のブロックチェーンに一般的に適用されてよいことが理解される。つまり、本発明は、ビットコインブロックチェーンに何ら限定されない。より一般的には、上述のビットコインネットワーク106、ビットコインブロックチェーン150、及びビットコインノード104への言及は、ブロックチェーンネットワーク106、ブロックチェーン150、及びブロックチェーンノード104により各々置き換えられてよい。ブロックチェーン、ブロックチェーンネットワーク、及び/又はブロックチェーンノードは、ビットコインブロックチェーン150、ビットコインネットワーク106、及びビットコインノード104の上述の特性の一部又は全部を共有してよい。
【0120】
本発明の好適な実施形態では、ブロックチェーンネットワーク106は、ビットコインネットワークであり、ビットコインノード104はブロックチェーン150のブロック151を生成し、公開し、伝播し、及び格納する上述の機能の少なくとも全部を実行する。これらの機能の全部ではなく1つ又は一部のみを実行する他のネットワークエンティティ(又はネットワーク要素)が存在することが除外されない。つまり、ネットワークエンティティは、ブロックを伝播し及び/又は格納する機能を実行してよいが、ブロックを生成し公開しなくてよい(これらのエンティティが好適なビットコインネットワーク106のノードとみなされないことを思い出してほしい)。
【0121】
本発明の他の実施形態では、ブロックチェーンネットワーク106はビットコインネットワークでなくてもよい。これらの実施形態では、ノードが、ブロックチェーン150のブロック151を生成し、公開し、伝播し、及び格納する機能の全部ではなく少なくとも1つ又は一部を実行してよいことが除外されない。例えば、これらの他のブロックチェーンネットワークでは、「ノード」は、ブロック151を生成し公開するよう構成されるが該ブロック151を格納し及び/又は他のノードに伝播しないネットワークエンティティを表すために使用されてよい。
【0122】
更に一般的には、上述の用語「ビットコインノード」104の言及は、用語「ネットワークエンティティ」又は「ネットワーク要素」と置き換えられてよい。このようなエンティティ/要素は、ブロックを生成し、公開し、伝播し、及び格納する役割のうちの一部又は全部を実行するよう構成される。そのようなネットワークエンティティ/要素の機能は、ハードウェアで、ブロックチェーンノード104を参照して上述したのと同じ方法で実装されてよい。
【0123】
上記の実施形態は、単なる例示として説明したものであることが理解されるであろう。より一般的には、以下の記述のうちの任意の1つ以上に従った方法、装置又はプログラムが提供され得る。
(ステートメント1)
ブロックチェーンノードによって実行されるコンピュータにより実施される方法であって、
孤立トランザクションを表すデータ構造を維持するステップであって、孤立トランザクションは、利用不可トランザクションである少なくとも1つの親トランザクション及び/又は異なる孤立トランザクションである少なくとも1つの親トランザクションを有するブロックチェーントランザクションであり、利用不可トランザクションは、ブロックチェーンノードの検証パイプラインに利用できないトランザクションである、ステップ、
を含み、
前記データ構造は、ノード及びエッジの有向グラフを含み、前記グラフの各ノードは、各々の孤立トランザクション又は各々の利用不可トランザクションのいずれかを表し、各々の親ノードを各々の子ノードに接続する各エッジは、前記各々の子ノードによって表される前記各々のトランザクションのインプットによる、前記各々の親ノードによって表される前記各々のトランザクションのアウトプットの使用を表し、
前記グラフの各ノードは、該ノードによって表される前記各々のトランザクションの各々のトランザクション識別子に関連付けられ、以下:
a)各々の入次数値であり、前記各々の入次数値は、以下:
i)前記各々のトランザクションが、利用不可トランザクション又は孤立トランザクションのいずれかである未知の数の親トランザクションを有することを示す第1値、又は
ii)前記各々のトランザクションが、利用不可トランザクション又は孤立トランザクションのいずれかである親トランザクションを有しないことを示す0の値、又は
iii)利用不可トランザクション又は孤立トランザクションのいずれかである、前記各々のトランザクションの各々の親トランザクションの数を示す値、
のうちの1つである入次数値、及び
b)各々のエッジによって該ノードに接続されている各々の子ノードが存在する場合には、各々の子ノードの各々の参照のリスト、
を含む、方法。
(ステートメント2)
前記データ構造は、前記孤立トランザクションの一部又は全部を含む、ステートメント1に記載の方法。
(ステートメント3)
各々の孤立トランザクションを表す前記グラフの1つの、一部の又は各々のノードは、前記各々の孤立トランザクションを含む、ステートメント2に記載の方法。
(ステートメント4)
各々の孤立トランザクションが前記データ構造内に所定の時間制限の間存在したことに応答して、前記データ構造から前記各々の孤立トランザクションを除去するステップ、
を含むステートメント2又は3に記載の方法。
(ステートメント5)
前記グラフの各ノードが、
c)該ノードにより表される前記各々のトランザクションの前記各々のトランザクション識別子、を含む、ステートメント1~4のいずれか一項に記載の方法。
(ステートメント6)
ターゲット孤立トランザクションと、利用不可トランザクション又は孤立トランザクションのいずれかである前記ターゲットトランザクションの各々のターゲット親トランザクションのリストとを取得するステップと、
前記ターゲット孤立トランザクションを入力として使用して追加トランザクションアルゴリズムを呼び出すステップと、
を含み、
前記追加トランザクションアルゴリズムを呼び出すステップは、
前記グラフが前記ターゲット孤立トランザクションを表すターゲット子ノードを含むかどうかを決定するステップと、
前記決定するステップに基づいて、前記ターゲット子ノードを作成又は更新することによって前記グラフを更新するステップと、
を含む、ステートメント1に記載の方法。
(ステートメント7)
前記決定するステップは、前記グラフの各々のノードが前記ターゲット孤立トランザクションのターゲットトランザクション識別子に関連付けられているかどうかを決定するステップを含む、ステートメント6に記載の方法。
(ステートメント8)
前記決定するステップは、前記ターゲットトランザクション識別子を生成するステップを含む、ステートメント7に記載の方法。
(ステートメント9)
前記追加トランザクションアルゴリズムを呼び出すステップは、
前記ターゲット孤立ノードの各々のターゲット親トランザクションの前記リスト内の各ターゲット親トランザクションに対して、
前記グラフが、前記ターゲット孤立トランザクションの前記各々のターゲット親トランザクションを表す各々のターゲット親ノードを含むかどうかを決定するステップと、
前記決定するステップに基づいて、前記各々のターゲット親ノードを作成又は更新することによって前記グラフを更新するステップであって、前記各々のノードは、前記ターゲット子ノードへの各々の参照を含む、ステップと、
を含む、ステートメント6又はステートメント6に従属するいずれか一項に記載の方法。
(ステートメント10)
前記各々のターゲット親ノードを作成するステップは、前記各々の親トランザクションが利用不可トランザクションである場合に、前記各々のターゲット親ノードの前記各々の入次数値を前記第1値として設定するステップを含む、ステートメント9に記載の方法。
(ステートメント11)
前記第1トランザクションを取得し、前記第1トランザクションを入力として解放トランザクションアルゴリズムを呼び出すステップ、を含み、
前記解放トランザクションアルゴリズムを呼び出すステップは、
前記第1トランザクションを表す前記グラフの第1ノードを識別するステップと、
前記第1ノードの前記入次数値が前記0値として設定されている場合、前記第1トランザクションを前記検証パイプラインに送信し、前記グラフから前記第1ノードを除去するステップと、
を含む、ステートメント1~11のいずれか一項に記載の方法。
(ステートメント12)
前記解放トランザクションアルゴリズムを呼び出すステップは、以下:
前記第1ノードによって参照される各々の子ノードに対して、
前記入次数が正の数である場合、利用不可トランザクション又は孤立トランザクションのいずれかである各々の親トランザクションの数を減少させることによって、前記各々の入次数値を更新するステップと、
前記各々の子ノードを入力として前記解放トランザクションアルゴリズムを呼び出すステップと、
により前記グラフを更新するステップを含む、ステートメント11に記載の方法。
(ステートメント13)
前記各々の子ノードを入力として前記解放トランザクションアルゴリズムを呼び出すステップは、1つ以上の子トランザクションが前記検証パイプラインに送信される結果となり、前記方法は、前記第1トランザクション及び前記1つ以上の子トランザクションをトランザクションのバッチとして前記検証パイプラインに送信するステップを含む、ステートメント12に記載の方法。
(ステートメント14)
前記第1トランザクション及び前記1つ以上の子トランザクションを前記検証パイプラインの同じプロセッサに送信するステップを含む、ステートメント13に記載の方法。
(ステートメント15)
前記第1トランザクションは、各々の利用不可トランザクションであり、前記方法は、
各々のリスナを1つ、幾つか、又は各々の利用不可トランザクションに関連付けるステップと、
前記各々の利用不可トランザクションを取得することに応答して、前記各々のリスナが前記解放トランザクションアルゴリズムを呼び出すステップと、
を含むステートメント11又はステートメント11に従属するいずれか一項に記載の方法。
(ステートメント16)
前記検証パイプラインで利用可能になった1つ以上の各々の利用不可トランザクションについて定期的間隔で前記データ構造を検索するステップと、
前記検証パイプラインで利用可能になった少なくとも1つの各々の利用不可トランザクションを識別するステップであって、前記第1トランザクションは、前記識別された各々の利用不可トランザクションであり、前記解放トランザクションアルゴリズムを呼び出すステップは、前記識別するステップに応答するものである、ステップと、
を含むステートメント11又はステートメント11に従属するいずれか一項に記載の方法。
(ステートメント17)
前記解放トランザクションアルゴリズムは、以下:
前記検証パイプラインが、前記第1トランザクションは前記検証パイプラインに入ったこと又は前記検証パイプラインから出たことを前記データ構造に通知すること、
前記データ構造が、前記第1トランザクションは前記データ構造内で利用不可トランザクションとして表現されていると決定すること、
に応答して呼び出される、ステートメント11又はステートメント11に従属するいずれか一項に記載の方法。
(ステートメント18)
コンピュータ機器であって、
1つ以上のメモリユニットを含むメモリと、
1つ以上の処理ユニットを含む処理機器と、
を含み、
前記メモリは、前記処理機器上で実行するよう構成されるコードを格納し、前記コードは前記処理機器上で実行するとステートメント1~17のいずれかに記載の方法を実行するよう構成される、コンピュータ機器。
(ステートメント19)
コンピュータ可読記憶装置上に具現化され、1つ以上のプロセッサ上で実行するとステートメント1~17のいずれかに記載の方法を実行するよう構成される、コンピュータプログラム。
(ステートメント20)
孤立トランザクションを表すデータ構造であって、孤立トランザクションは、利用不可トランザクションである少なくとも1つの親トランザクション及び/又は異なる孤立トランザクションである少なくとも1つの親トランザクションを有するブロックチェーントランザクションであり、利用不可トランザクションは、ブロックチェーンノードの検証パイプラインに利用できないトランザクションであり、
前記データ構造は、ノード及びエッジの有向グラフを含み、前記グラフの各ノードは、各々の孤立トランザクション又は各々の利用不可トランザクションのいずれかを表し、各々の親ノードを各々の子ノードに接続する各エッジは、前記各々の子ノードによって表される前記各々のトランザクションのインプットによる、前記各々の親ノードによって表される前記各々のトランザクションのアウトプットの使用を表し、
前記グラフの各ノードは、該ノードによって表される前記各々のトランザクションの各々のトランザクション識別子に関連付けられ、以下:
a)各々の入次数値であり、前記各々の入次数値は、以下:
i)前記各々のトランザクションが、利用不可トランザクション又は孤立トランザクションのいずれかである未知の数の親トランザクションを有することを示す第1値、又は
ii)前記各々のトランザクションが、利用不可トランザクション又は孤立トランザクションのいずれかである親トランザクションを有しないことを示す0の値、又は
iii)利用不可トランザクション又は孤立トランザクションのいずれかである、前記各々のトランザクションの各々の親トランザクションの数を示す値、
のうちの1つである入次数値、及び
b)各々のエッジによって該ノードに接続されている各々の子ノードが存在する場合には、各々の子ノードの各々の参照のリスト、
を含む、データ構造。
【国際調査報告】