IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ エヌチェーン ホールディングス リミテッドの特許一覧

特表2023-554417ブロックチェーントランザクションの生成と検証
<>
  • 特表-ブロックチェーントランザクションの生成と検証 図1
  • 特表-ブロックチェーントランザクションの生成と検証 図2
  • 特表-ブロックチェーントランザクションの生成と検証 図3A
  • 特表-ブロックチェーントランザクションの生成と検証 図3B
  • 特表-ブロックチェーントランザクションの生成と検証 図4
  • 特表-ブロックチェーントランザクションの生成と検証 図5
  • 特表-ブロックチェーントランザクションの生成と検証 図6
  • 特表-ブロックチェーントランザクションの生成と検証 図7
  • 特表-ブロックチェーントランザクションの生成と検証 図8
  • 特表-ブロックチェーントランザクションの生成と検証 図9
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2023-12-27
(54)【発明の名称】ブロックチェーントランザクションの生成と検証
(51)【国際特許分類】
   G06F 8/30 20180101AFI20231220BHJP
   H04L 9/32 20060101ALI20231220BHJP
【FI】
G06F8/30
H04L9/32 200Z
【審査請求】未請求
【予備審査請求】未請求
(21)【出願番号】P 2023536523
(86)(22)【出願日】2021-11-15
(85)【翻訳文提出日】2023-08-14
(86)【国際出願番号】 EP2021081703
(87)【国際公開番号】W WO2022128285
(87)【国際公開日】2022-06-23
(31)【優先権主張番号】2019748.9
(32)【優先日】2020-12-15
(33)【優先権主張国・地域又は機関】GB
(81)【指定国・地域】
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.JAVA
2.PYTHON
3.JAVASCRIPT
(71)【出願人】
【識別番号】318001991
【氏名又は名称】エヌチェーン ライセンシング アーゲー
(74)【代理人】
【識別番号】100108453
【弁理士】
【氏名又は名称】村山 靖彦
(74)【代理人】
【識別番号】100110364
【弁理士】
【氏名又は名称】実広 信哉
(74)【代理人】
【識別番号】100133400
【弁理士】
【氏名又は名称】阿部 達彦
(72)【発明者】
【氏名】ウェイ・ジャン
(72)【発明者】
【氏名】バッセム・アマール
(72)【発明者】
【氏名】スティーヴン・パトリック・カフラン
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376BC31
5B376FA10
(57)【要約】
ブロックチェーントランザクションを生成するコンピュータ実装方法であって、第1の当事者によって実行され、第1のブロックチェーントランザクションを生成するステップであって、第1のブロックチェーントランザクションが第1のコンパクトスクリプト(CS)を備え、第1のCSが、少なくとも部分的に高レベル(HL)スクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実行されるそれぞれの動作と同等の動作を実行するように構成され、第1のCSが、LLスクリプト言語で記述され、複数のLL関数を備える第1の展開スクリプト(ES)と同等の動作を実行するように構成され、第1のCSが、第1のESよりストレージサイズが小さい、ステップと、第1のブロックチェーントランザクションをブロックチェーンネットワークの1つまたは複数のノードおよび/または第2の当事者が利用できるようにするステップとを備える、コンピュータ実装方法。
【特許請求の範囲】
【請求項1】
ブロックチェーントランザクションを生成するコンピュータ実装方法であって、第1の当事者によって実行され、
第1のブロックチェーントランザクションを生成するステップであって、前記第1のブロックチェーントランザクションが第1のコンパクトスクリプト(CS)を備え、前記第1のCSが、少なくとも部分的に高レベル(HL)スクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実行されるそれぞれの動作と同等の動作を実行するように構成され、前記第1のCSが、前記LLスクリプト言語で記述され、複数のLL関数を備える第1の展開スクリプト(ES)と同等の動作を実行するように構成され、前記第1のCSが、前記第1のESよりストレージサイズが小さい、ステップと、
前記第1のブロックチェーントランザクションをブロックチェーンネットワークの1つまたは複数のノードおよび/または第2の当事者が利用できるようにするステップと
を備える、コンピュータ実装方法。
【請求項2】
前記HLスクリプト言語が、ユーザ向け(UF)スクリプト言語と前記LLスクリプト言語との間の中間レベル(IL)スクリプト言語であり、前記HL関数がIL関数である、請求項1に記載の方法。
【請求項3】
前記第1のブロックチェーントランザクションを生成するステップが、
第1のUFスクリプト(UFS)を生成するステップであって、前記第1のUFSが、少なくとも部分的に前記UFスクリプト言語で記述され、1つまたは複数のUF関数を備え、実行されると、各UF関数が、1つまたは複数のIL関数によって実行されるそれぞれの動作と同等の動作を実行するように構成される、ステップと、
前記第1のUFSを前記第1のCSに変換するステップと
を備える、請求項2に記載の方法。
【請求項4】
関数テーブルが関数マッピングのリストを備え、各関数マッピングが、1つまたは複数の他のIL関数および/あるいは1つまたは複数のLL関数のセットにマッピングされたそれぞれのIL関数を備え、前記第1のUFSから前記第1のCSに変換する前記ステップが、前記関数テーブルにリストされている前記関数マッピングに基づく、請求項3に記載の方法。
【請求項5】
前記関数テーブルが、それぞれがそれぞれのIL関数を識別する1つまたは複数の関数識別子を備え、前記第1のCSが、1つまたは複数の第1のデータペアを備え、各第1のデータペアが、それぞれのIL関数識別子および呼出し関数を備え、実行されると、前記呼出し関数が、前記それぞれのIL関数識別子によって識別される前記IL関数にマッピングされた1つまたは複数の他のIL関数および/あるいは1つまたは複数のLL関数の前記セットを実行するように構成される、請求項4に記載の方法。
【請求項6】
前記関数テーブルの少なくとも一部が前記第1の当事者によって作成され、前記方法が前記関数テーブルの前記少なくとも一部を、ブロックチェーンネットワークの1つまたは複数のノードおよび/または前記第2の当事者が利用できるようにするステップを備える、請求項5に記載の方法。
【請求項7】
前記関数テーブルの少なくとも一部が、前記第1の当事者以外の当事者によって作成され、前記方法が、前記関数テーブルの前記少なくとも一部を取得するステップを備える、請求項4または請求項4の記載を引用する請求項のうちのいずれか一項に記載の方法。
【請求項8】
前記関数テーブルの前記少なくとも一部がブロックチェーンノードによって作成され、取得する前記ステップが前記関数テーブルの前記少なくとも一部を前記ブロックチェーンノードから受信するステップを備える、請求項7に記載の方法。
【請求項9】
変数テーブルが1つまたは複数の変数識別子を備え、各変数識別子に関連付けて変数を記憶するように構成され、前記第1のCSが、1つまたは複数の第2のデータペアを備え、各第2のデータペアが、それぞれの変数識別子と、読取り関数または書込み関数のいずれかを備え、実行されると、前記読取り関数が、前記それぞれの変数識別子に関連付けて記憶されている前記変数テーブルから変数を読み取るように構成されており、実行されると、前記書込み関数が、前記それぞれの変数識別子に関連付けて記憶するために、前記第1のCSの実行中に生成された変数を前記変数テーブルに書き込むように構成されている、請求項3または請求項3の記載を引用する請求項のうちのいずれか一項に記載の方法。
【請求項10】
第1のトランザクション識別子を生成するステップであって、前記第1のトランザクション識別子が、前記第1のブロックチェーントランザクションの修正バージョンに基づいて生成され、前記第1のブロックチェーントランザクションのこの修正バージョンが、前記第1のCSの代わりに前記第1のESを備える、ステップと、
前記トランザクション識別子を前記ブロックチェーンネットワークの1つまたは複数のノードが利用できるようにするステップと
を備える、請求項1から9のいずれか一項に記載の方法。
【請求項11】
前記第1のトランザクション識別子を生成する前記ステップが、
前記第1のブロックチェーントランザクションを生成するステップと、
前記第1のトランザクション識別子を生成するための前記第1のブロックチェーントランザクションの前記修正バージョンを生成するために、前記第1のCSを前記第1のESに置き換えるステップと
を備える、請求項10に記載の方法。
【請求項12】
前記第1のブロックチェーントランザクションを前記ブロックチェーンネットワークの前記1つまたは複数のノードが利用できるようにする前記ステップの前に、前記第1のESを前記第1のCSに置き換えるステップを備える、請求項11に記載の方法。
【請求項13】
前記第1のブロックチェーントランザクションを生成する前記ステップが、
前記第1のブロックチェーントランザクションの前記修正バージョンを生成するステップと、
前記第1のESを前記第1のCSに置き換えることによって、前記第1のブロックチェーントランザクションを生成するステップと
を備える、請求項3に記載の方法。
【請求項14】
前記第1のブロックチェーントランザクションが、前記第1のトランザクション識別子とともに前記ブロックチェーンネットワークの前記1つまたは複数のノードで利用可能になる、請求項10または請求項10の記載を引用する請求項のうちのいずれか一項に記載の方法。
【請求項15】
前記第1のブロックチェーントランザクションが第1の入力を備え、前記第1の入力が前記第1のブロックチェーントランザクションの前記修正バージョンに基づいて生成された署名を備える、請求項1から14のいずれか一項に記載の方法。
【請求項16】
前記第1のブロックチェーントランザクションが、以下のフィールド、
前記第1のブロックチェーントランザクションのバージョン番号と、
前記第1のブロックチェーントランザクションのロックタイムと、
前記第1のブロックチェーントランザクションの1つまたは複数の入力と、
ロック解除スクリプトを備えない前記第1のブロックチェーントランザクションの1つまたは複数の入力と、
それぞれのCSを備える前記第1のブロックチェーントランザクションの1つまたは複数の出力と
のうちの1つまたは複数に基づくセカンダリトランザクション識別子を備える、請求項1から15のいずれか一項に記載の方法。
【請求項17】
署名の基礎となる前記第1のブロックチェーントランザクションの前記修正バージョンが、セカンダリトランザクション識別子を備える出力を備える、請求項11または12に記載の方法。
【請求項18】
1つまたは複数のブロックチェーンクライアントアプリケーションが前記第1のブロックチェーントランザクションを利用できるようにするステップを備える、請求項1から17のいずれか一項に記載の方法。
【請求項19】
前記第1のブロックチェーントランザクションを前記第1の当事者によって動作されるコンピューティング機器のメモリに記憶するステップを備える、請求項1から18のいずれか一項に記載の方法。
【請求項20】
前記HL関数のうちの少なくとも1つによって実行される演算が、複数の前記LL関数によって実行される演算と同等である、請求項1から19のいずれか一項に記載の方法。
【請求項21】
前記第1のCSが第1のコンパクトロックスクリプト(CLS)であり、前記第1のESが第1の展開ロックスクリプト(ELS)である、請求項1から20のいずれか一項に記載の方法。
【請求項22】
第1のUFスクリプトが、第1のユーザ向けロックスクリプト(UFLS)である、請求項2または21に記載の方法。
【請求項23】
前記第1のCSが第1のコンパクトロック解除スクリプト(CLS)であり、前記第1のESが第1の展開ロック解除スクリプト(ELS)である、請求項1から20のいずれか一項に記載の方法。
【請求項24】
第1のUFスクリプトが、第1のユーザ向けロック解除スクリプト(UFLS)である、請求項2または23に記載の方法。
【請求項25】
コンピュータ実装方法であって、
ブロックチェーントランザクションを検証するコンピュータ実装方法であって、前記方法が、ブロックチェーンネットワークのノードによって実行され、前記ノードが、高レベル(HL)スクリプト言語で記述されたスクリプトを実行するように構成され、前記ブロックチェーンが、第1のブロックチェーントランザクションを備え、前記第1のブロックチェーントランザクションが、第1のコンパクトロックスクリプト(CLS)を備える第1の出力を備え、前記第1のCLSが、少なくとも部分的に前記HLスクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実行されるそれぞれの動作と同等の動作を実行するように構成され、前記第1のCLSが、前記LLスクリプト言語で記述され、複数のLL関数を備える第1の展開ロックスクリプト(ELS)と同等の動作を実行するように構成され、前記第1のCLSが、前記第1のELSよりストレージサイズが小さく、前記方法がブロックチェーンノードによって実行され、
第2のブロックチェーントランザクションを取得するステップであって、前記第2のブロックチェーントランザクションが、第1のロック解除スクリプトを備える第1の入力を備える、ステップと、
前記第2のブロックチェーントランザクションを検証するステップと
を備え、前記第2のブロックチェーントランザクションを検証する前記ステップが、
前記第1のブロックチェーントランザクションを取得するステップを備え、
a)前記第1のCLSを前記第1のELSに置き換え、次いで、前記第1のロック解除スクリプトを前記第1のELSとともに実行するステップであって、前記第2のトランザクションが有効である条件が、前記実行が成功することである、ステップ、または、
b)前記第1のロック解除スクリプトを前記第1のCLSとともに実行するステップであって、前記第2のトランザクションが有効である条件が、前記実行が成功することである、ステップを備える、コンピュータ実装方法。
【請求項26】
前記第2のブロックチェーントランザクションが有効であることを条件として、前記第2のブロックチェーントランザクションを前記ブロックチェーンネットワークの1つまたは複数の他のノードに送信する、および/あるいは前記第1のブロックチェーントランザクションを前記ノードのメモリに記憶するステップを備える、請求項25に記載の方法。
【請求項27】
前記第2のブロックチェーントランザクションが第2の当事者によって生成され、前記第2のブロックチェーントランザクションを取得する前記ステップが、前記第2の当事者から前記第2のブロックチェーントランザクションを受信するステップを備える、請求項25または26に記載の方法。
【請求項28】
前記ノードのメモリから前記第1のブロックチェーントランザクションを取得するステップを備える、請求項24から26のいずれか一項に記載の方法。
【請求項29】
前記第2のブロックチェーントランザクションが第2のCLSを備える第2の出力を備え、前記第2のCLSが前記HLスクリプト言語で記述され、前記第2のCLSが前記LLスクリプト言語で記述された第2のELSと同等の動作を実行するように構成され、前記第2のCLSが前記第2のELSよりストレージサイズが小さく、前記第2のブロックチェーントランザクションを検証するステップが、
第2の候補トランザクション識別子を取得するステップと、
前記第2のブロックチェーントランザクションの修正バージョンを生成するステップであって、前記第2のブロックチェーントランザクションのこの修正バージョンでは、前記第2の出力が前記第2のCSの代わりに前記第2のESを備える、ステップと、
第2のトランザクション識別子を生成するステップであって、前記第2のトランザクション識別子が、前記第2のブロックチェーントランザクションの前記修正バージョンに基づいて生成される、ステップと、
前記第2の候補トランザクション識別子と前記第2のトランザクション識別子を比較するステップであって、前記第2のブロックチェーントランザクションが有効である条件が、前記第2の候補トランザクション識別子が前記第2のトランザクション識別子と一致することである、ステップと
を備える、請求項25から28のいずれか一項に記載の方法。
【請求項30】
前記第1のCLSまたは前記第1のELSとともに前記第1のロック解除スクリプトを実行する前記ステップの前に、前記第2の候補トランザクション識別子と前記第2のトランザクション識別子との前記比較を実行するステップを備える、請求項29に記載の方法。
【請求項31】
前記HLスクリプト言語が、ユーザ向け(UF)スクリプト言語と前記LLスクリプト言語との間の中間レベル(IL)スクリプト言語であり、前記HL関数がIL関数であり、関数テーブルが関数マッピングのリストを備え、各関数マッピングが、1つまたは複数の他のIL関数および/あるいは1つまたは複数のLL関数のセットにマッピングされたそれぞれのIL関数を備え、
a)前記第1のCLSを前記第1のELSに置き換える前記ステップが、前記関数テーブルにリストされている前記関数マッピングに基づいている、または、
b)前記第1のCLSとともに前記第1のロック解除スクリプトを実行する前記ステップが、前記関数テーブルにリストされている前記関数マッピングに基づいている、請求項25から30のいずれか一項に記載の方法。
【請求項32】
関数テーブルが、それぞれがそれぞれのIL関数を識別する1つまたは複数の関数識別子を備え、前記第1のCSが、1つまたは複数の第1のデータペアを備え、各第1のデータペアが、それぞれのIL関数識別子および呼出し関数を備え、実行されると、前記呼出し関数が、前記それぞれのIL関数識別子によって識別される前記IL関数にマッピングされた1つまたは複数の他のIL関数および/あるいは前記1つまたは複数のLL関数のセットを実行するように構成される、請求項25または請求項25の記載を引用する請求項のうちのいずれか一項に記載の方法。
【請求項33】
前記関数テーブルの少なくとも一部が第1の当事者によって作成され、前記方法が、前記関数テーブルの前記少なくとも一部を前記第1の当事者から受信するステップを備える、請求項31または32に記載の方法。
【請求項34】
異なる当事者から前記関数テーブルの異なる部分を受信するステップを備える、請求項31または請求項31の記載を引用する請求項のうちのいずれか一項に記載の方法。
【請求項35】
前記関数テーブルの少なくとも一部を作成するステップを備える、請求項31または請求項31の記載を引用する請求項のうちのいずれか一項に記載の方法。
【請求項36】
変数テーブルが1つまたは複数の変数識別子を備え、各変数識別子に関連付けて変数を記憶するように構成され、前記第1のCSが、1つまたは複数の第2のデータペアを備え、各第2のデータペアが、それぞれの変数識別子と、読取り関数または書込み関数のいずれかを備え、実行されると、前記読取り関数が、前記それぞれの変数識別子に関連付けて記憶されている前記変数テーブルから変数を読み取るように構成されており、実行されると、前記書込み関数が、前記それぞれの変数識別子に関連付けて記憶するために、前記第1のCSの実行中に生成された変数を前記変数テーブルに書き込むように構成されている、請求項25または請求項25の記載を引用する請求項のうちのいずれか一項に記載の方法。
【請求項37】
ブロックチェーントランザクションを検証するコンピュータ実装方法であって、前記方法がブロックチェーンネットワークのノードによって実行され、前記ノードが高レベル(HL)スクリプト言語で記述されたスクリプトを実行するように構成され、前記方法がブロックチェーンノードによって実行され、
第1のブロックチェーントランザクションを取得するステップであって、前記第1のブロックチェーントランザクションが前のブロックチェーントランザクションの入力を参照する入力を備え、前記第1のブロックチェーントランザクションが第1のコンパクトスクリプト(CS)を備え、前記第1のCSが、前記HLスクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実行されるそれぞれの動作と同等の動作を実行するように構成され、前記第1のCSが、前記LLスクリプト言語で記述され、複数のLL関数を備える第1の展開スクリプト(ES)と同等の動作を実行するように構成され、前記第1のCSが、前記第1のESよりストレージサイズが小さい、ステップと、
第2のブロックチェーントランザクションの検証の一部として、
第1の候補トランザクション識別子を取得するステップと、
前記第1のブロックチェーントランザクションの修正バージョンを生成するステップであって、前記第1のブロックチェーントランザクションのこの修正バージョンが、前記第1のCSの代わりに前記第1のESを備える、ステップと、
第1のトランザクション識別子を生成するステップであって、前記第1のトランザクション識別子が、前記第1のブロックチェーントランザクションの前記修正バージョンに基づいて生成される、ステップと、
前記第1の候補トランザクション識別子と前記第1のトランザクション識別子とを比較するステップであって、前記第1のブロックチェーントランザクションが有効である条件が、前記第1の候補トランザクション識別子が前記第1のトランザクション識別子と一致することである、ステップと
を備える、コンピュータ実装方法。
【請求項38】
前記第1の候補トランザクション識別子が前記第1のトランザクション識別子と一致することを条件として、前記ノードによって動作されるブロックチェーンプロトコルに従って前記第1のブロックチェーントランザクションの検証に進めるステップを備える、請求項37に記載の方法。
【請求項39】
前記第1のブロックチェーントランザクションが前記ブロックチェーンプロトコルに従って有効であることを条件として、前記第1のブロックチェーントランザクションを前記ブロックチェーンネットワークの1つまたは複数の他のノードに送信する、および/または前記第1のブロックチェーントランザクションを前記ノードのメモリに記憶するステップを備える、請求項38に記載の方法。
【請求項40】
前記HLスクリプト言語で記述されたスクリプトを実行するように構成されていない前記ブロックチェーンネットワークの1つまたは複数のノードから、前記第1のブロックチェーントランザクションの要求を受信するステップと、
前記第1のブロックチェーントランザクションの前記修正バージョンをそれらの1つまたは複数のノードに送信するステップと
を備える、請求項39に記載の方法。
【請求項41】
前記第1のブロックチェーントランザクションの前記修正バージョンを生成するステップが、前記第1のCSを前記第1のESに置き換えるステップを備える、請求項37から40のいずれか一項に記載の方法。
【請求項42】
前記第1のブロックチェーントランザクションが第1の当事者によって生成され、前記第1のブロックチェーントランザクションを取得する前記ステップが、前記第1の当事者から前記第1のブロックチェーントランザクションを受信するステップを備える、請求項37から41のいずれか一項に記載の方法。
【請求項43】
前記第1の候補トランザクション識別子を取得する前記ステップが、前記第1の当事者から前記第1の候補トランザクション識別子を受信するステップを備える、請求項42に記載の方法。
【請求項44】
ブロックチェーントランザクションを検証するコンピュータ実装方法であって、前記方法が、ブロックチェーンネットワークのノードによって実行され、前記ノードが、高レベル(HL)スクリプト言語で記述されたスクリプトを実行するように構成され、前記ブロックチェーンが、第1のブロックチェーントランザクションを備え、前記第1のブロックチェーントランザクションが第1の出力を備え、前記方法が、
第2のブロックチェーントランザクションを取得するステップであって、前記第2のブロックチェーントランザクションが、第1のコンパクトロック解除スクリプト(CUS)を備える第1の入力を備え、前記第1のCUSが、少なくとも部分的に前記HLスクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実行されるそれぞれの動作と同等の動作を実行するように構成され、前記第1のCUSが、前記LLスクリプト言語で記述され、複数のLL関数を備える第1の展開ロック解除スクリプト(EUS)と同等の動作を実行するように構成され、前記第1のCUSが、前記第1のEUSよりストレージサイズが小さい、ステップと、
前記第2のブロックチェーントランザクションを検証するステップと
を備え、前記第2のブロックチェーントランザクションを検証する前記ステップが、
前記第1のブロックチェーントランザクションを取得するステップを備え、
a)前記第1のCUSを前記第1のEUSに置き換え、次いで、前記第1の出力とともに前記第1のEUSを実行するステップであって、前記第2のトランザクションが有効である条件が、前記実行が成功することである、ステップ、または、
b)前記第1の出力とともに前記第1のCUSを実行するステップであって、前記第2のトランザクションが有効である条件が、前記実行が成功することである、ステップ
を備える、コンピュータ実装方法。
【請求項45】
前記HLスクリプト言語が、ユーザ向け(UF)スクリプト言語と前記LLスクリプト言語との間の中間レベル(IL)スクリプト言語であり、前記HL関数がIL関数であり、関数テーブルが関数マッピングのリストを備え、各関数マッピングが、1つまたは複数の他のIL関数および/あるいは1つまたは複数のLL関数のセットにマッピングされたそれぞれのIL関数を備え、
a)前記第1のCUSを前記第1のEUSに置き換える前記ステップが、前記関数テーブルにリストされている前記関数マッピングに基づく、または
b)前記第1の出力とともに前記第1のCUSを実行する前記ステップが、前記関数テーブルにリストされている前記関数マッピングに基づく、請求項44に記載の方法。
【請求項46】
1つまたは複数のメモリユニットを備えるメモリと、
1つまたは複数の処理ユニットを備える処理装置と
を備え、前記メモリが、前記処理装置上で実行されるように構成されたコードを記憶し、前記コードが、前記処理装置上にあるときに、請求項1から24のいずれか一項に記載の方法を実行するように構成される、コンピュータ機器。
【請求項47】
コンピュータ可読ストレージ上に具体化され、1つまたは複数のプロセッサ上で実行されると、請求項1から24のいずれか一項に記載の方法を実行するように構成される、コンピュータプログラム。
【請求項48】
1つまたは複数のメモリユニットを備えるメモリと、
1つまたは複数の処理ユニットを備える処理装置と
を備え、前記メモリが、前記処理装置上で実行されるように構成されたコードを記憶し、前記コードが、前記処理装置上にあるときに、請求項25から45のいずれか一項に記載の方法を実行するように構成される、コンピュータ機器。
【請求項49】
コンピュータ可読ストレージ上に具体化され、1つまたは複数のプロセッサ上で実行されると、請求項25から45のいずれか一項に記載の方法を実行するように構成される、コンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、ブロックチェーントランザクションを生成する方法、およびブロックチェーントランザクションを検証する方法に関する。
【背景技術】
【0002】
ブロックチェーンは、分散データ構造の形式を指し、ブロックチェーンの複製コピーが分散ピアツーピア(P2P)ネットワーク(以下では、「ブロックチェーンネットワーク」と呼ばれる)内の複数のノードの各々において維持され、広く宣伝される。ブロックチェーンはデータのブロックのチェーンを備え、各ブロックは1つまたは複数のトランザクションを備える。いわゆる「コインベーストランザクション」以外の各トランザクションは、1つまたは複数のコインベーストランザクションに戻る1つまたは複数のブロックにまたがり得るシーケンス内の先行するトランザクションを指す。コインベーストランザクションについては、以下でさらに説明する。ブロックチェーンネットワークに提出されるトランザクションは、新しいブロックに含まれる。新しいブロックは、多くの場合「マイニング(mining)」と呼ばれるプロセスによって作成され、このプロセスは、複数のノードの各々が「プルーフオブワーク(proof-of-work)」を実行するために競合すること、すなわち、ブロックチェーンの新しいブロックに含まれることを待っている、順序付けされ検証された保留中のトランザクションの定義されたセットの表現に基づいて暗号パズルを解くことを含む。ブロックチェーンはいくつかのノードにおいて取り除かれる可能性があり、ブロックの公開は単なるブロックヘッダの公開を通じて実現できる点に留意されたい。
【0003】
ブロックチェーン内のトランザクションは、デジタル資産(すなわち、多数のデジタルトークン)を伝達するため、仮想化された台帳またはレジストリ内のエントリのセットを順序付けるため、タイムスタンプエントリを受信して処理するため、および/またはインデックスポインタを時間順にするための目的のうちの1つまたは複数のために使用され得る。ブロックチェーンはまた、ブロックチェーンの上に追加の機能を重ねるために利用することができる。たとえば、ブロックチェーンプロトコルは、追加のユーザデータまたはトランザクション内のデータのインデックスを記憶できる場合がある。単一のトランザクション内に記憶できる最大データ容量には事前に指定された制限がなく、したがって、ますます複雑なデータを組み込むことができる。たとえば、これは電子ドキュメントをブロックチェーンに記憶すること、あるいはオーディオデータまたはビデオデータを記憶することを行うために使用され得る。
【0004】
ブロックチェーンネットワークのノード(「マイナ」と呼ばれることが多い)は、分散トランザクションの登録および検証プロセスを実行し、これについては後で詳しく説明する。要約すると、このプロセス中に、ノードはトランザクションを検証し、有効なプルーフオブワーク解を識別しようとするブロックテンプレートにトランザクションを挿入する。有効な解が見つかると、新しいブロックがネットワークの他のノードに伝搬され、したがって、各ノードが新しいブロックをブロックチェーンに記録できるようになる。トランザクションをブロックチェーンに記録するために、ユーザ(ブロックチェーンクライアントアプリケーションなど)が、伝搬させるためにトランザクションをネットワークのノードのうちの1つに送信する。トランザクションを受信するノードは、検証されたトランザクションを新しいブロックに組み込むプルーフオブワーク解を見つけるために競合する可能性がある。各ノードは、トランザクションを有効にするための1つまたは複数の条件を含む同じノードプロトコルを強制するように構成されている。無効なトランザクションは伝搬されず、ブロックに組み込まれない。トランザクションが検証され、それによってブロックチェーン上で受け入れられると仮定すると、トランザクション(ユーザデータを含む)は、不変の公開記録としてブロックチェーンネットワーク内のノードの各々において登録され、インデックス付けされたままになる。
【0005】
最新のブロックを作成するためにプルーフオブワークパズルを解決したノードは通常、ある額のデジタル資産、すなわち多数のトークンを分散する「コインベーストランザクション」と呼ばれる新しいトランザクションで報酬を与えられる。無効なトランザクションの検出と拒否は、ネットワークのエージェントとして機能する競合ノードのアクションによって強制され、不正行為を報告してブロックするよう促される。情報が広範に公開されるため、ユーザはノードのパフォーマンスを継続的に監査できるようになる。単なるブロックヘッダを公開することにより、参加者はブロックチェーンの継続的な整合性を確保できるようになる。
【0006】
「出力ベース」モデル(UTXOベースのモデルとも呼ばれる)では、所与のトランザクションのデータ構造は1つまたは複数の入力と1つまたは複数の出力を備える。使用可能な出力は、トランザクションの進行シーケンスから導き出されるデジタル資産の額を指定する要素を備える。使用可能出力は、UTXO(「未使用トランザクション出力(unspent transaction output)」)と呼ばれることもある。出力は、将来の出力の引換えのための条件を指定するロックスクリプトをさらに備え得る。ロックスクリプトは、デジタルトークンまたは資産を検証および転送するために必要な条件を定義する述語である。トランザクション(コインベーストランザクション以外)の各入力は、先行するトランザクションにおけるそのような出力へのポインタ(すなわち、参照)を備え、さらに、示された出力のロックスクリプトのロックを解除するためのロック解除スクリプトを備え得る。したがって、トランザクションのペアを考えると、それらを第1のトランザクションおよび第2のトランザクション(または「ターゲット」トランザクション)と呼ぶ。第1のトランザクションは、デジタル資産の額を指定する少なくとも1つの出力を備え、出力のロックを解除する1つまたは複数の条件を定義するロックスクリプトを備える。第2のターゲットトランザクションは、第1のトランザクションの出力へのポインタを備える少なくとも1つの入力と、第1のトランザクションの出力のロックを解除するためのロック解除スクリプトとを備える。
【0007】
そのようなモデルでは、第2のターゲットトランザクションが、ブロックチェーンに伝搬および記録されるためにブロックチェーンネットワークに送信されるとき、各ノードに適用される有効性の基準のうちの1つは、ロック解除スクリプトが、第1のトランザクションのロックスクリプトにおいて定義された1つまたは複数の条件をすべて満たすことである。もう1つは、第1のトランザクションの出力が別の以前の有効なトランザクションによってまだ償還されていないことである。これらの条件のいずれかに従ってターゲットトランザクションが無効であると判断したノードは、そのトランザクションを(有効なトランザクションとして、ただし無効なトランザクションを登録するために)伝搬したり、ブロックチェーンに記録するために新しいブロックに含めたりすることはない。
【発明の概要】
【発明が解決しようとする課題】
【0008】
ブロックチェーンは通常、トランザクションの特定の出力をロックするロック条件を設定するためにスクリプト言語を使用する。同様に、対応するロック解除条件は同じスクリプト言語で記述される。スクリプト言語は通常、データ(たとえば、公開鍵およびデジタル署名など)とそのデータ上で動作する関数で構成される。このスクリプト言語は、低レベルスクリプト言語、またはネイティブスクリプト言語と呼ばれることがある。特定の例として、ビットコインブロックチェーンのネイティブスクリプト言語はスクリプト(Script)として知られている。スクリプトにおいて、関数は「オペレーションコード(operation code)」の略で「オペコード(opcode)」として知られている。
【0009】
スクリプトを含むトランザクションは、トランザクション検証のために、生成側(たとえば、ユーザまたはマシン)とネットワークのノードの間で送信される。使用事例に応じて、トランザクションはまた、たとえばユーザからユーザへ、またはマシンからマシンへ、オフチェーンで送信され得る。さらに、トランザクションはノード自体によってブロックチェーンネットワーク全体に伝搬される。さらに、少なくとも一部のノードはトランザクションをブロックチェーンの一部として記憶する必要がある(または、少なくとも記憶することを選択する)。
【0010】
ブロックチェーン技術の使用が増え続けるにつれて、トランザクションの送信と記憶に必要な帯域幅とストレージ要件をそれぞれ削減する必要がある。これは通常、すべてのブロックチェーンに当てはまる。一部のブロックチェーンでは、トランザクションのサイズ、トランザクション内のスクリプトのサイズ、およびブロックのサイズに制限が設けられている。対照的に、少なくとも1つのブロックチェーン(たとえば、ビットコインSV)では、トランザクションのスクリプトサイズに制限がなく、ブロックサイズに制限がない。これにより、かなりのサイズになる可能性のある複雑なロックスクリプト(スマートコントラクトなど)の構築が可能になる。これにより、ブロックチェーンノードは、記憶する必要がある大きなブロックを構築して公開することもできる。したがって、この特定のブロックチェーンの一部としてトランザクションを送信および記憶する場合、帯域幅とストレージを節約する必要性がさらに高まる。
【課題を解決するための手段】
【0011】
本明細書で開示される一態様によれば、ブロックチェーントランザクションを生成するコンピュータ実装方法が提供され、本方法は、第1の当事者によって実行され、第1のブロックチェーントランザクションを生成するステップであって、第1のブロックチェーントランザクションが第1のコンパクトスクリプト(CS)を備え、第1のCSが、少なくとも部分的に高レベル(HL)スクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実行されるそれぞれの動作と同等の動作を実行するように構成され、第1のCSが、LLスクリプト言語で記述され、複数のLL関数を備える第1の展開スクリプト(ES)と同等の動作を実行するように構成され、第1のCSが、第1のESよりストレージサイズが小さい、ステップと、第1のブロックチェーントランザクションをブロックチェーンネットワークの1つまたは複数のノードおよび/または第2の当事者が利用できるようにするステップとを備える。
【0012】
本明細書に開示される別の態様によれば、ブロックチェーントランザクションを検証するコンピュータ実装方法が提供され、本方法は、ブロックチェーンネットワークのノードによって実行され、ノードが、高レベル(HL)スクリプト言語で記述されたスクリプトを実行するように構成され、ブロックチェーンが、第1のブロックチェーントランザクションを備え、第1のブロックチェーントランザクションが、第1のコンパクトロックスクリプト(CLS)を備える第1の出力を備え、第1のCLSが、少なくとも部分的にHLスクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実行されるそれぞれの動作と同等の動作を実行するように構成され、第1のCLSが、LLスクリプト言語で記述され、複数のLL関数を備える第1の展開ロックスクリプト(ELS)と同等の動作を実行するように構成され、第1のCLSが、第1のELSよりストレージサイズが小さく、本方法は、ブロックチェーンノードによって実行され、第2のブロックチェーントランザクションを取得するステップであって、第2のブロックチェーントランザクションが、第1のロック解除スクリプトを備える第1の入力を備える、ステップと、第2のブロックチェーントランザクションを検証するステップとを備え、第2のブロックチェーントランザクションを検証する前記ステップが、第1のブロックチェーントランザクションを取得するステップを備え、a)第1のCLSを第1のELSに置き換え、次いで、第1のロック解除スクリプトを第1のELSとともに実行するステップであって、第2のトランザクションが有効である条件が、前記実行が成功することである、ステップ、または、b)第1のロック解除スクリプトを第1のCLSとともに実行するステップであって、第2のトランザクションが有効である条件が、前記実行が成功することである、ステップを備える。
【0013】
本明細書に開示される別の態様によれば、ブロックチェーントランザクションを検証するコンピュータ実装方法が提供され、本方法は、ブロックチェーンネットワークのノードによって実行され、ノードが高レベル(HL)スクリプト言語で記述されたスクリプトを実行するように構成され、本方法は、ブロックチェーンノードによって実行され、第1のブロックチェーントランザクションを取得するステップであって、第1のブロックチェーントランザクションが前のブロックチェーントランザクションの入力を参照する入力を備え、第1のブロックチェーントランザクションが第1のコンパクトスクリプト(CS)を備え、第1のCSが、HLスクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実行されるそれぞれの動作と同等の動作を実行するように構成され、第1のCSが、LLスクリプト言語で記述され、複数のLL関数を備える第1の展開スクリプト(ES)と同等の動作を実行するように構成され、第1のCSが、第1のESよりストレージサイズが小さい、ステップと、第2のブロックチェーントランザクションの検証の一部として、第1の候補トランザクション識別子を取得するステップと、第1のブロックチェーントランザクションの修正バージョンを生成するステップであって、第1のブロックチェーントランザクションのこの修正バージョンが、第1のCSの代わりに第1のESを備える、ステップと、第1のトランザクション識別子を生成するステップであって、第1のトランザクション識別子は、第1のブロックチェーントランザクションの修正バージョンに基づいて生成される、ステップと、第1の候補トランザクション識別子と第1のトランザクション識別子とを比較するステップであって、第1のブロックチェーントランザクションが有効である条件が、第1の候補トランザクション識別子が第1のトランザクション識別子と一致することである、ステップとを備える。
【0014】
本明細書に開示される別の態様によれば、ブロックチェーントランザクションを検証するコンピュータ実装方法が提供され、本方法は、ブロックチェーンネットワークのノードによって実行され、ノードが、高レベル(HL)スクリプト言語で記述されたスクリプトを実行するように構成され、ブロックチェーンが、第1のブロックチェーントランザクションを備え、第1のブロックチェーントランザクションが第1の出力を備え、本方法が、第2のブロックチェーントランザクションを取得するステップであって、第2のブロックチェーントランザクションが、第1のコンパクトロック解除スクリプト(CUS)を備える第1の入力を備え、第1のCUSが、少なくとも部分的にHLスクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実行されるそれぞれの動作と同等の動作を実行するように構成され、第1のCUSが、LLスクリプト言語で記述され、複数のLL関数を備える第1の展開ロック解除スクリプト(EUS)と同等の動作を実行するように構成され、第1のCUSが、第1のEUSよりストレージサイズが小さい、ステップと、第2のブロックチェーントランザクションを検証するステップとを備え、第2のブロックチェーントランザクションを検証する前記ステップが、第1のブロックチェーントランザクションを取得するステップを備え、a)第1のCUSを第1のEUSに置き換え、次いで、第1の出力とともに第1のEUSを実行するステップであって、第2のトランザクションが有効である条件が、前記実行が成功することである、ステップ、または、b)第1の出力とともに第1のCUSを実行するステップであって、第2のトランザクションが有効である条件が、前記実行が成功することである、ステップを備える。
【0015】
これまで、ロックスクリプトとロック解除スクリプトは、低レベル、すなわちネイティブのスクリプト言語で記述されていた。これらのスクリプトを含むトランザクションはブロックチェーンネットワークに送信され、有効であれば、ブロックチェーンに記憶される。現在は、低レベルスクリプト言語でスクリプト(ロックまたはロック解除)を記述する代わりに、高レベルスクリプト言語でスクリプトを記述できるようになった。低レベル言語と同様に、高レベル言語はデータと関数を備える。しかしながら、これらの「高レベル関数(high-level functions)」の少なくとも一部は、一緒に実行されると、複数の「低レベル関数(low-level functions)」によって実行される動作と同じ動作を実行するように構成される。言い換えれば、1つの高レベル関数は、通常は複数の低レベル関数を必要とする同じ動作を実行し得る。その結果、高レベル言語で記述されたスクリプトは、低レベル言語で記述された同等のロックスクリプトと比べてよりコンパクトになる(すなわち、サイズが小さくなる)。
【0016】
高レベル言語で記述されたスクリプトは、ネイティブの低レベル言語で記述されたスクリプトと比較してコンパクトな性質があるため、「コンパクトスクリプト(compact script)」と呼ばれ、ネイティブの低レベル言語は現在「展開スクリプト(expanded script)」と呼ばれる。たとえば、高レベル言語で記述されたロックスクリプトおよびロック解除スクリプトは、それぞれ「コンパクトロックスクリプト(compact locking scripts)」および「コンパクトロック解除スクリプト(compact unlocking scripts)」と呼ばれる。
【0017】
通常は大規模な展開スクリプト(多くの低レベル関数という意味で大規模)が必要となる複雑なロックまたはロック解除条件は、現在は高レベル言語を使用してより小さいコンパクトスクリプトとして記述され得るようになった。したがって、コンパクトスクリプトを含むトランザクションの帯域幅とストレージの要件は、展開スクリプトを含むトランザクションの帯域幅とストレージの要件よりも低い。
【0018】
Bitcoin SVブロックチェーンを特定の例として取り上げる。ブロックサイズに制限がないため、1つのブロックに数十億のトランザクションを含むことができる。トランザクションサイズに制限がないため、各トランザクションは何百万もの低レベル関数(すなわち、オペコード)を含むことができる。各オペコードのサイズが数バイトの場合、それらのトランザクションの各々は数メガバイト程度になる。その結果、トランザクションをブロックチェーンネットワークに送信するときと、ネットワーク上でトランザクションとブロックを伝搬するときの両方において帯域幅の問題が発生する。ノードは、ブロックチェーンを記憶する際にもストレージの負担に直面する。単一の高レベル関数は、何百万もの低レベル関数と同じ動作を実行するように構成され得る。したがって、各トランザクションが高レベル言語を使用して記述された場合、トランザクションのサイズは数百バイト程度になり、したがって帯域幅とストレージが大幅に節約される。これは、ブロックチェーン技術が拡大し続ける場合にも重要である。
【0019】
ネイティブブロックチェーンスクリプトはアセンブリ言語と考えることができる。たとえば、スクリプト言語はおよそ100個のオペコードを備える。アセンブリ言語でプログラムを記述することは開発者にとって骨の折れる作業であり、結果として得られるコードは多くの場合長くて理解しにくいものになる。高レベル言語は、そのコンパクトさと読みやすさのため、他の技術分野の開発者によってよく使用される。次いで、結果として得られるコードは、コンピュータが読み取るアセンブリ言語に変換される。本出願は、高レベルのスクリプト言語を利用することによって、同じ手法をブロックチェーンスクリプトに使用できることを認識している。この高レベル言語は、ネイティブスクリプト言語の低レベル関数の一部またはすべてと、新しい高レベル関数を含んでもよく、あるいはそのような関数から完全に独立して高レベル関数のみを含んでもよい。
【0020】
以下で説明するように、現在は、大規模なスクリプトを使用するトランザクションを、よりコンパクト形式で伝搬および記憶できるようになった。さらに、ブロックチェーンスクリプトを実行する際、ノードは、対応する低レベル関数、たとえばオペコードのリストと同じ結果を達成する、実行する最も効率的な実装形態を選択することができる。最も重要なことは、これはネイティブのブロックチェーンプロトコルを変更することなく達成されることである。
【0021】
いくつかの例では、単一の高レベル関数と単一のLL関数の間に1対1のマッピングが存在する場合がある。この場合、HL関数のサイズは対応するLL関数よりも小さく、したがって帯域幅とストレージの節約が可能になる。
【0022】
いくつかの実施形態では、HL言語は、さらに高いレベルの言語(すなわち、第2層高レベル言語)とLL言語との間の中間レベル言語であってもよい。このさらに高いレベルの言語は、ユーザ向け言語、すなわちユーザがスクリプトを記述する言語である。ユーザ(あるいは、他のタイプの当事者またはエンティティ)は、ユーザ向け言語でスクリプトを生成し得、次いで、そのスクリプトは中間言語に変換(たとえば、コンパイル)される。中間言語は、LL言語と比較すると依然として高レベル言語である。ユーザ向け言語は、人間が読取り可能な言語であってもよく、これによりユーザフレンドリとなり、ユーザがLL言語の複雑なスクリプトと同等のスクリプトをより簡単に記述できるようになる。Javaソースコード(ユーザ向け)、Javaバイトコード(中間)、および機械可読コード(低レベル)を使用して、ユーザ向け言語、中間レベル言語、および低レベル言語を類似させることができる。JavaソースコードはJavaバイトコードにコンパイルされ、次いで、機械可読コードに展開される。同様に、ユーザ向け言語が中間レベル言語にコンパイルされてよく、次いで、それは低レベル言語に展開され得る。
【0023】
実装形態によっては、最高レベル言語(または、ユーザ向け言語である最高レベル言語で記述されたスクリプト)が、中間レベル言語で記述されたスクリプトよりもコンパクトになる場合がある。中間レベル言語を導入する利点は、低レベル言語に展開する際の計算量の節約である。すなわち、ブロックチェーンノードは、最高レベルを低レベルに直接展開する代わりに、中間レベル言語から低レベル言語に展開するだけで済む。この計算量の節約により、ブロックチェーンノードの負担がさらに軽減される。
【0024】
実施形態は主に、高レベル言語から低レベル言語に変換されるロックスクリプトに関して説明されるが、一般に、同じ教示がロック解除スクリプトに適用される。
【0025】
本開示の実施形態の理解を助け、そのような実施形態がどのように実施されるかを示すために、単なる例として添付の図面が参照される。
【図面の簡単な説明】
【0026】
図1】ブロックチェーンを実装するためのシステムの概略ブロック図である。
図2】ブロックチェーンに記録され得るトランザクションのいくつかの例を概略的に示す図である。
図3A】クライアントアプリケーションの概略ブロック図である。
図3B図3Aのクライアントアプリケーションによって提示され得る例示的なユーザインターフェースの概略的なモックアップを示す図である。
図4】トランザクションを処理するためのいくつかのノードソフトウェアの概略ブロック図である。
図5】ブロックチェーントランザクションを送信するための例示的なシステムの概略ブロック図である。
図6】本発明の例示的な実施形態を示すフローチャートである。
図7】本発明の別の例示的な実施形態を示すフローチャートである。
図8】本発明のいくつかの実施形態による、トランザクションの生成および検証を概略的に示す図である。
図9】スクリプト言語の例示的な階層を概略的に示す図である。
【発明を実施するための形態】
【0027】
例示的なシステムの概要
図1は、ブロックチェーン150を実装するための例示的なシステム100を示している。システム100は、パケット交換ネットワーク101、通常はインターネットなどの広域インターネットワークを備え得る。パケット交換ネットワーク101は、パケット交換ネットワーク101内にピアツーピア(P2P)ネットワーク106を形成するように配置され得る複数のブロックチェーンノード104を備える。図示されていないが、ブロックチェーンノード104は、ほぼ完全なグラフとして配置され得る。したがって、各ブロックチェーンノード104は、他のブロックチェーンノード104と高度に接続されている。
【0028】
各ブロックチェーンノード104は、ピアのコンピュータ機器を備え、ノード104のうちの異なるノードは異なるピアに属する。各ブロックチェーンノード104は、1つまたは複数のプロセッサ、たとえば、1つまたは複数の中央処理装置(CPU)、アクセラレータプロセッサ、特定用途向けプロセッサおよび/またはフィールドプログラマブルゲートアレイ(FPGA)と、特定用途向け集積回路(ASIC)などのその他の機器とを備える処理装置を備える。各ノードはまた、メモリ、すなわち非一時的コンピュータ可読媒体の形態のコンピュータ可読ストレージを備える。メモリは、1つまたは複数のメモリ媒体、たとえば、ハードディスクなどの磁気媒体、ソリッドステートドライブ(SSD)、フラッシュメモリ、もしくはEEPROMなどの電子媒体、および/または光ディスクドライブなどの光媒体を使用する1つまたは複数のメモリユニットを備え得る。
【0029】
ブロックチェーン150は、データブロック151のチェーンを備え、ブロックチェーン150のそれぞれのコピーが、分散またはブロックチェーンネットワーク106内の複数のブロックチェーンノード104の各々に維持される。上述したように、ブロックチェーン150のコピーを維持することは、必ずしもブロックチェーン150を完全に記憶することを意味するわけではない。代わりに、各ブロックチェーンノード150が各ブロック151のブロックヘッダ(後述)を記憶する限り、ブロックチェーン150からデータを取り除くことができる。チェーン内の各ブロック151は、1つまたは複数のトランザクション152を備え、この文脈におけるトランザクションは、ある種のデータ構造を指す。データ構造の性質は、トランザクションモデルまたは方式の一部として使用されるトランザクションプロトコルのタイプによって異なる。所与のブロックチェーンは、全体を通じて1つの特定のトランザクションプロトコルを使用する。1つの一般的なタイプのトランザクションプロトコルでは、各トランザクション152のデータ構造は、少なくとも1つの入力と少なくとも1つの出力を備える。各出力は、資産としてデジタル資産の数量を表す金額を指定し、その例としては、出力が暗号的にロックされているユーザ103がある(ロックを解除し、それによって償還または使用するためには、そのユーザの署名または他の解が必要である)。各入力は、先行するトランザクション152の出力を指し、それによってトランザクションがリンクされる。
【0030】
各ブロック151は、ブロック151への連続的な順序を定義するために、チェーン内で以前に作成されたブロック151を指すブロックポインタ155も備える。各トランザクション152(コインベーストランザクション以外)は、トランザクションのシーケンスへの順序を定義するために、前のトランザクションへ戻るポインタを備える(注意:トランザクション152のシーケンスは分岐することができる)。ブロック151のチェーンは、チェーン内の第1のブロックであったジェネシスブロック(Gb)153まで遡る。チェーン150内の初期の1つまたは複数の元のトランザクション152は、先行するトランザクションではなくジェネシスブロック153を指していた。
【0031】
ブロックチェーンノード104の各々は、トランザクション152を他のブロックチェーンノード104に転送し、それによってトランザクション152がネットワーク106全体に伝搬されるように構成されている。各ブロックチェーンノード104は、ブロック151を作成し、同じブロックチェーン150のそれぞれのコピーをそれぞれのメモリに記憶するように構成されている。各ブロックチェーンノード104もまた、ブロック151に組み込まれるのを待っているトランザクション152の順序付きセット(または「プール」)154を維持する。順序付きプール154は、「メモリプール(mempool)」と呼ばれることが多い。本明細書におけるこの用語は、任意の特定のブロックチェーン、プロトコル、またはモデルに限定することを意図したものではない。それは、ノード104が有効なものとして受け入れ、ノード104が同じ出力を使用しようとする任意の他のトランザクションを受け入れない義務があるトランザクションの順序付きセットを指す。
【0032】
所与の現在のトランザクション152jにおいて、入力(または、各入力)は、トランザクションのシーケンスにおける先行するトランザクション152iの出力を参照するポインタを備え、この出力が、現在のトランザクション152jにおいて償還または「使用(spent)」されるべきであることを指定する。一般に、先行するトランザクションは、順序付きセット154内の任意のトランザクションまたは任意のブロック151である可能性がある。先行するトランザクション152iは、現在のトランザクションが有効となるために、存在し、検証される必要があるが、先行するトランザクション152iが現在のトランザクション152jが作成される時点、またはネットワーク106に送信される時点でさえも、必ずしも存在する必要はない。したがって、本明細書における「先行する(preceding)」は、ポインタによってリンクされた論理シーケンスにおける先行するもの(predecessor)を指し、必ずしも時系列における作成または送信の時間を指すものではなく、したがって、トランザクション152i、152jが順不同に作成または送信されることを必ずしも排除するものではない(オーファントランザクションに関する以下の説明を参照)。先行するトランザクション152iは、先のトランザクション(antecedent transaction)または先行したトランザクション(predecessor transaction)と同様に呼ぶことができる。
【0033】
現在のトランザクション152jの入力はまた、入力権限、たとえば、先行するトランザクション152iの出力がロックされているユーザ103aの署名を備える。次に、現在のトランザクション152jの出力は、新しいユーザまたはエンティティ103bに暗号的にロックされ得る。したがって、現在のトランザクション152jは、先行するトランザクション152iの入力において定義された額を、現在のトランザクション152jの出力において定義されたように、新しいユーザまたはエンティティ103bに転送することができる。場合によっては、トランザクション152は、複数のユーザまたはエンティティ(残り(change)を与えるために、そのうちの1人が元のユーザまたはエンティティ103aであり得る)間で入力額を分割するための複数の出力を有し得る。場合によっては、トランザクションはまた、1つまたは複数の先行するトランザクションの複数の出力からの額をまとめ、現在のトランザクションの1つまたは複数の出力に再分配するために複数の入力を有することができる。
【0034】
ビットコインのような出力ベースのトランザクションプロトコルによれば、個人ユーザまたは組織などの当事者103が、(手動で、または当事者が採用する自動プロセスによって)新しいトランザクション152jを制定したい場合、制定当事者は、そのコンピュータ端末102から受信者に新しいトランザクションを送信する。制定当事者または受信者は、最終的にこのトランザクションをネットワーク106の1つまたは複数のブロックチェーンノード104(今日では、典型的にはサーバまたはデータセンタであるが、原則として他のユーザ端末でもよい)に送信することになる。また、新しいトランザクション152jを制定する当事者103が、トランザクションをブロックチェーンノード104のうちの1つまたは複数に直接送信し、場合によっては受信者に送信しない可能性も排除されない。トランザクションを受信するブロックチェーンノード104は、ブロックチェーンノード104の各々において適用されるブロックチェーンノードプロトコルに従って、トランザクションが有効であるかどうかをチェックする。ブロックチェーンノードプロトコルは、通常、新しいトランザクション152j内の暗号署名が、順序付けられたトランザクション152のシーケンス内で前のトランザクション152iに依存する、予想される署名と一致することをチェックすることをブロックチェーンノード104に要求する。そのような出力ベースのトランザクションプロトコルでは、これは、新しいトランザクション152jの入力に含まれる当事者103の暗号署名または他の許可が、新しいトランザクションが割り当てる先行するトランザクション152iの出力において定義された条件と一致することをチェックすることを備えてよく、この条件は通常、新しいトランザクション152jの入力における暗号署名または他の認可が、新しいトランザクションの入力がリンクされている前のトランザクション152iの出力のロックを解除することをチェックすることを少なくとも備える。条件は、先行するトランザクション152iの出力に含まれるスクリプトによって少なくとも部分的に定義され得る。あるいは、ブロックチェーンノードプロトコルだけによって単純に固定されてもよく、これらの組合せによるものであってもよい。いずれにしても、新しいトランザクション152jが有効である場合、ブロックチェーンノード104は、それをブロックチェーンネットワーク106内の1つまたは複数の他のブロックチェーンノード104に転送する。これらの他のブロックチェーンノード104は、同じブロックチェーンノードプロトコルに従って同じテストを適用し、したがって、新しいトランザクション152jを1つまたは複数のさらなるノード104に転送し、以下同様である。このようにして、新しいトランザクションはブロックチェーンノード104のネットワーク全体に伝搬される。
【0035】
出力ベースのモデルでは、所与の出力(たとえば、UTXO)が割り当てられているか(たとえば、使用されているか)の定義は、ブロックチェーンノードプロトコルに従って、その出力が別の後続のトランザクション152jの入力によってまだ有効に償還されているかどうかである。トランザクションが有効であるための別の条件は、償還しようと試みる先行するトランザクション152iの出力が別のトランザクションによってまだ償還されていないことである。同様に、有効でない場合、トランザクション152jは(無効としてフラグが立てられ、警告のために伝搬されない限り)ブロックチェーン150に伝搬も記録もされない。これは、取引者が同じトランザクションの出力を複数回割り当てようとする二重支出を防止する。一方、アカウントベースのモデルは、アカウント残高を維持することによって二重支出を防止する。ここでも、トランザクション順序が定義されているため、アカウント残高は常に単一の定義された状態にある。
【0036】
トランザクションの検証に加えて、ブロックチェーンノード104はまた、「プルーフオブワーク」によってサポートされる、一般にマイニングと呼ばれるプロセスにおいてトランザクションのブロックを最初に作成しようと競合する。ブロックチェーンノード104において、新しいトランザクションが、ブロックチェーン150上に記録されたブロック151にまだ現れていない有効なトランザクションの順序付きプール154に追加される。次いで、ブロックチェーンノードは、暗号パズルを解くことを試みることによって、順序付けられたトランザクションのセット154からトランザクション152の新しい有効なブロック151を組み立てようと競合する。通常、これは、ノンスが保留中のトランザクション154の順序付きプールの表現と連結されハッシュされたときに、ハッシュの出力があらかじめ定められた条件を満たすような「ノンス」値を検索することを備える。たとえば、あらかじめ定められた条件は、ハッシュの出力があらかじめ定義された数の先行ゼロを有することであってもよい。これは、プルーフオブワークパズルの特定のタイプの1つにすぎず、他のタイプが除外されるわけではない点に留意されたい。ハッシュ関数の特性は、その入力に対して予測不可能な出力を有することである。したがって、この検索は総当りしか実行することができず、したがって、パズルを解こうとしている各ブロックチェーンノード104においてかなりの量の処理リソースを消費する。
【0037】
最初にパズルを解いたブロックチェーンノード104は、これをネットワーク106に公表し、その解を、ネットワーク内の他のブロックチェーンノード104によって容易にチェックできるプルーフとして提供する。(ハッシュに対する解が与えられると、それによってハッシュの出力が条件を満たすかどうかをチェックするのは簡単である)。第1のブロックチェーンノード104は、ブロックを受け入れてプロトコルルールを強制する他のノードのしきい値コンセンサスまでブロックを伝搬する。次いで、トランザクションの順序付きセット154は、ブロックチェーンノード104の各々によって、ブロックチェーン150内に新しいブロック151として記録されるようになる。ブロックポインタ155も、チェーン内で以前に作成されたブロック151n-1を指す新しいブロック151nに割り当てられる。プルーフオブワーク解を作成するために必要な、たとえばハッシュの形態のかなりの量の労力は、ブロックチェーンプロトコルの規則に従うという第1のノード104の意図を信号で伝える。そのようなルールは、以前に検証されたトランザクションと同じ出力が割り当てられている場合、トランザクションを有効なものとして受け入れないことを含み、これは二重支出とも呼ばれる。ブロック151は、一度作成されると、ブロックチェーンネットワーク106内のブロックチェーンノード104の各々において認識され維持されるため、修正することができない。また、ブロックポインタ155は、ブロック151に連続的な順序を課す。トランザクション152は、ネットワーク106内の各ブロックチェーンノード104の順序付けされたブロックに記録されるため、これは、トランザクションの不変の公開台帳を提供する。
【0038】
パズルを解決するために常に競合している異なるブロックチェーンノード104は、それらがいつ解の検索を開始したか、またはトランザクションが受信された順序に応じて、常に未公開トランザクションのプール154の異なるスナップショットに基づいて実施している可能性がある点に留意されたい。誰がそれぞれのパズルを最初に解いても、どのトランザクション152が次の新しいブロック151nにどのような順序で含まれるかを最初に定義し、未公開トランザクションの現在のプール154が更新される。次いで、ブロックチェーンノード104は、新たに定義された未公開トランザクション154の順序付きプールからブロックを作成するために競合を続け、以下同様である。発生する可能性のある任意の「フォーク(fork)」を解決するためのプロトコルも存在し、フォークとは、2つのブロックチェーンノード104が互いに非常に短い時間内にパズルを解決し、ブロックチェーンの矛盾するビューがノード104間で伝搬されるようにするものである。つまり、最も長く成長するフォークの分岐が、最終的なブロックチェーン150になる。同じトランザクションが両方のフォークに現れるため、これはネットワークのユーザまたはエージェントに影響を与えないはずである点に留意されたい。
【0039】
ビットコインブロックチェーン(および、他のほとんどのブロックチェーン)によると、(あるエージェントまたはユーザから別のエージェントまたはユーザにある額のデジタル資産を転送するエージェント間またはユーザ間のトランザクションとは対照的に)新しいブロック104の構築に成功したノードには、追加の規定額のデジタル資産を分散する新しい特別な種類のトランザクションにおいて、追加の受入れ額のデジタル資産を新たに割り当てる能力が与えられる。この特別なタイプのトランザクションは通常「コインベーストランザクション」と呼ばれるが、「開始トランザクション」または「生成トランザクション」と呼ばれることもある。これは通常、新しいブロック151nの第1のトランザクションを形成する。プルーフオブワークは、新しいブロックを構築するノードがプロトコルルールに従う意図を通知し、この特別なトランザクションを後で償還できるようにする。ブロックチェーンプロトコルのルールは、この特別なトランザクションが償還され得る前に、たとえば100ブロックなどの満期期間が必要とする場合がある。多くの場合、通常の(非生成)トランザクション152は、そのトランザクションが公開されたブロック151nを作成したブロックチェーンノード104にさらに報酬を与えるために、その出力の1つにおいて追加のトランザクション手数料も指定する。この手数料は通常「トランザクション手数料(transaction fee)」と呼ばれ、後で説明する。
【0040】
トランザクションの検証および公開に関係するリソースに起因して、通常、ブロックチェーンノード104の少なくとも各々は、1つまたは複数の物理サーバユニットを備えるサーバの形態をとるか、またはデータセンタ全体の形態をとる。しかしながら、原則として、任意の所与のブロックチェーンノード104は、一緒にネットワーク化されたユーザ端末またはユーザ端末のグループの形態をとることができる。
【0041】
各ブロックチェーンノード104のメモリは、ブロックチェーンノードプロトコルに従ってそれぞれの役割を実行し、トランザクション152を処理するために、ブロックチェーンノード104の処理装置上で実行するように構成されたソフトウェアを記憶する。本明細書においてブロックチェーンノード104に起因する任意のアクションは、それぞれのコンピュータ機器の処理装置上で実行されるソフトウェアによって実施され得ることが理解されるであろう。ノードソフトウェアは、アプリケーション層、オペレーティングシステム層またはプロトコル層などの下位層、あるいはこれらの任意の組合せにおいて、1つまたは複数のアプリケーションに実装され得る。
【0042】
ネットワーク101には、消費ユーザの役割を担う複数の当事者103の各々のコンピュータ機器102も接続されている。これらのユーザは、ブロックチェーンネットワーク106と対話し得るが、トランザクションの検証またはブロックの構築には参加しない。これらのユーザまたはエージェント103の一部は、トランザクションにおいて送信者および受信者として機能する場合がある。他のユーザは、必ずしも送信者または受信者として行動することなく、ブロックチェーン150と対話し得る。たとえば、一部の当事者は、ブロックチェーン150のコピーを記憶するストレージエンティティとして機能してもよい(たとえば、ブロックチェーンノード104からブロックチェーンのコピーを取得した)。
【0043】
当事者103の一部またはすべては、異なるネットワーク、たとえばブロックチェーンネットワーク106の上にオーバーレイされるネットワークの一部として接続されてもよい。ブロックチェーンネットワークのユーザ(しばしば「クライアント(clients)」と呼ばれる)は、ブロックチェーンネットワーク106を含むシステムの一部であると言われる場合があるが、これらのユーザは、ブロックチェーンノードに必要な役割を実行しないため、ブロックチェーンノード104ではない。代わりに、各当事者103は、ブロックチェーンネットワーク106と対話し、それによって、ブロックチェーンノード106に接続する(すなわち、通信する)ことによってブロックチェーン150を利用し得る。2人の当事者103およびそのそれぞれの機器102、すなわち第1の当事者103aおよびそのそれぞれのコンピュータ機器102a、ならびに第2の当事者103bおよびそのそれぞれのコンピュータ機器102bが、例示の目的で示されている。はるかに多くのそのような当事者103およびそれぞれのコンピュータ機器102が存在し、システム100に参加し得るが、便宜上、それらは図示されていないことが理解されるであろう。各当事者103は、個人であってもよく、組織であってもよい。純粋に例示として、本明細書では第1の当事者103aをアリスと呼び、第2の当事者103bをボブと呼ぶが、これに限定されるものではなく、本明細書におけるアリスまたはボブへのいかなる言及も、それぞれ「第1の当事者(first party)」および「第2の当事者(second party)」と置き換えられ得ることが理解されるであろう。
【0044】
各当事者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つまたは複数の他のネットワーク化されたリソースを備え得る。
【0045】
クライアントアプリケーション105は、最初に、適切なコンピュータ可読記憶媒体上で任意の当事者103のコンピュータ機器102に提供されてよく、たとえば、サーバからダウンロードされるか、リムーバブルSSD、フラッシュメモリキー、リムーバブルEEPROM、リムーバブル磁気ディスドライブ、磁気フロッピーディスクまたはテープ、CDまたはDVD ROMなどの光ディスク、あるいはリムーバブル光ドライブなどのリムーバブルストレージデバイスにおいて提供される。
【0046】
クライアントアプリケーション105は、少なくとも「ウォレット(wallet)」機能を備える。これは2つの主な機能を有する。これらのうちの1つは、それぞれの当事者103が、トランザクション152を作成し、認可し(たとえば、署名し)、1つまたは複数のビットコインノード104に送信し、次いで、ブロックチェーンノード104のネットワーク全体に伝搬され、それによってブロックチェーン150に含まれるようにすることを可能にすることである。もう1つは、それぞれの当事者に、その当事者が現在所有しているデジタル資産の額を報告することである。出力ベースのシステムにおいて、この第2の機能は、当該当事者に属するブロックチェーン150全体に散在する様々なトランザクション152の出力において定義された額を照合することを備える。
【0047】
注:様々なクライアント機能は、所与のクライアントアプリケーション105に統合されるものとして説明され得るが、これは必ずしも限定されるものではなく、代わりに、本明細書で説明される任意のクライアント機能は、代わりに、2つ以上の別個のアプリケーションのスイートにおいて実装されてもよく、たとえば、APIを介してインターフェイスするか、または一方が他方へのプラグインになる。より一般的には、クライアント機能は、アプリケーション層、もしくはオペレーティングシステムなどの下位層、またはこれらの任意の組合せにおいて実装することができる。以下はクライアントアプリケーション105に関して説明されるが、これに限定されないことが理解されるであろう。
【0048】
各コンピュータ機器102上のクライアントアプリケーションまたはソフトウェア105のインスタンスは、ネットワーク106のブロックチェーンノード104のうちの少なくとも1つに動作可能に結合される。これにより、クライアント105のウォレット機能がトランザクション152をネットワーク106に送信できるようになる。クライアント105はまた、それぞれの当事者103が受信者であるトランザクションについてブロックチェーン150にクエリを行うために、ブロックチェーンノード104に連絡することができる(または、実施形態では、ブロックチェーン150は、部分的にその公開可視性を通じてトランザクションにおける信頼性を提供する公共施設であるため、実際にブロックチェーン150内の他の当事者のトランザクションを検査する)。各コンピュータ機器102上のウォレット機能は、トランザクションプロトコルに従ってトランザクション152を定式化し、送信するように構成されている。上で述べたように、各ブロックチェーンノード104は、ブロックチェーンノードプロトコルに従ってトランザクション152を検証するように構成されたソフトウェアを実行し、トランザクション152をブロックチェーンネットワーク106全体に伝搬させるためにそれを転送するように構成される。トランザクションプロトコルとノードプロトコルは互いに対応しており、所与のトランザクションプロトコルは所与のノードプロトコルとともに進行し、一緒に所与のトランザクションモデルを実装する。ブロックチェーン150内のすべてのトランザクション152に対して同じトランザクションプロトコルが使用される。同じノードプロトコルが、ネットワーク106内のすべてのノード104によって使用される。
【0049】
所与の当事者103、たとえばアリスが、ブロックチェーン150に含まれるべき新しいトランザクション152jを送信したい場合、アリスは、関連するトランザクションプロトコルに従って(アリスのクライアントアプリケーション105のウォレット機能を使用して)新しいトランザクションを定式化する。次いで、アリスは、クライアントアプリケーション105から、アリスが接続されている1つまたは複数のブロックチェーンノード104にトランザクション152を送信する。たとえば、これは、アリスのコンピュータ102に最良に接続されているブロックチェーンノード104であり得る。任意の所与のブロックチェーンノード104が新しいトランザクション152jを受信すると、ブロックチェーンノードプロトコルおよびそのそれぞれの役割に従ってそれを処理する。これは、新しく受信されたトランザクション152jが「有効(valid)」であるための特定の条件を満たすかどうかを最初にチェックすることを含み、その例についてはすぐに詳しく説明する。一部のトランザクションプロトコルでは、検証のための条件は、トランザクション152に含まれるスクリプトによって、トランザクションごとに設定可能であり得る。あるいは、条件は単にノードプロトコルの組込み機能であってもよく、またはスクリプトとノードプロトコルの組合せによって定義されてもよい。
【0050】
新たに受信されたトランザクション152jが有効であるとみなされるためのテストに合格することを条件として(すなわち、「検証される(validated)」ことを条件として)、トランザクション152jを受信する任意のブロックチェーンノード104は、そのブロックチェーンノード104において維持されるトランザクション154の順序付けられたセットに新しい検証されたトランザクション152を追加する。さらに、トランザクション152jを受信する任意のブロックチェーンノード104は、検証されたトランザクション152をネットワーク106内の1つまたは複数の他のブロックチェーンノード104に伝搬する。各ブロックチェーンノード104は同じプロトコルを適用するので、トランザクション152jが有効であると仮定すると、これは、それがすぐにネットワーク106全体に伝搬されることを意味する。
【0051】
所与のブロックチェーンノード104において維持される保留中のトランザクション154の順序付きプールへの参加が認められると、そのブロックチェーンノード104は、新しいトランザクション152を含むそれぞれのプール154の最新バージョンにおいてプルーフオブワークパズルを解こうと競合し始める。(他のブロックチェーンノード104は、異なるトランザクションプール154に基づいてパズルを解こうとしている可能性があるが、誰が最初に到達しても、最新のブロック151に含まれるトランザクションのセットを定義することになる可能性があることを思い出されたい。最終的には、ブロックチェーンノード104が、アリスのトランザクション152jを含む順序付けされたプール154の一部についてパズルを解くことになる)。新しいトランザクション152jを含むプール154に対してプルーフオブワークが行われると、それは不変的にブロックチェーン150内のブロック151の1つの一部となる。各トランザクション152は前のトランザクションへ戻るポインタを備えるため、トランザクションの順序も不変的に記録される。
【0052】
異なるブロックチェーンノード104は、所与のトランザクションの異なるインスタンスを最初に受信し得、したがって、1つのインスタンスが新しいブロック151において公開される前に、どのインスタンスが「有効」であるかについて矛盾する見解を有し、その時点で、すべてのブロックチェーンノード104は、公開されたインスタンスが唯一の有効なインスタンスであることに同意する。ブロックチェーンノード104が1つのインスタンスを有効なものとして受け入れ、次いで、第2のインスタンスがブロックチェーン150に記録されていることを発見した場合、そのブロックチェーンノード104はこれを受け入れなければならず、最初に受け入れたインスタンス(すなわち、ブロック151において公開されていないもの)を破棄する(すなわち、無効なものとして扱う)ことになる。
【0053】
いくつかのブロックチェーンネットワークによって動作されるトランザクションプロトコルの代替タイプは、アカウントベースのトランザクションモデルの一部として、「アカウントベース(account-based)」プロトコルと呼ばれる場合がある。アカウントベースの場合、各トランザクションは、過去のトランザクションのシーケンスにおける先行するトランザクションのUTXOを参照することによってではなく、絶対的なアカウント残高を参照することによって転送されるべき額を定義する。すべてのアカウントの現在の状態は、ブロックチェーンとは別の、ネットワークのノードによって記憶され、絶えず更新される。そのようなシステムでは、トランザクションはアカウントの実行中のトランザクション集計(「ポジション」とも呼ばれる)を使用して順序付けられる。この値は、送信者によってその暗号化署名の一部として署名され、トランザクション参照計算の一部としてハッシュされる。さらに、トランザクションにおける任意のデータフィールドも署名され得る。たとえば、このデータフィールドは、前のトランザクションIDがデータフィールドに含まれている場合、前のトランザクションを指し得る。
【0054】
UTXOベースのモデル
図2は、例示的なトランザクションプロトコルを示している。これは、UTXOベースのプロトコルの一例である。トランザクション152(「Tx」と略記される)は、ブロックチェーン150の基本的なデータ構造である(各ブロック151は1つまたは複数のトランザクション152を含む)。以下では、出力ベースまたは「UTXO」ベースのプロトコルを参照して説明される。しかしながら、これはすべての可能な実施形態に限定されない。UTXOベースの例示的なプロトコルはビットコインを参照して説明されているが、他の例示的なブロックチェーンネットワークにおいても同様に実装できる点に留意されたい。
【0055】
UTXOベースのモデルでは、各トランザクション(「Tx」)152は、1つまたは複数の入力202および1つまたは複数の出力203を備えるデータ構造を備える。各出力203は、未使用のトランザクション出力(UTXO)を備え得、これは、(UTXOがまだ償還されていない場合)別の新しいトランザクションの入力202のソースとして使用され得る。UTXOは、デジタル資産の額を指定する値を含む。これは、分散台帳上のトークンの設定数を表す。UTXOはまた、他の情報の中でも特に、元となるトランザクションのトランザクションIDを含み得る。トランザクションデータ構造は、入力フィールド202および出力フィールド203のサイズを示すインジケータを備え得るヘッダ201も備え得る。ヘッダ201はまた、トランザクションのIDを含み得る。実施形態では、トランザクションIDは、(トランザクションID自体を除く)トランザクションデータのハッシュであり、ノード104に提出される生のトランザクション152のヘッダ201に記憶される。
【0056】
アリス103aが、当該デジタル資産の額をボブ103bに転送するトランザクション152jを作成したいと仮定する。図2では、アリスの新しいトランザクション152jには「Tx1」とラベル付けされている。これは、シーケンス内の先行するトランザクション152iの出力203においてアリスにロックされたデジタル資産の額を取り、これのうちの少なくとも一部をボブに転送する。先行するトランザクション152iは、図2では「Tx0」とラベル付けされている。Tx0とTx1は単なる任意のラベルである。それらは、Tx0がブロックチェーン151内の最初のトランザクションであることも、Tx1がプール154内のすぐ次のトランザクションであることも必ずしも意味するものではない。Tx1は、アリスにロックされた未使用の出力203を依然として有する先行する(すなわち、先の)トランザクションを指すことができる。
【0057】
先行するトランザクションTx0は、アリスが新しいトランザクションTx1を作成した時点では、または少なくともアリスがそれをネットワーク106に送信する時点までには、すでに検証されており、ブロックチェーン150のブロック151に含まれている可能性がある。それは、その時点ですでにブロック151のうちの1つに含まれている可能性もあり、順序付きセット154内でまだ待機している可能性もあり、その場合、すぐに新しいブロック151に含まれることになる。あるいは、Tx0とTx1を作成して一緒にネットワーク106に送信することもでき、ノードプロトコルが「オーファン(Tx0)」トランザクションのバッファリングを許可する場合には、Tx0をTx1の後に送信することさえもできる。本明細書でトランザクションのシーケンスの文脈において使用される「先行する(preceding)」および「後続の(subsequent)」という用語は、トランザクション内で指定されているトランザクションポインタ(どのトランザクションが他のどのトランザクションを指すかなど)によって定義されるシーケンス内のトランザクションの順序を指す。これらは、「先行するもの(predecessor)」と「後続するもの(successor)」、または「先の(antecedent)」と「後の(descendant)」、「親(parent)」と「子(child)」などに同等に置き換えることもできる。それは、それらが作成され、ネットワーク106に送信され、または任意の所与のブロックチェーンノード104に到着する順序を必ずしも含意するものではない。それにもかかわらず、先行するトランザクション(先のトランザクションまたは「親」)を指す後続のトランザクション(後のトランザクションまたは「子」)は、親トランザクションが検証されるまで、および検証されない限り検証されない。親よりも先にブロックチェーンノード104に到着する子は、オーファンとみなされる。ノードプロトコルおよび/またはノードの挙動に応じて、親を待つために特定の時間、破棄またはバッファリングされ得る。
【0058】
先行するトランザクションTx0の1つまたは複数の出力203のうちの1つは、本明細書ではUTXO0とラベル付けされている特定のUTXOを備える。各UTXOは、UTXOによって表されるデジタル資産の額を指定する値と、ロックスクリプトとを備え、ロックスクリプトは、後続のトランザクションが検証され、したがって、UTXOが正常に償還されるために、後続のトランザクションの入力202内のロック解除スクリプトが満たさなければならない条件を定義する。典型的には、ロックスクリプトは、その額を特定の当事者(それが含まれるトランザクションの受益者)にロックする。すなわち、ロックスクリプトは、典型的には、後続のトランザクションの入力内のロック解除スクリプトに、先行するトランザクションがロックされる当事者の暗号署名が含まれるという条件を備えるロック解除条件を定義する。
【0059】
ロックスクリプト(通称scriptPubKey)は、ノードプロトコルによって認識されるドメイン固有言語で記述されたコードの一部分である。そのような言語の特定の例は、ブロックチェーンネットワークによって使用される「スクリプト(Script)」(大文字S)と呼ばれる。ロックスクリプトは、トランザクション出力203を使用するためにどの情報が必要とされるか、たとえばアリスの署名の要件を指定する。ロック解除スクリプトはトランザクションの出力に現れる。ロック解除スクリプト(通称scriptSig)は、ロックスクリプト基準を満たすために必要な情報を提供するドメイン固有言語で記述されたコードの一部分である。たとえば、それはボブの署名を含み得る。ロック解除スクリプトは、トランザクションの入力202に現れる。
【0060】
つまり、図示される例では、Tx0の出力203内のUTXO0は、UTXO0が償還されるために(厳密には、UTXO0を償還しようとする後続のトランザクションが有効となるために)アリスの署名Sig PAを必要とするロックスクリプト[Checksig PA]を備える。[Checksig PA]は、アリスの公開鍵-秘密鍵ペアからの公開鍵PAの表現(すなわち、ハッシュ)を含む。Tx1の入力202は、(たとえば、実施形態ではトランザクションTx0全体のハッシュであるそのトランザクションID、TxID0によって)Tx1を指し示すポインタを備える。Tx1の入力202は、Tx0の任意の他の可能な出力の中から、UTXO0を識別するために、Tx0内のUTXO0を識別するインデックスを備える。Tx1の入力202は、アリスが鍵ペアからのアリスの秘密鍵をデータのあらかじめ定義された部分(暗号では「メッセージ」と呼ばれることもある)に適用することによって作成された、アリスの暗号署名を備えるロック解除スクリプト<Sig PA>をさらに備える。有効な署名を提供するためにアリスによって署名される必要があるデータ(または「メッセージ」)は、ロックスクリプトによって、またはノードプロトコルによって、またはこれらの組合せによって定義され得る。
【0061】
新しいトランザクションTx1がブロックチェーンノード104に到着すると、ノードはノードプロトコルを適用する。これは、ロックスクリプトおよびロック解除スクリプトを一緒に実行して、ロック解除スクリプトがロックスクリプトにおいて定義されている条件(この条件は1つまたは複数の基準を備え得る)を満たすかどうかをチェックすることを備える。実施形態では、これは2つのスクリプトを連結することを含む。
<Sig PA> <PA>||[Checksig PA]
上式で、「||」は連結を表し、「<…>」はデータをスタックに置くことを意味し、「[…]」はロック解除スクリプト(この例ではスタックベースの言語)で構成される関数である。同等に、スクリプトは、スクリプトを連結するのではなく、共通スタックを用いて次々に実行され得る。いずれにしても、一緒に実行されるとき、スクリプトは、Tx0の出力内のロックスクリプトに含まれるようなアリスの公開鍵PAを使用して、Tx1の入力内のロック解除スクリプトが、データの予想される部分に署名したアリスの署名を含むことを認証する。データの予想される部分自体(「メッセージ」)はまた、この認証を実行するために含まれる必要がある。実施形態では、署名されたデータは、Tx1の全体を備える(つまり、平文のデータの署名された部分を指定する別個の要素は、すでに本質的に存在するので、含まれる必要はない)。
【0062】
公開-秘密暗号法による認証の詳細は、当業者によく知られている。基本的に、アリスが自分の秘密鍵を使用してメッセージに署名した場合、アリスの公開鍵および平文のメッセージが与えられると、ノード104などの別のエンティティは、メッセージの暗号化バージョンがアリスによって署名されたものに違いないことを認証することができる。署名は、典型的には、メッセージをハッシュし、ハッシュに署名し、これを署名としてメッセージにタグ付けすることを備え、これにより、公開鍵の任意の保持者が署名を認証することができる。したがって、特定のデータ部分またはトランザクションの一部への署名などへの本明細書での言及は、実施形態では、そのデータ部分またはトランザクションの一部のハッシュに署名することを意味することができる点に留意されたい。
【0063】
Tx1内のロック解除スクリプトが、Tx0のロックスクリプト内で指定されている1つまたは複数の条件を満たす場合(つまり、図示される例では、アリスの署名がTx1内で提供され、認証された場合)、ブロックチェーンノード104は、Tx1が有効であるとみなす。これは、ブロックチェーンノード104が保留中のトランザクション154の順序付きプールにTx1を追加することを意味する。ブロックチェーンノード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内の別の有効なトランザクションへの有効な入力をすでに形成しているかどうかである。
【0064】
所与のトランザクション152のすべての出力203において指定された合計金額が、そのすべての入力202によって指定された合計金額より大きい場合、これはほとんどのトランザクションモデルにおける無効のもう1つの根拠になる。したがって、そのようなトランザクションは伝搬されず、ブロック151にも含まれない。
【0065】
UTXOベースのトランザクションモデルでは、所与のUTXOが全体として使用される必要がある点に留意されたい。UTXOにおいて使用済みとして定義された額の一部を「後に残す(leave behind)」ことはできず、別の一部が使用される。しかしながら、次のトランザクションの複数の出力間でUTXOからの額を分割することはできる。たとえば、Tx0内のUTXO0において定義された額は、Tx1内の複数のUTXO間で分割され得る。したがって、アリスが、UTXO0において定義された額のすべてをボブに与えたくない場合、アリスは、リマインダを使用して、Tx1の第2の出力において自分に残りを与えるか、または別の当事者に支払うことができる。
【0066】
実際には、アリスは通常、自分のトランザクション104をブロック151に含めることに成功したビットコインノード104に対する手数料を含む必要もある。アリスがそのような手数料を含めない場合、Tx0は、ブロックチェーンノード104によって拒否される可能性があり、したがって、技術的には有効であっても、伝搬されず、ブロックチェーン150に含められない可能性がある(ノードプロトコルは、ブロックチェーンノード104が望まない場合にトランザクション152を受け入れることを強制しない)。いくつかのプロトコルでは、トランザクション手数料は、それ自体の別個の出力203を必要としない(すなわち、別個のUTXOを必要としない)。代わりに、入力202によって指定された合計金額と、所与のトランザクション152の出力203において指定された合計金額との差は、トランザクションを公開するブロックチェーンノード104に自動的に与えられる。たとえば、UTXO0へのポインタがTx1への唯一の入力であり、Tx1は唯一の出力UTXO1を有するとする。UTXO0において指定されているデジタル資産の額がUTXO1において指定されている額より大きい場合、その差がUTXO1を含むブロックを作成するためにプルーフオブワークレースに勝ったノード104によって割り当てられ得る。しかしながら、代替的にまたは追加的に、トランザクション手数料がトランザクション152のUTXO203のうちのそれ自体の1つにおいて明示的に指定され得ることは、必ずしも除外されるものではない。
【0067】
アリスおよびボブのデジタル資産は、ブロックチェーン150内のどこにでもある任意のトランザクション152においてそれらにロックされたUTXOから構成される。したがって、典型的には、所与の当事者103の資産は、ブロックチェーン150全体にわたる様々なトランザクション152のUTXO全体に散在している。ブロックチェーン150内のどこにも、所与の当事者103の総残高を定義する数字は記憶されない。クライアントアプリケーション105におけるウォレット機能の役割は、それぞれの当事者にロックされ、別の前方のトランザクションにおいてまだ使用されていない様々なUTXOすべての値を一緒に照合することである。これは、ビットコインノード104のいずれかに記憶されたブロックチェーン150のコピーにクエリを行うことによって行うことができる。
【0068】
スクリプトコードは、しばしば、概略的に表される(すなわち、正確な言語を使用していない)点に留意されたい。たとえば、特定の機能を表すためにオペレーションコード(オペコード)を使用し得る。「OP_...」は、スクリプト言語の特定のオペコードを指す。一例として、OP_RETURNは、ロックスクリプトの開始時にOP_FALSEが前に置かれると、トランザクション内にデータを記憶することができ、それによってデータをブロックチェーン150に不変的に記録することができる、トランザクションの使用不可能な出力を作成するスクリプト言語のオペコードである。たとえば、データは、ブロックチェーンに記憶することが望まれる文書を備え得る。
【0069】
通常、トランザクションの入力は、公開鍵PAに対応するデジタル署名を含む。実施形態では、これは、楕円曲線secp256k1を使用するECDSAに基づく。デジタル署名は、特定のデータの一部分に署名する。いくつかの実施形態では、所与のトランザクションについて、署名は、トランザクション入力の一部、およびトランザクション出力の一部または全部に署名する。署名された出力の特定の部分は、SIGHASHフラグに依存する。SIGHASHフラグは、通常、どの出力が署名されるかを選択するために署名の最後に含まれる4バイトコードである(したがって、署名時に固定される)。
【0070】
ロックスクリプトは、通常それぞれのトランザクションがロックされる当事者の公開鍵を備えるという事実を指して、「scriptPubKey」と呼ばれることがある。ロック解除スクリプトは、通常それが対応する署名を供給するという事実を指して「scriptSig」と呼ばれることがある。しかしながら、より一般的には、UTXOが償還されるための条件が署名を認証することを備えることは、ブロックチェーン150のすべてのアプリケーションにおいて必須ではない。より一般的には、任意の1つまたは複数の条件を定義するためにスクリプト言語を使用することができる。したがって、より一般的な用語「ロックスクリプト(locking script)」および「ロック解除スクリプト(unlocking script)」が好まれ得る。
【0071】
サイドチャネル
図1に示されるように、アリスおよびボブの各々のコンピュータ機器102a、120b上のクライアントアプリケーションは、それぞれ、追加の通信機能を備え得る。この追加の機能は、(いずれかの当事者または第三者の指示で)アリス103aがボブ103bとの別個のサイドチャネル107を確立することを可能にする。サイドチャネル107は、ブロックチェーンネットワークとは別でのデータの交換を可能にする。そのような通信は、「オフチェーン(off-chain)」通信と呼ばれることがある。たとえば、これは、当事者の一方がトランザクションをネットワーク106にブロードキャストすることを選択するまで、トランザクションが(まだ)ブロックチェーンネットワーク106に登録されたり、チェーン150上に進んだりすることなく、アリスとボブとの間でトランザクション152を交換するために使用され得る。この方法でトランザクションを共有することは、「トランザクションテンプレート」の共有と呼ばれることもある。トランザクションテンプレートには、完全なトランザクションを形成するために必要な1つまたは複数の入力および/または出力が欠けている場合がある。代替的にまたは追加的に、サイドチャネル107は、鍵、交渉された額または条件、データコンテンツなどの任意の他のトランザクション関連データを交換するために使用され得る。
【0072】
サイドチャネル107は、ブロックチェーンネットワーク106と同じパケット交換ネットワーク101を介して確立され得る。代替的にまたは追加的に、サイドチャネル301は、モバイルセルラーネットワークなどの異なるネットワーク、またはローカルワイヤレスネットワークなどのローカルエリアネットワーク、またはさらにはアリスのデバイス102aとボブのデバイス102bとの間の直接のワイヤードもしくはワイヤレスリンクを介して確立され得る。一般に、本明細書のどこかで参照されるサイドチャネル107は、「オフチェーン」、すなわちブロックチェーンネットワーク106とは別でデータを交換するための1つまたは複数のネットワーキング技術または通信媒体を介した任意の1つまたは複数のリンクを備え得る。2つ以上のリンクが使用される場合、全体としてのオフチェーンリンクの束または集合は、サイドチャネル107と呼ばれ得る。したがって、アリスおよびボブがサイドチャネル107を介して情報またはデータの特定の部分などを交換すると言われている場合、これは、これらのデータの部分のすべてが全く同じリンクまたは同じタイプのネットワーク上で送信されなければならないことを必ずしも含意するものではない点に留意されたい。
【0073】
《クライアントソフトウェア》
図3Aは、現在開示されている方式の実施形態を実装するためのクライアントアプリケーション105の例示的な実装形態を示している。クライアントアプリケーション105は、トランザクションエンジン401とユーザインターフェース(UI)層402を備える。トランザクションエンジン401は、トランザクション152を定式化することと、サイドチャネル301を介してトランザクションおよび/または他のデータを受信および/または送信することと、ならびに/あるいは上記で説明し、すぐにさらに詳細に説明する方式に従って、ブロックチェーンネットワーク106を通じて伝搬されるべき1つまたは複数のノード104にトランザクションを送信することとを行うためなどに、クライアント105の基礎となるトランザクション関連機能を実装するように構成される。本明細書で開示される実施形態によれば、各クライアント105のトランザクションエンジン401は、高レベルスクリプト言語でロックスクリプトを記述し、高レベルスクリプト言語と低レベルスクリプト言語との間で変換するように構成された関数403を備える。言い換えれば、高レベル言語で記述されたロックスクリプトは、低レベル言語で記述された同等のロックスクリプトにマッピングすることができる。たとえば、アリス103aは、高レベル言語を使用してコンパクトロックスクリプトを構築し得、次いで、トランザクションエンジン401が、対応する展開ロックスクリプトを生成し得る。
【0074】
UI層402は、機器102のユーザ出力手段を介して各ユーザ103に情報を出力することと、機器102のユーザ入力手段を介して各ユーザ103から入力を受信することとを含む、各ユーザのコンピュータ機器102のユーザ入力/出力(I/O)手段を介して、ユーザインターフェースをレンダリングするように構成される。たとえば、ユーザ出力手段は、視覚出力を提供するための1つまたは複数のディスプレイスクリーン(タッチスクリーンまたは非タッチスクリーン)、オーディオ出力を提供するための1つまたは複数のスピーカ、および/または触覚出力を提供するための1つまたは複数の触覚出力デバイスなどを備えることができる。ユーザ入力手段は、たとえば、1つもしくは複数のタッチスクリーン(出力手段のために使用されるものと同じまたは異なるもの)の入力アレイ、マウス、トラックパッド、またはトラックボールなどの1つもしくは複数のカーソルベースのデバイス、スピーチもしくは音声入力を受信するための1つもしくは複数のマイクおよびスピーチもしくは音声認識アルゴリズム、手動もしくは身体的なジェスチャの形式で入力を受信するための1つもしくは複数のジェスチャベースの入力デバイス、あるいは1つもしくは複数の機械的なボタン、スイッチ、またはジョイスティックなどを備えることができる。
【0075】
注:本明細書における様々な機能は、同じクライアントアプリケーション105に統合されるものとして説明される場合があるが、これは必ずしも限定されるものではなく、代わりに、それらは、2つ以上の別個のアプリケーションのスイートにおいて実装することができ、たとえば、1つはもう1つのプラグインであるか、API(アプリケーションプログラミングインターフェース)を介して接続されている。たとえば、トランザクションエンジン401の機能は、UI層402とは別個のアプリケーションで実装されてもよく、トランザクションエンジン401などの所与のモジュールの機能は、複数のアプリケーションに分割されてもよい。また、説明された機能の一部またはすべてが、たとえばオペレーティングシステム層において実装される可能性も排除されない。本明細書のどこかで単一のまたは所与のアプリケーション105などについて言及する場合、これは単なる例であり、より一般的には、説明される機能は任意の形式のソフトウェアで実装することができることが理解されるであろう。
【0076】
図3Bは、アリスの機器102a上のクライアントアプリケーション105aのUI層402によってレンダリングされ得るユーザインターフェース(UI)500の一例のモックアップを示している。同様のUIが、ボブの機器102b上のクライアント105b、または他の当事者の機器によってレンダリングされ得ることが理解されるであろう。
【0077】
例として、図3Bは、アリスの視点からのUI500を示している。UI500は、ユーザ出力手段を介して別個のUI要素としてレンダリングされる1つまたは複数のUI要素501、502、503を備え得る。
【0078】
たとえば、UI要素は、異なるスクリーン上のボタン、またはメニュー内の異なるオプションなどであり得る、1つまたは複数のユーザ選択可能な要素501を備え得る。ユーザ入力手段は、ユーザ103(この場合、アリス103a)が、スクリーン上のUI要素をクリックまたはタッチすること、または所望のオプションの名前を話すことなどによって、オプションのうちの1つを選択または動作できるように構成される(注意:本明細書で使用する「手動(manual)」という用語は、自動との対比のみを意味しており、必ずしも片手または両手の使用に限定するものではない)。このオプションにより、ユーザ(アリス)は、高レベルスクリプト言語の1つまたは複数の高レベル関数、たとえば、複雑な数学的演算を実行するように構成された関数を選択できるようになる。オプションにより、ユーザは、たとえば、コンパクトロックスクリプトの代わりに展開ロックスクリプトを含むトランザクションのバージョンに基づいて署名を生成するために、コンパクトロックスクリプトから展開ロックスクリプトに変換することもできる。
【0079】
代替的にまたは追加的に、UI要素は、ユーザが1つまたは複数の高レベル関数を記述することができる1つまたは複数のデータ入力フィールド502を備え得る。これらのデータ入力フィールドは、ユーザ出力手段を介して、たとえばスクリーン上でレンダリングされ、データは、ユーザ入力手段、たとえばキーボードまたはタッチスクリーンを通じてフィールドに入力することができる。あるいは、データは、たとえばスピーチ認識に基づいて口頭で受信することもできる。
【0080】
代替的にまたは追加的に、UI要素は、ユーザに情報を出力するために出力される1つまたは複数の情報要素503を備え得る。たとえば、これ/これらはスクリーン上に、または可聴式にレンダリングすることができる。
【0081】
様々なUI要素をレンダリングし、オプションを選択し、データを入力する特定の手段は重要ではないことが理解されるであろう。これらのUI要素の機能についてはすぐに詳しく説明する。また、図3に示されるUI500は、模式化されたモックアップにすぎず、実際には、簡潔にするために図示されていない1つまたは複数のさらなるUI要素を備え得ることも理解されよう。
【0082】
《ノードソフトウェア》
図4は、UTXOまたは出力ベースのモデルの例において、ネットワーク106の各ブロックチェーンノード104上で実行されるノードソフトウェア450の例を示している。別のエンティティは、ネットワーク106上でノード104として分類されずに、すなわち、ノード104に必要なアクションを実行せずに、ノードソフトウェア450を実行する可能性がある点に留意されたい。ノードソフトウェア450は、これらに限定されないが、プロトコルエンジン451と、スクリプトエンジン452と、スタック453と、アプリケーションレベル決定エンジン454と、1つまたは複数のブロックチェーン関連機能モジュール455のセットとを含み得る。各ノード104は、これらに限定されないが、コンセンサスモジュール455C(たとえば、プルーフオブワーク)、伝搬モジュール455P、および記憶モジュール455S(たとえば、データベース)の3つすべてを含む、ノードソフトウェアを実行し得る。プロトコルエンジン401は、通常、トランザクション152の異なるフィールドを認識し、ノードプロトコルに従ってそれらを処理するように構成される。別の先行するトランザクション152i(Txm-1)の出力(たとえば、UTXO)を指す入力を有するトランザクション152j(Txj)が受信されると、プロトコルエンジン451は、Txj内のロック解除スクリプトを識別し、それをスクリプトエンジン452に渡す。プロトコルエンジン451はまた、Txjの入力内のポインタに基づいて、Txiを識別し、取り出す。Txiはブロックチェーン150上で公開されてもよく、その場合、プロトコルエンジンは、ノード104に記憶されたブロックチェーン150のブロック151のコピーからTxiを取り出し得る。あるいは、Txiはブロックチェーン150上でまだ公開されていない可能性がある。その場合、プロトコルエンジン451は、ノード104によって維持される未公開トランザクションの順序付きセット154からTxiを取り出し得る。いずれにしても、スクリプトエンジン451は、Txiの参照された出力におけるロックスクリプトを識別し、これをスクリプトエンジン452に渡す。
【0083】
したがって、スクリプトエンジン452は、Txiのロックスクリプトと、Txjの対応する入力からのロック解除スクリプトとを有する。たとえば、Tx0およびTx1とラベル付けされたトランザクションが図2に示されているが、同じことが、任意のペアのトランザクションにも当てはまる。スクリプトエンジン452は、前述したように2つのスクリプトを一緒に実行し、これは、使用されているスタックベースのスクリプト言語(たとえば、Script)に従って、スタック453上にデータを配置し、そこからデータを取り出すことを含む。
【0084】
スクリプトを一緒に実行することによって、スクリプトエンジン452は、ロック解除スクリプトがロックスクリプトにおいて定義された1つまたは複数の基準を満たすか否か、すなわち、ロックスクリプトが含まれる出力を「ロック解除」するか否かを決定する。スクリプトエンジン452は、この決定の結果をプロトコルエンジン451に返す。スクリプトエンジン452は、ロック解除スクリプトが対応するロックスクリプトにおいて指定されている1つまたは複数の基準を満たすと決定した場合、結果「真(true)」を返す。そうでなければ、結果「偽(false)」を返す。
【0085】
出力ベースのモデルでは、スクリプトエンジン452からの結果「真」は、トランザクションの有効性の条件のうちの1つである。典型的には、Txjの出力において指定されているデジタル資産の総額が、その入力によって示された総額を超えないこと、およびTxiの示された出力が別の有効なトランザクションによってまだ使用されていないことなどの、同様に満たされなければならないプロトコルエンジン451によって評価される、1つまたは複数のさらなるプロトコルレベル条件も存在する。プロトコルエンジン451は、スクリプトエンジン452からの結果を1つまたは複数のプロトコルレベル条件とともに評価し、それらがすべて真である場合にのみ、トランザクションTxjを検証する。プロトコルエンジン451は、トランザクションが有効であるかどうかの指示をアプリケーションレベル決定エンジン454に出力する。Txjが実際に検証されるという条件でのみ、決定エンジン454は、Txjに関してそれぞれのブロックチェーン関連機能を実行するために、コンセンサスモジュール455Cおよび伝搬モジュール455Pの両方を制御することを選択し得る。これは、コンセンサスモジュール455Cが、ブロック151に組み込むためにTxjをノードのトランザクション154それぞれの順序付けられたセットに追加すること、および伝搬モジュール455PがTxjをネットワーク106内の別のブロックチェーンノード104に転送することを備える。任意で、実施形態では、アプリケーションレベル決定エンジン454は、これらの機能の一方または両方をトリガする前に、1つまたは複数の追加の条件を適用し得る。たとえば、決定エンジンは、トランザクションが有効であり、かつ十分なトランザクション手数料を残しているという条件でのみトランザクションを公開することを選択し得る。
【0086】
本明細書における「真」および「偽」という用語は、単一の2進数(ビット)のみの形態で表される結果を返すことに必ずしも限定されないが、それは確かに1つの可能な実装形態である点にも留意されたい。より一般的には、「真」は、成功または肯定的な成果を示す任意の状態を指すことができ、「偽」は、不成功または非肯定的な成果を示す任意の状態を指すことができる。たとえば、アカウントベースのモデルでは、「真」の結果は、署名の暗黙的な、プロトコルレベルの検証と、スマートコントラクトの追加の肯定的な出力との組合せによって示され得る(個々の成果の両方が真である場合、全体の結果が真を示すとみなされる)。
【0087】
《高レベルのスクリプト言語》
図5は、本発明の実施形態を実装するための例示的なシステム500を示している。システム500は、1人または複数の生成当事者(すなわち、ブロックチェーントランザクションを生成する当事者)を備える。簡単にするために、2人の生成当事者、アリス103aおよびボブ103bのみが図5に示されている。生成当事者はユーザである必要はなく、代わりにマシンであってもよい点に留意されたい。システム500はまた、ブロックチェーンノード104の形態で示される検証エンティティと、ブロックチェーンネットワーク106の1つまたは複数のノードとを備える。
【0088】
生成当事者、たとえばアリス103aは、第1のブロックチェーントランザクションTx1を生成するように構成されている。第1のブロックチェーントランザクションTx1は1つまたは複数の出力を備える。出力のうちの少なくとも1つ(第1の出力)は、コンパクトロックスクリプト(CLS)を備える。第1の出力がトランザクション内で論理的に最初に現れる必要はない点に留意されたい。代わりに、「第1(first)」は、この特定の出力のラベルとしてのみ使用される。CLSは高レベル(HL)スクリプト言語で記述されており、1つまたは複数の高レベル(HL)関数を備える。各高レベル関数は、ブロックチェーン150の低レベル(LL)スクリプト言語、すなわちネイティブスクリプト言語の1つまたは複数の低レベル(LL)関数(たとえば、オペコード)と同等の動作を実行するように構成されている。CLSは、LLスクリプト言語のみを使用して記述された展開ロックスクリプト(ELS)と同等の動作を実行する(すなわち、ロック条件を定義する)ように構成されている。たとえば、CLSとELSの両方で、数値の逆剰余を見つけるロックスクリプトを定義し得る。その動作を実行するために多数のLL関数を必要とするのではなく、CLSは数値の逆剰余を見つけるように構成された単一のHL関数を備え得るため、ELSと比較してCLSのサイズを削減することができる。別の言い方をすると、HLスクリプト言語で記述されたCLSは、LL言語で記述されたELSにコンパイルすることができる。
【0089】
いくつかの例では、単一の高レベル関数と単一のLL関数との間に1対1のマッピングが存在し得る。たとえば、HL関数「ADD」または「+」は、対応するLL関数の演算、たとえばOP_ADDを実行し得る。同様に、記号「-」、「*」、および「/」は、それぞれ減算、乗算、および除算を実行するために使用され得る。これにより、特定のLLスクリプト言語であるScriptによって使用されるOP_SUB、OP_MUL、OP_DIVなどのLL関数を節約することができる。
【0090】
いくつかの例では、HL関数のうちの少なくとも一部は複数のLL関数にマッピングする。たとえば、単一のHL関数は、データ項目に対して複数の連続動作を実行し得る(例については以下を参照)。いくつかの例では、各HL関数が複数のLL関数にマッピングする。
【0091】
第1のトランザクションTx1は複数の出力、たとえば第2の出力を備え得る。第2の出力は、それぞれのCLSを備え得る。一般に、第1のトランザクションTx1の出力のうちの一部またはすべては、それぞれのCLSを備え得る。
【0092】
アリス103aはまた、第1のトランザクションTx1をHL言語でブロックチェーンネットワーク106にとって利用可能にするように構成されている。たとえば、アリス103aは、第1のトランザクションをブロックチェーンノード104に直接送信してもよく、異なる当事者、たとえばボブ103bを介して間接的に送信してもよい。たとえば、アリス103aは、サイドチャネル107を介してトランザクションTx1をボブ103bに送信し得る。トランザクションを受信すると、ボブ103bは、トランザクションTx1に署名する署名を含み得る。次いで、ボブ103bは、トランザクションTx1をネットワーク106に送信し得る。第1のトランザクションを送信する際、第1のCLSが対応する第1のELSよりも小さいため、帯域幅が節約される。アリス103aは、第1のトランザクションTx1を彼女のコンピューティングデバイス102aのメモリに記憶し得る。
【0093】
いくつかの例では、アリス103aは、第1のトランザクションTx1のトランザクション識別子TxID1を生成し得る。トランザクション識別子は通常、生のトランザクションデータのハッシュまたは二重ハッシュである。アリス103aはまず、CLSを含まず、代わりに対応するELSを含む、第1のトランザクションTxrawの修正バージョンを生成する。すなわち、第1の出力は、第1のCLSの代わりに第1のELSを含む。同様に、第1のトランザクションTx1が複数のCLSを含んでいる場合、修正バージョンは代わりに複数のELSを含む。次いで、第1のトランザクションTxrawの修正バージョンのハッシュ(たとえば、SHA-256)または二重ハッシュ(たとえば、二重SHA-256)を取得することによって、第1のトランザクションTxrawの修正バージョンに基づいて、トランザクション識別子TxID1が生成される。アリス103aは、第1のトランザクションTx1とともにブロックチェーンノード104に送信することによって、トランザクション識別子TxID1をブロックチェーンネットワーク106にとって利用可能にする。
【0094】
いくつかの例では、アリス103aは、まず、CLSを含む第1のトランザクションTx1のバージョンを生成し、次いで、第1のトランザクションTxrawの修正バージョンを生成する。すなわち、任意のCLSを対応するELSに置き換える。言い換えれば、関数403は、HL言語のHL関数とLL言語のLL関数との間でマッピングすることによって、第1のCLSを第1のELSに変換し得、すなわち、第1のCLSが第1のELSにコンパイルされる。次いで、トランザクション識別子TxID1が生成される。
【0095】
第1のトランザクションTxrawの修正バージョンを生成することは、単に第1のCLSを第1のELSに置き換えることを意味する場合がある。次いで、トランザクション識別子TxID1が生成された後、第1のCLSを含む第1のトランザクションTx1のバージョンをブロックチェーンネットワーク106に送信できるように、第1のELSを第1のCLSに置き換えることができる。
【0096】
また、アリス103aが最初に、第1のトランザクションTxraw、すなわち第1のELSを含むトランザクションの修正バージョンを生成する可能性も排除されない。これにより、アリス103aはトランザクション識別子TxID1を生成できるようになる。次いで、アリス103aは、ELSを対応するCLSに置き換えることができる。すなわち、関数403は、LL言語のLL関数とHL言語のHL関数との間でマッピングすることによって、第1のELSを第1のCLSに変換し得る。
【0097】
ブロックチェーントランザクションは、トランザクションの入力に、以前のトランザクションの参照された出力のロックを解除するための署名を含むことがよくある。アリス103aが、以前のトランザクションの出力のロックを解除するために、第1のトランザクションTx1の入力の一部として署名を含める必要がある場合、アリス103aは、第1のトランザクションTxrawの修正バージョンの一部として署名を含み得る。言い換えれば、アリスの署名は、第1のCLSではなく第1のELSを含む第1のトランザクションTxrawの修正バージョンに署名する。次いで、トランザクション識別子TxID1は、アリスの署名を含む修正バージョンに基づいて生成され得る。ネットワーク106に提出されるトランザクションのバージョンは、アリスの署名も含む。しかしながら、第1のトランザクションTx1をメッセージとして使用して検証すると、署名は有効な署名にならない。第1のトランザクションTxrawの修正バージョンをメッセージとして使用する場合にのみ有効な署名である。
【0098】
第1のCLSの第1のELSへの置換えは、アリス103aによって選択された署名フラグ(たとえば、SIGHASHフラグ)の選択に依存し得る点に留意されたい。たとえば、アリス103aは、署名がトランザクション出力のいずれにも適用されないように、署名フラグ(たとえば、SIGHASH_NONE)を選択し得る。その場合、アリス103aは、第1のCLSを第1のELSに置き換える必要がない。別の例として、アリス103aは、署名が1つの出力のみに適用されるように、署名フラグ(たとえば、SIGHAHS_SINGLE)を選択し得る。その場合、第1のCLS(または、任意の他のCLS)を含まない出力に署名が適用される場合、アリス103aは、第1のCLSを第1のELS(または、対応するELS)に置き換える必要はない。さらに、この場合、署名された出力以外の出力にCLSが存在する場合、アリス103aは、そのCLSを置き換える必要がない。しかしながら、署名によって署名された単一の出力に第1のCLSが含まれている場合、アリス103aは第1のCLSを第1のELSに置き換える必要がある。最後に、アリス103aは、署名がすべての出力に署名するように、署名フラグ(たとえば、SIGHASH_ALL)を選択し得る。その場合、アリス103aは、第1のCLSを第1のELSに置き換えなければならない。同じことが、それぞれのCLSを含む任意の他の出力にも当てはまる。
【0099】
いくつかの例では、アリス103aは、1つまたは複数のセカンダリトランザクション識別子を生成し得る。これらのセカンダリ識別子は、データのハッシュまたは二重ハッシュであり得るという点で、上述のトランザクション識別子TxID1に類似しているが、ハッシュされたデータは異なる。たとえば、セカンダリトランザクション識別子は、第1のトランザクションTx1のバージョン番号、第1のトランザクションTx1のロックタイム、第1のトランザクションTx1の1つまたは複数の入力、および/または第1のトランザクションTx1の1つまたは複数の出力のうちの1つまたは複数に基づいて生成され得る。特定の例として、セカンダリトランザクション識別子は、バージョン番号とロックタイムに基づき得る。追加的にまたは代替的に、セカンダリトランザクション識別子は、それぞれのCLSを備える出力に基づき得る。
【0100】
トランザクションへの入力は、次の3つの部分を含み得る。
1.インデックスと連結されたトランザクション識別子(どのトランザクション出力が使用されるかを示す)、
2.ロック解除スクリプト、および
3.シーケンス番号。
【0101】
ロック解除スクリプトは、セカンダリトランザクション識別子に署名するデジタル署名を含み得る。したがって、セカンダリトランザクションに署名する可能性のあるデジタル署名を含むロック解除スクリプトの部分は排除される必要がある。セカンダリトランザクション識別子が1つまたは複数の入力に基づいている場合、循環参照を避けるために、その入力のロック解除スクリプトの一部またはすべてが排除され得る。言い換えれば、トランザクション識別子は、完全なロック解除スクリプトではなく、インデックスおよび/またはシーケンス番号と連結されたトランザクション識別子のみに基づき得る。
【0102】
セカンダリトランザクション識別子は、第1のトランザクションTx1の出力、たとえば使用不可能な出力に含まれ得る。第1のトランザクションTxrawの修正バージョンはまた、セカンダリトランザクション識別子を含み得る。したがって、これらの例では、「プライマリ(primary)」トランザクション識別子TxID1と署名は、セカンダリトランザクション識別子の関数である。
【0103】
いくつかの実施形態では、上述のHLスクリプト言語は、LLスクリプト言語と比較して高レベル言語である一方で、さらに高レベルのスクリプト言語と比較して低レベル言語であり得る。すなわち、HL言語は、LL言語と第2層HL言語との間の中間レベル言語であり得る。第2層HL言語は、ユーザ向け言語である。言い換えれば、ユーザ向け言語は、ユーザ(または、デバイスを含む他の当事者またはエンティティ)によって記述され得るスクリプト言語であり得る。ユーザ向け言語で記述されたスクリプトは、中間言語、たとえば第1のCLSで記述されたスクリプトにコンパイルすることができる(これは、圧縮されることを意味し得る)。次に、中間言語で記述されたスクリプトは、LL言語で記述されたスクリプトに展開され得る(たとえば、マッピングされることによって)。また、ユーザ向け言語で記述されたスクリプトが低レベル言語で記述されたスクリプトに直接変換される可能性も排除されない。
【0104】
言い換えれば、いくつかの実施形態では、スクリプト言語のレベルは高レベル言語と低レベル言語の2つだけであるが、他の実施形態では、スクリプト言語のレベルは、ユーザ向け(最高)レベル、中間言語レベル、および低レベル言語の3つある。
【0105】
上記の例に戻ると、アリス103aは、ユーザ向け言語で記述されたロックスクリプト、すなわちユーザ向け(UF)ロックスクリプトを備えるトランザクションを生成し得る。次いで、ネットワーク106に提出する前に、UFロックスクリプトは、中間言語で記述された第1のCLSに変換(たとえば、コンパイル)される。次いで、第1のCLSを備えるトランザクションがネットワーク106に提出され得る。言い換えれば、これらの例では、ユーザ向け言語は、最初にトランザクションを生成するときにアリス103aによってのみ使用される。トランザクションは、CLSのよりコンパクト形式のロックスクリプトを使用して提出される。
【0106】
上記の教示は、ロックスクリプトだけではなく、ロック解除スクリプトにも当てはまる。すなわち、展開ロックスクリプトに変換されるコンパクトロックスクリプトの生成に加えて、またはその代わりに、アリスのトランザクションはコンパクトロック解除スクリプトを備え得る。コンパクトロック解除スクリプトは、中間言語またはユーザ向け言語で記述され得る。
【0107】
図5に示されるように、ブロックチェーンノード104は第1のトランザクションTx1を取得する。第1のトランザクションTx1は、第1のCLS(および、場合によっては1つまたは複数の追加のCLS)を含む。第1のトランザクションTx1は、アリス103aから直接取得されてもよく、異なるエンティティ、たとえばボブ103bから取得されてもよい。ノード104が異なるノード104から第1のトランザクションTx1を取得する可能性も排除されない。
【0108】
ノード104は、第1のトランザクションTx1を検証するように構成されている。いくつかの実施形態では、第1のトランザクションTx1は、そのトランザクション識別子に基づいて検証される。これらの実施形態では、ノード104は、たとえばアリス103a、ボブ103b、または異なるエンティティから、候補トランザクション識別子TxID1を取得する。トランザクション生成当事者、すなわちアリス103aは、第1のトランザクションTx1とともに候補トランザクション識別子TxID1を送信することが期待される。
【0109】
ノード104は、第1のCLSを対応するELSに置き換えることによって、第1のトランザクションTxraw'の修正バージョンを生成し、すなわち、第1のCLSは第1のELSにコンパイルされる。言い換えれば、ノード104は、第1のCLSを第1のELSに変換するように構成されている。これは、ノードのスクリプトエンジン452によって、または別の関数455によって実行され得る。第1のトランザクションTxraw'の修正バージョンを生成したノード104は、第1のトランザクションTxraw'の修正バージョンに基づいてトランザクション識別子TxID1'を生成する。たとえば、トランザクション識別子TxID1'は、第1のトランザクションTxraw'の修正バージョンをハッシュまたは二重ハッシュすることによって生成され得る。
【0110】
第1のトランザクションTx1が有効であるとみなされるためには、取得された候補トランザクション識別子TxID1が、生成されたトランザクション識別子TxID1'と一致する必要がある。したがって、ノード104はトランザクション識別子の比較を実行し、それらが等しいかどうかを決定する。トランザクション識別子が一致しない場合、第1のトランザクションTx1は無効とみなされ、無視される可能性がある。
【0111】
トランザクション識別子が一致する場合、ノード104は、ブロックチェーンプロトコルに従ってトランザクションの検証を続行し得る。これは、第1のトランザクションTx1の入力と、以前のトランザクションのそれぞれの参照出力を一緒に実行することを含む。
【0112】
トランザクションTx1がブロックチェーンプロトコルに従って有効である場合、ノード104はトランザクションTx1をネットワーク106の他のノード104に送信し、および/または第1のトランザクションTxrawの修正バージョンに基づいてブロックの構築を試みることができる。言い換えれば、ブロックは、修正されたトランザクションTxrawのトランザクション識別子TxID1をリーフの1つとして有するマークルツリーのマークルルート(すなわち、第1のELSを備える修正されたトランザクションの(二重)ハッシュ)を含むことになる。これは、第1のトランザクションTx1および/または第1のトランザクションTxrawの修正バージョンをメモリに記憶することを含み得る。
【0113】
いくつかの例では、トランザクションの修正バージョンは、第1のCLSを含まない場合がある。他の例では、トランザクションの修正バージョンは、第1のELSと第1のCLSの両方を含み得る。たとえば、修正されたトランザクションの第1の出力は、トランザクションの検証中に実行されないような方法で第1のCLSを含み得る。たとえば、第1のCLSはOP_RETURNオペコード:<ELS> OP_RETURN <CLS>の後に続く場合がある。この場合、トランザクション識別子は第1のELSと第1のCLSの両方に基づく。
【0114】
いくつかの例では、ノード104は、要求の受信に応答して、第1のトランザクションTxrawの修正バージョンを別のノード104に送信し得る。たとえば、第1のトランザクションTx1を含むブロック151をブロックチェーン150上に公開し得る。要求側ノード104は、HL言語で記述されたスクリプトを含むトランザクションを検証するように構成されていない可能性がある。したがって、ノード104は、第1のトランザクションTxrawの修正バージョンを要求側ノードに送信し、要求側ノード104が、通常、LLスクリプト言語のみを含むトランザクションの場合と同様に第1のトランザクションを検証できるようにする。
【0115】
これまで、トランザクションの検証に関する上記の説明は、CLSを含むトランザクションの検証に焦点を当ててきたが、必ずしもCLSのロックを解除することを意図した入力ではなかった。たとえば、第1のトランザクションTx1は、LL言語のみを使用して記述された以前のトランザクションの出力のロックを解除する入力が含み得る。
【0116】
第1のトランザクションTx1が有効なトランザクションであると仮定すると、それはブロック151において公開される。次いで、ブロックチェーンノード104(必ずしもそのブロック151を公開したノード104と同じである必要はないが、排除されない)は、第1のトランザクションTx1の第1の出力、すなわち、第1のCLSを含む出力を参照する入力を含む、第2のトランザクションTx2を受信し得る。第2のトランザクションTx2は、第2の当事者、たとえばボブ103bによって生成され得る。ボブ103bは、第2のトランザクションをノード104に直接送信してもよく、異なるエンティティ、たとえば第3のユーザであるチャーリーを介して間接的に送信してもよい。
【0117】
次いで、ノード104は、第2のトランザクションTx2の検証に進む。第2のトランザクションTx2を検証するために、ノード104は、たとえばメモリまたはブロックチェーン150から第1のトランザクションを取得しなければならない。次いで、ノード104は、第2のトランザクションTx2を検証するための2つのオプションを有する。第1のオプションとして、ノード104は、第1のCLSを第1のELSに置き換え(すなわち、第1のCLSが第1のELSにコンパイルされ)、次いで、第1のELSに対して第2のトランザクションの入力を実行し得る。第2のトランザクションが有効になるためには、実行が成功する必要がある。言い換えれば、第2のトランザクションの入力は、第1のELSのロックを正常に解除する必要がある。第2のオプションとして、ノード104は、第1のCLSを第1のELSに置き換える必要はなく、代わりに、ノード104は、第1のCLSに対して第2のトランザクションTx2の入力を実行し得る。繰り返すが、第2のトランザクションが有効になるためには、実行が成功する必要がある。言い換えれば、第2のトランザクションTx2の入力は、第1のCLSのロックを正常に解除する必要がある。
【0118】
第1のCLSは第1のELSと同等であるため、同じ入力により第1のCLSと第1のELSの両方のロックが解除される。簡単な例として、第1のELSが、第2のトランザクションTx2の入力から数値を取得し、その数値に対して数学的演算を実行し、その数値が第1のELSに含まれる数値と一致するかどうかをチェックするように構成された複数のLL関数を備えているとする。第1のCLSは、同じ動作を実行するように構成されているが、第1のELSよりもサイズが小さい。たとえば、第1のCLSは数値と単一のHL関数を含み得るが、第1のELSは数値だけでなく多くのLL関数を含み得る。第1のELSと第1のCLSの全体的な動作は同じであるため、同じ入力は同じ結果、すなわち実行の成功または失敗につながる。
【0119】
第2のトランザクションTx2が有効である場合、すなわち、第2のトランザクションのロック解除スクリプトが第1のELSまたは第1のCLSのロックを正常に解除し、ブロックチェーンプロトコルの任意の他の条件が満たされる場合、ノード104は、第2のトランザクションTx2をブロックチェーンネットワーク106の他のノード104に送信し得る。ノード104はまた、たとえば、第2のトランザクションTx2を含むブロック151を構築するために、第2のトランザクショTx2を記憶し得る。
【0120】
第2のトランザクションTx2が、それぞれのCLSを含む1つまたは複数の出力を備える場合があり得る。その場合、第2のトランザクションTx2の検証の一部として、ノード104は、第1のトランザクションTx1の検証を議論するときに上で説明したのと同じ動作、すなわち、候補トランザクション識別子TxID2を取得することと、第2のトランザクションの修正バージョンを生成することと、トランザクション識別子TxID2'を生成することと、取得したトランザクション識別子と生成したトランザクション識別子の比較を実行することとを実行し得る。効率を高めるために、入力スクリプトと出力スクリプトを実行する前に比較が実行され得る。
【0121】
トランザクション検証に関する上記の説明は、主に、コンパクトロックスクリプトを備えるトランザクションを検証することに焦点を当ててきた。ノード104はまた、(コンパクトロックスクリプトに加えて、またはその代わりに)コンパクトロック解除スクリプトを備えるトランザクションを検証し得る。ノード104は、トランザクション検証中にコンパクトロック解除スクリプトを直接実行し得、すなわち、コンパクトロック解除スクリプトは、HLスクリプト言語(ユーザ向け言語または中間言語であり得る)で直接実行される。あるいは、ノード104は、実行前に、コンパクトロック解除スクリプトを、LLスクリプト言語で記述された展開ロック解除スクリプトに変換し得る。
【0122】
署名および/またはトランザクション識別子を生成する目的でトランザクションの修正バージョンを生成することについての説明は、トランザクションがコンパクトロック解除スクリプトを備えるシナリオにも同様に当てはまる。
【0123】
図9は、3つのタイプの言語間の関係を示している。図示されるように、最下位レベルはLL言語、すなわちブロックチェーンのネイティブスクリプト言語(たとえば、スクリプト言語のオペコード)である。より高いレベルは中間言語である。中間言語より上のレベルには、ユーザ向け言語がある。
【0124】
このプログラミングアーキテクチャは、ブロックチェーンスクリプトをよりアクセスしやすく、計算とスペースの効率をより高め、スマートコントラクトにより適したものにするように設計されている。
【0125】
トランザクションのライフサイクルは、少なくとも次の段階を備える。
1.作成-1つのトランザクション(作成されるトランザクション)。スクリプトは、ユーザ向け、中間レベル、または低レベルのスクリプト言語であり得る。
2.伝搬-1つのトランザクション(送信されるトランザクション)。スクリプトは、(ユーザ向け言語と比較して)ノード側におけるコンパクトさとLL言語への迅速な展開のために、中間レベル言語であり得る。
3.ストレージ-1つのトランザクション(記憶されるトランザクション)。スクリプトはコンパクトさのために中間レベル言語であり得る。
4.検証-2つのトランザクション(使用されるトランザクションはロックスクリプトを提供し、支出トランザクションはロック解除スクリプトを提供する)。作成中、伝搬中、または記憶中の検証はない。実行時、トランザクションは、コンパクト形式または展開形式、あるいは、コンパクトスクリプトのすべてではなく一部が実行前にネイティブスクリプトに変換されるハイブリッド方式でのみ実行され得る。
【0126】
いくつかの例では、関数テーブルは、コンパクトスクリプト(ロックまたはロック解除)を実行する際に、異なる当事者(すなわち、アリス103aおよびノード104)によって使用され得る。関数テーブルは、HL関数と対応するLL関数のリストを含む。言い換えれば、HL関数は対応するLL関数にマッピングされる。HL関数は、対応するLL関数にコンパイル(すなわち、翻訳)され、関数テーブルに記憶される。関数テーブルを使用すると、コンパクトスクリプトから展開スクリプトへの変換、またはその逆の変換が可能になる。
【0127】
関数テーブルは、アリス103aによって全体または一部が作成され、1つまたは複数のノード104に配布されてもよく、あるいは、関数テーブルは、別のエンティティ、たとえば、ノード104のうちの1つによって全体または一部が作成されてもよい。
【0128】
3層フレームワーク(すなわち、ユーザ向け言語、中間レベル言語、および低レベル言語)が利用される実施形態では、UF言語からIL言語にマッピングするために関数テーブルが使用され得る。関数がUF言語で記述されると、対応するIL関数にコンパイル(すなわち、翻訳)される。対応するILは、1つまたは複数の他の(すなわち、異なる)IL関数、および/あるいは1つまたは複数のLL関数にマッピングされ、すなわち、1つのIL関数(たとえば、以下の例示的なセクションにおける「反転(reverse)」)は、IL関数と同等の動作を一緒に実行する低レベル関数のセットにマッピングされる。ここで、「低レベル」は、ユーザ向けレベルよりも低いレベルを意味する。低レベル関数のセットは、IL関数に関連付けられて関数テーブルに記憶される(以下の例示的なセクションでは、「長さ(length)」は異なるIL関数の例である)。
【0129】
次いで、ILスクリプトを生成および/または実行するために、関数テーブルが使用され得る。たとえば、IL関数への参照またはIL関数の識別子をILスクリプトに含めることができ、それにより、実行時に、マッピングされた低レベルの関数のセットが実行され得る。言い換えれば、識別子/参照は、低レベルの関数のセットを検索するために使用される。この例では、参照または識別子自体がIL関数であり、実行時に、1つまたは複数のLL関数と同等の動作を実行し、同様に、識別/参照された関数と同等の動作を実行するように構成されている。ILスクリプト自体は、対応するネイティブスクリプトに展開することができる。ここでも、低レベル関数のセットが関数テーブルから取得され、LL(すなわち、ネイティブ)関数のみに展開され得る。1つのIL関数を定義する低レベル関数のセット自体が、異なるIL関数、あるいはその異なるIL関数の識別子または参照を含み得る点に留意されたい。
【0130】
上で述べたように、同じIL言語にコンパイルできる複数の異なるUF言語(たとえば、PythonおよびJava)が存在し得る。異なるUF言語で記述された同じUF関数(すなわち、同じ動作を実行するように構成されているが、異なる言語で記述された関数)は、関数テーブルの同じ低レベル関数のセットにコンパイルされることが望ましいが、これは必須ではない。
【0131】
ノード104は、いくつかの小さい関数テーブル、たとえば異なる当事者(たとえば、ユーザまたはノード)によって生成された関数テーブルに基づいて、より大きい関数テーブルを生成し得る。全体的なテーブルは中央の当事者によって記憶され得、ノード104は全体的なテーブルを要求することによってそれらのテーブルを随時更新し得る。
【0132】
《ユーザ向け/最高レベルの言語》
ユーザ向け言語は人間が読取り可能であり、開発者にとって使いやすく、拡張性があり、中間レベル言語にコンパイルすることができる。ユーザ向け言語の例を以下に提供する。しかしながら、同じ中間レベル言語にコンパイルできる、複数の異なるユーザ向け言語が存在し得る。ブロックチェーントランザクションを作成するための高レベル言語にするために、Java、JavaScript、またはPythonなどの既存の言語を適応させることもできる。
【0133】
《中間レベル言語》
中間レベル言語は、帯域幅、ストレージ、および計算における効率を向上させるために、高レベル言語を低レベル言語(たとえば、オペコード)に接続する。以下では、この汎用中間レベル言語はメタスクリプトと呼ばれる。メタスクリプトの特徴は次のように要約することができる。
1.スペース効率-高レベル言語および低レベル言語よりもサイズがコンパクト、
2.実行可能-互換性のあるスクリプトエンジンによって直接実行することができる、
3.展開可能-低レベル言語(ネイティブスクリプト)に展開することができる、
4.決定的-同じメタスクリプトは常に同じネイティブスクリプトに展開される。
【0134】
さらに、同じ入力が与えられて直接実行されると、メタスクリプトは、メタスクリプトから展開ネイティブスクリプトを実行することによって生成される出力と同じ出力を生成する。
【0135】
開発者はユーザ向け言語でスクリプトを記述することができ、次いで、そのスクリプトは中間レベル言語スクリプト(メタスクリプト)にコンパイルされる。トランザクションは、メタスクリプトバージョンで送信および記憶され得る。トランザクションは、メタスクリプト、ネイティブスクリプト、またはハイブリッド方式で検証される(すなわち、ロック解除スクリプトとロックスクリプトの実行)。すなわち、ブロックチェーンノード104のメタスクリプトエンジンは、より多くの機能および効率を得るために、ネイティブスクリプトエンジンと対話することができる。
【0136】
ユーザ向け言語スクリプトは、低レベル言語スクリプト(ネイティブスクリプト)に直接変換され得る。しかしながら、中間レベル言語スクリプト(メタスクリプト)を導入することによって、ブロックチェーンノード104のユーザ向け言語スクリプトをネイティブスクリプトに変換する際の作業を可能な限り削減する。これにより、ノード104は、ブロックの生成(マイニング)などの他のより重要なアクティビティにリソースを集中できるようになる。例は、ユーザ向け言語スクリプト、中間レベル言語スクリプト、および低レベル言語スクリプトがどのように互いに異なり、様々な態様においてブロックチェーンスクリプトを改善するかを示している。
【0137】
以下に、本発明のいくつかの実施形態の具体例を提供する。これらの例はビットコインブロックチェーンについて言及しているが、これらの例は他のブロックチェーンにも一般的に適用される点に留意されたい。
【0138】
次の例では、ユーザ向け、中間レベル、および低レベルの3つの言語レベルを有するアーキテクチャについて説明している点にも留意されたい。これらの例では、スマートコントラクトはユーザ向け言語で記述され、中間レベル言語で記述されたメタスクリプトに変換され、さらにビットコインオペコード(すなわち、低レベル言語)に変換される。
【0139】
《トランザクションの作成》
アリスは、ロックスクリプト[High-Level script B]を作成するために、ユーザ向けのレベルスクリプト言語を使用することができる。
【0140】
次いで、ロックスクリプトは中間言語のメタスクリプトにコンパイルされ、トランザクションに埋め込まれる。
【表1】
【0141】
ここでいくつかの注意事項がある。
1.ロックスクリプト[High-Level script B]は、ユーザ向けスクリプト言語で記述されたコンパクトスクリプトである。これをユーザ向けロックスクリプトと呼ぶ。
2.ユーザ向けのロックスクリプトがメタスクリプトにコンパイルされる。
3.メタスクリプトごとに、ネイティブビットコインオペコードを備え、メタスクリプトと同等のネイティブロックスクリプトがある。すなわち、同じロック解除スクリプトを実行すると、常に同じ結果が生成される。この決定論的な挙動とその等価性は、テストと検証可能な計算を通じて実現され得る。
4.ネイティブロックスクリプトは数メガバイト、またはそれ以上の大きさになる可能性があるが、そのコンパクト形式は数バイト程度に抑えることができる。サイズの大きな違いは、トランザクションを伝搬して記憶する際にビットコインノードにとって有益である。
5.署名されていないトランザクションが最初に構築される(Table 1(表2))。トランザクションに署名すると、コンパクトロックスクリプトが低レベル言語ロックスクリプトに展開される(Table 2(表3))。
【表2】
【表3】
【表4】
【0142】
6.トランザクションに署名した後、ネイティブロックスクリプトがトランザクション内にまだ存在している間に、トランザクションIDを取得するためにトランザクションがシリアル化され、二重ハッシュされる。すなわち、TxID1は、コンパクトロックスクリプトではなく、展開ロックスクリプトに基づいて計算される。これによって、フォークレス性が実現され、すなわち、TxIDがネイティブのビットコインスクリプトに基づいて定義されているため、ブロックチェーンにおけるフォークが防止される。
【表5】
【0143】
7.いくつかのシナリオにおける整合性検証を容易にするために、コンパクトロックスクリプトのセカンダリトランザクションIDを署名前にトランザクションに埋め込むことができる。たとえば、TxID1-secondaryは、プリイメージが次のいずれかを備えるハッシュ値として定義することができる。
a.バージョンとロックタイム、
b.ロック解除スクリプトなしの入力、および
c.コンパクト形式のロックスクリプトを有する出力。
【0144】
これは、Table 5(表6)からTable 8(表9)に示されている。
【表6】
【表7】
【表8】
【表9】
【0145】
《トランザクションの伝搬》
上記のアリス103aによって作成されたトランザクションは、帯域幅を節約するためにコンパクト形式(メタスクリプト)で伝搬される。前述したように、展開ロックスクリプトと比較して、そのコンパクト形式は数桁小さくなる。これは、スクリプトのサイズが無制限で、各ブロックが数十億のトランザクション(およそ10分ごと)を含み得るビットコインSVエコシステムに特に関係する。
【0146】
今のところ、HLスクリプト言語を実行するように構成されたHL使用可能ビットコインノードと、そうではないHL使用不可能ビットコインノードの2つのタイプのノード104が存在すると仮定する。HL使用不可能ノードは、HL言語を認識し、単に機能を使用不可能にすることを選択したノードとは対照的に、HLスクリプト言語を意識せず、HL言語を使用するように構成されていない既存のノードである点に留意されたい。
【0147】
トランザクションの入力に署名するために使用される署名フラグに応じて(上記の説明を参照)、HL使用不可能ノードは、CLSを含むトランザクションが無効であるとみなす場合がある。すなわち、HL使用不可能ノードがトランザクションを受信すると、展開ロックスクリプトを使用して元のトランザクションを取得するメカニズムがないため、無効とみなし、破棄する。支出トランザクションのロック解除スクリプトの署名検証中に、署名されたメッセージはELS(HL使用不可能ノードがCLSから複製できない)を含むと想定されるため、トランザクションは無効とみなされる。これは、トランザクションIDは受信するが、トランザクションデータは受信しない場合と同じシナリオである。しかしながら、これらのノードからの受け入れの欠如は、HL使用可能ビットコインノードによってブロックが見つかった場合に対処することができる。HL使用不可能ノードは、アリスのトランザクションを含むブロックを受信する。アリスのトランザクションは、HL使用不可能ノードがそれらを記憶していないため、存在しないとみなされる。次いで、HL使用不可能ノードは、HL使用可能ノードにトランザクションを要求し得る。HL使用可能ノードは、コンパクトロックスクリプトを使用せずに完全なトランザクションを送信する。次いで、HL使用不可能ノードは、トランザクション全体を検証できるようになる。しかしながら、大多数のノードがHL使用可能である場合、アリスのトランザクションはネットワーク106の大部分によって受け入れられるため、HL使用可能ノードはそのような要求を無視することを選択することができる。
【0148】
いくつかの例では、署名がすべてのトランザクション出力に署名していない場合、CLSを含む出力が署名されていなければ、HL使用不可能ノードはHLトランザクションを有効とみなすことができる場合がある。その場合、HL使用不可能ノードは、CLSを使用して実際にトランザクションを検証することができる。しかしながら、この脆弱性は本発明に特有のものではなく、一般に、すべての出力に署名する署名フラグを備えた署名を有していない任意のトランザクション、たとえば、SIGHASH_ALLは出力が修正されると脆弱になる。
【0149】
HL使用可能ノードがトランザクションを受信すると、次の処理を実行する。
1.メタロックスクリプトを対応するネイティブロックスクリプトに変換し、以下を取得するために、ライブラリレジスタまたは参照テーブルを使用する。
【表10】
【0150】
2.トランザクションIDを取得するためにトランザクションデータをハッシュし、それがTxID1と同じかどうかをチェックする。
3.同じである場合、一般的な署名検証またはスクリプト検証に進む。
4.トランザクションが有効である場合、HL使用可能ノードはトランザクションをコンパクト形式でピアに伝搬する。
【0151】
HL使用不可能のノードが、HL使用可能ビットコインノードによって見つかったブロックを検証するとき、コンパクトロックスクリプトを使用したトランザクション、またはその観点から単に失われたトランザクションの完全なトランザクションデータを要求する。この場合、HL使用可能ノードは、展開ロックスクリプトを使用してそれらのトランザクションを送信する。これにより、HL使用不可能ノードがそれらのトランザクションを検証できるようになる。各コンパクトロックスクリプトは展開ロックスクリプトと同等であるため、HL使用可能ノードによって正常に検証されたトランザクションは、HL使用不可能ノードに対しても有効になる。
【0152】
《トランザクションの検証》
ユーザ、たとえばボブ103bが、アリス103aによって作成されたトランザクションを支出しようとしていると仮定する。彼は支出トランザクションを作成する。
【表11】
inputBが[Meta Script B]のロックを解除すると仮定し、ここで、inputBは、公開鍵PKBに関するボブSigBからのデジタル署名を含み得る。
【0153】
HL使用可能ノードとして、支出トランザクションを検証するため、または、より正確にはスクリプト"<inputB>[Meta Script B]"を検証するために、次のオプションのうちの1つを選択し得る。
1.コンパイルされたロックスクリプトを取得し、ネイティブスクリプトエンジンを使用して<inputB>[ビットコインオペコードにおける展開メタスクリプトB]を実行するためにSDLを使用する
2.<inputB>[Meta Script B]を実行して、オプション1と同じ結果を取得するために、SDLを使用する。
【0154】
オプション2は、HL使用不可能ノードよりもHL使用可能ノードに計算上の利点を提供する。SE1とSE2の2つのスクリプトエンジンがあるシナリオを考えてみる。
1.エンジンに同じ入力が与えられると、SE1とSE2の両方が同じ結果を生成する、および
2.SE2はSE1よりも効率的である(同じ入力が与えられた場合、結果を生成するのにかかる時間が短くなる)。
【0155】
ノードとして、SE1とSE2の間の切り替えはブロックチェーンプロトコルに影響を与えない。
【0156】
上記の理由を考慮すると、HL使用可能ノードは、スクリプト検証プロセスを最適化するために、ネイティブスクリプトエンジン(SE1として)とHLエンジン(SE2として)を切り替えることができる。
【0157】
《トランザクションの記憶》
HL使用可能ノードとして、スペースを節約するために、コンパクトロックスクリプトを使用してトランザクションを記憶することができる。一般性を失うことなく、トランザクションがtable 10(表12)のように存在すると仮定する。
【表12】
代わりに、セカンダリ識別子が第1の出力に追加され得、たとえば以下のようになる。
[smart contract]OP_FALSE OP_RETURN TxID1-secondary>。
【0158】
ネイティブオペコードに展開すると、ロックスクリプト[メタスクリプトBから展開されたビットコインオペコード]は数メガバイトになる可能性があるが、そのコンパクト形式(メタスクリプト)では、ロックスクリプトは数バイト程度になる可能性がある点に留意されたい。1つのブロック内にそのようなトランザクションが数十億件存在する場合(およそ10分ごと)、ストレージスペースの節約は大幅になる。
【0159】
さらに、デジタル署名によって整合性が保護されているセカンダリトランザクションIDを含めることで、対応する署名者が信頼されていると仮定して、コンパクトロックスクリプトをコンパイルせずにその整合性を検証することができる。
【0160】
図6は、トランザクションの生成から検証までの流れを示している。まず、トランザクションTx1がHLスクリプト言語を使用して生成されている。次いで、HLスクリプト言語が言語変換され、Txrawが生成される。次いで、Txrawに基づいてトランザクション識別子TxID1が生成される。トランザクション識別子TxID1とHLトランザクションTx1はブロックチェーンノード104に送信される。ノード104はトランザクション識別子TxID1とHLトランザクションTx1を受信する。HLスクリプト言語はLLスクリプト言語に変換され、結果として得られるトランザクションはトランザクション識別子TxID1'を生成するために使用される。受信したトランザクション識別子と生成したトランザクション識別子が比較される。それらが一致する場合、ノード104はトランザクションの検証を続行し、その逆も同様である。
【0161】
TxID1の送信は、ノード104がトランザクションジェネレータ(たとえば、アリス103a)とトランザクション検証ノード104によって使用されるマッピング(CLSからELSとELSからのCLS)の間の不一致を検出できるようにする、堅牢なエラーチェック機構として機能する。しかしながら、代替のエラーチェック機構を使用することもできる。TxID1を含めることにより、ノード104は、トランザクションのマッピングと検証を依然として実行しながら、マイニング動作(たとえば、TxID1に基づくマークルツリーの構築)を迅速に開始することもできる。
【0162】
図7は、生成から検証までの署名付きトランザクションの流れを示している。このフローは図6のフローと類似しているが、HLスクリプト言語からLLスクリプト言語への変換後にトランザクションに署名するという追加のステップがある。トランザクション識別子は、署名されたトランザクションに基づいている。まず、トランザクションロックスクリプトがトランザクションエンジン関数によって生成され、HL言語で記述される。これにより、まだ署名されていないコンパクトロックスクリプトを含むトランザクションTx1-unsignedが出力される。通常、トランザクション内のロック解除スクリプトにはトランザクションへの署名が必要である。トランザクションに署名するために、HL関数を同等のLL関数のセットに置き換える必要がある。Tx1-unsignedは、HL関数をネイティブLL数、たとえばオペコードに置き換えるマッピングモジュールに渡される。マッピングモジュールはTx1-unsignedを受け取り、Txraw-unsignedを出力し、これは署名モジュールに渡される。トランザクション署名モジュールはTxraw-unsignedを受け取り、署名されたトランザクションTxrawを出力する。Txrawは、トランザクションID TxIDを生成するために使用される。Txrawは再びマッピングモジュールに渡され、LL関数がHL関数に置き換えられる。次いで、送信者はTxIDとTx1を連結し、ブロックチェーンに送信する。受信者によって使用されるマッピングが送信者によって使用されるマッピングと同じであることをチェックするために、受信者はTx1をTxraw'にマッピングし、TxID'を生成して、それがTxIDと等しいかどうかをチェックする。それらが同じである場合、受信者はトランザクションの検証を続行することができる。TxIDは、このインスタンス化においてパリティチェックとして使用される。
【0163】
図8は、いくつかの実施形態によるデータの流れを示している。HL使用可能トランザクション作成者(たとえば、アリス103a)は、コンパクトロックスクリプトを有するトランザクションを生成する。この時点では、トランザクションは署名されていない。コンパクトロックスクリプトは展開スクリプトに置き換えられ、次いで署名される。署名されたトランザクションは、トランザクション識別子を生成するためにハッシュされる。展開ロックスクリプトは、コンパクトロックスクリプトに置き換えられ、両方がブロックチェーンネットワーク106に送信される。HL使用可能トランザクションバリデータ(たとえば、ノード104)は、トランザクションおよびトランザクション識別子を受信する。コンパクトロックスクリプトが展開ロックスクリプトに置き換えられ、次いで、候補トランザクション識別子を生成するためにトランザクションがハッシュされる。候補トランザクション識別子が受信したトランザクション識別子と比較され、それらが一致する場合、バリデータはトランザクションの検証に進む。一致しない場合、バリデータはトランザクションを破棄する。HL使用不可能トランザクションバリデータも示されている。トランザクションのコンパクトバージョンのみが受信された場合、HL使用不可能トランザクションバリデータはトランザクションを検証することができない。一方、展開トランザクションが受信された場合、HL使用不可能トランザクションバリデータはトランザクションを検証することができる。トランザクションがブロックチェーン上に公開されると、HL使用不可能バリデータは、トランザクションを検証するためにコンパイルされたトランザクションを要求する。
【0164】
《実施例》
このセクションは、開示されたフレームワークがどのように機能するかを示す3つの例のセットを提供する。第1のセットは、最高レベル(ユーザ向け)言語から中間レベル(メタスクリプト)言語に変換する際に関数テーブルを使用することの実用性と計算効率の利点に焦点を当てる。第2のセットは、メタスクリプト言語のコンパクトさに焦点を当てている。第3のセットは、より複雑ないくつかのスクリプトについての洞察を提供する。第3のセットはまた、高レベル言語で記述されたスクリプトを低レベルのネイティブスクリプト言語に直接変換できる方法を示す。
【0165】
《例示的なセット1》
この例は、関数テーブルを使用して、最高レベル言語で記述されたスクリプトをコンパクトメタスクリプトに変換できる方法を示している。例示的なスクリプトは、入力文字列の文字を反転する。
【表13】
次いで、最高レベル言語は中間レベル言語にコンパイルされ、そこで関数テーブルと変数テーブルが参照または作成される。関数テーブルと変数テーブルは分散されており、ローカルに記憶することができる。いくつかの例では、一旦作成されると、変数テーブルは読取りおよび書込み可能であるが、関数テーブルは読取りのみ可能である。例として、次のようなものがある。
【表14】
この例示的な関数テーブルには、関数ID 0と1を有する2つの関数がある。第1の関数は入力文字列のサイズを計算し、第2の関数は第1の関数を呼び出し、次いで文字列を反転する。
【0166】
関数1の説明は次のとおりである。
【0167】
この例示的な関数テーブルには、関数ID 0と1を有する2つの関数がある。第1の関数は入力文字列のサイズを計算し、第2の関数は第1の関数を呼び出し、次いで文字列を反転する。関数1の説明は次のとおりである。
【0168】
$0は、まだ提供されていないスクリプトへの第1の入力を参照する。スタックの一番上の項目になる可能性がある。
【0169】
0 MOP_FN_CALLは、関数テーブル内の関数ID 0の関数を呼び出す構文である。
【0170】
$0 0 MOP_FN_CALLを実行した後、入力の長さがスタックの先頭に残る。
【0171】
1 OP_SUBはスタックの一番上の値から1を減算し、結果をスタックの先頭に残す。
【0172】
0 MOP_SET_VARは、スタックの最上位要素を変数テーブル内のインデックス0の変数に割り当てる。この変数は残りの実行のために使用することができる。
【0173】
0 MOP_GET_VARは、変数テーブル内のインデックス0の変数の値をスタックの先頭にプッシュする。これは、変数テーブルから変数を取得するための構文である。
【0174】
MOP_LOOP OP_1 OP_SPLIT MOP_END_BLOCKはスタック上の第1の値を消費し、MOP_LOOPとMOP_END_BLOCKの間でコマンドをその回数だけループする。
【0175】
0 MOP_GET_VAR MOP_LOOP OP_1 OP_SPLIT MOP_END_BLOCKを実行した後、文字列は半角の部分文字列に分割される。
【0176】
同様に、0 MOP_GET_VAR MOP_LOOP OP_SWAP OP_CAT MOP_END_BLOCKは、入力文字列とは逆の文字列を形成するために、部分文字列の順序を入れ替えてそれらを連結する。
【0177】
変数テーブルの作成時に値を入力する必要はない点に留意されたい。これは関数実行のためのプレースホルダのように機能する。これにより、値を記憶し、実行中に渡すことができるようになる。
【0178】
「while」ループを使用しても同じ結果が得ることができる。
【表15】
【表16】
ここには1とCOUNTERという2つの変数がある。COUNTERは、デフォルト値を持つ予約変数にできることを提案する。すなわち、メタスクリプトにおいてCOUNTERを直接呼び出すことができる。「while」ループにおいて呼び出される場合、値は0から始まり、ループごとに1ずつ増加する。
【0179】
次に、「while」ループがどのように機能するかを説明する。
【0180】
MOP_LOOP_IF COUNTER 0 MOP_GET_VAR LESSTHAN MOP_END_BLOCKは、カウンタがインデックス0の変数より小さい場合、ループを開始する。カウンタはデフォルト値を有する予約変数である。すなわち、メタスクリプト内でCOUNTERを直接呼び出すことができる。実行されたループを暗黙的にカウントする。0から始まり、毎回1ずつ増加する。カウンタが高レベル言語またはデフォルト値によって設定された最大値に達するか、条件が満たされない場合、実行は「while」ループを終了する。この場合、インデックス0の変数は入力文字列の長さである。一般に、MOP_LOOP_IFの後には任意の条件を続けることができ、条件はMOP_END_BLOCKで終了する。
【0181】
OP_1 OP_SPLITは条件が満たされたた場合に繰り返し実行される。高レベル言語で定義されたすべての単語を含めないオプションがあることを示すために、関数テーブルにこれを含めなかった点に留意されたい。一般的な方法としては、関数が頻繁に参照される場合は、その関数を関数テーブルに含める。
【0182】
MOP_END_BLOCKは、繰り返されるコードの終わりを示している。
【0183】
MOP_LOOP_IF COUNTER 1 MOP_GET_VAR LESSTHAN MOP_END_BLOCK OP_1 OP_SPLIT MOP_END_BLOCKを実行した後、文字列は半角の部分文字列に分割される。
【0184】
同様に、MOP_LOOP_IF COUNTER 1 MOP_GET_VAR LESSTHAN MOP_END_BLOCK OP_SWAP OP_CAT MOP_END_BLOCKは、入力文字列とは逆の文字列を形成するために、部分文字列の順序を入れ替えてそれらを連結する。
【0185】
《中レベル言語(メタスクリプト)》
逆関数に「I am fish」という文字列を入力したと仮定すると、メタスクリプトは次のようになる。
【表17】
【0186】
次いで、メタスクリプトはトランザクションに(ロックスクリプトとして)埋め込まれる。トランザクションはメタスクリプト形式で送信および記憶される。
【0187】
メタスクリプトは、関数テーブルのセクションで説明されているように、メタスクリプトエンジンを使用して直接実行することができる。MOP_FN_CALL 1は、関数テーブルにおける関数1を呼び出す。「I am fish」は関数への入力である。出力は入力文字列の逆になる。
【0188】
トランザクションIDを生成したり、署名を検証したり、関数テーブルを指定してネイティブスクリプトエンジンで実行したりするために、メタスクリプトをネイティブ形式に展開することもできる。
【0189】
この例示的なスクリプトを展開する場合、入力(ロック解除スクリプト)がスクリプトの作成者に知られているか、または無限ループを防ぐためにスクリプトの作成者によってループの最大カウンタが設定されていると仮定する。
【0190】
《低レベル言語(たとえば、ビットコインオペコード)》
メタスクリプトを展開すると、すべてのループが解かれ、ネイティブオペコードのみが許可される。例として、前の例示的なメタスクリプトに対応する次のネイティブスクリプトがある。
【表18】
正規スクリプトのサイズは、入力文字列のサイズに対して直線的に増加する点に留意されたい。しかしながら、メタスクリプトのサイズはほぼ一定であり、入力文字列のサイズには依存しない。これは、メタスクリプトフレームワークによってストレージと帯域幅が大幅に節約されることを示している。
【0191】
《例示的なセット2》
・文字列を反転する
この第1の例では、入力文字列内の文字も反転する。この例は、説明した関数テーブルを使用せずに同じ関数をどのように実現できるかを示している。この例では、高レベルの逆関数がメタスクリプトにコンパイルされる。たとえば、コンパイラは、関数「reverse()」を読み取り、対応するメタスクリプトをコンパイルするように構成されている。特定の例として、高レベル関数のメタスクリプトへのマッピングは、コンパイラがアクセス可能なメモリに記憶され得る。
【0192】
高レベル言語(すなわち、ユーザ向け言語)
【表19】
txtファイル(ソースコード)として保存された場合は31バイト
中間レベル言語(メタスクリプト):
【表20】
【表21】
例として、meta_loopにはc0、one_splitにはd1、swap_catにはe2を使用する。「76 09」は、9バイトのデータをスタックの先頭にプッシュする点に留意されたい。
2(プッシュデータ)+9(データ)+6=メタスクリプトにおける17バイト
高レベル言語からコンパイルする場合、メタスクリプトは文字列を逆にするために必要なループ数をコンパイラから取得する。この場合、ループ数は文字列の長さ-1になる。
【0193】
低レベル言語(ビットコインオペコード/ネイティブスクリプト)
【表22】
2(op_pushdataとデータサイズ)+9(データ)+32=43バイト
【0194】
コンパイル時に関数への入力が利用できない場合、ループ数も利用できない可能性がある。この場合、メタスクリプトは、ロック解除スクリプトから情報を取得するか、デフォルトの最大値を仮定するように設計される。たとえば、
高レベル言語におけるロックスクリプト(関数):reverse()
メタスクリプト内のロックスクリプト(関数):meta_var meta_assignVar meta_var meta_loop one_split meta_var meta_loop swap_cat
ロック解除スクリプト(関数への入力)は<I am fish>8にすることができる。
【0195】
ビットコインオペコード(ネイティブスクリプト)に変換する前に、「8 meta_var meta_assignVar」は値「8」を「meta_var」という名前の変数に割り当てる。この割当ての後、「meta_var」が出現するたびに、「8」に置き換えられる。したがって、入力が与えられるとすぐに、上記と同じメタスクリプトが作成される。変数を割り当てるために追加の2バイトを導入しただけであるという点に留意されたい。
【0196】
・最大公約数
この例では、関数は2つの整数の最大公約数(GCD)を見つける。
高レベル言語:
【表23】
17バイト
【0197】
中間レベル言語:
【表24】
【表25】
13バイト
【0198】
低レベル言語:
【表26】
49バイト
【0199】
数が多い場合、節約はさらに重要になる。
【0200】
また、楕円曲線の点加算およびスカラ倍算などの複雑な関数を扱う場合、メタスクリプト(中間レベル言語)では10バイト規模、ネイティブスクリプト(低レベル言語)では数メガバイト規模になる。
【0201】
《変数の割当て》
メタスクリプトにおいてメタ変数を割り当てる方法を簡単に説明した。このセクションでは、ネイティブスクリプトにおいて変数を割り当てるメカニズムを紹介する。
高レベル言語:
var=5
return var+var
【0202】
中間レベル言語
5 var meta_assign var op_add
【0203】
低レベル言語
5 OP_TOALTSTACK OP_FROMALTSTACK OP_DUP OP_TOALTSTACK OP_FROMALTSTACK OP_DUP OP_TOALTSTACK OP_ADD
【0204】
ネイティブスクリプト(ビットコインオペコードなど)に変換する場合、「5 var meta_assign」は「5 OP_TOALTSTACK」になり、値「5」を「var」という名前の変数に割り当てる。この割当ての後、「var」が出現するたびに、「OP_FROMALTSTACK OP_DUP OP_TOALTSTACK」に変換される。altスタックは、すべての変数を(順序付きリストとして)記憶するためのスタックになる。
【0205】
《例示的なセット3》
次の例では、HLスクリプトはLLスクリプトに直接変換され、すなわち、スクリプト言語のレベルは高レベルと低レベルの2つだけである。
【0206】
《最大公約数(GCD)》
GCDは、2つの整数a、bを入力として受け取り、GDC(a、b)を出力する関数である。これは、次のように説明できるユークリッドアルゴリズムを使用して実現される。
1.a=x、b=yとする
2.x、yが与えられた場合、x=yq+r、0≦r<|y|と記述するために、除算アルゴリズムを使用する
3.r=0の場合、停止してyを出力する。これはa、bのgcdである。
4.r≠0の場合、(x、y)を(y、r)に置き換える。ステップ2に進む。
【0207】
上記のアルゴリズムは、高レベルプログラミング言語を使用して容易に記述および実行することができる。しかしながら、ビットコインオペコードスクリプトを使用してユークリッドアルゴリズムを実行するのは容易な作業ではない。展開されたスクリプトはループが許可されていないため、OP_IFステートメントを繰り返し使用して各ループを記述する必要がある。
【0208】
次のスクリプトは、メインスタックにおける最上位2桁x、yを取得し、yが最上位であり、スタックにy、rを残し、x=yq+rである。
【表27】
アルゴリズムは次のように記述することができる。
【表28】
【0209】
上の例では、3つのループにおいて計算できる場合、2つの正の整数のGCDを求める。入力にさらに多くのループが必要な場合、より多くのifステートメントを記述する必要がある。これは、アリスがアルゴリズムを実行したいときに入力が事前にわからない場合、入力の範囲に対応できる十分な大きさのIFステートメントの最大数を定義する必要があることを意味する。これを100以上に設定したいと思い、コンパイルされたスクリプトにおいて非常に大規模なトランザクションが発生する場合はどうなるだろうか。
【0210】
この例では、アリスは最大反復回数を指定する必要があり、SDL使用可能ノードは、展開スクリプトにおいて正確なトランザクションを生成することができる。
【0211】
上記のアルゴリズムを関数/ライブラリ関数/forthワードとして定義した場合、次のように記述する。
スタックの初期状態:<a><b>
スタックの最終状態:<b><r>、
Altstackの初期状態:未使用
Altstackの最終状態:未使用
計算:a=qb+r、またはr=a mod b
【0212】
FUNCTION_1-<a>を受け取り、<b>は<r><q>を返し、a=b*q+rである
スタックの初期状態:<a><b>//<b>はスタックの先頭である
スタックの最終状態:<q>
Altstackの初期状態:未使用
Altstackの最終状態:<d><b>//<b>はaltstackの先頭である
OP_TUCK OP_2DUP OP_MOD OP_DUP OP_TOALTSTACK OP_SWAP
OP_TOALTSTACK OP_SUB
OP_SWAP OP_DIV
【0213】
上記は、HL言語でHL関数として次のように記述することができる。
HL関数qr(){TUCK 2DUP MOD DUP TAS SWAP TAS-SWAP/}
【0214】
HLスクリプト言語を使用すると、HL関数を定義することができる。また、ユーザフレンドリかつ効率的な方法でOP_CODESを記述することもできる。上の例では、TUCK DUP SWAPはOP_TUCK OP_DUP OP_SWAPに相当し、FASおよびTASはOP_FROMALTSTACKおよびOP_TOALTSTACKに相当し、+ - */%はOP_ADD OP_SUB OP_MUL OP_DIVおよびOP_MODなどに相当する。
【0215】
HL関数qr()は、メインスタックの上位2つの値を取得し、商と剰余を返す。すなわち、<a>と<b>を取得し、<q>と<r>を計算し、a=b*q+r*/である。
【0216】
FUNCTION_2-拡張ユークリッドアルゴリズムのパラメータsi=si-2-si-1qiおよびti=ti-2-ti-1qiを計算するための1つのループ。この例は、初期値si-2、ti-2、si-1、ti-1、qiを使用してスタックを開始する。アルゴリズムはi=2から始まり、s0=1、t0=0、s1=0、t1=1となる。
スタックの初期状態:<si-2><ti-2><si-1><ti-1><qi>//<qi>はスタックの先頭である
スタックの最終状態:<si-1><ti-1><si><ti>
Altstackの初期状態:未使用
Altstackの最終状態:未使用
OP_DUP 3 OP_PICK OP_MUL 5 OP_ROLL OP_SWAP OP_SUB OP_SWAP
2 OP_PICK OP_MUL 4 OP_ROLL OP_SWAP OP_SUB
【0217】
上記はHL言語で次のように記述することができる。
HL関数st(){DUP 3 PICK * 5 ROLL SWAP - SWAP 2 PICK * 4 ROLL SWAP-}
HL関数st()は、以下の拡張ユークリッドアルゴリズムの計算において使用されるパラメータsとtを計算する。
【0218】
《拡張ユークリッドアルゴリズム》
この関数は<a><b>を受け取り、sn、tn gcd(a,b)を計算し、gcd(a,b)=sna+tnbである
スタックの初期状態:<a><b>//<b>はスタックの先頭であり、a>bであり、両方とも+ve整数である
スタックの最終状態:<sn><tn>gcd(a,b)//スタック先頭のgcd(a,b)
Altstackの初期状態:未使用
Altstackの最終状態:…
<a><b> FUNCTION_1
1 0 0 1 4 OP_ROLL
FUNCTION_2
OP_FROMALTSTACK OP_FROMALTSTACK OP_DUP OP_IF
FUNCTION_1 FUNCTION_2
OP_FROMALTSTACK OP_FROMALTSTACK OP_DUP OP_IF
FUNCTION_1 FUNCTION_2
OP_FROMALTSTACK OP_FROMALTSTACK OP_DUP OP_IF
FUNCTION_1 FUNCTION_2


OP_ENDIF
OP_ENDIF
OP_ENDIF
OP_DROP OP_NIP OP_NIP
【0219】
HL関数EEAは拡張ユークリッドアルゴリズムである。この例では、単語qr()と単語st()をループにおいて25回実行する。
HL function qr(){TUCK 2DUP MOD DUP TAS SWAP TAS - SWAP/}
HL function st(){DUP 3 PICK * 5 ROLL SWAP - SWAP 2 PICK * 4 ROLL SWAP-}
HL function EEA(a, b){
a b qr() 1 0 0 1 4 ROLL st() FAS
let l=25
loop (l) {DUP IF qr() st() FAS ENDIF}
DROP NIP NIP}
EEA (in1 , in2)
【0220】
これはHLスクリプト言語コードの例である。関数を最大25回繰り返すために、ループを使用する。これは、変数lを単に変更することによって、さらに多くの回数に設定することができる。たとえば、lは必要に応じて100番台または1000番台の回数を設定され得る。CLSのサイズは変更されないが、対応するELSのサイズはメガバイトになる。
【0221】
《結論》
開示された技法の他の変形または使用事例は、本明細書の開示が与えられれば、当業者には明らかになり得る。本開示の範囲は、記載された実施形態によって限定されるものではなく、添付の特許請求の範囲によってのみ限定される。
【0222】
たとえば、上記のいくつかの実施形態は、ビットコインネットワーク106、ビットコインブロックチェーン150、およびビットコインノード104に関して説明されている。しかしながら、ビットコインブロックチェーンはブロックチェーン150の特定の一例であり、上記の説明は一般に任意のブロックチェーンに適用し得ることが理解されるであろう。すなわち、本発明は決してビットコインブロックチェーンに限定されるものではない。より一般的には、ビットコインネットワーク106、ビットコインブロックチェーン150、およびビットコインノード104に対する上記の言及は、それぞれ、ブロックチェーンネットワーク106、ブロックチェーン150、およびブロックチェーンノード104の言及と置き換えられ得る。ブロックチェーン、ブロックチェーンネットワーク、および/またはブロックチェーンノードは、上述のように、ビットコインブロックチェーン150、ビットコインネットワーク106、およびビットコインノード104の記載された特性のうちのいくつか、またはすべてを共有し得る。
【0223】
本発明の好ましい実施形態では、ブロックチェーンネットワーク106はビットコインネットワークであり、ビットコインノード104は、ブロックチェーン150のブロック151を作成、公開、伝搬、および記憶する上述の機能の少なくともすべてを実施する。これらの機能のすべてではなく、1つまたは一部のみを実施する他のネットワークエンティティ(または、ネットワーク要素)が存在する可能性も排除されない。すなわち、ネットワークエンティティは、ブロックを作成および公開することなく、ブロックを伝搬および/または記憶する機能を実施し得る(これらのエンティティは、好ましいビットコインネットワーク106のノードとはみなされないことを思い出されたい)。
【0224】
本発明の他の実施形態では、ブロックチェーンネットワーク106はビットコインネットワークでなくてもよい。これらの実施形態では、ノードが、ブロックチェーン150のブロック151を作成、公開、伝搬、および記憶する機能のすべてではないが、少なくとも1つまたはいくつかを実施し得ることを排除するものではない。たとえば、それらの他のブロックチェーンネットワークでは、「ノード」は、ブロック151を作成および公開するが、それらのブロック151を記憶および/または他のノードに伝搬しないように構成されたネットワークエンティティを指すために使用され得る。
【0225】
さらにより一般的には、上記の「ビットコインノード」104という用語への言及は、「ネットワークエンティティ」または「ネットワーク要素」という用語に置き換えられてよく、そのようなエンティティ/要素は、ブロックの作成、公開、伝搬、および記憶の役割のいくつか、またはすべてを実施するように構成されている。そのようなネットワークエンティティ/要素の機能は、ブロックチェーンノード104を参照して上で説明したのと同じ方法で、ハードウェアに実装され得る。
【0226】
上記の実施形態は、単なる例として説明されたものであることが理解されよう。より一般的には、以下のステートメントのいずれか1つまたは複数に従って、方法、装置、またはプログラムが提供され得る。
【0227】
ステートメント1.ブロックチェーントランザクションを生成するコンピュータ実装方法であって、第1の当事者によって実施され、
第1のブロックチェーントランザクションを生成するステップであって、第1のブロックチェーントランザクションが第1のコンパクトスクリプト(CS)を備え、第1のCSが、少なくとも部分的に高レベル(HL)スクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実施されるそれぞれの動作と同等の動作を実施するように構成され、第1のCSが、LLスクリプト言語で記述され、複数のLL関数を備える第1の展開スクリプト(ES)と同等の動作を実施するように構成され、第1のCSが、第1のESよりストレージサイズが小さい、ステップと、
第1のブロックチェーントランザクションをブロックチェーンネットワークの1つまたは複数のノードおよび/または第2の当事者が利用できるようにするステップと
を備える、コンピュータ実装方法。
【0228】
LLスクリプト言語は、ネイティブのブロックチェーンスクリプト言語である。
【0229】
第2の当事者は、トランザクションを第1の当事者に返す前、または第1のトランザクションをブロックチェーンネットワークに送信する前に、第1のトランザクションに署名し得る。
【0230】
第1のCSは完全にHLスクリプト言語で記述され得る。あるいは、第1のCSは、部分的にHLスクリプト言語で記述され、部分的に別のスクリプト言語、たとえばLLスクリプト言語で記述されてもよい。
【0231】
HLスクリプト言語およびLLスクリプト言語の一方または両方は、スタックベースのスクリプト言語であり得る。
【0232】
ステートメント2.HLスクリプト言語が、ユーザ向け(UF)スクリプト言語とLLスクリプト言語との間の中間レベル(IL)スクリプト言語であり、HL関数がIL関数である、ステートメント1に記載の方法。
【0233】
言い換えれば、UFスクリプト言語は最高レベルのスクリプト言語である。UFスクリプト言語は、スタックベースのスクリプト言語であってもよい。
【0234】
ステートメント3.第1のブロックチェーントランザクションを生成するステップが、
第1のUFスクリプト(UFS)を生成するステップであって、第1のUFSが、少なくとも部分的にUFスクリプト言語で記述され、1つまたは複数のUF関数を備え、実行されると、各UF関数が、1つまたは複数のIL関数によって実施されるそれぞれの動作と同等の動作を実施するように構成される、ステップと、
第1のUFSを第1のCSに変換するステップと
を備える、ステートメント2に記載の方法。
【0235】
第1のUFSは、第1のCSおよび/または第1のESよりストレージサイズが小さくてもよい。
【0236】
第1のUFSは完全にUFスクリプト言語で記述され得る。あるいは、第1のUFSは、部分的にUFスクリプト言語で記述され、部分的に別のスクリプト言語、たとえばILスクリプト言語および/またはLLスクリプト言語で記述されてもよい。
【0237】
第1のUFSを第1のCSに変換するステップは、第1のUFSを第1のCSにコンパイルするステップを備える。
【0238】
ステートメント4.関数テーブルが関数マッピングのリストを備え、各関数マッピングが、1つまたは複数の他のIL関数および/あるいは1つまたは複数のLL関数のセットにマッピングされたそれぞれのIL関数を備え、第1のUFSから第1のCSに変換する前記ステップが、関数テーブルにリストされている関数マッピングに基づく、ステートメント3に記載の方法。
【0239】
ステートメント5.関数テーブルが、それぞれがそれぞれのIL関数を識別する1つまたは複数の関数識別子を備え、第1のCSが、1つまたは複数の第1のデータペアを備え、各第1のデータペアが、それぞれのIL関数識別子および呼出し関数を備え、実行されると、呼出し関数が、それぞれのIL関数識別子によって識別されるIL関数にマッピングされた1つまたは複数の他のIL関数および/あるいは1つまたは複数のLL関数のセットを実行するように構成される、ステートメント4に記載の方法。
【0240】
ステートメント6.関数テーブルの少なくとも一部が第1の当事者によって作成され、本方法が、関数テーブルの少なくとも一部を、ブロックチェーンネットワークの1つまたは複数のノードおよび/または第2の当事者が利用できるようにするステップを備える、ステートメント5に記載の方法。
【0241】
ステートメント7.関数テーブルの少なくとも一部が、第1の当事者以外の当事者によって作成され、本方法が、関数テーブルの前記少なくとも一部を取得するステップを備える、ステートメント4またはステートメント4の記載を引用するステートメントのうちのいずれか1つに記載の方法。
【0242】
ステートメント8.関数テーブルの前記少なくとも一部がブロックチェーンノードによって作成され、取得する前記ステップが関数テーブルの前記少なくとも一部をブロックチェーンノードから受信するステップを備える、ステートメント7に記載の方法。
【0243】
ステートメント9.変数テーブルが1つまたは複数の変数識別子を備え、各変数識別子に関連付けて変数を記憶するように構成され、第1のCSが、1つまたは複数の第2のデータペアを備え、各第2のデータペアが、それぞれの変数識別子と、読取り関数または書込み関数のいずれかを備え、実行されると、読取り関数が、それぞれの変数識別子に関連付けて記憶されている変数テーブルから変数を読み取るように構成されており、実行されると、書込み関数が、それぞれの変数識別子に関連付けて記憶するために、第1のCSの実行中に生成された変数を変数テーブルに書き込むように構成されている、ステートメント3またはステートメント3の記載を引用するステートメントのうちのいずれか1つに記載の方法。
【0244】
たとえば、書込み関数により、現在スタックの最上位にある変数が変数テーブルに記述されることがある。同様に、読取り関数により、変数テーブルに記憶されている変数がスタックの先頭にプッシュされる場合がある。
【0245】
関数テーブルは、第1の当事者によって作成され、ブロックチェーンネットワークの1つまたは複数のノードおよび/または第2の当事者が利用できるようにされ得る。あるいは、変数テーブルは別の当事者によって作成され、第1の当事者に送信されてもよい。
【0246】
ステートメント10.
第1のトランザクション識別子を生成するステップであって、第1のトランザクション識別子が、第1のブロックチェーントランザクションの修正バージョンに基づいて生成され、第1のブロックチェーントランザクションのこの修正バージョンが、第1のCSの代わりに第1のESを備える、ステップと、
トランザクション識別子をブロックチェーンネットワークの1つまたは複数のノードが利用できるようにするステップと
を備える、ステートメント1から9のいずれか1つに記載の方法。
【0247】
第1のトランザクション識別子は、第1に第1のブロックチェーントランザクションの修正バージョンをシリアル化し、次いで、そのシリアル化された修正バージョンのハッシュまたは二重ハッシュを計算することによって生成され得る。
【0248】
ステートメント11.第1のトランザクション識別子を生成する前記ステップが、
第1のブロックチェーントランザクションを生成するステップと、
第1のトランザクション識別子を生成するための第1のブロックチェーントランザクションの修正バージョンを生成するために、第1のCSを第1のESに置き換えるステップと
を備える、ステートメント10に記載の方法。
【0249】
言い換えれば、第1のCSは第1のESに変換(すなわち、展開)される。
【0250】
ステートメント12.第1のブロックチェーントランザクションをブロックチェーンネットワークの1つまたは複数のノードが利用できるようにする前記ステップの前に、第1のESを第1のCSに置き換えるステップを備える、ステートメント11に記載の方法。
【0251】
ステートメント13.第1のブロックチェーントランザクションを生成する前記ステップが、
第1のブロックチェーントランザクションの修正バージョンを生成するステップと、
第1のESを第1のCSに置き換えることによって、第1のブロックチェーントランザクションを生成するステップと
を備える、ステートメント3に記載の方法。
【0252】
ステートメント14.第1のブロックチェーントランザクションが、第1のトランザクション識別子とともにブロックチェーンネットワークの1つまたは複数のノードで利用可能になる、ステートメント10またはステートメント10の記載を引用するステートメントのうちのいずれか1つに記載の方法。
【0253】
たとえば、第1のブロックチェーントランザクションは第1のトランザクション識別子と連結され得る。
【0254】
ステートメント15.第1のブロックチェーントランザクションが第1の入力を備え、第1の入力が第1のブロックチェーントランザクションの修正バージョンに基づいて生成された署名を備える、ステートメント1から14のいずれか1つに記載の方法。
【0255】
より具体的には、署名は、第1のCSではなく第1のESを備える第1のブロックチェーントランザクションの修正バージョンに基づいて生成される。
【0256】
ステートメント16.第1のブロックチェーントランザクションが、以下のフィールド、
第1のブロックチェーントランザクションのバージョン番号と、
第1のブロックチェーントランザクションのロックタイムと、
第1のブロックチェーントランザクションの1つまたは複数の入力と、
ロック解除スクリプトを備えない第1のブロックチェーントランザクションの1つまたは複数の入力と、
それぞれのCSを備える第1のブロックチェーントランザクションの1つまたは複数の出力と
のうちの1つまたは複数に基づくセカンダリトランザクション識別子を備える、ステートメント1から15のいずれか1つに記載の方法。
【0257】
たとえば、セカンダリ識別子は、それらのフィールドのうちの1つまたは複数のハッシュ(たとえば、二重ハッシュ)に基づいて生成され得る。
【0258】
ステートメント17.署名の基礎となる第1のブロックチェーントランザクションの修正バージョンが、セカンダリトランザクション識別子を備える出力を備える、ステートメント11および12に記載の方法。
【0259】
ステートメント18.1つまたは複数のブロックチェーンクライアントアプリケーションが第1のブロックチェーントランザクションを利用できるようにするステップを備える、ステートメント1から17のいずれか1つに記載の方法。
【0260】
ステートメント19.第1のブロックチェーントランザクションを第1の当事者によって動作されるコンピューティング機器のメモリに記憶するステップを備える、ステートメント1から18のいずれか1つに記載の方法。
【0261】
メモリはハードドライブであり得る点に留意されたい。
【0262】
ステートメント20.HL関数のうちの少なくとも1つによって実施される演算が、複数のLL関数によって実施される演算と同等である、ステートメント1から19のいずれか1つに記載の方法。
【0263】
いくつかの実施形態では、HL関数のうちの少なくともいくつかによって実施されるそれぞれの演算は、複数のLL関数のそれぞれによって実施される演算と同等であり得る。いくつかの実施形態では、HL関数の各々によって実施されるそれぞれの演算は、複数のLL関数のそれぞれによって実施される演算と同等であり得る。
【0264】
ステートメント21.第1のCSが第1のコンパクトロックスクリプト(CLS)であり、第1のESが第1の展開ロックスクリプト(ELS)である、ステートメント1から20のいずれか1つに記載の方法。
【0265】
ステートメント22.第1のUFスクリプトが、第1のユーザ向けロックスクリプト(UFLS)である、ステートメント2および21に記載の方法。
【0266】
ステートメント23.第1のCSが第1のコンパクトロック解除スクリプト(CLS)であり、第1のESが第1の展開ロック解除スクリプト(ELS)である、ステートメント1から20のいずれか1つに記載の方法。
【0267】
ステートメント24.第1のUFスクリプトが、第1のユーザ向けロック解除スクリプト(UFLS)である、ステートメント2および23に記載の方法。
【0268】
ステートメント25.ブロックチェーントランザクションを検証するコンピュータ実装方法であって、本方法が、ブロックチェーンネットワークのノードによって実施され、ノードが、高レベル(HL)スクリプト言語で記述されたスクリプトを実行するように構成され、ブロックチェーンが、第1のブロックチェーントランザクションを備え、第1のブロックチェーントランザクションが、第1のコンパクトロックスクリプト(CLS)を備える第1の出力を備え、第1のCLSが、少なくとも部分的にHLスクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実施されるそれぞれの動作と同等の動作を実施するように構成され、第1のCLSが、LLスクリプト言語で記述され、複数のLL関数を備える第1の展開ロックスクリプト(ELS)と同等の動作を実施するように構成され、第1のCLSが、第1のELSよりストレージサイズが小さく、本方法がブロックチェーンノードによって実施され、
第2のブロックチェーントランザクションを取得するステップであって、第2のブロックチェーントランザクションが、第1のロック解除スクリプトを備える第1の入力を備える、ステップと、
第2のブロックチェーントランザクションを検証するステップと
を備え、第2のブロックチェーントランザクションを検証する前記ステップが、
第1のブロックチェーントランザクションを取得するステップを備え、
a)第1のCLSを第1のELSに置き換え、次いで、第1のロック解除スクリプトを第1のELSとともに実行するステップであって、第2のトランザクションが有効である条件が、前記実行が成功することである、ステップ、または、
b)第1のロック解除スクリプトを第1のCLSとともに実行するステップであって、第2のトランザクションが有効である条件が、前記実行が成功することである、ステップを備える、コンピュータ実装方法。
【0269】
第1のCLSをESに置き換えるステップは、第1のCLSを第1のESに変換(たとえば、展開)することを備える。
【0270】
ステートメント26.第2のブロックチェーントランザクションが有効であることを条件として、第2のブロックチェーントランザクションをブロックチェーンネットワークの1つまたは複数の他のノードに送信する、および/あるいは第1のブロックチェーントランザクションをノードのメモリに記憶するステップを備える、ステートメント25に記載の方法。
【0271】
ステートメント27.第2のブロックチェーントランザクションが第2の当事者によって生成され、第2のブロックチェーントランザクションを取得する前記ステップが、第2の当事者から第2のブロックチェーントランザクションを受信するステップを備える、ステートメント25または26に記載の方法。
【0272】
ステートメント28.ノードのメモリから第1のブロックチェーントランザクションを取得するステップを備える、ステートメント24から26のいずれか1つに記載の方法。
【0273】
ステートメント29.第2のブロックチェーントランザクションが第2のCLSを備える第2の出力を備え、第2のCLSがHLスクリプト言語で記述され、第2のCLSがLLスクリプト言語で記述された第2のELSと同等の動作を実施するように構成され、第2のCLSが第2のELSよりストレージサイズが小さく、第2のブロックチェーントランザクションを検証するステップが、
第2の候補トランザクション識別子を取得するステップと、
第2のブロックチェーントランザクションの修正バージョンを生成するステップであって、第2のブロックチェーントランザクションのこの修正バージョンでは、第2の出力が第2のCSの代わりに第2のESを備える、ステップと、
第2のトランザクション識別子を生成するステップであって、第2のトランザクション識別子が、第2のブロックチェーントランザクションの修正バージョンに基づいて生成される、ステップと、
第2の候補トランザクション識別子と第2のトランザクション識別子を比較するステップであって、第2のブロックチェーントランザクションが有効である条件が、第2の候補トランザクション識別子が第2のトランザクション識別子と一致することである、ステップと
を備える、ステートメント25から28のいずれか1つに記載の方法。
【0274】
ステートメント30.第1のCLSまたは第1のELSとともに第1のロック解除スクリプトを実行する前記ステップの前に、第2の候補トランザクション識別子と第2のトランザクション識別子との前記比較を実施するステップを備える、ステートメント29に記載の方法。
【0275】
ステートメント31.HLスクリプト言語が、ユーザ向け(UF)スクリプト言語とLLスクリプト言語との間の中間レベル(IL)スクリプト言語であり、HL関数がIL関数であり、関数テーブルが関数マッピングのリストを備え、各関数マッピングが、1つまたは複数の他のIL関数および/あるいは1つまたは複数のLL関数のセットにマッピングされたそれぞれのIL関数を備え、
a)第1のCLSを第1のELSに置き換える前記ステップが、関数テーブルにリストされている関数マッピングに基づいている、または、
b)第1のCLSとともに第1のロック解除スクリプトを実行する前記ステップが、関数テーブルにリストされている関数マッピングに基づいている、ステートメント25から30のいずれか1つに記載の方法。
【0276】
ステートメント32.関数テーブルが、それぞれがそれぞれのIL関数を識別する1つまたは複数の関数識別子を備え、第1のCSが、1つまたは複数の第1のデータペアを備え、各第1のデータペアが、それぞれのIL関数識別子および呼出し関数を備え、実行されると、呼出し関数が、それぞれのIL関数識別子によって識別されるIL関数にマッピングされた1つまたは複数の他のIL関数および/あるいは1つまたは複数のLL関数のセットを実行するように構成される、ステートメント25またはステートメント25の記載を引用するステートメントのうちのいずれか1つに記載の方法。
【0277】
ステートメント33.関数テーブルの少なくとも一部が第1の当事者によって作成され、本方法が、関数テーブルの少なくとも一部を第1の当事者から受信するステップを備える、ステートメント31または32に記載の方法。
【0278】
ステートメント34.異なる当事者から関数テーブルの異なる部分を受信するステップを備える、ステートメント31またはステートメント31の記載を引用するステートメントのうちのいずれか1つに記載の方法。
【0279】
ステートメント35.関数テーブルの少なくとも一部を作成するステップを備える、ステートメント31またはステートメント31の記載を引用するステートメントのうちのいずれか1つに記載の方法。
【0280】
ステートメント36.変数テーブルが1つまたは複数の変数識別子を備え、各変数識別子に関連付けて変数を記憶するように構成され、第1のCSが、1つまたは複数の第2のデータペアを備え、各第2のデータペアが、それぞれの変数識別子と、読取り関数または書込み関数のいずれかを備え、実行されると、読取り関数が、それぞれの変数識別子に関連付けて記憶されている変数テーブルから変数を読み取るように構成されており、実行されると、書込み関数が、それぞれの変数識別子に関連付けて記憶するために、第1のCSの実行中に生成された変数を変数テーブルに書き込むように構成されている、ステートメント25またはステートメント25の記載を引用するステートメントのうちのいずれか1つに記載の方法。
【0281】
ステートメント37.ブロックチェーントランザクションを検証するコンピュータ実装方法であって、本方法が、ブロックチェーンネットワークのノードによって実施され、ノードが高レベル(HL)スクリプト言語で記述されたスクリプトを実行するように構成され、本方法が、ブロックチェーンノードによって実施され、
第1のブロックチェーントランザクションを取得するステップであって、第1のブロックチェーントランザクションが前のブロックチェーントランザクションの入力を参照する入力を備え、第1のブロックチェーントランザクションが第1のコンパクトスクリプト(CS)を備え、第1のCSが、HLスクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実施されるそれぞれの動作と同等の動作を実施するように構成され、第1のCSが、LLスクリプト言語で記述され、複数のLL関数を備える第1の展開スクリプト(ES)と同等の動作を実施するように構成され、第1のCSが、第1のESよりストレージサイズが小さい、ステップと、
第2のブロックチェーントランザクションの検証の一部として、
第1の候補トランザクション識別子を取得するステップと、
第1のブロックチェーントランザクションの修正バージョンを生成するステップであって、第1のブロックチェーントランザクションのこの修正バージョンが、第1のCSの代わりに第1のESを備える、ステップと、
第1のトランザクション識別子を生成するステップであって、第1のトランザクション識別子が、第1のブロックチェーントランザクションの修正バージョンに基づいて生成される、ステップと、
第1の候補トランザクション識別子と第1のトランザクション識別子とを比較するステップであって、第1のブロックチェーントランザクションが有効である条件が、第1の候補トランザクション識別子が第1のトランザクション識別子と一致することである、ステップと
を備える、コンピュータ実装方法。
【0282】
ステートメント38.第1の候補トランザクション識別子が第1のトランザクション識別子と一致することを条件として、ノードによって動作されるブロックチェーンプロトコルに従って第1のブロックチェーントランザクションの検証に進めるステップを備える、ステートメント37に記載の方法。
【0283】
ステートメント39.第1のブロックチェーントランザクションがブロックチェーンプロトコルに従って有効であることを条件として、第1のブロックチェーントランザクションをブロックチェーンネットワークの1つまたは複数の他のノードに送信する、および/または第1のブロックチェーントランザクションをノードのメモリに記憶するステップを備える、ステートメント38に記載の方法。
【0284】
ステートメント40.
HLスクリプト言語で記述されたスクリプトを実行するように構成されていないブロックチェーンネットワークの1つまたは複数のノードから、第1のブロックチェーントランザクションの要求を受信するステップと、
第1のブロックチェーントランザクションの修正バージョンをそれらの1つまたは複数のノードに送信するステップと
を備える、ステートメント39に記載の方法。
【0285】
ステートメント41.第1のブロックチェーントランザクションの修正バージョンを生成するステップが、第1のCSを第1のESに置き換えるステップを備える、ステートメント37から40のいずれか1つに記載の方法。
【0286】
言い換えれば、第1のCSは第1のESに変換(すなわち、展開)される。
【0287】
ステートメント42.第1のブロックチェーントランザクションが第1の当事者によって生成され、第1のブロックチェーントランザクションを取得するステップが、第1の当事者から第1のブロックチェーントランザクションを受信するステップを備える、ステートメント37から41のいずれか1つに記載の方法。
【0288】
ステートメント43.第1の候補トランザクション識別子を取得する前記ステップが、第1の当事者から第1の候補トランザクション識別子を受信するステップを備える、ステートメント42に記載の方法。
【0289】
ステートメント44.ブロックチェーントランザクションを検証するコンピュータ実装方法であって、本方法が、ブロックチェーンネットワークのノードによって実施され、ノードが、高レベル(HL)スクリプト言語で記述されたスクリプトを実行するように構成され、ブロックチェーンが、第1のブロックチェーントランザクションを備え、第1のブロックチェーントランザクションが第1の出力を備え、本方法が、
第2のブロックチェーントランザクションを取得するステップであって、第2のブロックチェーントランザクションが、第1のコンパクトロック解除スクリプト(CUS)を備える第1の入力を備え、第1のCUSが、少なくとも部分的にHLスクリプト言語で記述され、1つまたは複数のHL関数を備え、実行されると、各HL関数が、低レベル(LL)スクリプト言語の1つまたは複数のLL関数によって実施されるそれぞれの動作と同等の動作を実施するように構成され、第1のCUSが、LLスクリプト言語で記述され、複数のLL関数を備える第1の展開ロック解除スクリプト(EUS)と同等の動作を実施するように構成され、第1のCUSが、第1のEUSよりストレージサイズが小さい、ステップと、
第2のブロックチェーントランザクションを検証するステップと
を備え、第2のブロックチェーントランザクションを検証する前記ステップが、
第1のブロックチェーントランザクションを取得するステップを備え、
a)第1のCUSを第1のEUSに置き換え、次いで、第1の出力とともに第1のEUSを実行するステップであって、第2のトランザクションが有効である条件が、前記実行が成功することである、ステップ、または、
b)第1の出力とともに第1のCUSを実行するステップであって、第2のトランザクションが有効である条件が、前記実行が成功することである、ステップ
を備える、コンピュータ実装方法。
【0290】
ステートメント45.HLスクリプト言語が、ユーザ向け(UF)スクリプト言語とLLスクリプト言語との間の中間レベル(IL)スクリプト言語であり、HL関数がIL関数であり、関数テーブルが関数マッピングのリストを備え、各関数マッピングが、1つまたは複数の他のIL関数および/あるいは1つまたは複数のLL関数のセットにマッピングされたそれぞれのIL関数を備え、
a)第1のCUSを第1のEUSに置き換える前記ステップが、関数テーブルにリストされている関数マッピングに基づく、または
b)第1の出力とともに第1のCUSを実行する前記ステップが、関数テーブルにリストされている関数マッピングに基づく、ステートメント44に記載の方法。
【0291】
関数テーブルが、それぞれがそれぞれのIL関数を識別する1つまたは複数の関数識別子を備え得、第1のCSが、1つまたは複数の第1のデータペアを備え、各第1のデータペアが、それぞれのIL関数識別子および呼出し関数を備え、実行されると、呼出し関数が、それぞれのIL関数識別子によって識別されるIL関数にマッピングされた1つまたは複数の他のIL関数および/あるいは1つまたは複数のLL関数のセットを実行するように構成される。
【0292】
変数テーブルが1つまたは複数の変数識別子を備え得、各変数識別子に関連付けて変数を記憶するように構成され、第1のCSが、1つまたは複数の第2のデータペアを備え、各第2のデータペアが、それぞれの変数識別子と、読取り関数または書込み関数のいずれかを備え、実行されると、読取り関数が、それぞれの変数識別子に関連付けて記憶されている変数テーブルから変数を読み取るように構成されており、実行されると、書込み関数が、それぞれの変数識別子に関連付けて記憶するために、第1のCSの実行中に生成された変数を変数テーブルに書き込むように構成されている。
【0293】
ステートメント46.
1つまたは複数のメモリユニットを備えるメモリと、
1つまたは複数の処理ユニットを備える処理装置と
を備え、メモリが、処理装置上で実行されるように構成されたコードを記憶し、コードが、処理装置上にあるときに、ステートメント1から24のいずれか1つに記載の方法を実施するように構成される、コンピュータ機器。
【0294】
ステートメント47.コンピュータ可読ストレージ上に具体化され、1つまたは複数のプロセッサ上で実行されると、ステートメント1から24のいずれか1つに記載の方法を実施するように構成される、コンピュータプログラム。
【0295】
ステートメント48.
1つまたは複数のメモリユニットを備えるメモリと、
1つまたは複数の処理ユニットを備える処理装置と
を備え、メモリが、処理装置上で実行されるように構成されたコードを記憶し、コードが、処理装置上にあるときに、ステートメント25から45のいずれか1つに記載の方法を実施するように構成される、コンピュータ機器。
【0296】
ステートメント49.コンピュータ可読ストレージ上に具体化され、1つまたは複数のプロセッサ上で実行されると、ステートメント25から45のいずれか1つに記載の方法を実施するように構成される、コンピュータプログラム。
【0297】
本明細書に開示される別の態様によれば、第1の当事者とノードのアクションを備える方法が提供され得る。
【0298】
本明細書に開示される別の態様によれば、第1の当事者のコンピュータ機器とノードとを備えるシステムが提供され得る。
【符号の説明】
【0299】
100 システム
101 パケット交換ネットワーク
102 コンピュータ機器
102a コンピューティングデバイス
102a コンピュータ機器
102b コンピュータ機器
103 当事者
103a ユーザ
103a アリス
103a 第1の当事者
103b 第2の当事者
103b ボブ
104 ビットコインノード
104 ブロックチェーンノード
105 クライアント
105 クライアントアプリケーション
106 ピアツーピア(P2P)ネットワーク
106 ブロックチェーンネットワーク
107 サイドチャネル
150 ブロックチェーン
151 データブロック
151 新しいブロック
151n-1 ブロック
152 トランザクション
152i 先行するトランザクション
152j 現在のトランザクション
153 ジェネシスブロック(Gb)
154 順序付きセット(または「プール」)
155 ブロックポインタ
201 ヘッダ
202 入力
202 入力フィールド
203 出力
203 出力フィールド
401 トランザクションエンジン
402 ユーザインターフェース(UI)層
403 関数
450 ノードソフトウェア
451 プロトコルエンジン
452 ノードのスクリプトエンジン
453 スタック
454 アプリケーションレベル決定エンジン
455 ブロックチェーン関連機能モジュール
455 関数
455C コンセンサスモジュール
455P 伝搬モジュール
455S 記憶モジュール
500 ユーザインターフェース(UI)
500 システム
501 UI要素
501 ユーザ選択可能な要素
502 UI要素
502 データ入力フィールド
503 UI要素
503 情報要素
図1
図2
図3A
図3B
図4
図5
図6
図7
図8
図9
【国際調査報告】