(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024099823
(43)【公開日】2024-07-25
(54)【発明の名称】ブロックチェーン・トランザクションを検証するプロトコル
(51)【国際特許分類】
H04L 9/32 20060101AFI20240718BHJP
【FI】
H04L9/32 200Z
【審査請求】有
【請求項の数】20
【出願形態】OL
【外国語出願】
(21)【出願番号】P 2024075034
(22)【出願日】2024-05-07
(62)【分割の表示】P 2021569309の分割
【原出願日】2020-04-23
(31)【優先権主張番号】1907345.1
(32)【優先日】2019-05-24
(33)【優先権主張国・地域又は機関】GB
(71)【出願人】
【識別番号】318001991
【氏名又は名称】エヌチェーン ライセンシング アーゲー
(74)【代理人】
【識別番号】100107766
【弁理士】
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【弁理士】
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100135079
【弁理士】
【氏名又は名称】宮崎 修
(72)【発明者】
【氏名】タータン,クロエ
(72)【発明者】
【氏名】アマール,バッサム
(72)【発明者】
【氏名】デーヴィス,ジャック
(72)【発明者】
【氏名】ワハブ,ジェド
(72)【発明者】
【氏名】ジャン,ウェイ
(72)【発明者】
【氏名】ヴォーガン,オーウェン
(72)【発明者】
【氏名】ライト,クレイグ
(57)【要約】 (修正有)
【課題】ブロックチェーンにおける記録のためにトランザクションを検証するコンピュータ実行方法及び演算装置を提供する。
【解決手段】方法は、受信した各々のトランザクション152を検証するプロトコルが適用される。プロトコルは、ターミネーション・オペコードをトランザクションの出力スクリプトに含むように構成される。ターミネーション・オペコードは、ノードにより実行されると、出力スクリプトの実行を終了させ、かつ、出力スクリプトにターミネーション・オペコードを含むことだけでトランザクションを無効化しないように構成される。プロトコルは、ターミネーション・オペコードの如何なるインスタンスもトランザクションの入力スクリプトに含まないように構成され、ターミネーション・オペコードの何らかのインスタンスが入力スクリプトに含まる場合、ノードがトランザクションを無効化する。
【選択図】
図2
【特許請求の範囲】
【請求項1】
ブロックチェーンにおける記録のためにトランザクションを検証するコンピュータ実行方法であって、ブロックチェーン・ネットワークのノードで1つ以上のトランザクションを受信するステップと、受信した各々のトランザクションについて、前記トランザクションを検証するプロトコルを適用するステップとを含み、
前記プロトコルは、ターミネーション・オペコードの如何なるインスタンスも、前記トランザクションの入力スクリプトに含まれることを許容しないように構成され、該許容しないことは、前記ターミネーション・オペコードの何らかのインスタンスが前記入力スクリプトに含まれている場合に、前記ノードが前記トランザクションを少なくとも無効化することを含む、方法。
【請求項2】
前記プロトコルは、ターミネーション・オペコードが前記トランザクションの出力スクリプトに含まれることを可能にするように構成され、前記ターミネーション・オペコードは、前記ノードにより実行されると、a)前記出力スクリプトの実行を終了させるように、且つb)前記出力スクリプトに前記ターミネーション・オペコードを含んでいることのみに基づいて前記トランザクションを無効化しないように構成されている、請求項1に記載の方法。
【請求項3】
前記プロトコルは:
前記出力スクリプトが、少なくとも1つのデータ要素が先行する前記ターミネーション・オペコードのインスタンスの組み合わせを含む場合に、前記ターミネーション・オペコードのインスタンスと前記少なくとも1つのデータ要素との組み合わせに基づいて前記トランザクションを無効化するように構成されている、請求項2に記載の方法。
【請求項4】
前記少なくとも1つのデータ要素は、
ゼロ・オペコード;又は
前記トランザクションの証明可能な消費不能な出力を作成するためのゼロ値の表現;
のうちの一方又は双方を含む、請求項3に記載の方法。
【請求項5】
前記プロトコルは:
如何なるオペコードも、前記トランザクションの前記入力スクリプトに含まれることを許容しないように構成され、該許容しないことは、何らかのオペコードが前記入力スクリプトに含まれている場合に、前記ノードが前記トランザクションを少なくとも無効化することを含む、請求項1に記載の方法。
【請求項6】
前記検証することは:
出力スクリプトと前記入力スクリプトとの組み合わせの前記ノードによる実行の後に、エンプティでないゼロでない結果をもたらすこと;
前記ノードが、前記トランザクションを、前記ネットワークの1つ以上のノードへ、前記ブロックチェーンにおける記録のために転送すること;及び
前記ノードが前記トランザクションを前記ブロックチェーンに記録すること;
のうちの少なくとも1つを含む、請求項1に記載の方法。
【請求項7】
前記プロトコルに従って前記ブロックチェーン・ネットワークのトランザクションを実行するステップを含み、第1トランザクションは、スタック・ベースのスクリプト言語の第1ロッキング・スクリプトを含む第1出力を少なくとも含み、前記第1ロッキング・スクリプトは、前記ターミネーション・オペコードの第1インスタンスが実行される前に実行されるべき前記第1ロッキング・スクリプトの部分を含み、第2トランザクションは、前記第1トランザクションにおける前記第1出力を参照する第1アンロッキング・スクリプトを含み、
前記方法は、前記ターミネーション・オペコードの前記第1インスタンスを実行する場合に:
前記第1ロッキング・スクリプトの実行を終了するが、前記第1トランザクションを無効化しないステップ;
第1データ要素を少なくとも1つのスタックから読み込むステップであって、前記第1データ要素は、前記第1ロッキング・スクリプトの部分と前記第1アンロッキング・スクリプトの実行中に生成される、ステップ;及び
前記第1データ要素をオフ・チェーン・ファンクションへ、前記少なくとも1つのスタックから読み込まれた際に供給するステップであって、前記ファンクションは、少なくとも前記第1データ要素に基づいて結果を生成するように構成されている、ステップ;
を含む、請求項2に記載の方法。
【請求項8】
前記生成するステップは、結果的に、前記ブロックチェーン・ネットワークの別のトランザクションを生成するステップを含む、請求項7に記載の方法。
【請求項9】
前記別のトランザクションを、前記ブロックチェーン・ネットワークの1つ以上のノードへ送信するステップを含む、請求項8に記載の方法。
【請求項10】
前記第1トランザクションは複数の出力を含み、各出力は各自のロッキング・スクリプトを含み、前記複数の出力の各々は、各自の出力アドレスによって参照され、前記第1データ要素は、前記複数の出力のうちの第2出力を参照する出力アドレスであり、第1出力は前記第2トランザクションのアンロッキング・スクリプトで参照され;及び
前記オフ・チェーン・ファンクションは、前記ターミネーション・オペコードの前記第1インスタンスを呼び出す場合に、前記スタックから読み込まれた前記出力アドレスを使用して、前記第2出力のロッキング・スクリプトを参照する、請求項7に記載の方法。
【請求項11】
前記アンロッキング・スクリプトと前記第1ロッキング・スクリプトを実行するステップであって、前記第2出力の前記出力アドレスを前記スタックにプッシュすることを含むステップを含む請求項10に記載の方法。
【請求項12】
前記アンロッキング・スクリプトと前記第1ロッキング・スクリプトを実行する前に、前記アンロッキング・スクリプトと前記第1ロッキング・スクリプトを、スクリプト・テンプレートにコピーするステップを含み、前記スクリプト・テンプレートは、実行対象のスクリプトを含む、請求項11に記載の方法。
【請求項13】
前記第2出力の前記ロッキング・スクリプトを実行するステップを含む、請求項10に記載の方法。
【請求項14】
前記第2出力の前記ロッキング・スクリプトは、前記ターミネーション・オペコードの第2インスタンスの前に実行されるべきスクリプトの部分を含み、当該部分は、前記複数の出力のうちの第3出力を参照する出力アドレスを含み、
前記第2出力の前記ロッキング・スクリプトを実行するステップは、前記第3出力の前記出力アドレスを前記スタックにプッシュするステップを含み、
前記ファンクションは、前記ターミネーション・オペコードの前記第2インスタンスを呼び出す場合に、前記スタックから読み込まれた前記出力アドレスを使用して、前記第3出力のロッキング・スクリプトを参照するように構成されている、請求項13に記載の方法。
【請求項15】
参照した出力のロッキング・スクリプトを実行し、各自の出力の出力アドレスを前記オフ・チェーン・スタックにプッシュするオペレーションを実行するステップを含み、
前記ファンクションは、前記各自の出力の前記ターミネーション・オペコードの前記各自のインスタンスを呼び出す場合に、前記スタックから読み込まれた前記出力アドレスを使用して、前記複数の出力のうちの次のもののロッキング・スクリプトを参照するように構成されており、
前記複数の出力の内の、別のロッキング・スクリプトにより参照される各ロッキング・スクリプトが実行されるまで、前記オペレーションは反復される、請求項10に記載の方法。
【請求項16】
前記ロッキング・スクリプトのうちの1つが実行される度に、該ロッキング・スクリプトを前記スクリプト・テンプレートの先頭にコピーするステップ;及び
前記スクリプト・テンプレートを、別のトランザクションのロッキング・スクリプトとして使用するステップ;
を含み、前記別のトランザクションの前記ロッキング・スクリプトは、前記ターミネーション・オペコードのインスタンスを含んでいない、請求項15に記載の方法。
【請求項17】
前記第1ロッキング・スクリプトが前記ターミネーション・オペコードのインスタンスを含む場合に、全てのロッキング・スクリプトを前記第1トランザクションから取り出し、それらを各自の出力アドレスでインデックスを付けるステップを含む請求項10に記載の方法。
【請求項18】
各々のロッキング・スクリプトにおける各々の出力アドレスは各自のデータ要素であり、前記ファンクションは、前記各自のデータ要素を出力アドレスとして解釈するように構成されている、請求項10に記載の方法。
【請求項19】
コンピュータ読み取り可能なストレージに組み込まれたコンピュータ・プログラムであって、前記ブロックチェーン・ネットワークの前記ノードで実行されると、請求項1に記載の方法を実行するように構成されているコンピュータ・プログラム。
【請求項20】
1つ以上のメモリ・ユニットを含むメモリ;及び
1つ以上の処理ユニットを含む処理装置;
を含む演算装置であって、前記メモリは前記処理装置で実行されるように構成されたコードを記憶し、前記コードは、前記処理装置で実行されると、請求項1に記載の方法を実行するように構成されている、演算装置。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、ブロックチェーン・トランザクションを検証するプロトコル
の実装に関連する。
【背景技術】
【0002】
ブロックチェーンは分散されたデータ構造の形態を指し、ピア・ツー・ピア(P2P)ネットワーク内の複数のノードの各々において、ブロックチェーンの重複コピーが維持される。ブロックチェーンは、データのブロックのチェーンを含み、各ブロックは、1つ以上のトランザクションを含む。各トランザクションは、シーケンス内の先行するトランザクションを後方から指し示し、ブロックチェーンの先頭でジェネシス・ブロックに戻る。トランザクションは、新しいブロックに含まれるように、ネットワークに対してサブミットされることが可能である。新しいブロックは、“マイニング”として知られるプロセスによって生成され、これは、“プルーフ・オブ・ワーク”を実行する、即ちブロックに含まれることを待機しているペンディング・トランザクションのプールに基づいて暗号パズルを解決する、競合する複数のマイニング・ノードの各々に関わる。
【0003】
従来、ブロックチェーン内のトランザクションは、デジタル資産、即ち、価値のストア(a store of value)として機能するデータ、を伝達するために使用される。しかしながら、ブロックチェーンは、そのブロックチェーンの上に追加の機能を階層化するために使用することも可能である。例えば、ブロックチェーン・プロトコルは、トランザクションの出力に追加ユーザー・データを格納することが可能である。現代のブロックチェーンは、単一トランザクション内に格納することが可能な最大データ容量を増加させ、より複雑なデータが組み込まれることを可能にしている。例えば、それはブロックチェーン内に電子文書を、或いはオーディオ又はビデオ・データさえ、格納するために使用されてもよい。
【0004】
ネットワーク内の各ノードは、フォワーディング、マイニング、及びストレージの3つの役割のうちの何れか1つ、2つ、又は全ての役割を有する可能性がある。フォワーディング・ノードは、ネットワークのノード全体にトランザクションを伝搬させる。マイニング・ノードは、トランザクションのブロックへのマイニングを実行する。ストレージ・ノードはそれぞれ、ブロックチェーンのマイニングされたブロックのそれら自身のコピーを格納する。トランザクションをブロックチェーンに記録させるために、当事者は、トランザクションを、伝搬されるべきネットワークのノードのうちの1つに送信する。トランザクションを受信するマイニング・ノードは、新しいブロックに向かってトランザクションをマイニングするために競うことが可能である。各ノードは、同じノード・プロトコルを順守するように構成され、そのプロトコルは、有効化されることになるトランザクションに対する1つ以上の条件を含むであろう。無効なトランザクションは、伝搬されないか、又はブロックに向かってマイニングされないであろう。トランザクションが検証され、それによってブロックチェーンに受け入れられたと仮定すると、トランザクション(何らかのユーザー・データを含む)は、P2Pネットワークの各ノードで、変更できない公の記録として格納されたまま残る。
【0005】
プルーフ・オブ・ワーク・パズル(proof-of-work puzzle)を解くことに成功して最新のブロックを作成したマイナーは、典型的には、新たな量のデジタル資産を生み出す“ジェネレーション・トランザクション”と呼ばれる新たなトランザクションによって報われる。プルーフ・オブ・ワークは、マイナーが、二重支払トランザクション(double-spending transactions)を彼らのブロックに含めることによってシステムを欺かないように動機付け、なぜならそのようなことはブロックをマイニングするために大量のコンピュータ・リソースを必要とし、二重支払の試みを含むブロックは他のノードによって受け入れられない可能性が高いからである。
【0006】
“アウトプット・ベース”モデル(しばしばUTXOベース・モデルとも呼ばれる)では、所与のトランザクションのデータ構造は、1つ以上の入力と1つ以上の出力を含む。任意の使用可能な出力は、UTXO(“unspent transaction output”)としばしば呼ばれるデジタル資産の量を指定する要素を含む。出力は、更に、出力を償還(redeem)するための条件を指定するロッキング・スクリプトを更に含む可能性がある。各入力は、先行するトランザクションにおけるそのような出力に対するポインタを含み、更に、指し示された出力のロッキング・スクリプトをロック解除するためのアンロッキング・スクリプトを更に含む可能性がある。そこでトランザクションのペアを考え、それらを第1及び第2トランザクション(又は“ターゲット”トランザクション)と呼ぶ。第1トランザクションは、デジタル資産の量を指定する少なくとも1つの出力を含み、出力をロック解除する1つ以上の条件を定義するロッキング・スクリプトを含む。第2のターゲット・トランザクションは、第1トランザクションの出力に対するポインタと、第1トランザクションの出力をロック解除するためのアンロッキング・スクリプトとを含む、少なくとも1つの入力を含む。
【0007】
このようなモデルにおいて、第2のターゲット・トランザクションがブロックチェーン内で伝搬されて記録されるようにP2Pネットワークへ送信される場合に、各ノードで適用される有効性に関する条件の1つは、アンロッキング・スクリプトが、第1トランザクションのロッキング・スクリプトで定義された1つ以上の条件の全てを充足することであろう。別のものは、第1トランザクションの出力が、別の先行する有効なトランザクションによってまだ償還されていないことであろう。これらのうちの何れかの条件に従ってターゲット・トランザクションが無効であることを発見した如何なるノードも、それを伝搬せず、ブロックチェーンに記録されるブロックのマイニングに関してそれを含めない。
【0008】
別のタイプのトランザクション・モデルは、アカウント・ベース・モデルである。この場合、各トランザクションは、移転される分量を、過去のトランザクションのシーケンスで先行するトランザクションのUTXOを参照することによってではなく、むしろ絶対的なアカウント残高を参照することによって定める。全てのアカウントの現在の状態は、ブロックチェーンに対してバラバラにマイナーによって保存され、絶えず更新される。
【0009】
ブロックチェーン・プロトコルは、トランザクションに関するスクリプト言語を使用する可能性がある。スクリプトは、本質的には要素のリストであり、要素はデータ又は命令である可能性がある。この命令は、文献ではスクリプト語、オペコード、コマンド、又はファンクションとして言及される。オペコード(オペレーション・コードの略)は、スクリプト内のデータに対して事前に定義されたオペレーションを実行する。
【発明の概要】
【0010】
そのようなオペコードの1つはOP_RETURNである。元来のブロックチェーン・プロトコルでは、OP_RETURNの目的は、スクリプトの実行を終了することであった。それは、スクリプトを含むトランザクションを無効化してはいなかった。しかしながら、このことは、OP_RETURNがトランザクションの入力スクリプトに含まれていた場合に、不正な攻撃を招いた。具体的には、OP_RETURNを含んだトランザクションの如何なる入力スクリプトも、先行トランザクションの出力スクリプトをロック解除するために使用される可能性がある。従って、既存のブロックチェーン・プロトコルでは、そのプロトコルは、オペコードOP_RETURNが証明可能に消費不能なトランザクション出力を表すように変更され、ブロックチェーン上におけるデータの格納を可能する。既存のプロトコルでは、OP_RETURNオペコードは、スクリプトの実行を終了し、同時にトランザクションを無効化するために使用される。しかしながら、これは、ブロックチェーン内の機能の喪失という結果を招き、なぜなら何らかのアンロッキング・スクリプトと一緒に実行する場合に、その入力スクリプトにOP_RETURNを有するトランザクションは、‘TRUE’(又は有効)な実行の結果をもたらし得ないからである。
【0011】
本件で開示される一態様によれば、ブロックチェーンにおける記録のためにトランザクションを検証するためにコンピュータが実行する方法が提供され、本方法は、ブロックチェーン・ネットワークのノードで1つ以上のトランザクションを受信するステップと、受信した各々のトランザクションについて、トランザクションを検証するプロトコルを適用するステップとを含み、プロトコルは、ターミネーション・オペコードがトランザクションの出力スクリプトに含まれることを可能にするように構成され、ターミネーション・オペコードは、ノードにより実行されると、a)出力スクリプトの実行を終了させるように、且つb)出力スクリプトにターミネーション・オペコードを含んでいることのみに基づいてはトランザクションを無効化しないように構成されており;及びプロトコルは、ターミネーション・オペコードの如何なるインスタンスも、トランザクションの入力スクリプトに含まれることを許容しないように構成され、該許容しないことは、ターミネーション・オペコードの何らかのインスタンスが入力スクリプトに含まれている場合に、ノードがトランザクションを少なくとも無効化することを含む。
【0012】
ターゲット・トランザクションを含む複数のトランザクションの各々に対して、ネットワークの少なくとも幾つかのノードは、トランザクションが有効であるという条件で各トランザクションを伝搬するように構成され、少なくとも幾つかのノードは、トランザクションが有効であるという条件で、そのノードのブロックチェーンのコピーに各トランザクションを記録するように構成される。トランザクションの有効性は、上記のプロトコルを条件とし、そのプロトコルに従って、特定のオペコードが呼び出される場合に、スクリプトのみが終了し、重要なことに、トランザクションは無効化されない。例えば、トランザクションの有効性は、スタックの最上位要素に依存する可能性がある。
【0013】
簡明化のため、以下、終了オペコードは“OP_RETURN”と言及される。しかしながら、本開示はそのような特定のラベルを有するオペコードに限定されない。より一般的には、実施形態は、ブロックチェーン・スクリプト言語の“OP_RETURN”に関して説明されるであろうが、同様な教示は、スクリプト・エンジン(例えば、スクリプト・インタープリタ)によって呼び出される場合に、特定のファンクションを実行する任意のオペコードを使用して実装されることが可能であり、そのファンクションは、スクリプトの実行を終了する一方、トランザクションを無効化しないものである。オペコードの第1及び第2インスタンスに関する言及は、同じタイプのオペコードのインスタンスとして解釈されるべきである。
【0014】
プロトコルは、入力スクリプトが、出力スクリプトと一緒に実行される場合に、有効に実行されることを可能にする一方、OP_RETURNを有する入力スクリプトが何らかの出力スクリプトをロック解除するために使用できないことを保証ことで不正な攻撃を防止することによって、トランザクションの機能を取り戻す。
【0015】
ノードは、上記のプロトコルに基づいてノードが処理するトランザクションを検証又は無効化するように構成される。即ち、ノードがトランザクションを処理する場合に、トランザクションの出力スクリプト(又は1つより多い出力スクリプト)にOP_RETURNが含まれていると、OP_RETURNが呼び出された場合に、出力スクリプトの終了という結果をもたらすことになる。OP_RETURNを出力スクリプトに含めることは、トランザクションを無効化しない。トランザクションは、その他の理由で無効化される可能性がある。一方、OP_RETURNがトランザクションの入力スクリプトに含まれている場合、ノードはトランザクションを常に無効化するように構成される。ここで、OP_RETURNが何らかの入力スクリプトに含まれることは、トランザクションが無効化されるという結果をもたらすことになる。幾つかの例において、スクリプトを実行する前に、ノードは、入力スクリプト内で、OP_RETURNの何らかのインスタンスをスキャンし、そのような何らかのインスタンスが存在する場合、ノードは、トランザクションを、即ち入力スクリプトを実行する前に、無効化にするように構成される。
【0016】
ブロックチェーン・ネットワークの各タイプのノードは、同じプロトコルを実装することが可能である。ブロックチェーン・ネットワークのノードは、例えば、マイニング・ノード、フォワーディング・ノード、又はストレージ・ノードである可能性があり、各々は、以下に説明されるように、1つ以上の同じ機能を有する。例えば、ノードがフォワーディング・ノードである場合、フォワーディング・ノードは、トランザクションの何らかの入力スクリプトにOP_RETURNオペコードが存在しないという条件を少なくとも含むプロトコルに従って、トランザクションが有効であるという条件で、トランザクションを、ブロックチェーン・ネットワークの1つ以上のノードへ転送できるだけである。
【図面の簡単な説明】
【0017】
本開示の実施形態の理解を促し、そのような実施形態がどのように実施され得るかを示すために、添付の図面を単なる具体例として参照する:
【
図1】ブロックチェーンを実装するためのシステムの概略ブロック図である。
【
図2】ブロックチェーンに記録されることが可能なトランザクションの幾つかの例を概略的に示す。
【
図3】ブロックチェーンを実装するための別のシステムの概略ブロック図である。
【
図4】ランザクションを実行するためのノード・ソフトウェアの概略ブロック図である。
【
図5a】開始トランザクションTx
Inの例を示す。各入力はプレイヤーからのコミットメントrを含む。
【
図5b】例示的なオラクル・トランザクションTx
Oracleを示す。出力0がデジタル資産を当事者に転送し、出力1が乱数を生成する。
【
図6a】複合機能トランザクションの出力0内のアウトポイント・アドレス1へジャンプする際のオフ・ブロック・スクリプト・インタープリタの例を示す。
【
図6b】アウトポイント間で可能な多数のジャンプを組み込む複合機能トランザクションの例を示す。
【
図7】入力a=105及びb=28に対するユークリッド・アルゴリズムの合成スクリプト機能からのループをアンパックする例である。
【
図8】入力5,Gによる楕円曲線点乗算の例であり、Altスタック(影で示されているもの)がメイン・スタックと並んで示されている。
【発明を実施するための形態】
【0018】
図1は、ブロックチェーン150を実装するための例示的なシステム100を示す。システム100は、典型的にはインターネットのような広域インターネットワークであるパケット交換ネットワーク101を含む。パケット交換ネットワーク101は、パケット交換ネットワーク101内でピア・ツー・ピア(P2P)オーバーレイ・ネットワーク106を形成するように構成される複数のノード104を含む。各ノード104はピアのコンピュータ装備を含み、ノード104のうちの異なるものは異なるピアに属する。各ノード104は、1つ以上のプロセッサ、例えば、1つ以上の中央処理ユニット(CPU)、アクセラレータ・プロセッサ、特定用途向けプロセッサ、及び/又はフィールド・プログラマブル・ゲート・アレイ(FPGA)を含む処理装置を含む。各ノードはまた、メモリ、即ち、非一時的なコンピュータ読み取り可能な媒体又はメディアの形態におけるコンピュータ読み取り可能なストレージを備える。メモリは、1つ以上のメモリ媒体、例えば、ハード・ディスクのような磁気媒体;ソリッド・ステート・ドライブ(SSD)、フラッシュ・メモリ又はEEPROMのような電子媒体;及び/又は光ディスク・ドライブのような光媒体;を使用する1つ以上のメモリ・ユニットを含んでもよい。
【0019】
ブロックチェーン150は、データ151のブロックのチェーンを含み、ブロックチェーン150のそれぞれのコピーは、P2Pネットワーク160内の複数のノードのそれぞれにおいて維持される。チェーン内の各ブロック151は、1つ以上のトランザクション152を含み、ここで、この文脈におけるトランザクションは一種のデータ構造を参照する。データ構造の性質は、トランザクション・モデル又はスキームの一部として使用されるトランザクション・プロトコルのタイプに依存することになる。所与のブロックチェーンは、典型的には、全体を通じて1つの特定のトランザクション・プロトコルを使用する。1つの一般的なタイプのトランザクション・プロトコルでは、各トランザクション152のデータ構造は、少なくとも1つの入力及び少なくとも1つの出力を含む。各々の出力は、ユーザー103に属するデジタル資産の量を表す分量を指定し、そのユーザーに出力は暗号的にロックされている(ロック解除してそれによって償還又は消費されるためには、そのユーザーの署名を必要とする)。各々の入力は、先行するトランザクション152の出力を後方から指し示し、それによって、トランザクションを結び付ける。
【0020】
ノード104のうちの少なくとも一部は、トランザクション152を転送し、それによって伝搬させる転送ノード104Fの役割を担う。ノード104のうちの少なくとも一部は、マイナー・ブロック151を採掘するマイナー104Mの役割を担う。ノード104のうちの少なくとも一部は、記憶ノード104Sの役割を担い(しばしば“フル・コピー”ノードとも呼ばれる)、各ノードは、各自それぞれのメモリに同じブロックチェーン150の各自のコピーを記憶する。各マイナー・ノード104Mはまた、ブロック151へのマイニングを待つトランザクション152のプール154を維持する。所与のノード104は、転送ノード104、マイナー104M、ストレージ・ノード104S、又はこれらのうちの2つ若しくは全ての任意の組み合わせであり得る。
【0021】
所与の現在のトランザクション152jにおいて、その(各々の)入力は、トランザクションのシーケンスにおいて先行するトランザクション152iの出力を参照するポインタを含み、それはこの出力が現在のトランザクション152jにおいて償還されるか、又は“消費される”ことを指定する。一般に、先行するトランザクションは、プール154又は任意のブロック151内の任意のトランザクションであるとすることが可能である。先行するトランザクション152iは、現在のトランザクション152jが作成される時点、又はネットワーク106へ送信される時点においてさえ必ずしも存在することを必要としないが、先行するトランザクション152iは、現在のトランザクションが有効とされるためには、存在して検証されることを必要とする。従って、本件において“先行する(preceding)”とは、ポインタによってリンクされた論理的な順序における先行を指し、必ずしも時間的な順序における作成又は送信する時間ではなく、従って、トランザクション152i、152jが順番通りではく作成又は送信されることを必ずしも排除していない(孤立トランザクションに関する以下の説明を参照されたい)。先行するトランザクション152iは、同様に、先立つトランザクション又は先行トランザクションと呼ぶことができる。
【0022】
現在のトランザクション152jの入力は、ユーザー103aの署名も含み、先行するトランザクション152iの出力はそのユーザーにロックされる。次いで、現在のトランザクション152jの出力は、新しいユーザー103bに暗号的にロックすることができる。従って、現在のトランザクション152jは、先行するトランザクション152iの入力で定められる分量を、現在のトランザクション152jの出力で定められる新しいユーザー103bへ転送することができる。ある場合には、トランザクション152は、複数のユーザー間で入力量を分割するために、複数の出力を有する可能性がある(それらのうちの1つは、変更をもたらすための、オリジナル・ユーザー103aであるとすることが可能である)。場合によっては、トランザクションは複数の入力を有し、1つ以上の先行トランザクションの複数の出力からの分量を集め、現在のトランザクションの1つ以上の出力へ分配し直すことも可能である。
【0023】
上記は、“出力ベース”トランザクション・プロトコルと呼ばれることがあり、時には未使用トランザクション出力(UTXO)タイプのプロトコルとも呼ばれる(出力はUTXOと呼ばれる)。ユーザーのトータル・バランスは、ブロックチェーン151で記憶されるどの1つの数においても定められず、その代わりに、ユーザーは、ブロックチェーン151内の多くの異なるトランザクション152に散在する、そのユーザーの全てのUTXOの値を照合するための特別な“ウォレット”アプリケーション105を必要とする。
【0024】
別のタイプのトランザクション・プロトコルは、アカウント・ベースのトランザクション・モデルの一部として、“アカウント・ベース”プロトコルと呼ばれることがある。アカウント・ベースの場合、各トランザクションは、過去のトランザクションのシーケンスにおける先行トランザクションのUTXOを後方から参照することによって転送される分量を定めるのではなく、むしろ絶対的なアカウント残高を参照することによって定める。全てのアカウントの現在の状態は、ブロックチェーンに分散するマイナーによって記憶され、絶えず更新される。このようなシステムでは、トランザクションは、アカウントの実行中のトランザクション・タリー(tally)(“ポジション”とも呼ばれる)を使用して並べられる。この値は、送信者によって、自身の暗号署名の一部として署名され、トランザクション参照計算の一部としてハッシュ化される。更に、オプションのデータ・フィールドがトランザクションにおいて署名されてもよい。このデータ・フィールドは、例えば、以前のトランザクションIDがデータ・フィールドに含まれている場合に、以前のトランザクションを示すことが可能である。
【0025】
何れのタイプのトランザクション・プロトコルでも、ユーザー103が新しいトランザクション152jを制定することを希望する場合、彼/彼女は、彼/彼女のコンピュータ端末102から、P2Pネットワーク106のノード104のうちの1つへ、新しいトランザクションを送信する(これは今日では、通常、サーバー又はデータ・センターであるが、原理的には他のユーザー端末であるとすることが可能である)。このノード104は、各ノード104で適用されるノード・プロトコルに従って、トランザクションが有効であるかどうかをチェックする。ノード・プロトコルの詳細は、全体的なトランザクション・モデルを形成するとともに、対象のブロックチェーン150で使用されているトランザクション・プロトコルのタイプに対応することになる。ノード・プロトコルは、典型的には、新たなトランザクション152jにおける暗号署名が、トランザクション152の順序付けられたシーケンスにおいて先行するトランザクション152iに依存する期待される署名に一致することをチェックするように、ノード104に要求する。出力ベースの場合、これは、新しいトランザクション152jの入力に含まれるユーザーの暗号署名が、新しいトランザクションが消費する先行トランザクション152iの出力で定められる条件に合致することをチェックすることを含む可能性があり、その条件は、典型的には、新しいトランザクション152jの入力における暗号署名が、新しいトランザクションの入力が指し示す先行トランザクション152iの出力をロック解除することを少なくともチェックすることを含む。幾つかのトランザクション・プロトコルでは、条件は、少なくとも部分的に、入力及び/又は出力に含まれるカスタム・スクリプトによって定められてもよい。代替的に、単にノード・プロトコルだけで解決することも可能であり、或いは、これらの組み合わせによることも可能である。何れにせよ、新しいトランザクション152jが有効であるならば、現在のノードは、P2Pネットワーク106内のノード104のうちの1つ以上の他のノードへそれを転送する。これらのノード104のうちの少なくとも一部は、転送ノード104Fとしても機能し、同じノード・プロトコルに従って同じテストを適用し、新しいトランザクション152jを1つ以上の更なるノード104へ転送すること等々を行う。このように、新しいトランザクションは、ノード104のネットワーク全体に伝搬される。
【0026】
出力ベース・モデルでは、所与の出力(例えば、UTXO)が消費されるかどうかの定義は、ノード・プロトコルに従って、別の前方トランザクション152jの入力によってまだ有効に償還されるかどうかである。トランザクションが有効であるための別の条件は、それが消費又は償還を試みる先行トランザクション152iの出力が、別の有効なトランザクションによってまだ消費/償還されていないことである。再度、有効でない場合、トランザクション152jは、ブロックチェーンにおいて伝搬又は記録されない。これは、消費者が、同じトランザクションの出力を、複数回消費しようとする二重消費から保護する。一方、アカウント・ベースのモデルは、アカウント・バランスを維持することによって、二重消費から保護する。この場合も、トランザクションの定められた順序が存在するので、アカウント・バランスは、一度に1つの定められた単独の状態を有する。
【0027】
検証に加えて、ノード104Mのうちの少なくとも一部はまた、“プルーフ・オブ・ワーク”によって支えられている、マイニングとして知られるプロセスでトランザクションのブロックを最初に作成するために競い合う。マイニング・ノード104Mでは、まだブロックに登場していない有効なトランザクションのプールに、新しいトランザクションが追加される。次いで、マイナーたちは、暗号パズルを解くことを試みることによって、トランザクションのプール154から、トランザクション152の新しい有効なブロック151を組み立てようと競う。典型的には、これは、“ナンス(nonce)”値を探索することを含み、その結果、ナンスがトランザクションのプール154に連結され、ハッシュ化されると、ハッシュの出力は所定の条件を満たす。例えば、所定の条件は、ハッシュの出力が、所定の数の先行するゼロを有することであってもよい。ハッシュ関数の特性は、入力に対して予測不能な出力を有することである。即ち、この探索は、ブルートフォースによってのみ実行することが可能であり、従って、パズルを解こうと試みる各ノード104Mでは、かなりの量の処理リソースを消費する。
【0028】
パズルを解いた最初のマイナー104Mは、それをネットワーク106へ通知し、その解を証明(proof)として提供し、次いでその証明はネットワーク内の他のノード104によって容易にチェックすることができる(ハッシュに対する解が与えられると、それがハッシュの出力を条件に合致させることをチェックすることは容易である。勝者がパズルを解いたトランザクションのプール154は、次いで、そのような各ノードにおける勝者が告知した解のチェックに基づいて、ストレージ・ノード104Sとして機能するノード104のうちの少なくとも一部によって、ブロックチェーン150内の新しいブロック151として記録されるようになる。ブロック・ポインタ155はまた、チェーン内で以前に生成されたブロック151n-1を後方から指し示す新しいブロック151nにも割り当てられる。新しいブロック151を作成するために多大な労力を費やすので、プルーフ・オブ・ワークは二重支出のリスクを低減するのに役立ち、また、二重支出を含む如何なるブロックも他のノード104によって拒否される可能性が高いので、マイニング・ノード104Mは、二重支出がそれらのブロックに含まれることを許容しないように動機付けられる。いったん生成されると、ブロック151は修正されることは不可能であり、なぜなら同じプロトコルに従ってP2Pネットワーク106内の記憶ノード104Sの各々でそれが認識されて維持されるからである。ブロック・ポインタ155はまた、ブロック151に連続的な順序を課す。トランザクション152は、P2Pネットワーク106内の各々の記憶ノード104Sにおいて順序付けられたブロックに記録されるので、従ってこれはトランザクションの変更できない公の台帳を提供する。
【0029】
任意の所与の時間にパズルを解くために競い合う様々なマイナー104Mは、それらがいつ解を探索し始めたかに応じて、任意の所与の時間における採掘されていないトランザクション・プール154の様々なスナップ・ショットに基づいて、そのようにすることができることに留意されたい。それぞれのパズルを最初に解いた者が誰であれ、どのトランザクション152が次の新しいブロック151nに含まれるかを定め、採掘されていないトランザクションの現在のプール154が更新される。次いで、マイナー104Mは、新たに定められた未解決のプール154から、ブロックを生成する等のために競い続ける。また、生じる可能性のある“フォーク”を解決するためのプロトコルも存在し、これは、2人のマイナー104Mが互いの非常に短時間の間に彼らのパズルを解いて、その結果、ブロックチェーンの矛盾した見方が伝播してゆくことである。要するに、フォークのどちらの突起が伸びても、最も長い方が最終的なブロックチェーン150となる。
【0030】
ほとんどのブロックチェーンでは、勝利したマイナー104Mは、(あるユーザーから別のユーザーへある分量のデジタル資産を移転する通常のトランザクションとは異なり)どこにもない新しい分量のデジタル資産を創出する特別な種類の新しいトランザクションによって自動的に報奨を受ける。従って、勝利したノードは、ある分量のデジタル資産を“採掘した”したと言われる。この特殊なタイプのトランザクションは、しばしば“ジェネレーション”トランザクションと呼ばれる。それは自動的に新しいブロック151nの一部を形成する。この報奨は、マイナー104Mがプルーフ・オブ・ワークに参加するインセンティブを与える。通常の(ジェネレーションでない)トランザクション152は、その出力の1つにおいて追加のトランザクション手数料を指定し、そのトランザクションが含まれたブロック151nを生成した勝利したマイナー104Mを更に報奨する。
【0031】
マイニングに関わる計算リソースに起因して、典型的には、マイナー・ノード104Mのうちの各々は少なくとも、1つ以上の物理的なサーバー・ユニット、又はデータ・センター全体さえも含むサーバーの形態をとる。各々の転送ノード104M及び/又は記憶ノード104Sは、サーバー又はデータ・センターの形態をとることも可能である。しかしながら、原理的には、所与の任意のノード104は、ユーザー端末又は互いにネットワーク接続されたユーザー端末のグループ、の形態をとることができる。
【0032】
各ノード104のメモリは、それぞれの1つの役割又は複数の役割を実行し、ノード・プロトコルに従ってトランザクション152を処理するために、ノード104の処理装置で動作するように構成されたソフトウェア400を記憶する。本件においてノード104に帰属する如何なるアクションも、それぞれのコンピュータ装備の処理装置上で動作するソフトウェア400によって実行されてもよいことが理解されるであろう。また、本件で使用される用語“ブロックチェーン”は、一般的な技術の種類を指し、何らかの特定の専有ブロックチェーン、プロトコル又はサービスに限定されない一般的な用語である。
【0033】
また、ネットワーク101に接続されるものは、消費するユーザーの役割を担う複数の当事者103各々のコンピュータ装備102である。これらは、トランザクションにおける支払人と受取人として機能するが、他の当事者の代わりに、トランザクションをマイニングしたり又は伝播させたりすることに必ずしも参加しない。それらは必ずしもマイニング・プロトコルを実行するわけではない。2つの当事者103及びそれぞれの装備102は、説明の目的で示されており:第1当事者103a及び彼/彼女の各自のコンピュータ装備102a、並びに第2当事者103b及び彼/彼女の各自のコンピュータ装備102bである。より多くのこのような当事者103及びそれら各自のコンピュータ装備102がシステムに存在し、参加する可能性があるが、便宜上、それらは図示されていないことが理解されるであろう。各々の当事者103は、個人又は組織であってもよい。純粋に例示として本件において第1当事者103aはアリス(Alice)と称され、第2当事者103bはボブ(Bob)と称されるが、これが限定ではないこと、本件におけるアリス又はボブという如何なる言及も、それぞれ“第1当事者”及び“第2当事者”で置き換えられてもよいことが理解されるであろう。
【0034】
各々の当事者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つ以上の他のネットワーク化されたリソースを含んでもよい。
【0035】
クライアント・アプリケーション又はソフトウェア105は、最初に、適切なコンピュータ読み取り可能な記憶媒体又はメディア上の任意の所与の当事者103のコンピュータ装備102に提供されてもよく、例えばサーバーからダウンロードされてもよいし、又はリムーバブル・ストレージ・デバイスであって、リムーバブルSSD、フラッシュ・メモリ・キー、リムーバブルEEPROM、リムーバブル磁気ディスク・ドライブ、磁気フロッピー・ディスク又はテープ、CD又はDVD ROMのような光ディスク、又はリムーバブル光学ドライブのようなもので提供されてもよい。
【0036】
クライアント・アプリケーション105は少なくとも“ウォレット(wallet)”機能を含む。これは主に2つの機能を有する。これらのうちの1つは、それぞれのユーザー当事者103が、トランザクション152を作成し、署名し、送信して、ノード104のネットワーク全体にわたって伝搬させ、それによってブロックチェーン150に含まれることを可能にすることである。もう1つは、彼又は彼女が現在所有しているデジタル資産の分量をそれぞれの当事者に報告することである。出力ベース・システムでは、この第2機能は、対象の当事者に属するブロックチェーン150全体に散在する様々な152トランザクションの出力で定められる分量を照合することを含む。
【0037】
各コンピュータ装備102におけるクライアント・アプリケーション105のインスタンスは、P2Pネットワーク106の転送ノード104Fのうちの少なくとも1つに動作可能に結合される。これは、クライアント105のウォレット機能が、トランザクション152をネットワーク106に送信することを可能にする。クライアント105はまた、記憶ノード104のうちの1つ、一部、又は全部と連絡を取り、それぞれの当事者103が受取人である何らかのトランザクションについて、ブロックチェーン150に問い合わせを行うことができる(又は、実際、ブロックチェーン150内の他の当事者のトランザクションを検査し、なぜなら実施形態ではブロックチェーン150は、部分的にその公衆の目に触れてトランザクションの信頼を提供する公の施設であるからである)。各々のコンピュータ装備102におけるウォレット機能は、トランザクション・プロトコルに従ってトランザクション152を形成し、送信するように構成される。各ノード104は、ノード・プロトコルに従ってトランザクション152を検証するように構成されたソフトウェア400を実行し、転送ノード104Fの場合には、ネットワーク106全体にトランザクション152を伝播させるためにトランザクション152を転送する。トランザクション・プロトコルとノード・プロトコルは互いに対応し、所与のトランザクション・プロトコルは所与のノード・プロトコルと共に所与のトランザクション・モデルを実装する。同じトランザクション・プロトコルが、ブロックチェーン150内の全てのトランザクション152に使用される(ただし、トランザクション・プロトコルは、トランザクションの異なるサブタイプをその中で許可してもよい)。同じノード・プロトコルは、ネットワーク106内の全てのノード104によって使用される(ただし、それはそのサブタイプに対して定められたルールに従って異なるトランザクションのサブタイプを別様に処理し、また、異なるノードは異なる役割を担い、従ってプロトコルの様々な対応する側面を実装することができる)。
【0038】
上述したように、ブロックチェーン150はブロック151のチェーンを含み、各ブロック151は、上述したように、プルーフ・オブ・ワーク・プロセスによって作成された1つ以上のトランザクション152のセットを含む。各ブロック151はまた、ブロック151に対する連続的な順序を定めるように、チェーン内で以前に生成されたブロック151を後方から指し示すブロック・ポインタ155を含む。ブロックチェーン150はまた、プルーフ・オブ・ワーク・プロセスによって新しいブロックに含まれることを待機する有効なトランザクション154のプールを含む。各トランザクション152は、一連のトランザクションに対する順序を定めるように、先行するトランザクションを指し示すポインタを含む(注:一連のトランザクション152は、分岐することが許されている)。ブロック151のチェーンは、チェーンの先頭ブロックであったジェネシス・ブロック(Gb)153に様々な経路で戻る。チェーン150の初期において、1つ以上のオリジナル・トランザクション152は、先行トランザクションではなく、ジェネシス・ブロック153を指していた。
【0039】
所与の当事者103、例えばアリスが、ブロックチェーン150に含まれるように新しいトランザクション152jを送信することを望む場合、彼女は、関連するトランザクション・プロトコルに従って(彼女のクライアント・アプリケーション105におけるウォレット機能を使用して)新しいトランザクションを形成する。次いで、彼女は、トランザクション152を、クライアント・アプリケーション105から、彼女がつながっている1つ以上の転送ノード104Fのうちの1つへ送信する。例えば、これは、アリスのコンピュータ102に最も近いか、又は最良に接続されている転送ノード104Fである可能性がある。何らかの所与のノード104が新しいトランザクション152jを受信すると、それはノード・プロトコル及び各自の役割に従ってそれを処理する。これは、最初に、新たに受信したトランザクション152jが“有効”であるための特定の条件を充足するかどうかをチェックすることを含み、その例は間もなくより詳細に説明される。幾つかのトランザクション・プロトコルでは、検証のための条件は、トランザクション152に含まれるスクリプトによってトランザクションごとに設定可能であってもよい。代替的に、条件は単にノード・プロトコルの組み込み機能であってもよいし、あるいはスクリプトとノード・プロトコルの組み合わせによって定められてもよい。
【0040】
新たに受信されたトランザクション152jが、有効であると認められるテストに合格するという条件の下で(即ち、“有効化されている”という条件の下で)、トランザクション152jを受信した任意の記憶ノード104Sは、新たに有効とされたトランザクション152を、そのノード104Sで維持されているブロックチェーン150のコピー内のプール154に追加する。更に、トランザクション152jを受信する任意の転送ノード104Fは、検証されたトランザクション152を、P2Pネットワーク106内の1つ以上の他のノード104へ前方に伝搬させるであろう。各々の転送ノード104Fは同じプロトコルを適用するので、トランザクション152jが有効であると仮定すると、これは、P2Pネットワーク106全体に間もなく伝搬されるであろうということを意味する。
【0041】
1つ以上のストレージ・ノード104で維持されるブロックチェーン150のコピー内のプール154に対していったん認められると、マイナー・ノード104Mは、新しいトランザクション152を含むプール154の最新バージョンに関するプルーフ・オブ・ワーク・パズルを解くために競争を開始する(他のマイナー104Mは、依然として、プール154の古い見解に基づいてパズルを解こうとするかもしれないが、そこに最初に到達した者は誰でも、次の新しいブロック151が終了して新しいプール154が始まる場所を定め、最終的には、誰かが、アリスのトランザクション152jを含むプール154の一部に対するパズルを解くであろう)。一旦、新しいトランザクション152jを含むプール154についてプルーフ・オブ・ワークが行われると、それは、変更不可能な方法で、ブロックチェーン150内のブロック151のうちの1つの一部となる。各々のトランザクション152は、以前のトランザクションに返るポインタを含むので、トランザクションの順序もまた、変更不可能に記録される。
【0042】
異なるノード104は、先ず、所与のトランザクションの異なるインスタンスを受信し、従って、1つのインスタンスがブロック150へマイニングされる前に、どのインスタンスが‘有効’であるかについての競合する見解を有する可能性があり、そのマイニングされた時点で、全てのノード104は、マイニングされたインスタンスが唯一の有効なインスタンスであることに同意する。ノード104が1つのインスタンスを有効として受け入れ、次いで、第2インスタンスがブロックチェーン150に記録されていることを発見した場合、そのノード104はそれを受け入れなければならず、最初に受け入れた未採掘のインスタンスを破棄するであろう(即ち、無効として取り扱う)。
【0043】
図2は、例示的なトランザクション・プロトコルを示す。これはUTXOベース・プロトコルの例である。トランザクション152(“Tx”と略す)は、ブロックチェーン150(各ブロック151は1つ以上のトランザクション152を含む)の基本的なデータ構造である。以下、出力ベース・プロトコル又は“UTXO”ベース・プロトコルを参照することによって説明する。しかしながら、これは全ての可能な実施形態に対する限定ではない。
【0044】
UTXOベース・モデルでは、各トランザクション(“Tx”)152は、1つ以上の入力202と1つ以上の出力203を含むデータ構造を含む。各々の出力203は、未使用トランザクション出力(UTXO)を含む可能性があり、(UTXOがまだ償還されていない場合には)これは別の新しいトランザクションの入力202のソースとして使用することができる。UTXOは、デジタル資産(価値のストア)の分量を指定する。また、他の情報の中でも、それが到来してきた元のトランザクションのトランザクションIDを含んでもよい。トランザクション・データ構造はまたヘッダ201を含んでもよく、入力フィールド202と出力フィールド203のサイズのインジケータを含む可能性がある。ヘッダ201はまた、トランザクションのIDを含んでもよい。実施形態において、トランザクションIDは、トランザクション・データのハッシュ(トランザクションID自体を除く)であり、マイナー104Mにサブミットされた未加工トランザクション152のヘッダ201に格納される。
【0045】
アリス103aは、問題としているデジタル資産の分量を、ボブ103bに転送するトランザクション152jを作成することを希望しているとする。
図2では、アリスの新しいトランザクション152jは、“Tx
1”とラベル付けされている。これは、シーケンスで先行するトランザクション152iの出力203においてアリスにロックされているデジタル資産の分量を取って、その少なくとも一部をボブへ転送する。先行トランザクション152iは、
図2では“Tx
0”とラベル付けされている。Tx
0及びTx
1は、単なる任意的なラベルである。これらは、必ずしも、Tx
0がブロックチェーン151における最初のトランザクションであることや、Tx
1がプール154内で直近の次のトランザクションであることを必ずしも意味していない。Tx
1は、アリスにロックされた未使用出力203を依然として有する、何らかの先行する(即ち、先立つ)トランザクションに戻るように指し示すことができる。
【0046】
先行トランザクションTx0は、アリスが彼女の新しいトランザクションTx1を作成する時点、又は少なくとも彼女がそれをネットワーク106に送信する時点までに、既に検証され且つブロックチェーン150に含まれている可能性がある。それは、その時点で既にブロック151のうちの1つに含まれている可能性があり、或いはプール154内でまだ待機している可能性があり、その場合、新しいブロック151に速やかに含まれることになる。代替的に、ノード・プロトコルが“オーファン”(orphan)トランザクションをバッファリングすることを許容する場合、Tx0及びTx1は一緒に作成されてネットワーク102へ送信することが可能であり、或いはTx0がTx1の後に送信されることさえ可能である。本件でトランザクション・シーケンスの文脈で使用される“先行”及び“後続”という用語は、トランザクションで指定されるトランザクション・ポインタ(どのトランザクションが、他のどのトランザクションを後方から指すか等)によって定められるシーケンスにおけるトランザクションの順序を指す。これらは“先行”と“後行”、“祖先”と“子孫”、“親”と“子”等により同等に置換することが可能である。これは、それらが生成されたり、ネットワーク106に送信されたり、又は任意の所与のノード104に到達したりする順序を必ずしも意味しない。それにもかかわらず、先行トランザクション(祖先トランザクション又は“親”)を指し示す後続トランザクション(子孫トランザクション又は“子”)は、親トランザクションが検証されるまで、及び親トランザクションが検証されない限り、検証されないであろう。親の前にノード104に到着した子は、孤立(オーファン)と考えられる。ノード・プロトコル及び/又はマイナーの行動に応じて、それは破棄されるか又は親を待機するための一定時間にわたってバッファリングされる可能性がある。
【0047】
先行トランザクションTx0の1つ以上の出力203のうちの1つは、本件ではUTXO0とラベル付けされた特定のUTXOを含む。各UTXOは、UTXOによって表されるデジタル資産の分量を指定する値と、後続のトランザクションが検証されるために、従ってUTXOが正常に償還されるために、後続のトランザクションの入力202においてアンロッキング・スクリプトによって充足されることを必要とする条件を定めるロッキング・スクリプトとを含む。典型的には、ロッキング・スクリプトは、特定の当事者(トランザクションに含まれている受取人)に対する分量をロックする。即ち、ロッキング・スクリプトは、アンロッキング条件を定め、典型的には、後続トランザクションの入力におけるアンロッキング・スクリプトが、先行トランザクションがロックされる当事者の暗号署名を含むという条件を含む。
【0048】
ロッキング・スクリプト(scriptPubKeyとしても知られている)は、ノード・プロトコルによって認識されるドメイン固有の言語で書かれるコードの一部である。そのような言語の特定の例は、“Script”(大文字のS)と呼ばれる。ロッキング・スクリプトは、如何なる情報がトランザクション出力203を消費するために必要とされるか、例えば、アリスの署名の条件を指定する。アンロッキング・スクリプトはトランザクションの出力に登場する。アンロッキング・スクリプト(scriptSig としても知られている)は、ロッキング・スクリプトの基準を満たすために必要な情報を提供するドメイン固有の言語で書かれたコードの一部である。例えばそれはボブの署名を含む可能性がある。アンロッキング・スクリプトは、トランザクションの入力202に登場する。
【0049】
図示の例では、Tx0の出力203におけるUTXO0は、ロッキング・スクリプト[Checksig PA]を含み、これは、UTXO0が償還されるために(厳密には、UTXO0を償還しようとする後続のトランザクションが有効化されるために)、アリスの署名Sig PAを必要とする。[Checksig PA]は、アリスのパブリック-プライベート・キー・ペアからのパブリック・キーPAを含む。Tx1の入力202は、Tx1に戻るように指すポインタ(例えば、そのトランザクションID、TxID0を利用することによって、実施形態ではそれはトランザクションTx0全体のハッシュである)を含む。Tx1の入力202は、Tx0の任意の他の可能な出力の中でそれを識別するために、Tx0内のUTXO0を識別するインデックスを含む。Tx1の入力202は、更に、キー・ペアからのアリスのプライベート・キーを、データの所定の部分に適用してアリスによって作成された、アリスの暗号署名を含むアンロッキング・スクリプト<Sig PA>を含む(暗号化における“メッセージ”と呼ばれることもある)。如何なるデータ(又は“メッセージ”)が、有効な署名を提供するためにアリスによって署名されることを必要とするかは、ロッキング・スクリプトによって、ノード・プロトコルによって、又はこれらの組み合わせによって定められることが可能である。
【0050】
新しいトランザクションTx1がノード104に到着すると、ノードはノード・プロトコルを適用する。これは、ロッキング・スクリプトとアンロッキング・スクリプトを一緒に実行して、アンロッキング・スクリプトがロッキング・スクリプトで定められている条件(この条件は1つ以上の基準を含む可能性がある)を充足しているかどうかをチェックすることを含む。実施形態において、これは2つのスクリプトを連結することを含む:
<Sig PA><PA>||[Checksig PA]
ここで、“||”は連結を表し、“<・・・>”はデータをスタックの上に置くことを意味し、“[・・・]”はアンロッキング・スクリプト(この例では、スタック・ベース言語)によって構成される関数である。同等に、スクリプトは、スクリプトを連結するのではなく、共通のスタックで、一方を他方の後で実行してもよい。いずれにせよ、一緒に実行される場合、スクリプトは、Tx0の出力におけるロッキング・スクリプトに含まれるように、アリスのパブリック・キーPAを使用して、Tx1の入力におけるロッキング・スクリプトが、データの予想される部分を署名するアリスの署名を含んでいることを認証する。この認証を実行するためには、データ自体の予想される部分(“メッセージ”)もTx0に含まれることを必要とする。実施形態において、署名されたデータは、Tx0の全体を含む(従って、個々の要素が包含されることを必要とせず、データの署名された部分を平文で指定し、なぜなら既に本来的に存在するからである)。
【0051】
パブリック_プライベート暗号による認証の詳細は、当業者にはよく知られているであろう。基本的に、アリスがプライベート・キーでメッセージを暗号化することによってメッセージに署名した場合、アリスのパブリック・キーと平文(暗号化されていないメッセージ)におけるメッセージが与えられると、ノード104のような別のエンティティは、そのメッセージの暗号化されたバージョンがアリスによって署名されていなければならないことを認証することができる。署名は、典型的には、メッセージをハッシュ化し、ハッシュに署名し、署名としてメッセージのクリア・バージョンにこれをタグ付けし、パブリック・キーの任意の所有者が署名を認証することを可能にする。従って、本件において、データの特定の部分又はトランザクションの一部分などに署名するという如何なる言及も、実施形態では、データのその部分又はトランザクションの一部分のハッシュに署名することを意味する可能性があることに留意されたい。
【0052】
Tx1のアンロッキング・スクリプトが、Tx0のロッキング・スクリプトで指定された1つ以上の条件を満たす場合(図示の例では、アリスの署名がTx1で提供され、認証される場合)、ノード104は、Tx1を有効であるとみなす。それが記憶ノード104Sである場合、これは、プルーフ・オブ・ワークを待機するトランザクションのプール154にそれを追加することを意味する。それが転送ノード104Fである場合、それはトランザクションTx1をネットワーク106内の1つ以上の他のノード104へ転送し、その結果、それがネットワーク全体に伝播されるであろう。いったんTx1が検証され、ブロックチェーン150に含まれると、これはTx0からのUTXO0を支払い済み(spent)として定める。Tx1は、それが未使用トランザクション出力203を消費する場合にのみ有効であり得ることに留意されたい。別のトランザクション152によって既に消費されている出力を消費しようとするならば、Tx1は、たとえ他の全ての条件が充足されていたとしても無効となるであろう。従って、ノード104は、先行トランザクションTx0において参照されるUTXOが既に消費されているかどうか(別の有効なトランザクションに対する有効な入力を既に形成しているかどうか)もチェックすることを必要とする。これが、ブロックチェーン150にとってトランザクション152に定義された順序を課すことは重要であることの理由の1つである。実際には、所与のノード104は、どのトランザクション152でどのUTXO203が消費されているかをマーキングする別個のデータベースを維持できるが、最終的にUTXOが消費されているかどうかを定めるものは、ブロックチェーン150内の別の有効なトランザクションに対する有効な入力を既に形成しているかどうかである。
【0053】
所与のトランザクション152の全ての出力203で指定される総量が、その全ての入力202によって指し示される総量よりも大きい場合、これは、ほとんどのトランザクション・モデルにおいて無効に関する別の根拠である。従って、このようなトランザクションは、ブロック151に伝播されたり、マイニングされたりしないであろう。
【0054】
UTXOベースのトランザクション・モデルでは、所定のUTXOが全体として消費されることを必要とすることに留意されたい。UTXOで定められている分量のうちの一部分を“残しておく”一方、別の部分が消費される、ということはできない。しかしながら、UTXOの分量は、次のトランザクションの複数の出力の間で分割されることが可能である。例えば、Tx0におけるUTXO0で定められる分量は、Tx1における複数のUTXOの間で分割されることが可能である。従って、アリスが、UTXO0で定められる分量のうちの全てをボブに与えることを望まない場合、彼女は残りの分量を使って、Tx1の第2出力で自分自身に釣り銭を与えたり、別の当事者へ支払ったりすることができる。
【0055】
実際には、アリスは、通常、勝利したマイナーに対する手数料を含めることを必要とし、なぜなら、今日ではジェネレーション・トランザクションの報酬だけでは、典型的には、マイニングを動機付けるには十分ではないからである。アリスがマイナーのための手数料を含めていない場合、Tx0はマイナー・ノード104Mによって拒否される可能性が高く、従って、技術的には妥当であるが、それはまだ伝播されず、ブロックチェーン150に含まれないことになるであろう(マイナー・プロトコルは、マイナー104Mに、彼らが希望しない場合には、トランザクション152を受け入れるよう強制していない)。一部のプロトコルでは、マイニング手数料は、独自の別個の出力203を必要としない(即ち、別個のUTXOを必要としない)。その代わりに、入力202によって示される総量と所与のトランザクション152の出力203で指定される総量との間の如何なる差分も、勝利したマイナー104に自動的に与えられる。例えば、UTXO0に対するポインタがTx1に対する唯一の入力であり、Tx1は唯1つの出力UTXO1を有するとする。UTXO0で指定されたデジタル資産の分量がUTXO1で指定された分量より多い場合、その差分は勝利したマイナー104Mへ自動的に向かう。しかしながら、代替的又は追加的に、必ずしも、マイナー手数料が、トランザクション152のUTXO203のうちの自身の1つにおいて明示的に指定できることは除外されない。
【0056】
アリスとボブのデジタル資産は、ブロックチェーン150のどこかで任意のトランザクション152において、それらにロックされた未使用UTXOから構成される。従って、典型的には、所与の当事者103の資産は、ブロックチェーン150を通じて、様々なトランザクション152のUTXO全体に分散される。ブロックチェーン150内のどこかに保存された、所与の当事者103の総残高を定める1つの数字は存在しない。各々の当事者にロックされ、別の前方トランザクションでまだ消費されていない全ての様々なUTXOの値を一緒にまとめることは、クライアント・アプリケーション105におけるウォレット機能の役割である。これは、何らかの記憶ノード104S、例えば各々の当事者のコンピュータ装備102に最も近接しているか、又は最良に接続されている記憶ノード104S、に記憶されたブロックチェーン150のコピーを問い合わせることによって行うことができる。
【0057】
スクリプト・コードはしばしば概略的に表現される(即ち、厳密な言語ではない)ことに留意されたい。例えば、ある人は[Checksig PA] = OP_DUP OP_HASH160 <H(PA)> OP_EQUALVERIFY OP_CHECKSIGを意味するように、[Checksig PA] と書くかもしれない。“OP_...”はScript言語の特定のオペコードを示す。OP_CHECKSIG(“Checksig”とも呼ばれる)は、2つの入力(署名とパブリック・キー)を取り、楕円曲線デジタル署名アルゴリズム(ECDSA)を使用して署名の妥当性を検証するScriptオペコードである。ランタイムにおいて、何らかの署名(‘sig’)の発生はスクリプトから削除されるが、ハッシュ・パズルのような追加的な条件は、‘sig’入力によって検証されるトランザクションに残る。別の例として、OP_RETURNは、トランザクション内にメタデータを格納することができ、それによってメタデータを変更不可能にブロックチェーン150に記録することが可能なトランザクションの消費不能な出力(unspendable output)を生成するためのScript言語のオペコードである。例えば、メタデータは、ブロックチェーンに格納することが望ましい文書を含むことが可能である。
【0058】
署名PAはデジタル署名である。実施形態において、これは楕円曲線secp256k1を使用するECDSAに基づいている。デジタル署名は、特定のデータに署名する。実施形態において、所与のトランザクションについて、署名は、トランザクション入力の一部、及びトランザクション出力の全部又は一部に署名する。それが署名する出力の特定の部分は、SIGHASHフラグに依存する。SIGHASHフラグは、署名の最後に含まれる4バイトのコードであり、どの出力が署名されるのかを選択する(従って、署名の時点で確定される)。
【0059】
ロッキング・スクリプトはしばしば“scriptPubKey”と呼ばれ、それぞれのトランザクションがロックされている対象者のパブリック・キーを含んでいるという事実を示す。アンロッキング・スクリプトはしばしば“scriptSig”と呼ばれ、対応する署名を提供するという事実を示す。しかしながら、より一般的には、UTXOが償還される条件が、署名を認証することを含む、ということはブロックチェーン150の全てのアプリケーションにおいて必須ではない。より一般的には、スクリプト言語は、任意の1つ以上の条件を定めるために使用されることが可能である。従って、より一般的な用語である“ロッキング・スクリプト”及び“アンロッキング・スクリプト”が好ましいかもしれない。
【0060】
検証プロトコル
図4は、UTXO又は出力ベース・モデルの例において、P2Pネットワーク106の各ノード104上で実行されることが可能なノード・ソフトウェア400の例を示す。ノード・ソフトウェア400は、プロトコル・エンジン401、スクリプト・エンジン402、スタック403、アプリケーション・レベル決定エンジン404、及び1つ以上のブロックチェーン関連機能モジュールのセット(図示せず)を含む。任意の所与のノード104において、これらは、マイニング・モジュール、フォワーディング・モジュール、及び記憶モジュールのうちの任意の1つ、2つ、又は3つ全てを(ノードの1つの役割又は複数の役割に応じて)含む可能性がある。スクリプト・エンジン402は、スクリプトの一部をデータ要素、又はそれらデータ要素に作用する機能として解釈し、及び/又はデータ要素をスタック403へプッシュするか又はそこから読み込むことによって、スクリプトを実行するように構成されたスクリプト・インタープリタを含んでもよい。代替的に、スクリプト・エンジン402は、ジャスト・イン・タイム(just-in-time, JIT)コンパイルのような別形態の実行を採用することが可能である。一般に、“実行(execute)”という用語は、本件では何らかの方法でスクリプトを実行する最広義の意味で使用される(コンパイルされたマシン・コード命令を実行する狭い意味におけるものではない)。従って、“実行する(executing)”は、この文脈で解釈することを含む可能性がある。また、この文脈における“オペコード(opcode)”は、個々のマシン・コード命令のオペコードを意味するのではなく、各ノード104においてスクリプト・エンジン402によって、各自所定の機能にマッピングされる、より上位のレベルのコマンドを意味することに留意されたい。
【0061】
プロトコル・エンジン401は、トランザクション152の様々なフィールドを認識し、ノード・プロトコルに従ってそれらを処理するように構成される。トランザクション152m(Txm)が受信され、それが別の先行するトランザクション152m-1(Txm-1)の出力(例えば、UTXO)を指し示す入力を有する場合、プロトコル・エンジン401はTxm内のアンロッキング・スクリプトを識別し、それをスクリプト・エンジン402に渡す。プロトコル・エンジン401はまた、Txmの入力の内のポインタに基づいて、Txm-1を識別及び探索する。それは、Txm-1がまだブロックチェーン150上にない場合には、ペンディング・トランザクションの各自のノードの自身のプール154から、又は、Txm-1が既にブロックチェーン150上にある場合には、各ノード又は他のノード104に記憶されたブロックチェーン150内のブロック151のコピーから、Txm-1を取り出すことができる。いずれにせよ、スクリプト・エンジン401は、指し示されたTxm-1の出力内のロッキング・スクリプトを識別し、これをスクリプト・エンジン402に渡す。
【0062】
従って、スクリプト・エンジン402は、Tx
m-1のロッキング・スクリプトとTx
mの対応する入力からのアンロッキング・スクリプトとを有する。例えば、Tx
1とTx
2が
図4に示されているが、同様のことは、例えばTx
0とTx
1等のような任意のペアのトランザクションにも当てはまる可能性がある。スクリプト・エンジン402は前述のように2つのスクリプトを一緒に実行し、それは、使用されるスタック・ベースのスクリプト言語(例えば、Script)に従って、データをスタック403に配置すること、及びスタック403からデータを取り出すことを含むであろう。
【0063】
スクリプトを一緒に実行することによって、スクリプト・エンジン402は、アンロッキング・スクリプトがロッキング・スクリプトで定められる1つ以上の基準を充足するかどうか、即ち、ロッキング・スクリプトが含まれている出力を“ロック解除”するか?を判断する。スクリプト・エンジン402は、この決定の結果をプロトコル・エンジン401に返す。スクリプト・エンジン402は、アンロッキング・スクリプトが、対応するロッキング・スクリプトで指定される1つ以上の基準を充足する判断した場合には、結果“真(true)”を返す。そうでない場合には、結果“偽(false)”を返す。
【0064】
出力ベース・モデルでは、スクリプト・エンジン402からの“真”の結果は、トランザクションの有効性に関する条件の1つである。典型的には、更に充足されることを要する、プロトコル・エンジンによって評価される1つ以上の更なるプロトコル・レベルの条件も存在し;例えば、Txmの出力で指定されるデジタル資産の総量が、その入力によって指される総量を超えないこと、及びTxm-1の指定された出力が、別の有効なトランザクションによってまだ消費されていないことである。プロトコル・エンジンは、スクリプト・エンジン402からの結果を、1つ以上のプロトコル・レベル条件と共に評価し、それらが全て真である場合にのみ、トランザクションTxmを検証する。プロトコル・エンジンは、トランザクションがアプリケーション・レベル決定エンジン404に対して有効であるかどうかの指示を出力する。Txmが実際に検証された条件のみで、決定エンジン404は、Txmに関する各自のブロックチェーン関連機能を実行するために、マイニング・モジュール及び転送モジュールの一方又は両方を制御するように選択することができる。これは、ブロック151へのマイニングのためにノードのそれぞれのプール154にTxmを追加するマイニング・モジュール405M、及び/又はP2Pネットワーク106内の別のノード104へTxmを転送する転送モジュール405Fを含む可能性がある。しかしながら、実施形態において、決定エンジン404は、無効なトランザクションを転送したり又はマイニングしたりすることを選択しないであろうが、これは、逆に、それが単に有効であるという理由で、有効なトランザクションのマイニング又は転送をトリガすることを必ずしも意味しないことに留意されたい。オプションとして、実施形態において、決定エンジン404は、これらの機能の一方又は双方をトリガする前に、1つ以上の追加的な条件を適用することができる。例えば、ノードがマイニング・ノード104Mである場合、決定エンジンは、トランザクションが有効であり、且つ十分なマイニング手数料を残すという双方を条件で、トランザクションをマイニングすることを選択するだけであってもよい。
【0065】
また、本件において“真”及び“偽”という用語は、必ずしも単一の2進数(ビット)の形式だけで表される結果を返すことに限定されないが、これは確かに1つの可能な実装であることにも留意されたい。より一般的には、“真”は成功又は肯定的な結果を示す任意の状態を指し、“偽”は失敗又は否定的な結果を示す任意の状態を指す。例えば、アカウント・ベース・モデル(
図4には示されていない)においては、“真”の結果は、ノード104による署名の暗黙のプロトコル・レベルの検証と、スマート契約の追加の肯定的な出力との組み合わせによって示されることが可能である(全体の結果は、個々の両方の結果が真であれば真を伝えていると見なされる)。
【0066】
幾つかの実施形態によれば、有効なトランザクションのための条件の1つは、そのトランザクションのアンロッキング・スクリプトが、OP_RETURNオペコードの何らかのインスタンス、又はトランザクションが無効であることをマーキングしない何らかの他のそのようなターミネーション・オペコードを、含むことができないことである。プロトコル・エンジン401及び/又はスクリプト・エンジン402は、トランザクションのアンロッキング・スクリプト内にそのようなオペコードの存在を検出するように構成される。例えばTx2のようなトランザクションのアンロッキング・スクリプトにおけるターミネーション・オペコードを検出すると、プロトコル・エンジン401は、トランザクションを無効としてマークするように構成される。ターミネーション・オペコードがアンロッキング・スクリプトで検出されると、トランザクションは即座に無効とマークされ、スクリプトは決してじっこうされない。
【0067】
追加的又は代替的な実施形態では、ノード・ソフトウェアはオフ・チェーン機能405を含む。ここで、プロトコル・エンジン401、スクリプト・エンジン402、アプリケーション・レベル決定エンジン404は、“オン・チェーン(on-chain)”機能と言うことができる。オン・チェーンは、その機能がブロック151内に実際に含まれることを意味しない。むしろ、これは、その機能が、ネットワーク106を介して伝搬されてブロック151にマイニングされるトランザクションを検証するためのプロトコルの一部として、統合されることを意味する。逆に、オフ・チェーンは、その機能が、ブロックの検証以外の目的で機能することを意味する。幾つかの例における目的は、新しいトランザクションを生成すること、複合機能を含むテンプレート・スクリプトを生成すること、又はトランザクションTxから得られた(又はその結果の)データに関して計算を実行することである。
【0068】
これらの実施形態では、スクリプト・エンジン402は、スタック403から(例えば、スタックのトップから)オフ・チェーン機能405へデータ要素を供給するように構成される。スクリプト・エンジン402は、
図4に示すTx
1であるトランザクションのロッキング・スクリプトに存在するOP_RETURNを呼び出す場合に、スタック403からデータ要素を読み込むように構成される。オフ・チェーン機能405は、データ要素に基づいて結果を生成する(又は別の方法で、データ要素に関してオペレーションを実行する)ように構成される。幾つかの例において、データ要素はスタック403から読み込まれ、“オフ・チェーン・スタック”に記録される。ここで、“オフ・チェーン・スタック”は、トランザクションを検証する目的では使用されないスタックである。データ要素は、スタック403から読み込まれ、OP_RETURNがスクリプト・エンジン402によって呼び出される毎に、オフ・チェーン機能に供給されることが可能である。オフ・チェーン機能405は、オフ・チェーン・スタックに記録されたデータ要素を使用して、新しいトランザクションを生成するように構成されることが可能である。他の例において、オフ・チェーン機能405は、データ要素を、Tx
1内のロッキング・スクリプトに対する参照として使用するように構成される。
図4に示すように、Tx
1は複数のロッキング・スクリプト1ないしnを含む。オフ・チェーン機能405は、データ要素を、ロッキング・スクリプトのアドレス又はインデックスとして(例えば、第3ロッキング・スクリプトのインデックスとして)解釈し、そのロッキング・スクリプトを実行する。追加的又は代替的に、アドレス指定されたロッキング・スクリプトは、メモリに保存されるスクリプト・テンプレートに追加されてもよい。
【0069】
上記で詳述したように、トランザクションは、有効なトランザクションであるために、即ち、ブロックチェーンの全体にわたって伝搬されてそこでマイニングされるために、幾つかの要件を充足しなければならない。本発明の実施形態は、トランザクションの有効性の条件を規定するプロトコルに対する修正の実装に関連する。トランザクションの有効性に関する条件に対する修正は、トランザクションに、特定のタイプのオペレーション・コード(オペコード)が含まれることに関連する。
【0070】
ブロックチェーン・プロトコルは、データとオペコードの2種類の要素を含むスクリプト言語を使用する。スクリプト内のデータは、例えば、数字、パブリック・キー、署名、ハッシュ値などであってもよい。オペコードは、スクリプト内のデータに作用する関数である。スクリプト言語では、スクリプトは、一端から他端へ(通常は左から右へ)実行され、“スタック”と呼ばれるデータ構造を利用する。データは常にスタックにプッシュされる(即ち、スタック上に置かれる)。オペコードは、スタックからデータをはじき出し(即ち、スタックからデータを取り出し)、データに対してオペレーションを実行し、次いで、オプションとして新しいデータをスタックに“プッシュ”することができる。多くのブロックチェーンで一般的に使用されるスタック・ベースのスクリプト言語は、単にScriptと呼ばれる。以下はScript言語のオペコードの観点から説明されている。
【0071】
スタック・ベースのスクリプト言語は、当業者にはよく知られているであろう。以下の例は、例示的なスクリプトがどのように実装されるかを示す。具体的には、例示的な検証及びアンロッキング・スクリプトが示されている。
【0072】
例示的なスクリプトは、<Bob’s signature> <Bob’s public key> OP_DUP OP_HASH <Bob’s public address> OP_EQUALVERIFY OP_CHECKSIG を含む。スクリプトは左から右へ作用する。
【0073】
【0074】
【0075】
【0076】
【0077】
【0078】
【0079】
【0080】
1つの特有のオペコードは、OP_RETURNオペコードである。元来のブロックチェーン・プロトコルでは、OP_RETURNは、スクリプトの実行を終了させるための1つの主要な機能を有していた。これは、OP_RETURNオペコードに続くものは決して実行されないこと、スタックの最終状態は、OP_RETURNが作用した時点と厳密に同じになることを意味する。例えば、スクリプト[<X> OP_RETURN <Y>]が実行された場合、スクリプト要素<Y>は決して実行されず、スクリプトは(メイン)スタックのトップに残った<X>とともに終了する。
【0081】
しかしながら、このプロトコルは2つの攻撃に対して脆弱であった:
1)OP_RETURN で始まる如何なるロッキング・スクリプトも、アンロッキング・スクリプト[OP_1]、又は同じ効果を伴うアンロッキング・スクリプトを使って償還されることが可能であり、ここで、トップ・スタック・アイテムは‘truthy’である。
2)如何なるロッキング・スクリプトも、アンロッキング・スクリプト[OP_1 OP_RETURN]を使用して償還されることが可能であり、なぜならロッキング・スクリプトは実行されないからである(即ち、それはOP_RETURNに続くからである)。
【0082】
上述の攻撃を軽減するために、以後のプロトコル(既存のプロトコル)は、OP_RETURNの機能を、その機能がスクリプトの実行を終了させ且つ実行を失敗させるように、変更した。これは、先ずスクリプトを無効としてマークし、次いで実行を終了することによって達成される。これについての利点は、OP_RETURNが証明可能に消費不能な出力を生成するために使用されることが可能なことであり、なぜならOP_RETURNを含むどのロッキング・スクリプトも、何らかのアンロッキング・スクリプトと一緒に実行すると‘TRUE’の実行をもたらすことができないからである。トランザクションが有効であるためには、‘TRU’の実行(即ち、スタック上のトップ要素が真の結果、例えば、値1を表すこと)が要求される。
【0083】
既存のプロトコルのこの性質は、ブロックチェーンの使用に関して2つの主要な影響を与えた:
1)データ・ストレージ - OP_RETURN以降の如何なるデータも、マイナーや検証者によって決して実行されない。これは、スタック・ベースのスクリプト言語の制約との互換性を必要とすることなく、任意のタイプ及びフォーマットによるものであり得ることを意味する。例えば、スクリプトに適用するデータ要素に関する通常の520バイト制限は、OP_RETURNが先行する場合には適用されない。
2)プルーニング - 如何なるOP_RETURN出力も証明可能に消費不能であるので、マイナーがこれらの出力に関するデータを保持する実際のインセンティブは未だ存在しない。これは、マイナーに、OP_RETURN UTXOデータ又はメタデータを選択的にプルーニング(即ち、保持しないこと)をさせている。
【0084】
本発明の実施形態によるノードによって実装される新しいプロトコルは、OP_RETURNの使用に関して少なくとも2つの条件を課す:
1)OP_RETURNは、有効なトランザクションの出力スクリプトに含まれるように許容される。
2)OP_RETURNは、有効なトランザクションの入力スクリプトに含まれるようには許容されない。
【0085】
次に、実施形態によれば、OP_RETURNの機能は、トランザクションを無効化することなく、スクリプトの実行を終了させることである。即ち、OP_RETURNが呼び出されると、スクリプトは停止され、スタックは変更されないまま残る。
【0086】
トランザクションを検証する場合に、ノードは、トランザクションの出力203内の出力スクリプトにOP_RETURNが存在することのみに基づいて、トランザクションを無効化しない。逆に、ノードは、トランザクションの入力202内の入力スクリプト内にOP_RETURNが存在することのみに基づいて、トランザクションを無効化する。トランザクションが1つより多い入力を有する場合、ノードがトランザクションを無効にするために、OP_RETURNを含む入力スクリプトを有することは、これらの入力のうち唯1つで十分である。ロッキング・スクリプトがOP_RETURNを含む場合、トランザクションは決して実行されず、それは実行されずに無効化される。
【0087】
図1を参照すると、第1当事者アリス103aは、1つ以上の入力及び/又は1つ以上の出力を含むトランザクションを生成することができる。
図2に示すように、各入力は、先行トランザクションからロッキング・スクリプトをロック解除するためのアンロッキング・スクリプトを有する可能性がある。各々の出力は、ある量のデジタル資産をそれぞれの第2当事者、例えばボブ103bにロックするロッキング・スクリプトを有する可能性があり、ロッキング・スクリプトは、後のトランザクションのアンロッキング・スクリプトによってロック解除される。アリス103aはトランザクションをP2Pネットワークのノードに送信する。フォワーディング・ノード104Fは、トランザクションを、1つ以上の他のフォワーディング・ノードに又はマイニング・ノード104Mに伝搬させる前に、有効性に関してトランザクションをチェックする。代替的に、マイニング・ノード104Mは、アリス 103aから直接的にトランザクションを受信してもよい。各ノードは、少なくとも上記のプロトコルに基づいて、トランザクションが有効であるか否かを決定する。トランザクションがOP_RETURNの使用の観点からプロトコルの要件(及びプロトコルの1つ以上の他の要件)を満たす場合、トランザクションはネットワーク全体に伝搬され、及び/又はブロックチェーンに対してマイニングされる。
【0088】
幾つかの実施形態において、OP_RETURNは、トランザクションのロッキング・スクリプトにおいて許容されるだけであってもよい。同様に、幾つかの実施形態では、OP_RETURNは、トランザクションのアンロッキング・スクリプトからは許容されないだけであってもよい。上述のように、各トランザクションは、各々がアンロッキング・スクリプトを有することが可能な1つ以上の入力と、各々がロッキング・スクリプトを有することが可能な1つ以上の出力とを含む。所与のトランザクションのアンロッキング・スクリプトは、何らかの先行トランザクションのロッキング・スクリプトをロック解除する。
【0089】
プロトコルを実装する場合に、ノードがトランザクションを検証するならば、 それは、他の条件を満たしつつ、トランザクションは如何なる入力スクリプトにおいても如何なるOP_RETURNを含まないことを意味する。トランザクションの検証は、トランザクションからのアンロッキング・スクリプトと、異なるトランザクションからのロックスクリプトとの組み合わせを実行した後に、スタックにおいて、エンプティでない非ゼロの結果をもたらす。トランザクションの検証は、追加的又は代替的に、ノードがトランザクションをネットワークの1つ以上のノードへ、例えばブロックチェーンに対してマイニングするマイナーへ転送する結果となる。トランザクションを検証する別の結果は、ノードがマイナーである場合、マイナーがブロックチェーンのブロック内でトランザクションをマイニング(即ち、記録)することである。
【0090】
本件で定義されるプロトコルは、有利なことに、不正な攻撃を防止し、ブロックチェーンの既存の機能(即ち、データ・ストレージ・アプリケーション)との互換性を維持する。不正な攻撃は、OP_RETURNがトランザクションのアンロッキング・スクリプトに存在し得ないことを保証することによって防止される。既存の機能は、トランザクションの出力(例えば、ロッキング・スクリプト)において、OP_RETURNの前に<0>を含めることによって、達成することができる。ここで、<0>は、スタックにプッシュされるゼロになる任意の要素である。例えば、ゼロのオペコードOP_0が、OP_RETURNの前に置かれてもよい。これは、証明可能な消費不能なトランザクション出力を、例えば、トランザクションのロッキング・スクリプトに[OP_0 OP_RETURN <arbitrary data>]を挿入することによって作成する。任意のデータ(arbitrary data)は、例えば、画像データ、テキスト・データ、ビデオ・データ、及びオーディオデータのうちの1つ以上であってもよい。一例として、ビデオ・ファイル又は法律文書がトランザクションの出力に含められてもよい。
【0091】
OP_RETURNが、出力スクリプトにある場合に有効に実行できることの更なる利点は、以下に説明するようにオフ・ブロック(又はオフ・チェーン)機能を提供することである。
【0092】
OP_RETURNが呼び出される前のロッキング・スクリプト内のスクリプト要素(OP_RETURNより前に実行されたもの)は、オフ・チェーン機能に対する入力として利用することができる。言い換えれば、ロッキング・スクリプトが実行されると、少なくとも1つのスタック(例えば、Mainスタック又はAltスタック)に残されたデータが存在するであろう。このデータは、スタックから読み取られ、オフ・チェーンの目的でファンクションに供給されることが可能である。
【0093】
例えば、このファンクションは、スタックから読み取られたデータに基づいて新しいトランザクションを生成することができる。データは、スタックから読み取られ、“リターン(Return)”スタック、即ち、Main及びAltスタックから分離されたスタックに記録されてもよい。
【0094】
別の例として、スタックに残されたデータは、トランザクションの別の部分に対する参照として使用されてもよい。例えば、データは、トランザクション内の出力のインデックス(又はアドレス)として、ファンクションによって解釈される可能性がある。ファンクションは、次いで、参照された出力に含まれるロッキング・スクリプトを実行することができる。この意味で、ファンクションは、ロッキング・スクリプトを識別して実行する“オフ・チェーン・スクリプト・インタープリタ”として動作する。これは、オフ・チェーン・ループを作成するために使用することができる。
【0095】
新規トランザクションの生成
幾つかの実施形態では、ファンクションは、データ要素に基づいて新しいトランザクションを生成するように構成される。新しいトランザクションは、最初のトランザクションが実行された後の任意の時点で生成され送信されることが可能である。ファンクションは、データ要素に基づいて直接的に、又は先ずそのデータ要素に対して演算を実行することによって、トランザクションを生成することができる。新しいトランザクションは、ネットワーク全体にわたる伝搬及び/又はブロックチェーンにおける記録のために、ブロックチェーン・ネットワーク106の1つ以上のノード104へ送信されることが可能である。
【0096】
一例として、ファンクションは、新しいトランザクションの入力のうちの少なくとも一部(例えば、パブリック・キー、署名、確率変数)を生成することができる。追加的又は代替的に、ファンクションは、新しいトランザクションの出力のうちの少なくとも一部(例えば、転送するデジタル資産の量)を生成することができる。
【0097】
新しいトランザクションは、ロッキング・スクリプトを有する出力を含んでもよい。そのロッキング・スクリプトは、OP_RETURNが呼び出される前に実行されるべきスクリプトの一部を含む可能性がある。ロッキング・スクリプトの少なくとも一部は、オフ・チェーン機能に供給されるデータ要素に基づくことが可能である。ここでも、OP_RETURNが呼び出されると、ロッキング・スクリプトは終了し、新しいデータ要素がスタックに残るであろう。このデータ要素は、スタックから読み取られ、例えば、更なるトランザクションを生成するために、オフ・チェーン機能に供給される可能性がある。これは、トランザクションのループが構築されることを可能にし、ここで、更なるトランザクションの各々は、先行するトランザクションのロッキング・スクリプトの実行から生じるデータ要素に基づいている。
【0098】
ブロックチェーン・スクリプトの例では、MainスタックとAltスタックの2つのスタックがある。トランザクションを検証する場合に、スクリプトはスタックで実行される。実行中、予め定められたスクリプト以外の如何なるものもスタックに書き込むことはできない。しかしながら、実行終了直後に、外部機能(又はエージェント)を使用して、スタックからデータを読み取ることが可能であるということが、本件で認識されている。以下、3番目のスタック:“リターン・スタック(Return Stack)”と呼ばれるオフ・チェーン・スタックの使用について説明する。リターン・スタックの機能は、スクリプトの実行後にMainスタック及びAltスタックからデータを読み取って記録すること、例えばブロックチェーンを外部世界にリンクすることである。リターン・スタックに格納されたデータは、次いで、オフ・
チェーン機能に供給されて、追加の機能を提供することができ、例えば、次のスクリプト実行に供給されること、新しいトランザクションを生成すること、或いは何らかの他のオフ・チェーン計算のために供給されることが可能である。“スタック”という用語が使用されていが、Main又はaltスタックから読み出されたデータを格納するように構成された任意のデータ記憶装置が使用される可能性がある。
【0099】
ユース・ケース - クラップス
以下、クラップス(Craps)と呼ばれるカジノ・ゲームをシミュレートする例が、リターン・スタックとブロックチェーン・トランザクションの間の相互作用を説明するために用意される。この例は、カジノ、チャーリーと、プレイヤー、アリスという2つの存在を含む。これらの各々は、それぞれ当事者103である可能性がある。この単純化された例では、クラップスというゲームは次のようにプレイする:あるプレイヤー‘シューター’は、2つのサイコロを取ってそれらをクラップス・テーブルに投じるか、又はオンライン・クラップスをプレイする場合には‘ロール(roll)’ボタンを押す。
【0100】
第1数が出ると、次の3つの結果がある:
1. ナチュラル(Natural)-‘ナチュラル’は出目の結果が7又は11であることを意味する。これが起こると、プレイヤーは勝利し、再びサイコロを振る。
2. クラップス(Craps)- 2(蛇の目(Snake Eyes)としても知られている)、3、又は12が出ている。これが起こると、プレイヤーは敗北する。しかしながら、そのラウンドは終わっておらず、プレイヤーは再びサイコロを振る。
3. ポイント(Point)- プレイヤーは4, 5, 6, 8, 9, 又は10を出している。実際のカジノでは、ディーラーは、テーブルの上に‘ポイント’(出た数)をマークする。オンライン・クラップス・ゲームでは、Pointが確立すると登場する小さなボタンが存在する。それは通常は白であり、‘On’と言う。プレイヤーはもう一度サイコロを振る必要があり、彼らは再び同じ番号に当たることを希望する。以前に振った場合と同じサイコロの組み合わせである必要はない。同じ合計である限り、プレイヤーは勝利する。プレイヤーが7を出すと、プレイヤーは‘セブンズ・アウト(sevens out)’となり、彼らは敗北し、その賭けのラウンドを終了する。
【0101】
ゲームを更に簡単にするために、この例では“Natural”と“Craps”の結果はゲームを終了させるとする。アリスとチャーリーが作成した以下の最初のトランザクションを考察する。
【0102】
【0103】
TX0における備考(Remarks):
1) TX0には2つの入力が存在する:アリスの賭けとチャーリーの賭けである。
2) TX0には2つの出力が存在する:各出力は1つのサイコロを表す。2つの出力を1つにまとめることができる。しかしながら、2つの出力を持つことは、2つのサイコロが存在すること、及び1人より多い人々がサイコロを“投じる”ことを強調する。
3) アリスはサイコロを投げる唯一のプレイヤーであると仮定されている。即ち、アリスはPK1とPK2に対する双方のプライベート・キーを知っている。他のプレイヤーが投じることができるように、PK2は、他のプレイヤーの選択したパブリック・キーに置き換えることができる。
4) アリスがチート(cheating)を行うことを防ぐために、アリスのパブリック・キーは、2-out-of-2 MultiSigで置換されることが可能であり、その場合、アリスとチャーリーの両方の署名が要求される。
5) 各出力には2つのOP_IFが存在する。最上位スタック値が偽でない場合、ステートメントは実行される。最上位スタック値は取り除かれる。
a. 第1のものは署名の有効性をチェックするためのものである。それが真であれば、“サイコロ振り(throwing)”に進む。それが真でない場合、チャーリーは出力を請求することがでる。チャーリーはプレイヤーから信頼されていると仮定されていることに留意されたい。そうでない場合、アリスが出力を請求する優先権を有することを保証するために、ロック時間を実装することができる。
b. 第2のものは、アンロッキング・スクリプトで提供されるランダム文字列の妥当性をチェックするためのものである。これは、ハッシュ・パズルを通じた文字列のプレフィックスに関するチェックであるとすることが可能である。例えば:
i. [CHECK_RANDOM_STRING]:=“get_first_4_bytes OP_HASH <pre-determined hash value> OP_EQUAL”
c. ランダム文字列が有効でない場合、チャーリーは出力を請求することができる。
6) ランダム文字列が有効であり、且つ実際にランダムであると仮定すると、スクリプト“OP_HASH<6>OP_MOD”は{0,1,2,3,4,5}の範囲内の数字をほぼ等しい確率で生成する。これらの結果は、サイコロ{1,2,3,4,5,6}からの6つの結果を表現している。
【0104】
サイコロ振りをシミュレートするために、アリスは2つのアンロッキング・スクリプトを構築することを必要とする。次いで、アリスはこの不完全なトランザクションTX1をチャーリーに渡す。チャーリーは、2つのランダムな文字列を追加してトランザクションTX1を完成させる。
【0105】
【0106】
PKbetpoolはカジノによってコントロールされ、チャーリーは2つの新しいランダムな文字列を提供するように信頼されていると仮定する。
TX1が検証されると、スクリプトの実行の1つは次のように見えるであろう:
【0107】
【0108】
OP_RETURNの既存のバージョンは、OP_RETURNが呼び出されるとスクリプトを終了させ、トランザクションを無効化する。しかしながら、本件で説明される実施形態のノードによって実装されるOP_RETURNでは、OP_RETURNはトランザクションを「有効」にマークし、実行後であってスタックがクリアされる前にスタック上に数字を残すであろう。スタックに残された数字は、リターン・スタックで読み込まれ、格納されるであろう。
【0109】
【0110】
それぞれの結果は、新しいトランザクションに対応する。リターン・スタックからの結果を解釈することによって、結果トランザクション(outcome transaction)を構築することができる:
・ナチュラル - このトランザクションは、単に、TX1における出力からアリス に賞金を支払う。
・クラップス - トランザクションはTX1における出力を償還する:これは、チャーリーに支払う。
・ポイント - トランザクションは、アリス が再びサイコロを振ることを可能にする、TX1と同様な別のトランザクションを作成する。
【0111】
この例示的なユース・ケースでは、“ナチュラル・トランザクション”又は“クラップス・トランザクション”はゲームを終了させるが、“ポイント・トランザクション”の場合は、ゲームは続くことに留意されたい。最も重要なことは、第1スローの出力(aとbの合計)がリターン・スタックに格納されることである。言い換えると、結果は、スタックから読み取られ且つリターン・スタックに格納されるデータ要素である。次いで、第2スローの出力は、a+bと比較される。両者が等しければ、アリスが賞金を請求するためのトランザクションが作成されるであろう。そうでなければ、アリスが再びサイコロを投じるために、TX0のような別のトランザクションが作成されるであろう。
【0112】
要約すると、リターン・スタックを持つことによって、複雑なwhile-loopをシミュレートすることができる。このループはオフ・チェーンで存在し、クラップスをプレイすることは、このループをどのように実装できるかについての一例であることに留意されたい。リターン・スタックの使用は、以下の例で実証されるように、多くの他のアプリケーションに一般化することができる。
【0113】
ユース・ケース - 陪審選任(Jury selection)
この例は、ブロックチェーン・スクリプトにおいて乱数生成(RNG)を達成するために、N人の参加者のグループを使用する方法に関する。この方法は、最低2回のトランザクションを含む:
a)開始(第1)トランザクションTxIn - 各参加者は、開始トランザクションに入力を追加して署名し、それは、シークレット値sに対するパブリック・コミットメントrを含む。このトランザクションは、そのデジタル資産をオラクル(oracle)に支払う。
b)オラクル(第2)トランザクション - オラクル(オフ・チェーン機能)は、シークレット値sを各プレイヤーから取得してトランザクションを生成し、そのトランザクションのロッキング・スクリプトは、N人全てのプレイヤーのシークレット値を組み合わせて乱数RN(第1データ要素)を生成し、その数に従ってデジタル資産をパブリック・キーにロックする。
【0114】
オラクル・トランザクションのロッキング・スクリプトで生成された乱数RNは、これらのデジタル資産を消費するための次の償還トランザクションの条件を決定するために使用することができる。しかしながら、RNは、証明可能に疑似ランダムであるので、決定論的プロセス用のシード(seed)を必要とする研究室実験のように、他のオフ・チェーン・プロセスを作るために使用されることが可能である。特に、刑事訴訟手続における陪審員の証明可能に公正な選任は、この解決策を利用することができる。
【0115】
オン・チェーン・ロッキング・スクリプトによって生成される、オフ・チェーン陪審選任における証明可能に公正な乱数の利用は、更に、リターン・スタックを導入してそのようなロッキング・スクリプトを実行し、最終的な乱数RNをオフ・チェーン・インタープリタに返すことによって支援される。
【0116】
裁判所は、刑事事件の訴訟手続きに参加する陪審員を選任する責任を負うことが可能であり、その選任は、陪審がいかなる方法によっても‘包み隠されたり(packed)’又は不当に偏ったりできないように、無作為に行われるべきである。裁判所は、オフ・チェーン・リターン・スタックを実行する能力を有するハードウェア及びソフトウェアを運用することができる。更に、裁判所は、ブロックチェーンからデータを読み取り、トランザクション・スクリプトを実行し、これらの実行の結果をローカルのリターン・スタックに格納することができる。可能性のあるN人の陪審員のプールから陪審員を選ぶために裁判所により定義される手続きは、上述のオン・チェーン法を用いて生成される乱数から導出される。しかしながら、裁判所は、生成プロセス自体に関与する必要はなく、むしろブロックチェーンの第三者オブザーバーとしての役割を果し、その場合、RNGプロセスは、他の第三者T、例えば宝くじ会社によって運営される。
【0117】
陪審が刑事裁判に選任されるたびに、次のようなプロセスが生じる:
1)裁判所は、サービス・プロバイダTからのオン・チェーンRNGプロセスを要求する:
a. N人の参加者を含む初期トランザクションTxInが組織され、Tによってブロードキャストされ、且つ
b. オラクル・トランザクションTxOracleが生成され、Tによってブロードキャストされる。
2)裁判所は、TxInとTxOracleをブロックチェーンから取り出す。
3)裁判所は、アンロッキング・スクリプトを使用して、TxOracleのロッキング・スクリプトを実行する:
a. TxInから全てのr値を抽出することによって、アンロッキング・スクリプトが生成される。
b. アンロッキング・スクリプトが、TxOracleから取り出される。
4)トップ(Main)スタック・アイテムRN(第1データ要素)が、裁判所のリターン・スタックにコピーされ、記憶される。
5)裁判所のリターン・スタック(オフ・チェーン・スタック)が、陪審員を選任するために使用され、例えば、スタックからのアイテムはオフ・チェーン機能に供給され、オフ・チェーン機能は、乱数RNの連続的なハッシュを取得し、その結果を、適格な市民のIDにマッピングする。
【0118】
ステップ4を達成するために、OP_RETURNはTxOracleロッキング・スクリプトに含まれなければならず、その結果、それはステップ3でスクリプトの実行を終了させるために使用することができる。また、OP_RETURNは、トランザクションの実行を終了し且つ、トランザクションを無効化しない機能とともに備わり、スクリプトの実行が終了した場合に一番上のスタック・アイテムがRNであることを保証するようにも要求される。そうではなくOP_RETURNがトランザクションを無効化したとすると、裁判所のインタープリタは、所望の乱数ではなく、終了時にエラーに遭遇するであろう。
【0119】
このシナリオに関わるトランザクションは、
図5a及び
図5bに示されている。
裁判所は、陪審員選任プロセスのステップ3において、コミットメントr
1,...,r
Nのリストを、初期トランザクションTx
Inの入力から取り出し、それらをアンロッキング・スクリプトとして使用することができる:
[unlocking script] = <r
1><r
2>・・・<r
N>
【0120】
【0121】
このロッキング・スクリプトの1行目は、コミットされたr値が開始トランザクションと整合していることをチェックするために使用される。2行目は、次いで、スクリプト実行中に、シークレットs値を、r値によってコミットされたように使用して、乱数RNを生成する。最後に、3行目は単なるOP_RETURNの呼び出しであり、スクリプトの実行を終了させ、メイン・スタックのトップにRNを残す。
【0122】
陪審員選任プロセスのステップ3において、裁判所は、上記のロッキング及びアンロッキング・スクリプトを一緒に実行し、乱数RNを返すか、又は実行は失敗するかのどちらかとなる。実行が成功して完了した場合、裁判所は、Mainスタックの先頭からランダム値を読み出し、彼らのローカル・マシンのリターン・スタックに格納することができる。
【0123】
そして、この値RNは、証明可能に公正な方法で陪審を選ぶために使用される。プロセス全体は、陪審員の選任が要求されるたびに繰り返すことが可能であり、その都度、TxInとTxOracleの生成は裁判所によって管理されるか、又は第三者に委託されることが可能である。
【0124】
このアプローチの主な利点は透明性である。公衆はオン・チェーンでトランザクションを読み、そのプロセスが実際にランダムで偏りのないものであることを目の当たりすることができるであろう。
【0125】
複合機能
幾つかの実施形態において、第1トランザクション(以下、先行トランザクションと言及される)は、複数の出力を有する可能性があり、各々の出力は、ロッキング・スクリプト(そのうちの幾つかは、同一であってもよいし、又は異なっていてもよい)を含む可能性がある。各出力は、出力アドレス(OA)によって参照され、以下、出力アドレスと言及される場合がある。このアドレスは、トランザクションにおける出力の位置をインデックス化する数字であってもよい。出力のうちの少なくとも1つは、出力のうちの異なる1つを参照する出力アドレスを含むロッキング・スクリプトを有する。例えば、ロッキング・スクリプトは、数(例えば、2)又はオペコード(例えば、OP_2)を含む可能性があり、それは、OP_RETURNと結びついた場合、第2出力(例えば、出力のリストのうちの2番目)のアドレスとして解釈されることが可能である。
【0126】
第1トランザクションの後のある時点で生成される第2トランザクション(以下、新規の又は更なるトランザクションと言及される)は、1つ以上の入力を含み、それらの各々はアンロッキング・スクリプトを有する。これらのアンロッキング・スクリプトのうちの少なくとも1つは、先行トランザクションの出力(以下、第1又はメイン出力と言及される)を参照する。第1出力は、前の出力の出力リストの最初である必要はなく、“第1”というラベルは、その出力が、呼び出される第1のものであることを示すために使用されているに過ぎない。
【0127】
アンロッキング・スクリプトを実行すると、第1出力のロッキング・スクリプトが参照されて実行される。第1出力のロッキング・スクリプトは、同じトランザクションの出力の少なくとも1つの出力アドレス(OA)(即ち、出力アドレスとして解釈されることが可能なデータ要素)を含む。出力は、同じ出力(即ち、第1出力)又は異なる出力(例えば、第2出力)であってもよい。ここで、第2出力は先行トランザクションの出力のリストの2番目の出力を意味することが可能であるが、第2出力は必ずしもそれを意味するわけではない。“第2”というラベルは、出力が、呼び出されるべき2番目のものであることを示すために、単に使用されているに過ぎない。第1出力のロッキング・スクリプトは、少なくともOP_RETURNオペコードも含む。ロッキング・スクリプトはまた、追加のデータ要素又はオペコードを含んでもよい。
【0128】
OP_RETURNは、トランザクションを無効化することなく、スクリプトの実行を終了させるように構成されていることに起因して、OP_RETURNが呼び出されると、第2出力の出力アドレスはスタックに残るであろう。幾つかの例において、ロッキング・スクリプト内の出力アドレスの直後にOP_RETURNが続いており、即ち、出力アドレスとOP_RETURNの間にデータ要素やオペコードが存在しない。オフ・チェーン機能は、スタック上に残されたデータ要素を読み取り、それを1つの出力(この場合、第2出力)の出力アドレスとして解釈するように構成される。
【0129】
ファンクションは、次いで、第2出力のロッキング・スクリプトを実行することができる。ロッキング・スクリプトの通常の実行とは異なり、第2出力のロッキング・スクリプトは、アンロッキング・スクリプトとともには実行されないことに留意されたい。その理由は、ファンクションが“オフ・チェーン”であるからであり、そのため、ロッキング・スクリプトを実行する目的は、トランザクションを、ブロックチェーンへのマイニングのブロックチェーン・ネットワークへ送信する目的で、トランザクションを検証することではない。その代わりに、利点の1つは、例えばロッキング・スクリプトやスマート契約で実装するためのスクリプトを構築することである。
【0130】
第2出力のロッキング・スクリプトは、例えば、OP_RETURNが後に続く第3出力の出力アドレスを含む可能性がある。ここでも、“第3”は、第1及び第2トランザクション同士を区別するためのラベルとして使用されており、先行トランザクション中の出力の順序を意味するものではない。しかしながら、第1、第2及び第3出力が、先行トランザクションの順序付けられた一連の出力の一部であることは除外されない。この場合、第2出力のロッキング・スクリプトが実行されると、第3出力の出力アドレスがスタックにプッシュされる。出力アドレスは、ファンクションが、出力のうちの1つ、この場合は第3出力、の出力アドレスとして解釈するように構成された数又はその他のデータ要素であってもよい。次いで、オフ・チェーン機能は、第3出力アドレスを使用して、第3出力のロッキング・スクリプトを参照してもよい。
【0131】
ロッキング・スクリプトを実行するプロセスは、1回以上、繰り返すことが可能である。OP_RETURNが呼び出される場合はいつでも、スタックのトップにあるデータ要素は、出力のうちの何れかの出力アドレスとして解釈される。先行トランザクションの1つ以上の出力は、複数回実行されてもよい。このプロセスは、出力のそれぞれのロッキング・スクリプト各々が実行された時点で終了してもよい。幾つかの例では、先行トランザクションの全ての出力が、第2トランザクションのアンロッキング・スクリプト又は第1トランザクションの出力の何れかによって参照されるわけではない。
【0132】
ロッキング・スクリプトが参照されるたびに、そのロッキングは、スクリプト・テンプレート、即ち“実行対象のスクリプト(to-be-executed script)”にコピーされることが可能である。オフ・チェーン・ファンクションが、参照されたロッキング・スクリプト全ての実行を終了すると、スクリプト・テンプレートは、参照されたロッキング・スクリプトの内容であってこれらのロッキング・スクリプトにおけるOP_RETURNオペコード以外のものを含む。言い換えれば、スクリプト・テンプレートは、アンパックされた全てのループを有するスクリプトを有し、それは、新しいトランザクションに対してOP_RETURNを使用せずにロッキング・スクリプトを構築するために使用することができる。
【0133】
言い換えると、複数の出力を含む第1トランザクションが存在すること、及び第1トランザクションにおける出力のうちの1つを参照する第2トランザクションが存在することを考察すると、以下のステップが実行される可能性がある。
【0134】
ステップ1:参照先の出力のロッキング・スクリプトにOP_RETURNが存在するかどうかをチェックする。存在する場合、全てのロッキング・スクリプトを第1トランザクションから抽出し、それらを相応にインデックス化する。
【0135】
ステップ2:OP_RETURNが存在すると仮定すると、アンロッキング・スクリプトにより参照されたロッキング・スクリプトとロッキング・スクリプトを、実行対象のスクリプトにコピーする。
【0136】
ステップ3:実行対象のスクリプトを実行する。
【0137】
ステップ4:OP_RETURNが呼び出されると、スタックにおける第1要素が消費される。
【0138】
ステップ5:消費された第1要素が有効なインデックスであると仮定すると、ステップ4でOP_RETURNによって消費された要素によって参照されたロッキング・スクリプトが、ここで、実行対象のスクリプトの先頭にコピーされる。
【0139】
ステップ6:実行を続ける。
【0140】
一例として、第1トランザクションは、以下のロッキング・スクリプトを有する可能性がある:
ロッキング・スクリプト1: [function 1] OP_2 OP_RETURN
ロッキング・スクリプト2: [function 2]
ロッキング・スクリプト3: OP_1 OP_RETURN
【0141】
第2トランザクションは、ロッキング・スクリプト3:xに対するアンロッキング・スクリプトを有する可能性がある。
【0142】
従って、第1トランザクション中に3つのロッキング・スクリプトと、第1トランザクションの第3出力を参照する第2トランザクション中の1つのアンロッキング・スクリプトとが存在する。ファンクション1及び2は、それぞれのロッキング・スクリプト内のファンクションであり、例えばそれらはスタックにデータをプッシュする及び/又はデータに作用することができる。ロッキング・スクリプト3が先ず実行されることに起因して、ファンクション1及び2が実行され、(ファンクション1を含む)ロッキング・スクリプト1が実行され、次いで(ファンクション2を含む)ロッキング・スクリプト2が実行される。
【0143】
トランザクションを実行するために:
1. xがスタックにプッシュされる。
2. ロッキング・スクリプト3が実行される。
3. ロッキング・スクリプト1が呼び出される。
4. ファンクション1が実行される。
5. ロッキング・スクリプト2が呼び出される。
6. ファンクション2が実行される。
7. 実行が終了する。
【0144】
OP_RETURNが呼び出される場合に、アンロッキング・スクリプトは再実行されず、他の如何なるアンロッキング・スクリプトも実行されない。ロッキング・スクリプトの実行はオフ・チェーンである。
【0145】
オフ・チェーン・ファンクションは、オフ・ブロック(又はオフ・チェーン)スクリプト・インタープリタとして機能する。このようなインタープリタは、ロッキング・スクリプトやスマート契約で実装するために、複雑なスクリプトをユーザーが構築することを支援することができる。オン・チェーン、OP_RETURNは、トランザクションの何らかの検証中に呼び出された場合に、トランザクションを無効化せずに、スクリプトの実行を終了するように構成される。オフ・チェーン、オフ・ブロック・スクリプト・インタープリタは、新しい特徴をOP_RETURNに追加する。新しい特徴は、OP_RETURNを使用して、ループを含む複合スクリプト・ファンクションを構築する。ブロックチェーン・スクリプト言語の中には、ループを許可しないものがある。従って、構築されたファンクションにおける如何なるループも、それらがロッキング・スクリプトに入れられる前に、アンパックされるであろう。
【0146】
オフ・チェーン・ファンクションは、複数のアウトポイント(アウトポイントとアウトプット(出力)は、可換に使用される)を有する単一トランザクションを使用する。OP_RETURN のオフ・ブロック定義は、トランザクション内のあるアウトポイントから別のところへのジャンプを許容し、スタック上のトップ・アイテムによって与えられるアウトポイント・インデックスは、ジャンプ先のアウトポイントを示すために使用される。これは、
図6a及び6bに示されており、以下のように説明することができる。
【0147】
トランザクションの各アウトポイントは、ロッキング・スクリプトを含む。それぞれのアウトポイントに関し、このロッキング・スクリプトは単一のファンクションと考えることができる。各アウトポイントは、トランザクションのアウトポイントのインデックスである一意のOAによって参照される。
【0148】
‘メイン’ファンクションと考えることが可能な1つのアウトポイントが存在し、それは最初に実行される。これは、例えば、トランザクションの最後のアウトポイントである可能性がある。
【0149】
トランザクション・アウトポイントは0からインデックスを付されることに留意すべきであり、0は、通常、OP_RETURNが後に続く場合に失敗するスクリプトのために予約される特別な値である。以下では簡潔性のために、アウトポイントは1からインデックスを付されていると仮定する。
【0150】
OP_RETURNを実行すると、オフ・ブロック・スクリプト・インタープリタは、スタックのトップ・アイテムにより与えられるOAへジャンプし、ロッキング・スクリプトのオペコードを命令セットに追加し、そして、以前のように実行を継続する。トップ・アイテムをはじき出すことは別として、MainスタックとAltスタックは変更されないままである。
【0151】
図6aと
図6bに示されるように、スクリプト・インタープリタは以下のタスクを実行する:
・入力:<OA>
・オペレータ:OP_RETURN
・出力:[Locking SCRIPT from <OA>], <OA> は消費される。
【0152】
OP_RETURNの実行以外では、スクリプト・インタープリタはトランザクションを検証するスクリプト・インタープリタと同じである、ということを強調することは重要なことである。上記の構成では、スクリプト内の複合ファンクションのためのテンプレートとして、トランザクションを解釈することが許容される。ファンクションがコンパイル可能である場合、それは全てのループがアンパックされなければならない単一のアウトポイントで書き出される場合があり、その結果は長く複雑なコードである。しかしながら、本発明の実施形態では、全ての論理は、トランザクションの別々のアウトポイント内に含まれ、これは、サイズがかなり小さくなる可能性がある。この論理は容易に短縮可能であり、前方のものとより密接に関連する。より具体的には、これはコードの可読性を改善し、コードベースを減らし、ユニット・テストを可能にする。
【0153】
この形式のトランザクションは、不使用の場合、UTXOセットに格納され、これは、将来の参照のためのロギング・データの観点から言えば、ビットコインのためのユニバーサルな‘メモリ’と見なすことができる。トランザクションは、複合ファンクションを構築するために必要とされる全てのものを含み、他の高級言語は必要とされない。これは、複合ファンクションのセットに関する普遍的な合意を可能にする。これは、多くのアプリケーションにおいて反復される可能性が高いファンクション、例えば、以下に説明する楕円曲線点乗算に対して特に有用である。
【0154】
これは、UTXOセットが、チューリング・コンプリート・コード・スニペット(Turing complete code snippets)のための分散リポジトリとして使用されることも許容する。このリポジトリは、一組の有用な複合ファンクションを格納する以外に、計算を実行するのは困難だが検証は容易である計算の処理をアウトソーシングするために使用することが可能である。このような計算に対する解は、次いで、ブロックチェーン上で転送することが可能であり、その場合において、デジタル資産は、スクリプトで検証可能な正確な解を提供することによって償還することが可能である。別の可能なユース・ケースは、UTXOセットを、スマート契約の分散リポジトリとして使用することである。
【0155】
UTXOセット内のこのようなトランザクションが消費されることを回避するために、トランザクション作成者アリスは、ロッキング・スクリプトの先頭にOP_CHECKSIGVERIFY(彼女の署名を必要とする)を追加することができる。スクリプトを解釈する場合に、この部分は無視しても支障は無い。代替的に、上述したようにアウトポイントを含むが入力を有しない部分トランザクションを構築することが可能であり、これはファンクションを定義するのに十分である。いったん複合ファンクションがアリスの満足のいくように利用されると、トランザクションは完了し、サブミットされるか、又は廃棄される。
【0156】
ユース・ケース - ユークリッド・アルゴリズム(Euclidean algorithm)
一例として、ユークリッド・アルゴリズムを含む、2つのアウトポイントを有するトランザクションTX_[Euclidean_algorithm]が生成される可能性がある。トランザクションの入力は、アウトポイントを強調するためにブランクのままにされている。
【0157】
【0158】
ユークリッド・アルゴリズムは2つの入力(a,b)を取り、aとbの最大公約数(greatest common divisor,GCD)を出力する。簡明化のために、a>bであると仮定する。
【0159】
設計上、“<i>OP_RETURN”が呼び出されるときはいつでも、オフ・ブロック・インタープリタは、これらの2つのアイテムを、i番目のアウトポイントに保存されたスクリプト全体で置き換えることに留意されたい。ループ特徴は、i番目のアウトポイントに“<i>OP_RETURN”を持たせることによって達成される。このユース・ケースでは、トランザクションの最後のアウトポイントが主要なファンクションであり、最初に呼び出される。“<1>OP_RETURN”に対する如何なる呼び出しも、
“OP_TUCK OP_MOD OP_DUP OP_IF <1> OP_RETURN OP_ENDIF”
によって置換される。この例は
図7に示されている。その実行はステップ・バイ・ステップで次のとおりである。
【0160】
1)この入力はスタックに先ずプッシュされる。
2)Mainファンクション“<1> OP_RETURN OP_DROP”が呼び出される。
3)“<1> OP_RETURN”は、“OP_TUCK OP_MOD OP_DUP OP_IF <1> OP_RETURN OP_ENDIF”により置換される。
4)“OP_TUCK OP_MOD OP_DUP OP_IF”が実行される。
5)入力が非ゼロである場合に、ifステートメントの中の“<1>OP_RETURN”に進む
6)“<1>OP_RETURN”は、“OP_TUCK OP_MOD OP_DUP OP_IF <1> OP_RETURN OP_ENDIF”により置換される。
7)“OP_TUCK OP_MOD OP_DUP OP_IF”が実行される。
8)入力が非ゼロである場合に、ifステートメントの中の“<1>OP_RETURN”に進む
9)“<1>OP_RETURN”は、“OP_TUCK OP_MOD OP_DUP OP_IF <1> OP_RETURN OP_ENDIF”により置換される。
10)“OP_TUCK OP_MOD OP_DUP OP_IF”が実行される。
11)入力がゼロである場合に直接的に“OP_ENDIF”に進み、ステップ9におけるifステートメントを閉じる。
12)“OP_ENDIF”に進み、ステップ6におけるifステートメントを閉じる。
13)“OP_ENDIF”に進み、ステップ3におけるifステートメントを閉じる。
14)Mainファンクションに戻り、“OP_DROP”に進む。
15)結果がスタックのトップに残される。
【0161】
ユース・ケース ‐ 楕円曲線点乗算(Elliptic Curve Point Multiplication)
単純化のために、このユース・ケースは[DECIMAL_TO_BINARY], [POINT_ADD], 及び [POINT_DOUBLE]のように略された3つのファンクションを含むものとする。
【0162】
【0163】
[POINT_ADD]は、スタックにおける最初の2つの要素P1とP2を消費し、P1とP2の点加算をスタックにプッシュする。
【0164】
[POINT_DOUBLE]は、OP_DUP [POINT_ADD]と互換性があり、スタックにおける第1要素Pを消費し、スタック上に点2Pをプッシュする。
【0165】
TX_[POINT_MUL]は、楕円曲線点乗算のための複合スクリプト・ファンクションを含むトランザクションである。
【0166】
【0167】
Mainファンクションは、上記トランザクションの最後のアウトポイントによって表現され、2つの入力(a,G)を取り、a・Gを出力する。具体例は
図8に示されている。OP_RETURNに遭遇するときはいつも、“<i> OP_RETURN”は、i番目のアウトポイントからのスクリプト全体で置き換えられる。スクリプトが何を行っているかについてのステップ・バイ・ステップの説明は、次のとおりである。この場合において、入力(a,G)がスタックにプッシュされることが仮定されており、Gはスタックにおける第1要素である:
【0168】
Mainファンクション(アウトポイント6)が呼び出される。
1)GをALTスタックにプッシュする。
2)[DECIMAL_TO_BINARY]を呼び出して、aのバイナリ表現を取得する。
3)GをALTスタックから戻すように動かす。
4)0をALTスタックにプッシュする。この0は、ALTスタックの底にいつ到達したかを識別するのに役立つ。
5)最初に、aの第1(最下位)ビットを取り扱う。それが1であるならば、GをALTスタックにプッシュする。
6)次いで、1をALTスタックにプッシュする。この1は、ALTスタック上でその隣に非ゼロ要素が存在することを示す。
7)アウトポイント4は、Mainスタック上で2に遭遇するまで(バイナリ・シーケンスの終端を示す)、連続的に呼び出される。
8)アウトポイント4は、その点を2倍にし、バイナリ・ビットが1であり場合には、その結果をALTスタックにプッシュし、(ステップ6で説明したように)1を後に続ける。
9)アウトポイント4が完了すると、一緒に追加されるべきALTスタックに点のリストが存在するであろう。
10)ALTスタックからMainスタックへ第1点を移動させ、アウトポイント5を呼び出して点加算を開始する。
11)ALTスタックの終端に達すると、期待される結果がMainスタック上にあるであろう。
【0169】
上記の実施形態は、例示としてのみ説明されていることが理解されるであろう。明確化のために言うと、実施形態は、特定の名称を有するオペコードに限定されない。むしろ、実施形態は、特定の機能を有するオペコードに限定される。“OP_RETURN”という用語は簡潔性のために使用されている。
【0170】
本件で開示される教示の第1実施例によれば、ブロックチェーンにおける記録のためにトランザクションを検証するためにコンピュータが実行する方法が提供され、方法は、ブロックチェーン・ネットワークのノードで1つ以上のトランザクションを受信するステップと、受信した各々のトランザクションについて、トランザクションを検証するプロトコルを適用するステップとを含み、プロトコルは、ターミネーション・オペコードがトランザクションの出力スクリプトに含まれることを可能にするように構成され、ターミネーション・オペコードは、ノードにより実行されると、a)出力スクリプトの実行を終了させるように、且つb)出力スクリプトにターミネーション・オペコードを含んでいることのみに基づいてはトランザクションを無効化しないように構成されており;及びプロトコルは、ターミネーション・オペコードの如何なるインスタンスも、トランザクションの入力スクリプトに含まれることを許容しないように構成され、該許容しないことは、ターミネーション・オペコードの何らかのインスタンスが入力スクリプトに含まれている場合に、ノードがトランザクションを少なくとも無効化することを含む。
【0171】
即ち、トランザクションは、出力スクリプトにターミネーション・オペコードが存在するという純粋にその理由だけでは無効化されない。言い換えると、トランザクションは、出力スクリプト自体のターミネーション・オペコードに基づいては無効化されないが、前述のように、別の理由で無効化される可能性がある。
【0172】
第2のオプションの実施例によれば、第1実施例による方法が提供される場合において、出力スクリプトはトランザクションに含まれるロッキング・スクリプトであってもよく、入力スクリプトは、先行トランザクションのロッキング・スクリプトをロック解除するための、トランザクションに含まれるアンロッキング・スクリプトであってもよい。
【0173】
第3のオプションの実施例によれば、第1又は第2実施例による方法が提供される場合において、プロトコルは、出力スクリプトが、少なくとも1つのデータ要素が先行するターミネーション・オペコードのインスタンスの組み合わせを含む場合に、ターミネーション・オペコードのインスタンスと少なくとも1つのデータ要素との組み合わせに基づいてトランザクションを無効化するように構成されていてもよい。
幾つかの例において、組み合わせに基づいてトランザクションが無効化されるためには、ターミネーション・オペコードのインスタンスは、直前に少なくとも1つのデータ要素がなければならず、即ち、少なくとも1つのデータ要素とターミネーション・オペコードは、出力スクリプトの隣接する要素である。証明可能な消費不能な出力は、ブロックチェーンにおけるデータ記憶(例えば、契約、メディア・ファイル、文書などについてのもの)を可能にする。
データ要素は、スクリプトの任意の要素(例えば、関数、文字列、オペコードなど)であってもよい。
【0174】
第4のオプションの実施例によれば、第3実施例による方法が提供される場合において、少なくとも1つのデータ要素は、ゼロ・オペコード;又はトランザクションの証明可能な消費不能な出力を作成するためのゼロ値の表現;のうちの一方又は双方を含んでもよい。
【0175】
第5のオプションの実施例によれば、第1ないし第4実施例のうちの何れかに従う方法が提供される場合において、プロトコルは、如何なるオペコードも、トランザクションの入力スクリプトに含まれることを許容しないように構成されてもよく、該許容しないことは、何らかのオペコードが入力スクリプトに含まれている場合に、ノードがトランザクションを少なくとも無効化することを含む。
【0176】
第6のオプションの実施例によれば、第1ないし第5実施例のうちの何れかに従う方法が提供される場合において、検証することは:出力スクリプトと入力スクリプトとの組み合わせのノードによる実行の後に、エンプティでないゼロでない結果をもたらすこと;ノードが、トランザクションを、ネットワークの1つ以上のノードへ、ブロックチェーンにおける記録のために転送すること;及びノードがトランザクションをブロックチェーンに記録すること;のうちの少なくとも1つを含んでもよい。
【0177】
第7のオプションの実施例によれば、第1ないし第6実施例のうちの何れかに従う方法が提供される場合において、方法は、プロトコルに従ってブロックチェーン・ネットワークのトランザクションを実行するステップを含み、第1トランザクションは、スタック・ベースのスクリプト言語の第1ロッキング・スクリプトを含む第1出力を少なくとも含み、第1ロッキング・スクリプトは、ターミネーション・オペコードの第1インスタンスが実行される前に実行されることになる第1ロッキング・スクリプトの部分を含み、第2トランザクションは、第1トランザクションにおける第1出力を参照する第1アンロッキング・スクリプトを含み、方法は、ターミネーション・オペコードの第1部分を実行する場合に:第1ロッキング・スクリプトの実行を終了するが、第1トランザクションを無効化しないステップ;第1データ要素を少なくとも1つのスタックから読み込むステップであって、第1データ要素は、第1ロッキング・スクリプトの部分と第1アンロッキング・スクリプトの実行中に生成される、ステップ;及び第1データ要素をオフ・チェーン・ファンクションへ、少なくとも1つのスタックから読み込まれた際に供給するステップであって、ファンクションは、少なくとも第1データ要素に基づいて結果を生成するように構成されている、ステップを含んでもよい。
【0178】
第8のオプションの実施例によれば、第7実施例による方法が提供される場合において、第1データ要素を読み込むステップは、第1データ要素をオフ・チェーン・スタックに記録するステップを含み、供給するステップは、第1データ要素をオフ・チェーン・ファンクションへ、少なくとも1つのオフ・チェーン・スタックから読み込まれた際に供給するステップを含んでもよい。
【0179】
第9のオプションの実施例によれば、第7又は第8実施例に従う方法が提供される場合において、生成するステップは、結果的に、ブロックチェーン・ネットワークの別のトランザクションを生成するステップを含んでもよい。
【0180】
第10のオプションの実施例によれば、第9実施例による方法が提供される場合において、別のトランザクションを生成するステップは、別のトランザクションの入力を生成するステップを含んでもよく、入力は少なくとも第1データ要素に基づいている。
【0181】
第11のオプションの実施例によれば、第9又は第10実施例に従う方法が提供される場合において、方法は、別のトランザクションを、ブロックチェーン・ネットワークの1つ以上のノードへ送信するステップを含んでもよい。
【0182】
第12のオプションの実施例によれば、第9ないし第11実施例のうちの何れかに従う方法が提供される場合において、方法は、ブロックチェーン・ネットワークの第3トランザクションを実行するステップを含んでもよく、第3トランザクションは、スタック・ベースのスクリプト言語の第2ロッキング・スクリプトを含む第2出力を少なくとも含み、第2ロッキング・スクリプトは、ターミネーション・オペコードの第2インスタンスが実行される前に実行されることになる第2ロッキング・スクリプトの部分を含み、別のトランザクションは、第3トランザクションにおける第2出力を参照する第2アンロッキング・スクリプトを含み、
方法は、別のトランザクションのターミネーション・オペコードの第2部分を実行する場合に:第2ロッキング・スクリプトの実行を終了するが、別のトランザクションを無効化しないステップ;第2データ要素を少なくとも1つのスタックから読み込むステップであって、第2データ要素は、第2ロッキング・スクリプトの部分と第2アンロッキング・スクリプトの実行中に生成される、ステップ;及び第2データ要素をオフ・チェーン・ファンクションへ、少なくとも1つのスタックから読み込まれた際に供給するステップであって、ファンクションは、少なくとも前記第2データ要素に基づいて別の結果を生成するように構成されている、ステップを含んでもよい。
【0183】
第13のオプションの実施例によれば、第7実施例による方法が提供される場合において、第1トランザクションは複数の出力を含んでもよく、各出力は各自のロッキング・スクリプトを含み、複数の出力の各々は、各自の出力アドレスによって参照され、第1データ要素は、複数の出力のうちの第2のものを参照する出力アドレスであり、第1出力は第2トランザクションのアンロッキング・スクリプトで参照され;及びオフ・チェーン・ファンクションは、ターミネーション・オペコードの第1インスタンスを呼び出す場合に、スタックから読み込まれた出力アドレスを使用して、第2出力のロッキング・スクリプトを参照する。
【0184】
第14のオプションの実施例によれば、第13実施例による方法が提供される場合において、方法は、アンロッキング・スクリプトと第1ロッキング・スクリプトを実行するステップであって、第2出力の出力アドレスをスタックにプッシュすることを含むステップを含んでもよい。
【0185】
第15のオプションの実施例によれば、第14実施例による方法が提供される場合において、方法は、アンロッキング・スクリプトと第1ロッキング・スクリプトを実行する前に、アンロッキング・スクリプトと第1ロッキング・スクリプトを、スクリプト・テンプレートにコピーするステップを含んでもよく、スクリプト・テンプレートは、実行対象のスクリプトを含む。
【0186】
第16のオプションの実施例によれば、第15実施例による方法が提供される場合において、方法は、ターミネーション・オペコードの第1インスタンスを呼び出す場合に、第2出力のロッキング・スクリプトを、スクリプト・テンプレートの先頭にコピーするステップを含んでもよい。
【0187】
第17のオプションの実施例によれば、第13ないし第16実施例のうちの何れかに従う方法が提供される場合において、方法は、第2出力のロッキング・スクリプトを実行するステップを含んでもよい。
【0188】
第18のオプションの実施例によれば、第17実施例による方法が提供される場合において、第2出力のロッキング・スクリプトは、ターミネーション・オペコードの第2インスタンスの前に実行されることになるスクリプトの部分を含んでもよく、その部分は、複数の出力のうちの第3のものを参照する出力アドレスを含み、
第2出力のロッキング・スクリプトを実行するステップは、第3出力の出力アドレスを前記スタックにプッシュするステップを含んでもよく、
ファンクションは、ターミネーション・オペコードの第2インスタンスを呼び出す場合に、スタックから読み込まれた出力アドレスを使用して、第3出力のロッキング・スクリプトを参照するように構成されている。
【0189】
第19のオプションの実施例によれば、第18実施例による方法が提供される場合において、方法は、ターミネーション・オペコードの第2インスタンスを呼び出す場合に、第3出力のロッキング・スクリプトを、スクリプト・テンプレートの先頭にコピーするステップを含んでもよい。
【0190】
第20のオプションの実施例によれば、第18又は第19実施例による方法が提供される場合において、第1、第2、及び第3出力は複数の出力の中で順に掲載されていてもよい。
【0191】
第21のオプションの実施例によれば、第18又は第19実施例による方法が提供される場合において、第1、第2、及び第3出力は複数の出力の中でその順には掲載されていなくてもよい。
【0192】
第22のオプションの実施例によれば、第13ないし第21実施例のうちの何れかに従う方法が提供される場合において、方法は、参照した出力のロッキング・スクリプトを実行し、各自の出力の出力アドレスをオフ・チェーン・スタックにプッシュするオペレーションを実行するステップを含んでもよく、
ファンクションは、各自の出力のターミネーション・オペコードの各自のインスタンスを呼び出す場合に、スタックから読み込まれた出力アドレスを使用して、複数の出力のうちの次のもののロッキング・スクリプトを参照するように構成されており、
複数の出力の内の、別のロッキング・スクリプトにより参照される各ロッキング・スクリプトが実行されるまで、オペレーションは反復される。
【0193】
第23のオプションの実施例によれば、第22実施例による方法が提供される場合において、方法は、ロッキング・スクリプトのうちの1つが実行される度に、該ロッキング・スクリプトをスクリプト・テンプレートの先頭にコピーするステップを含んでもよい。
【0194】
第24のオプションの実施例によれば、第23実施例による方法が提供される場合において、方法は、スクリプト・テンプレートを、別のトランザクションのロッキング・スクリプトとして使用するステップを含んでもよく、別のトランザクションのロッキング・スクリプトは、ターミネーション・オペコードのインスタンスを含んでいない。
【0195】
第25のオプションの実施例によれば、第13ないし第24実施例のうちの何れかに従う方法が提供される場合において、ロッキング・スクリプトのうちの1つ以上は各自のファンクションを有してもよく、その各自のロッキング・スクリプトを実行することは、各自のファンクションを実行することを含んでもよい。
【0196】
第26のオプションの実施例によれば、第25実施例による方法が提供される場合において、各自のファンクションは、各自のファンクションが実行される度に、オフ・チェーン・スタックにおけるデータに作用するように構成されていてもよい。
【0197】
第27のオプションの実施例によれば、第13ないし第26実施例のうちの何れかに従う方法が提供される場合において、方法は、第1ロッキング・スクリプトがターミネーション・オペコードのインスタンスを含む場合に、全てのロッキング・スクリプトを第1トランザクションから取り出し、それらを各自の出力アドレスでインデックスを付けるステップを含んでもよい。
【0198】
第28のオプションの実施例によれば、第13ないし第27実施例のうちの何れかに従う方法が提供される場合において、各々のロッキング・スクリプトにおける各々の出力アドレスは各自のデータ要素であってもよく、ファンクションは、各自のデータ要素を出力アドレスとして解釈するように構成されていてもよい。
【0199】
本件で開示される教示の第29実施例によれば、コンピュータ読み取り可能なストレージに組み込まれるコンピュータ・プログラムが提供され、当該プログラムは、ブロックチェーン・ネットワークのノードで実行されると、第1ないし第28実施例のうちの何れかの方法を実行するように構成されている。
【0200】
本件で開示される教示の第30実施例によれば、コンピューティング装置が提供され、当該装置は、1つ以上のメモリ・ユニットを含むメモリ;及び1つ以上の処理ユニットを含む処理装置を含み、メモリは処理装置で実行されるように構成されたコードを記憶し、コードは、処理装置で実行されると、第1ないし第28実施例のうちの何れかの方法を実行するように構成されている。
【0201】
開示された技術の他の変形例又はユース・ケースは、本件の開示が与えられると当業者にとって明らかになり得る。本開示の範囲は、説明された実施形態によっては限定されず、添付のクレームによってのみ限定される。
【0202】
(付記1)
ブロックチェーンにおける記録のためにトランザクションを検証するためにコンピュータが実行する方法であって、ブロックチェーン・ネットワークのノードで1つ以上のトランザクションを受信するステップと、受信した各々のトランザクションについて、前記トランザクションを検証するプロトコルを適用するステップとを含み、
前記プロトコルは、ターミネーション・オペコードが前記トランザクションの出力スクリプトに含まれることを可能にするように構成され、前記ターミネーション・オペコードは、前記ノードにより実行されると、a)前記出力スクリプトの実行を終了させるように、且つb)前記出力スクリプトに前記ターミネーション・オペコードを含んでいることのみに基づいては前記トランザクションを無効化しないように構成されており;及び
前記プロトコルは、前記ターミネーション・オペコードの如何なるインスタンスも、前記トランザクションの入力スクリプトに含まれることを許容しないように構成され、該許容しないことは、前記ターミネーション・オペコードの何らかのインスタンスが前記入力スクリプトに含まれている場合に、前記ノードが前記トランザクションを少なくとも無効化することを含む、方法。
(付記2)
前記出力スクリプトは前記トランザクションに含まれるロッキング・スクリプトであり、前記入力スクリプトは、先行トランザクションのロッキング・スクリプトをロック解除するための、前記トランザクションに含まれるアンロッキング・スクリプトである、付記1に記載の方法。
(付記3)
前記プロトコルは:
前記出力スクリプトが、少なくとも1つのデータ要素が先行する前記ターミネーション・オペコードのインスタンスの組み合わせを含む場合に、前記ターミネーション・オペコードのインスタンスと前記少なくとも1つのデータ要素との組み合わせに基づいて前記トランザクションを無効化するように構成されている、付記1又は2に記載の方法。
(付記4)
前記少なくとも1つのデータ要素は、
ゼロ・オペコード;又は
前記トランザクションの証明可能な消費不能な出力を作成するためのゼロ値の表現;
のうちの一方又は双方を含む、付記3に記載の方法。
(付記5)
前記プロトコルは:
如何なるオペコードも、前記トランザクションの前記入力スクリプトに含まれることを許容しないように構成され、該許容しないことは、何らかのオペコードが前記入力スクリプトに含まれている場合に、前記ノードが前記トランザクションを少なくとも無効化することを含む、付記1ないし4のうちの何れか1項に記載の方法。
(付記6)
前記検証することは:
前記出力スクリプトと前記入力スクリプトとの組み合わせの前記ノードによる実行の後に、エンプティでないゼロでない結果をもたらすこと;
前記ノードが、前記トランザクションを、前記ネットワークの1つ以上のノードへ、前記ブロックチェーンにおける記録のために転送すること;及び
前記ノードが前記トランザクションを前記ブロックチェーンに記録すること;
のうちの少なくとも1つを含む、付記1ないし5のうちの何れか1項に記載の方法。
(付記7)
前記プロトコルに従って前記ブロックチェーン・ネットワークのトランザクションを実行するステップを含み、第1トランザクションは、スタック・ベースのスクリプト言語の第1ロッキング・スクリプトを含む第1出力を少なくとも含み、前記第1ロッキング・スクリプトは、前記ターミネーション・オペコードの第1インスタンスが実行される前に実行されることになる前記第1ロッキング・スクリプトの部分を含み、第2トランザクションは、前記第1トランザクションにおける前記第1出力を参照する第1アンロッキング・スクリプトを含み、
前記方法は、前記ターミネーション・オペコードの前記第1部分を実行する場合に:
前記第1ロッキング・スクリプトの実行を終了するが、前記第1トランザクションを無効化しないステップ;
第1データ要素を少なくとも1つのスタックから読み込むステップであって、前記第1データ要素は、前記第1ロッキング・スクリプトの前記部分と前記第1アンロッキング・スクリプトの実行中に生成される、ステップ;及び
前記第1データ要素をオフ・チェーン・ファンクションへ、前記少なくとも1つのスタックから読み込まれた際に供給するステップであって、前記ファンクションは、少なくとも前記第1データ要素に基づいて結果を生成するように構成されている、ステップ;
を含む、付記1ないし6のうちの何れか1項に記載の方法。
(付記8)
前記第1データ要素を読み込む前記ステップは、前記第1データ要素をオフ・チェーン・スタックに記録するステップを含み、前記供給するステップは、前記第1データ要素を前記オフ・チェーン・ファンクションへ、前記少なくとも1つのオフ・チェーン・スタックから読み込まれた際に供給する、付記7に記載の方法。
(付記9)
前記生成するステップは、結果的に、前記ブロックチェーン・ネットワークの別のトランザクションを生成するステップを含む、付記7又は8に記載の方法。
(付記10)
前記別のトランザクションを生成する前記ステップは、前記別のトランザクションの入力を生成するステップを含み、前記入力は少なくとも前記第1データ要素に基づいている、付記9に記載の方法。
(付記11)
前記別のトランザクションを、前記ブロックチェーン・ネットワークの1つ以上のノードへ送信するステップを含む、付記9又は10に記載の方法。
(付記12)
前記ブロックチェーン・ネットワークの第3トランザクションを実行するステップを含み、前記第3トランザクションは、前記スタック・ベースのスクリプト言語の第2ロッキング・スクリプトを含む第2出力を少なくとも含み、前記第2ロッキング・スクリプトは、前記ターミネーション・オペコードの第2インスタンスが実行される前に実行されることになる前記第2ロッキング・スクリプトの部分を含み、前記別のトランザクションは、第3トランザクションにおける前記第2出力を参照する第2アンロッキング・スクリプトを含み、
前記方法は、前記別のトランザクションの前記ターミネーション・オペコードの前記第2部分を実行する場合に:
前記第2ロッキング・スクリプトの実行を終了するが、前記別のトランザクションを無効化しないステップ;
第2データ要素を前記少なくとも1つのスタックから読み込むステップであって、前記第2データ要素は、前記第2ロッキング・スクリプトの前記部分と前記第2アンロッキング・スクリプトの実行中に生成される、ステップ;及び
前記第2データ要素を前記オフ・チェーン・ファンクションへ、前記少なくとも1つのスタックから読み込まれた際に供給するステップであって、前記ファンクションは、少なくとも前記第2データ要素に基づいて別の結果を生成するように構成されている、ステップ;
を含む、付記9ないし11のうちの何れか1項に記載の方法。
(付記13)
前記第1トランザクションは複数の出力を含み、各出力は各自のロッキング・スクリプトを含み、前記複数の出力の各々は、各自の出力アドレスによって参照され、前記第1データ要素は、前記複数の出力のうちの第2のものを参照する出力アドレスであり、第1出力は前記第2トランザクションの前記アンロッキング・スクリプトで参照され;及び
前記オフ・チェーン・ファンクションは、前記ターミネーション・オペコードの前記第1インスタンスを呼び出す場合に、前記スタックから読み込まれた前記出力アドレスを使用して、前記第2出力のロッキング・スクリプトを参照する、付記7に記載の方法。
(付記14)
前記アンロッキング・スクリプトと前記第1ロッキング・スクリプトを実行するステップであって、前記第2出力の前記出力アドレスを前記スタックにプッシュすることを含むステップを含む付記13に記載の方法。
(付記15)
前記アンロッキング・スクリプトと前記第1ロッキング・スクリプトを実行する前に、前記アンロッキング・スクリプトと前記第1ロッキング・スクリプトを、スクリプト・テンプレートにコピーするステップを含み、前記スクリプト・テンプレートは、実行対象のスクリプトを含む、付記14に記載の方法。
(付記16)
前記ターミネーション・オペコードの前記第1インスタンスを呼び出す場合に、前記第2出力の前記ロッキング・スクリプトを、前記スクリプト・テンプレートの先頭にコピーするステップを含む、付記15に記載の方法。
(付記17)
前記第2出力の前記ロッキング・スクリプトを実行するステップを含む、付記13ないし16のうちの何れか1項に記載の方法。
(付記18)
前記第2出力の前記ロッキング・スクリプトは、前記ターミネーション・オペコードの第2インスタンスの前に実行されることになるスクリプトの部分を含み、前記部分は、前記複数の出力のうちの第3のものを参照する出力アドレスを含み、
前記第2出力の前記ロッキング・スクリプトを実行するステップは、前記第3出力の前記出力アドレスを前記スタックにプッシュするステップを含み、
前記ファンクションは、前記ターミネーション・オペコードの前記第2インスタンスを呼び出す場合に、前記スタックから読み込まれた前記出力アドレスを使用して、前記第3出力のロッキング・スクリプトを参照するように構成されている、付記17に記載の方法。
(付記19)
前記ターミネーション・オペコードの前記第2インスタンスを呼び出す場合に、前記第3出力の前記ロッキング・スクリプトを、前記スクリプト・テンプレートの先頭にコピーするステップを含む、付記18に記載の方法。
(付記20)
前記第1、第2、及び第3出力は前記複数の出力の中で順に掲載されている、付記18又は付記19に記載の方法。
(付記21)
前記第1、第2、及び第3出力は前記複数の出力の中でその順には掲載されていない、付記18又は付記19に記載の方法。
(付記22)
参照した出力のロッキング・スクリプトを実行し、各自の出力の出力アドレスを前記オフ・チェーン・スタックにプッシュするオペレーションを実行するステップを含み、
前記ファンクションは、前記各自の出力の前記ターミネーション・オペコードの前記各自のインスタンスを呼び出す場合に、前記スタックから読み込まれた前記出力アドレスを使用して、前記複数の出力のうちの次のもののロッキング・スクリプトを参照するように構成されており、
前記複数の出力の内の、別のロッキング・スクリプトにより参照される各ロッキング・スクリプトが実行されるまで、前記オペレーションは反復される、付記13ないし21のうちの何れか1項に記載の方法。
(付記23)
前記ロッキング・スクリプトのうちの1つが実行される度に、該ロッキング・スクリプトを前記スクリプト・テンプレートの先頭にコピーするステップ
を含む付記22に記載の方法。
(付記24)
前記スクリプト・テンプレートを、別のトランザクションのロッキング・スクリプトとして使用するステップを含み、前記別のトランザクションの前記ロッキング・スクリプトは、前記ターミネーション・オペコードのインスタンスを含んでいない、付記23に記載の方法。
(付記25)
前記ロッキング・スクリプトのうちの1つ以上は各自のファンクションを有し、その各自のロッキング・スクリプトを実行することは、前記各自のファンクションを実行することを含む、付記13ないし24のうちの何れか1項に記載の方法。
(付記26)
前記各自のファンクションは、前記各自のファンクションが実行される時点で、前記オフ・チェーン・スタックにおけるデータに作用するように構成されている、付記25に記載の方法。
(付記27)
前記第1ロッキング・スクリプトが前記ターミネーション・オペコードのインスタンスを含む場合に、全てのロッキング・スクリプトを前記第1トランザクションから取り出し、それらを各自の出力アドレスでインデックスを付けるステップを含む付記13ないし26のうちの何れか1項に記載の方法。
(付記28)
各々のロッキング・スクリプトにおける各々の出力アドレスは各自のデータ要素であり、前記ファンクションは、前記各自のデータ要素を出力アドレスとして解釈するように構成されている、付記13ないし27のうちの何れか1項に記載の方法。
(付記29)
コンピュータ読み取り可能なストレージに組み込まれるコンピュータ・プログラムであって、前記ブロックチェーン・ネットワークの前記ノードで実行されると、上記の何れかの項の方法を実行するように構成されているコンピュータ・プログラム。
(付記30)
1つ以上のメモリ・ユニットを含むメモリ;及び
1つ以上の処理ユニットを含む処理装置;
を含むコンピューティング装置であって、前記メモリは前記処理装置で実行されるように構成されたコードを記憶し、前記コードは、前記処理装置で実行されると、付記1ないし28のうちの何れか1項に記載の方法を実行するように構成されている、コンピューティング装置。
【外国語明細書】