(57)【要約】  ブロックチェーンプラットフォーム上で高レベル言語（HLL）で記述されたソースコードの部分の実行を可能にし又は促進するコンピュータにより実施される方法（及び対応するシステム）が提供される。当該方法及びシステムは、高レベルソースコードの部分をブロックチェーンプラットフォームと共に使用可能な形式に変換するよう構成されるブロックチェーンコンパイラを含み得る。これは、Bitcoinブロックチェーン又は代替物であってよい。方法は、ソースコードの部分をインプットとして受信するステップと、複数のオペコードを含むアウトプットスクリプトを生成するステップと、を含み得る。オペコードは、機能的に制約されたブロックチェーンスクリプト言語に固有のオペコードのサブセットである。出力されるスクリプトは、実行されると、該スクリプトが、少なくとも部分的に、ソースコードの中で指定された機能を提供するように、構成され及び／又は生成される。ブロックチェーンスクリプト言語は、該言語が複雑な制御フロー構成又はジャンプに基づくループ若しくは他の反復プログラミング構成による反復を本来サポートしないという点で、制約される。アウトプットスクリプトを生成するステップは、ソースコード内で提供される少なくとも１つのループ構成を展開するステップを含み得る。当該方法は、アウトプットスクリプトをブロックチェーンプラットフォーム上で実行可能な形式に変換するよう構成されるインタープリタ又は仮想機械を提供する又は使用するステップ、を更に含み得る。
2020526814.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータにより実施される方法であって、
インプットとしてソースコードの部分を受信するステップであって、前記ソースコードの部分は、高レベル言語（HLL）で記述される、ステップと、
機能的に制約されたブロックチェーンスクリプト言語から選択された及び／又は該言語に固有の複数のオペコードを含むアウトプットスクリプトを生成するステップであって、その結果、実行されると、前記スクリプトが少なくとも部分的に前記ソースコードの部分の中で指定された機能を提供する、ステップと、
を含む方法。
【請求項２】
請求項１のステップを実行するよう構成されるコンパイラを提供する又は使用するステップ、を含む請求項１に記載の方法。
【請求項３】
前記アウトプットスクリプトは、静的コンパイルを実行することにより生成される、請求項１又は２に記載の方法。
【請求項４】
前記ブロックチェーンスクリプト言語は制約されており、その結果、該言語は、複雑な制御フロー構成、反復、及び／又はジャンプに基づくループを本来サポートしない、請求項１、２、又は３に記載の方法。
【請求項５】
前記アウトプットスクリプトを生成する前記ステップは、
前記ソースコード内で提供される少なくとも１つのループ構成を展開するステップを含む、請求項１乃至４のいずれかに記載の方法。
【請求項６】
前記アウトプットスクリプトをブロックチェーンプラットフォーム上で実行可能な形式に変換するよう構成されるインタープリタ又は仮想機械を提供する又は使用するステップ、
を更に含む請求項１乃至５のいずれかに記載の方法。
【請求項７】
前記アウトプットスクリプトのより効率的な又は削減されたバージョンを提供するために、少なくとも１回、前記アウトプットスクリプトを最適化するステップ、
を更に含む請求項１乃至６のいずれかに記載の方法。
【請求項８】
前記アウトプットスクリプトを生成する前記ステップは、導関数のない最適化の使用を含む、請求項１乃至７のいずれかに記載の方法。
【請求項９】
請求項１乃至８のいずれかに記載のステップを実行するよう構成された前記HLL及び／又はコンパイラコンポーネントは、ソフトウェア開発キット（SDK）の部分を形成する、請求項１乃至８のいずれかに記載の方法。
【請求項１０】
前記ソースコードは、スマートコントラクトを実施するよう構成される、請求項１乃至９のいずれかに記載の方法。
【請求項１１】
前記HLLは、少なくとも１つのプリミティブ、又は前記ブロックチェーンスクリプト言語に固有の１つ以上のプリミティブに直接変換可能な構成を含む、請求項１乃至１０のいずれかに記載の方法。
【請求項１２】
前記ブロックチェーンスクリプト言語はスタックに基づき、前記HLLは、前記スクリプト言語により使用されるスタックに対して演算を実行するよう構成される１つ以上のプリミティブを含む、請求項１乃至１１のいずれかに記載の方法。
【請求項１３】
前記HLLは、前記ブロックチェーンスクリプト言語によるメモリ割り当てのために使用されるスタックに、前記ソースコードへの入力の数をプッシュするよう構成されるプリミティブを含む、請求項１乃至１２のいずれかに記載の方法。
【請求項１４】
前記HLLは、以下のプリミティブ又は演算子又はそれらの機能的に等価なもの：
Initiate;
Declare;
Increment;
IF;
While;
Populate;
Monus;
Reset;
Rawscript;
Abort;
Retrieve;
Hash、hash  １６０、又は別のハッシュ演算若しくはその変形；
のうちの少なくとも１つを含む、請求項１乃至１３のいずれかに記載の方法。
【請求項１５】
コンピュータにより実施される方法であって、
ソースコードの部分をブロックチェーンと互換性のあるスクリプトに変換するために静的コンパイルを使用するステップであって、望ましくは前記静的コンパイルはループを展開するステップを含む、ステップ、
を含む方法。
【請求項１６】
コンピュータにより実装されるシステムであって、請求項１乃至１５のいずれかに記載のステップを実施するよう構成されるシステム。
【請求項１７】
インプットとしてソースコードの部分を受信し、前記ソースコードは、高レベル言語（HLL）で記述され、
機能的に制約されたブロックチェーンスクリプト言語から選択された及び／又は該言語に固有の複数のオペコードを含むアウトプットスクリプトを生成し、その結果、実行されると、前記スクリプトが少なくとも部分的に前記ソースコードの中で指定された機能を提供する、
よう構成されるシステム。
【請求項１８】
ソフトウェア開発キット（SDK）を含む請求項１６又は１７に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、概して、分散台帳技術に関し、特に、Bitcoinネットワーク又は関連プロトコルのようなブロックチェーン技術に関する。本開示は、コンピュータに基づくコードの変換のためのコンパイラ及びコンパイラ関連技術にも関する。本発明の１つ以上の実施形態は、ブロックチェーンプラットフォーム又は機能的に制約されたスクリプトに基づく言語を含むプロトコル上で、高レベルプログラムの自動化及び実行を可能にする及び／又は促進するためのソリューションとしての使用に適する。
【背景技術】
【０００２】
本願明細書で、用語「ブロックチェーン」は、あらゆる形式の電子的な、コンピュータに基づく、分散台帳を含むよう使用される。これらは、総意に基づくブロックチェーン及びトランザクションチェーン技術、許可及び未許可台帳、共有台帳、及びそれらの変形を含む。最も広く知られているブロックチェーン技術の用途はBitcoin台帳であるが、他のブロックチェーンの実装が提案され開発されている。ビットコインは便宜上及び説明を目的として本願明細書において言及されるが、本発明はビットコインのブロックチェーンと共に使用することに限定されず、代替のブロックチェーンの実装及びプロトコルが本発明の範囲に含まれることに留意すべきである。用語「ユーザ」は、人間又はコンピュータに基づくリソースを表すことがある。
【０００３】
ブロックチェーンは、ブロックにより構成される、コンピュータに基づく非集中型の分散型システムとして実装されるピアツーピア電子台帳である。また、ブロックはトランザクションにより構成される。各トランザクションは、ブロックチェーンシステム内で参加者間のデジタルアセットの制御の移転を符号化するデータ構造であり、少なくとも１つのインプット及び少なくとも１つのアウトプットを含む。各ブロックは前のブロックのハッシュを含み、ブロックは共にチェーンになって、その発端からブロックチェーンに書き込まれている全てのトランザクションの永久的な変更不可能なレコードを生成する。トランザクションは、そのインプット及びアウトプットに組み込まれたスクリプトとして知られる小さなプログラムを含む。スクリプトは、トランザクションのアウトプットがどのように及び誰によりアクセス可能かを指定する。ビットコインプラットフォーム上で、これらのスクリプトは、Scriptと呼ばれるスタックに基づくスクリプト言語を用いて記述される。スクリプトは、コマンド（オペコード）を用いて記述され、該コマンドはインタープリタにより実行可能コードに変換される。
【０００４】
トランザクションがブロックチェーンに書き込まれるために、「検証され」なければならない。ネットワークノード（マイナー）は、各トランザクションが有効であることを保証するために作業を実行し、無効なトランザクションはネットワークから拒否される。ノードにインストールされたソフトウェアクライアントは、自身のロック及びアンロックスクリプトを実行することにより、この検証作業を未使用トランザクション（UTXO）に対して実行する。ロック及びアンロックスクリプトの実行が真と評価した場合、及びチェックに合格した場合、トランザクションは有効であり、トランザクションはブロックチェーンに含まれるためにマイニングされる。したがって、トランザクションがブロックチェーンに書き込まれるためには、トランザクションは、ｉ）トランザクションを受信した第１ノードにより検証され、トランザクションが検証された場合に、ノードは該トランザクションをネットワーク内の他のノードに中継し、ｉｉ）マイナーにより構築された新しいブロックに追加し、ｉｉｉ）マイニングされ、つまり過去のトランザクションの公開台帳に追加されなければならない。
【０００５】
ブロックチェーン技術は、暗号通貨実装の使用で最も広く知られているが、デジタル起業家が、新しいシステムを実装するために、Bitcoinの基づく暗号通貨セキュリティシステム、及びブロックチェーンに格納可能なデータの両方の使用を探索し始めている。ブロックチェーンが、暗号通貨の領域に限定されない自動タスク及びプロセスのために使用できれば、非常に有利である。このようなソリューションは、それらの用途において一層多様でありながら、ブロックチェーンの利点（例えば、永久的、イベントの耐タンパレコード、分散プロセス、等）を利用できる。したがって、黎明期のインターネットの採用及びウェブに基づくシステムの発展における後の急成長と同様に、新しいアプリケーションのための技術の幅広い採用及び技術革新の必要がある。
【０００６】
しかしながら、このようなスクリプト言語でプログラムを記述することは、例えば、低レベルプログラミング技術に関連する知識及び熟練を必要とするために、より広いプログラミングコミュニティにより直感的又は直ちに採用できない。これは、プログラマに、スタック及びその中のデータの位置を考慮することを要求する。低レベルオペコードで構成されるプログラムの記述は、C、Java（登録商標）、等のような高レベル言語（high−level  language：HLL）でソースコードを記述するより時間及び労働集約的である。このようなHLLのために構築されるコンパイラ／インタープリタは、プログラマをメモリ管理等に関連する多くの面倒な低レベルな問題から遠ざける便利な抽象化レベルを提供する。１つ以上のスタックの中のデータを操作するためのオペコードのシーケンスの記述は、HLLでソースコードを記述するより、技術的に複雑であり且つ時間がかかる。したがって、低レベルオペコードの使用の困難な特性により、エラー及びバグの発生する可能性がより高い。
【０００７】
さらに、HLLは、プログラマが、ループ、case文、及び反復呼び出しのような複雑な制御フロー構成を彼らのソースコードに含めることを可能にする。プログラマは、所望のロジックに焦点を当て、「これが真の間はXを行う．．．」のようなメカニズムにより直感的方法で論理的フローを表現できる。しかしながら、BitcoinのScriptのような幾つかのブロックチェーンに関連するスクリプト言語は、それらが算術演算のような典型的な演算、並びにハッシュ演算及び署名検証のような暗号関数も含むが、それらは、HLLでは使用可能な、whileループのような複雑な制御構造のための固有のプリミティブを含まない、或いは、反復技術の使用を許容しない、という意味で機能的に制約されている。このような制約された言語は、ジャンプに基づく制御フローをサポートしない。したがって、設計により、それらは、ソースコードに包含するためにプログラマに提供される言語及び論理的構成を制約する。これは、一部の人々を、Scriptのような制約された言語がチューリング不完全であるという論争に導くが、この定義は他の者達により異議を唱えられている。したがって、私達は、「機能的に制約された」という表現を使用する。
【０００８】
この意図的な制約は、プログラマにとってコーディング処理を一層困難にすることがあるが、プログラム実行時間が限られ、重要なことに、悪意ある手段を防ぎ、例えばDoS（Denial  of  Service）攻撃を実施するための無限ループの使用から保護するので、重要なセキュリティメカニズムを提供することに留意する。
【０００９】
したがって、重大なセキュリティと、ブロックチェーンに基づく技術の発展を促進し、奨励し、及び向上させる必要との間にはトレードオフが存在する。後者の問題を解決するために、Ethereumは、それ自体のブロックチェーンプラットフォームに、固有の特徴としてHLL言語を組み込んでいる。Scriptと同様に、低レベルインタープリタが、コードの実行可能バージョンを生成するために要求される。EthereumのHLL言語は、Etherとして知られ、条件付き及び無条件ジャンプの使用を通じて、制御フローを実行させる。これは、反復も可能にする。DoS攻撃のような問題を回避するために、Ethereumは、ガス（gas）、つまり実行コストをカバーするために予め支払われる暗号通貨の一部、の概念を導入することにより、トランザクション実行時間を制限する。したがって、固有のHLLの使用により、技術的及び商業的に複雑な追加レイヤが必要である。さらに、Ethereumは、今まで、少なくとも１つの重大な反復に基づく攻撃に苦しんできた。例えば以下を参照する。http://hackingdistributed.com/２０１６/０６/１８/analysis−of−the−dao−exploit/
【００１０】
したがって、プログラマに親しみのあるHLL言語を用いて、しかし機能的に制約されたスクリプト言語により提供されるセキュリティを危険に晒すことなく、プログラマが有効なブロックチェーンソリューションを、より容易に、迅速に、且つ一層効率的な方法で開発し、設計し、及び生産できるメカニズムを提供することが望ましい。これは、決して自明な作業ではなく、有意な技術的革新を要求する。これは、特に、本開示により解決される技術的課題の１つである。
【発明の概要】
【００１１】
したがって、本開示によると、添付の請求の範囲に定められるようなシステム及び対応する方法が提供される。
【００１２】
したがって、本発明によると、コンピュータにより実施される方法及び対応するシステムが提供され得る。当該方法は、ブロックチェーンプラットフォーム上でソースコードの部分の実行を可能にする又は促進するよう構成されてよい。ソースコードは、高レベル言語で記述されてよい。本開示は、ソフトウェアコンパイラとして実装されてよいコンパイル技術及びシステム／コンポーネントを記載する。これは、以後、「ブロックチェーン又はBitcoinコンパイラ」と呼ばれてよい。ソフトウェアコンパイラは、Bitcoinブロックチェーン又は任意の他のブロックチェーンに基づくプロトコル／ネットワークと関連する使用のために構成されてよい。
【００１３】
有利なことに、本開示のソフトウェアコンパイラは、ユーザ（プログラマ）がブロックチェーンにより実行可能なプログラム／アプリケーションを、彼らに親しみのある言語で、例えばC、Java（登録商標）、C++スタイルの構文で記述し及び生成することを可能にし得る。これは、ブロックチェーンに基づく開発作業を、より広い開発コミュニティへと広げる。これは、以下に詳述するように、ブロックチェーンに基づくソリューションが、本発明により、より素早く記述でき及びエラーチェックされることも意味する。重大なことに、基礎にあるプロトコル及び関連するスクリプト言語のセキュリティ機能が保存され維持される。したがって、本発明は、スクリプト生成のプロセス中にブロックチェーンに関連するセキュリティを保存する技術及びシステムを提供し、ブロックチェーンネットワーク上のノードにより検証される有効な、エラーの無いスクリプト（したがってトランザクション）の生成を促進し又は可能にする。
【００１４】
１つの可能な実施形態によると、ソースコードの部分をブロックチェーンと互換性のあるスクリプトに変換する静的コンパイルを使用するコンピュータにより実施される方法が提供され得る。これは、コンパイラにより提供されるアウトプットを形成し得るので、「アウトプットスクリプト」と呼ばれてよい。本発明は、１つ以上のエラーをテストしてよい。本発明は、１つ以上のエラーが検出された場合に警告を提供してよい。静的コンパイルは、ループ展開ステップを含んでよく、ソースコードの部分の中で提供される１つ以上のループが展開されてよい。用語「静的コンパイル」及び「ループ展開」は従来知られた用語であり、それらは当業者により直ちに理解されることに留意する。
【００１５】
当該方法は、ブロックチェーンネットワークと共に使用するために構成されてよい。ブロックチェーンネットワークは、プロトコルに関連付けられてよい。これは「proof−of−work」ブロックチェーンであってよい。これは総意に基づくブロックチェーンであってよい。これは、パブリック及び／又は未許可ブロックチェーンであってよい。これはピアツーピア分散型ブロックチェーンであってよい。
【００１６】
ブロックチェーンネットワークは、ブロックチェーントランザクションを検証する複数のノードを含んでよい。ブロックチェーントランザクションは、複数のノードにより実行可能なスクリプトを含んでよい。スクリプトは、機能的に制約された（又はチューリング不完全としても表される）ブロックチェーンスクリプト言語に属するオペコード（op_code）のセットにより表され又はそれを含んでよい。当該方法は、ブロックチェーンネットワークのノードにより検証されたブロックチェーントランザクションへの包含のために、アウトプットスクリプトを生成するステップを含んでよい。アウトプットスクリプトは、機能的に制約されたブロックチェーンスクリプト言語に属するオペコードのセットにより表されてよく、アウトプットスクリプトは、ブロックチェーンネットワークのノードによるスクリプトの実行がソースコードの中で指定された機能を実行するように、構成され又は適応されてよい。
【００１７】
ソースコードの部分は、高レベル言語（high  level  language：HLL）で記述されてよい。HLLは、コンパイル可能HLLとして記載されてよい。HLLは、本発明に従い構成されるソフトウェアコンポーネント（コンパイラ）によりコンパイルされてよい。HLLは、インタープリタにより実行可能なスクリプトを生成するために、コンパイラによりコンパイルされてよい。スクリプトは、ブロックチェーントランザクション（Ｔｘ）に提供されてよい。スクリプトは、トランザクションのインプット又はアウトプットに関連付けられてよい。HLLは、反復、複雑な選択構造及び／又はループのような複雑な制御フローを実装する表現、構造、及び／又は文を許容し得るチューリング完全言語であってよい（現実世界の制約を受ける）。HLLに固有の構文は、WHILE、FOR、又はREPEATループのような、ループ関連構文を含んでよい。これは、暗号化、算術及びスタック操作演算の実行のためのプリミティブを含んでよい。HLLは、以下に実質的に記載される、カスタマイズされたオペコード及び／又は高レベル言語構成を含んでよい。
【００１８】
ブロックチェーンと互換性のあるスクリプトは、ブロックチェーン上で実行可能なブロックチェーンスクリプト言語から選択された、それに固有の及び／又はその部分を形成するオペコードで形成されるスクリプト（つまりプログラム）であってよい。オペコードは、プリミティブ又はコマンドと呼ばれてよい。スクリプトは、ブロックチェーン上で実行される／実行可能になる前に、インタープリタ又は仮想機械を通過してよい。（この文脈における用語「ブロックチェーン」は、プロトコル及び実装プラットフォームを含んでよい）。インタープリタは、スクリプトを機械実行可能（オブジェクト）コードに変換してよい。ブロックチェーンスクリプト言語は、例えば、Bitcoinプロトコル又はその変形と関連して使用されるScript言語であってよい。スクリプト言語は、ブロックチェーンプロトコルと共に使用するために構成されてよい。スクリプト言語は、暗号化、算術、及びスタック操作オペコードを含んでよい。
【００１９】
ブロックチェーンスクリプト言語は機能的に制約されてよい。ブロックチェーンスクリプト言語は、構文／インタープリタが許可する又は処理するよう構成される機能に関して制限されてよい。これは、反復、複雑な選択構造及び／又はループのような複雑な制御フロ―を、本来サポートしなくてよい。
【００２０】
追加又は代替として、ブロックチェーンプラットフォーム上で高レベル言語（HLL）で記述されたソースコードの部分の実行を可能にし又は促進する方法が提供され得る。ソースコードは、スマートコントラクトを実装するよう構成されてよい。スマートコントラクトは、従来知られているようなブロックチェーン上で実行可能な、機械可読且つ実行可能アプリケーションであってよい。
【００２１】
当該方法は、ソースコードの部分をインプットとして受信するステップを含んでよい。ソースコードの部分は、ソフトウェアにより実装されるコンパイラにより受信されてよい。
【００２２】
当該方法は、アウトプットスクリプトを生成するステップを含んでよい。アウトプットスクリプトは、上述のようなブロックチェーンと互換性のあるスクリプトであってよい。アウトプットスクリプトは、機能的に制約されたブロックチェーンスクリプト言語から選択された及び／又はそれに固有の複数のオペコードを含んでよい。このスクリプト言語は、上述の通りであってよい。実行されると、スクリプトは、少なくとも部分的に、ソースコードの中で指定された機能を提供してよい。
【００２３】
当該方法は、上述の方法のいずれかの実施形態を実行するよう構成されるコンパイラを提供する又は使用するステップを含んでよい。アウトプットスクリプトは、静的コンパイルを実行することにより生成されてよい。
【００２４】
静的コンパイルの使用は、結果として生じるスクリプトが常に停止するという利点を提供する。これは、実行時間において実用上の利点を提供するだけでなく、ソースコードの中で何からの種類のエラー又は無効な構成に遭遇した場合にブロックチェーンコンパイラが停止するので、本発明が検証ツールとして機能することを可能にする。スクリプト開発の間に検証ツールを使用できるという利点は、プログラマの時間及び労力を削減することにより、プログラミング作業が向上することを意味する。さらにまた、ブロックチェーンコンパイラは、バグ及びオーバーフローエラーをテストするという点で、セキュリティソリューションを提供し、プログラムが実行するか及び安全に実行するかをユーザ（プログラマ）が静的にテストすることを可能にする。
【００２５】
ブロックチェーンスクリプト言語は、該言語が複雑な制御フロー構成又はジャンプに基づくループ若しくは他の反復プログラミング構成による反復を本来サポートしないという点で、制約されてよい。アウトプットスクリプトを生成するステップは、ソースコード内で提供される少なくとも１つのループ構成を展開するステップを含んでよい。当該方法は、アウトプットスクリプトをブロックチェーンプラットフォーム上で実行可能な形式に変換するよう構成されるインタープリタ又は仮想機械を提供する又は使用するステップ、を含んでよい。
【００２６】
当該方法は、アウトプットスクリプトのより効率的な又は削減されたバージョンを提供するために、少なくとも１回、アウトプットスクリプトを最適化するステップ、を更に含んでよい。これは、導関数のない最適化（derivative  free  optimisation：DFO）の使用を含んでよい。DFOは、従来知られた用語であり、当業者により直ちに理解される。追加又は代替として、アウトプットスクリプトを生成するステップは、導関数のない最適化の使用を含んでよい。
【００２７】
ブロックチェーンコンパイラは、ソフトウェア開発キット（software  development  kit：SDK）の部分を形成し及び／又はそれと関連して動作するよう構成されてよい。SDKは、エディタ、デバッガ、及びコードに基づくソリューションの生成を促進するためにSDKと共に使用されるべき知られている他のコンポーネントを含んでよい。
【００２８】
HLLは、ブロックチェーンスクリプト言語に固有の１つ以上のプリミティブ／コマンド／オペコードに直接変換可能な、少なくとも１つのプリミティブ、演算子、又は構成を含んでよい。
【００２９】
ブロックチェーンスクリプト言語はスタックに基づいてよい。ブロックチェーンスクリプト言語は、１つ又は複数のスタックを操作するよう構成されてよい。HLLは、スクリプト言語により使用されるスタック上で演算の実行を引き起こすよう構成される１つ以上のプリミティブ又は演算子を含んでよい。
【００３０】
HLLは、ブロックチェーンスクリプト言語によるメモリ割り当てのために使用されるスタックに、ソースコードへの入力の数をプッシュするよう構成されるプリミティブ又は構成を含んでよい。HLLは、暗号化演算又は関数、及び算術演算、及び／又はループの実行を引き起こすよう構成される１つ以上のプリミティブを含んでよい。
【００３１】
HLLは、以下のプリミティブ又は演算子又はそれらの個々の機能的等価物のうちの少なくとも１つを含んでよい：
Initiate;
Declare;
Increment;
IF;
While;
Populate;
Monus;
Reset;
Rawscript;
Abort;
Retrieve
Hash,  hash１６０,又はハッシュ演算又はその変形。
【００３２】
本開示は、ソースコードの部分をブロックチェーンと互換性のあるスクリプトに変換する静的コンパイルを用いるステップを含む方法を提供し得る。静的コンパイルは、ループ展開ステップを含んでよい。
【００３３】
ソースコードの部分は、少なくとも１つの高レベルプログラミング構成を含んでよい。アウトプットスクリプトは、高レベルプログラミング構成を、機能的に制約されたブロックチェーンスクリプト言語に属する１つ以上のオペコードに変換することにより生成されてよい。アウトプットスクリプトの１つ以上のオペコードは、ブロックチェーンネットワークのノードによる１つ以上のオペコードの実行が、ソースコードの少なくとも１つの高レベルプログラミング構成（の機能）を実行するように、構成され又は適応されてよい。
【００３４】
望ましくは、機能的に制約されたブロックチェーンスクリプト言語は、ループ構成をサポートしない。望ましくは、少なくとも１つの高レベルプログラミング構成は、ループ構成を含む。望ましくは、スクリプトは、ループ構成（「ループ構成」とも呼ばれてよい）を展開することにより生成される。望ましくは、ループ構成は、コードブロック及び反復の回数を指定する引数を含み、ループ構成の展開は、反復の回数だけ、コードブロックの機能をためのオペコードを記述することを含む。
【００３５】
当該方法は、ループ構成が反復の回数を指定する引数を含むこと、及び該引数が最大反復数を指定する制約を満たすこと、を保証するために、ループ構成の構文をチェックするステップを更に含んでよい。
【００３６】
ループ構成は、コードブロック、及び少なくとも１つの変数に基づくループ構成の反復の回数を指定するための条件、を含んでよい。望ましくは、ループ構成の展開は、アウトプットスクリプトの実行から決定された変数の値を用いる条件の評価に基づき、最大反復回数だけ、コードブロックの機能の複製されたオペコードを選択的に実行するオペコードコマンドを記述することに関連して、コードブロックの機能のオペコードを複製するステップを含む。
【００３７】
本開示によると、本願明細書に記載の方法のいずれかの実施形態のステップを実施するよう構成される、コンピュータにより実装されるシステムが提供される。
【００３８】
本開示の一実施形態によるコンピュータにより実施されるシステムは、コンパイラを含んでよい。コンパイラは、ソースコードの部分をインプットとして受信するよう構成されてよい。ソースコードは、高レベル言語（HLL）で記述されてよい。コンパイラは、アウトプットスクリプトを生成するよう構成されてよい。アウトプットスクリプトは、「ブロックチェーンスクリプト」又は「ブロックチェーンと互換性のあるスクリプト」と呼ばれてよく、複数のオペコードを含んでよい。これらのオペコードは、上述のような機能的に制約されたブロックチェーンスクリプト言語から選択され及び／又はそれに固有であってよく、実行されると、スクリプトは、少なくとも部分的にソースコードの中で指定された機能を提供する。
【００３９】
当該システムは、ソフトウェア開発キット（software  development  kit：SDK）を含んでよい。コンパイラは、SDKの部分を形成してよい。
【００４０】
本発明は、システムであって、プロセッサと、前記プロセッサによる実行の結果として前記システムに本願明細書に記載のコンピュータにより実施される方法の任意の実施形態を実行させる実行可能命令を含むメモリと、を含むシステムも提供する。
【００４１】
本発明は、実行可能命令を格納した非一時的コンピュータ可読記憶媒体であって、前記実行可能命令は、コンピュータシステムのプロセッサにより実行された結果として、前記コンピュータシステムに本願明細書に記載のコンピュータにより実施される方法の実施形態を少なくとも実行させる、非一時的コンピュータ可読記憶媒体も提供する。
【００４２】
本開示のある実施形態又は態様に関連して上述した任意の特徴は、１又は複数の他の実施形態又は態様に適用されてもよい。本開示の方法に関連して記載された任意の特徴は、本開示のシステムに等価に適用されてよく、逆も同様である。
【００４３】
本開示の上述の及び他の態様は、本願明細書に記載される実施形態から明らかであり、それらの実施形態を参照して教示される。本開示の実施形態は、単なる例として添付の図面を参照して以下に説明される。
【図面の簡単な説明】
【００４４】
【図１】本発明の概略を示す。
【図２】whileループを展開する以下の例に関連して議論されるTry[]アレイを投入するコードブロックを提供する。
【図３】種々の実施形態が実施され得るブロックチェーン環境を示す。
【図４】一実施形態による、前のブロックチェーントランザクションを参照するspendingブロックチェーントランザクションを検証し及びマイニングするブロックチェーンプロトコルを示す。
【図５】種々の実施形態が実施され得るコンピューティング環境を示す。
【発明を実施するための形態】
【００４５】
＜概要＞
以下では、私達は、参照を容易にするために、最も広く知られ採用されているので、Bitcoinプロトコル、ブロックチェーン、ネットワーク又はスクリプト言語を参照することがある。しかしながら、本発明は、Bitcoin関連ブロックチェーンと共に使用されることに限定されず、他のブロックチェーン技術が本開示の範囲に含まれる。
【００４６】
上述のように、大部分のプログラマは、今日、低レベルではなく、C、C++、Java（登録商標）等のような高レベル言語でコードを記述する。低レベルでコードを記述することは、より多くの時間がかかり、メモリ操作のためのより専門的な知識を要求し、結果としてエラーが導入され得る。したがって、基礎にある、制約されたスクリプト言語により提供されるセキュリティを危険に晒すことなく、プログラマにより親しみのある言語でブロックチェーンアプリケーションのための有効な、テストされた、エラーチェックされたコードを記述できることは、プログラマにとって有利であり得る。
【００４７】
本開示に記載の方法及びシステムは、特殊なブロックチェーントランザクション又はトランザクションのクラスタの生成のための「SDK」の開発を可能にする。例えば、トランザクションは、機械実行可能スマートコントラクトの条項及び条件を自動的に施行することを目的とし得る。しかしながら、多くの他のアプリケーションが可能であり、本発明はこれに関して限定されない。したがって、本発明は、ブロックチェーン関連技術を生成し及びテストするための「ツールキット」又はシステムの部分を形成してよい。
【００４８】
有利なことに、ブロックチェーンコンパイラは、ユーザのソースコードの静的コンパイルを実行し、ループ展開のような技術の使用により複雑な制御フローメカニズムの実装を可能にする。従来知られているように、「ループ展開（ループアンローリング、loop  unrolling）」は、「ループ展開（ループアンワインディング、loop  unwinding）」とも呼ばれてよい。ループ展開は、特定種類のループの中でブランチの頻度を削減するために及び／又はループ維持命令を削減するためにコンパイラにより使用可能なループ変換技術である。ソースコードの中で見付かったループを展開することにより、コンパイラは、ソースコードの変換されたバージョンを生成できる。これは、機能的に制約されたスクリプト言語を使用するブロックチェーンプラットフォーム上で実行可能である。
【００４９】
図１を参照すると、本開示の一実施形態は、ユーザ（プログラマ）が高レベル言語（HLL）を使用して所望のアプリケーション、例えばスマートコントラクトのためのコード１０１０を定義し、次にHLLコード１０１を実行ファイルにコンパイルするブロックチェーンコンパイラ１０２を実行することを可能にする。これらの実行ファイルは、ボットにより実行可能な（python、C++、等のような）３G言語プログラムのチャンクの形式であってよい。或いは、それらは、（例えばBitcoin）スクリプト１０３のチャンクの形式であってよい。後者は、特定機能を実行可能なスクリプトのチャンクを設計し生成することにより達成される。例えば、Bitcoinスクリプトの元のバージョンは、OP_MULと呼ばれる乗算のための関数を含んでいた。このオペコードは現在は無効にされている。しかしながら、小さなスクリプト部分の中で既存の有効なオペコードを使用することにより、同じ機能が再び生成できる。
【００５０】
本開示の実施形態は、以下の２種類のプリミティブのうちの一方又は両方を含んでよい。
・カスタマイズされたオペコード（以後、これをCOP_CODEと呼ぶ）、
・高レベル言語（HLL）構成。
【００５１】
HLL構成は、コンパイラ１０２がそれらをスクリプトコード１０３に変換することを必要とする。一方、COP_CODEは、COP_CODEからOP_CODEのブロックへの直接置換のみを必要とする。標準的に、プリミティブは、変数へのアクセスを必要としない場合に、つまり所与のプロトコル（及び他のCOP_CODE）のためにブロックチェーンスクリプト言語に既に存在するOP_CODE及びハードコードされたインプットのみを用いて完全に記述可能な場合に、COP_CODEにされる。
【００５２】
例えば、monusプリミティブはオペコードにより完全に記述でき、したがって以下のCOP_CODEにできる。
OP_SUB
OP_０
OP_MAX
【００５３】
しかしながら、WHILEループの実行は、所要の変数に依存する（例えば、実行のための条件、反復回数のためのカウンタ、等）。したがって、WHILEは、COP_CODEにするのには適さず、HLL構成として記述される。
【００５４】
有利なことに、２種類のプリミティブの結合が、更なる柔軟性をプログラマに提供する。プログラムをBitcoinスクリプトに直接記述する（つまり、HLLを使用しない）プログラマは、COP_CODEを用いて拡張されたスクリプト機能を使用できる。実際に、これらは、スクリプトプログラマに、彼らの必要な関数を実行するOP_CODEのブロックの置換を与え、プログラミング時間及び労力を削減する。COP_CODEを該COP_CODEを構成するOP_CODEのブロックで単純に置換する「COP−CODEコンパイラ」があればよい。低レベルBitcoinスクリプトでプログラムを書けない又は書きたくないプログラマは、代わりに本開示によりサポートされるHLLを使用できる。
【００５５】
カスタマイズOP_CODE（COP_CODE）は以下に更に議論される。
【００５６】
（１）カスタマイズOP_CODE（COP_CODE）
本章は、以下で本開示に従い適用されてよい規格を、カスタマイズOP_CODE（COP_CODE）のスクリプトプリミティブに関連して記載する。COP_CODEは、通常のオペコードと同様の所与のフォーマットであり、同じように動作する。つまり、Script（及び／又はコンパイラ）のライタは、オペコードを従来使用するのと同じ方法で、プリミティブを使用する。Bitcoinオペコードのリストは、Bitcoin  wikiにある。https://en.bitcoin.it/wiki/Script.
●命名の慣例
スクリプトプリミティブは、ここでBitcoin  Scriptオペコードと同様の方法で以下の通り命名される。
COP_xxx
ここで、「xxx」は関数の省略表現である。例えば、乗算関数は、COP_MULTと命名され得る。更にオペコードと同様に、関数が、計算で使用される特定数のパラメータ又は特定数値を有する場合、名称はその数を組み込んでよい。例えば、オペコード「OP_２DROP」は、「上位２個のスタックアイテムを除去する」を意味し、一方で「OP_１ADD」は「１がインプットに加算される」を意味する。したがって、COP_２MULTは具体的に「インプットが２で乗算される」を意味する。
●実行前の検証
特定数のインプット又は特定のインプットフォーマットが期待される場合には、プリミティブは、機能ロジックを実行する前にチェックを実行し、インプットが期待と一致しない場合に異常終了する（トランザクションを無効としてマークする）。有利なことに、これは、関数が不正又は虚偽であるかも知れないアウトプットを実行し提供することを防ぐ。例えば、特定のプリミティブが正の数値であるインプットのみを演算することを目的とするが、それにも拘わらず負の数値に対してエラー無しに実行する場合、結果は「有効なトランザクション」になり得るが、予期しない又は不正な結果を伴う。
【００５７】
（２）高レベル言語（HLL）構成
これらは、本開示に従うコンパイラが認識でき及びBitcoinスクリプトに変換できる関数又は文である。総合して、これらは、プログラマに馴染みのある構文を用いる高レベルプログラミング言語を構成する。馴染みのある構成（例えばIF−ELSE、CASE、WHILEループ、等）と同様に、Bitcoinトランザクションが動作するために、HLLに非常に特有の馴染みのない構成もある。例えば、INITIATE構成は、主スタックに自動的にプッシュされるデータインプットの数が（予約ワードNUM_INPUTSに割り当てられた）メモリ割り当ての中で最初の定数として保存されることを保証するための非常に特有の機能である。実施形態では、INITIATE構成は、HLLプログラムの中の最初の文であり得、DECLARE構成（これは、定数及び変数のためにメモリ割り当てを実行する）はHLLプログラムの中の２番目の文であり得る。
【００５８】
HLL構成は、コンパイラによりコンパイルのときに利用可能な情報のみを用いてBitcoinスクリプトに（つまり、OP_CODE及びCOP_CODEに）変換可能なように、設計されなければならない。これは、通常、プログラムの中で定数が宣言され（DECLARE）値を割り当てられる、プログラマによる多数のハードコーディングを意味する。例えば、NUM_INPUTSが定数と考えられる場合でも、プログラムが実行するまで、コンパイラはその値へのアクセスを有しない。したがって、これは、（もちろんプログラマはこれをプログラムの中の他の定数と同様に使用できるが）コンパイル実行のために使用できない。
【００５９】
HLL構成を設計するとき、設計者は、擬似コード又は自然言語での明確な説明に、コンパイラの期待される動作を含むことができる。例えば、コンパイラは、正しい構文及び任意の制約（例えばサイズ制限）に従うことの検証のような特定のチェックを実行することを要求され得る。これは、特定の制約が未だ分からなくても、明確であるべきである。HLL構成を設計する作業は、コンパイラ自体を記述することを含まないが、コンパイラの全ての期待される動作が可能であることを保証しなければならない。
【００６０】
本開示の説明のための実施形態に従い使用され得るHLL構成の選択が以下に提供される。
＜HLL構成：WHILEループ＞
●説明
コードブロック（又はcode−block、標準的にループ本体と呼ばれる）は、指定された条件が真である限り、最大反復回数まで、繰り返し実行される。最大反復回数は、コンパイルのときに知られており及び指定されなければならない。ループは、「ループを展開する」として知られる技術によりエミュレートされる。これは、コードブロックの機能（演算のシーケンス）を表すオペコードのシーケンスが、指定された最大反復回数まで複製されることを意味する。コードブロックの各複製されたオペコードのシーケンスの前にあるIF文は、コードブロックのオペコードのシーケンスが実行されるかどうかを決定する。IF条件は、ループの始めに（つまり、コードブロックのオペコードのシーケンスの最初の実行の前に）チェックされる。
【００６１】
●構文：
【数１】
2020526814.tif 000003
ここで、
Iterations:
正整数
コードブロック（Code−Block）が実行され得る最大回数。コンパイラは、この回数だけCode−Blockを生成するので、この値を知る必要がある。これは、ハードコードされ得る、又はDECLARE文の中にある定数を参照し得る。
Condition:
真（TRUE）又は偽（FALSE）に分けられる評価可能な表現。
合成条件であってよい。つまり、AND、OR、等（どちらでもコンパイラにより現在認識されている）を用いる。
【００６２】
●コンパイラの動作：
構文チェックを実行する。
反復（Iterations）が任意の制約（例えば、所定範囲に含まれる）を満たすことをチェックする。
条件（Condition）内の表現が評価可能であることをチェックする。
表現内の全ての定数／変数は、メモリ割り当て（DECLARE）リスト内に存在する。
表現内で使用される全ての演算子が現在許可されていることをチェックする（=、<、>、等）。
合成表現が任意の制約を満たすことをチェックする（例えば、AND、OR、等）。
Code−Blockの機能を「Iterations」回だけ複製する。
START  OF  REPLICATED  CODE（複製したコードの開始）
条件（Condition）を解決する（つまり、実行が真又は偽をスタックの一番上に残す）１つ以上のオペコードを記述する。
【００６３】
一般的な処理は、テストのために必要な各値をフェッチし該値を主スタックの一番上に置くRETRIEVE構成を利用し、次に関連するテスト動作（つまり、OP_EQUAL、OP_LESSTHAN、OP_GREATERTHAN等）を実行し得る。テストされるべき値が定数である場合、該値は、割り当てられたメモリ内の既知の位置にあり（つまり、主スタック上の既知の位置）、OP_PICKを用いてスタックの一番上にコピーされる。テストされるべき値が変数である場合（この場合、テストされるべき値はスクリプト実行中に決定される）、変数の位置は、割り当てられたメモリ内の既知の位置にあり（つまり、altスタック上の既知の位置）、「Borrow  Block」メソッドを用いて主スタックの一番上にコピーできる。
【００６４】
テストが（AND、OR、等を用いる）合成条件を利用する場合、各下位条件は別個に評価され、最終結果（０又は１）が主スタックの一番上に残される。これらは、次に、合成条件をテストするために結合される。例えば、合成条件が「Exp１  OR  Exp２」の形式である場合、動作は、最初にExp１を評価し、次にExp２を評価し、そしてスタック上の上位２個の値を比較するOP_BOOLORを記述する（つまり、Exp１及びExp２の評価結果）。
【００６５】
評価結果は、主スタックの一番上に残される。他の値はスタック上にない（もちろん、割り当てられたメモリを除く）。値は、次の動作（OP_IF）により使用される。
【００６６】
Code−Blockの機能（演算のシーケンス）をCode−Blockの機能を表すオペコードのシーケンスに変換する。このような変換は、Code−Blockに含まれる任意のCOP_CODEについてバイパスできる。これは、COP_CODEのCode−Blockのオペコードのシーケンスへの直接置換が必要なだけである。次に、OP_IF／OP_ENDIFペアの中でCode−Blockの機能を表すオペコードのシーケンスを記述する。
END  OF  REPLICATED  CODE（複製されたコードの終了）
【００６７】
幾つかの実施形態では、複製されたCode−Blockを表すオペコードのシーケンスは、WHILEループ構成の反復毎にオペコードのシーケンスによりアクセスされる定数及び変数の初期スタック位置がループ反復に渡り一定であるように、構成され得る。変数の値はループ反復に渡り更新され得るが、各ループ反復の実行を開始するときのこのような定数及び変数のスタック位置は、ループ反復に渡り一定のままである。このような動作は、オペコードの複製されたシーケンスが、各ループ反復の間にスタックに格納された適切な定数及び／又は変数にアクセスすることを保証する。
【００６８】
幾つかの実施形態では、Code−Blockを複製するための条件（Condition）は、スクリプト実行中に決定される１つ以上の変数の値に依存し、したがって、ループ反復に渡り更新され得る。この場合、複製されたCode−Blockの各反復は、関連する条件（Condition）をテストする１つ以上のオペコードコマンドを含み得る。該条件の後に、OP_IF／OP_ENDIFペアの中に埋め込まれた複製されたCode−Blockを表すオペコードのシーケンスが続く。この構成では、スクリプトの実行中、関連する条件（Condition）をテストするオペコードコマンドは、真（TRUE）又は偽（FALSE）として評価し、真（TRUE）又は偽（FALSE）の結果をスタックの一番上に置く。続くOP_IF文の実行は、真（TRUE）の結果がスタックの一番上にあるときだけ、複製されたCode−Blockを選択的に実行する。したがって、偽（FALSE）の結果がスタックの一番上にあるとき、OP_IF文の実行は、複製されたCode−Blockの実行をバイパスする。
【００６９】
さらに、Code−Blockを複製する条件（Condition）は、最大反復回数により制限できる。これは、WHILEループ構成の中で指定されるパラメータ、システム設計により肯定されたパラメータ、又は何らかの他のパラメータにより定義できる。この場合、条件（Condition）をテストするオペコードコマンド、及びそれに続く、OP_IF／OP_ENDIFペアの中に埋め込まれた複製されたCode−Blockを表すオペコードのシーケンスは、パラメータにより定義された最大反復回数に対応する回数だけ複製できる。
【００７０】
また、HLLプログラムは、内側WHILEループ構成が外側WHILEループ構成のCode−Blockの中に含まれるネスト構造のWHILEループ構成を利用できることに留意する。この場合、コンパイラは、外側WHILEループ構成についてのループ展開と関連して、内側WHILEループ構成についてループ展開を実行できる。例えば、内側WHILEループ構成のループ展開は、OP_IF／OP_ENDIFバイトコード構成のペアの間で内側WHILEループ構成のCode−Blockの機能を表すオペコードのシーケンスを、内側WHILEループ構成の反復数だけ複製できる。さらに、外側WHILEループ構成のループ展開は、OP_IF／OP_ENDIFバイトコード構成のペアの間で外側WHILEループ構成のCode−Blockの機能を表すオペコードのシーケンスを、外側WHILEループ構成の反復数だけ複製できる。この場合、外側WHILEループ構成の各反復のCode−Blockの機能を表すオペコードのシーケンスは、内側WHILEループ構成の反復回数だけオペコードシーケンスを含む。
【００７１】
また、WHILEループネスティングは拡張でき、追加内側WHILEループ構成が内側（第１内側）WHILEループ構成のCode−Block内に含まれる、及び更なるネスティングの可能性を有することに留意する。この場合、本願明細書に記載のようなループ展開動作は、この更なるネスティングを解決するために直ちに拡張可能である。
【００７２】
＜HLL構成：INITIATE＞
●説明：
実施形態において、これは、任意のHLLプログラムの必須の最初の文である。
トランザクション使用者により供給されるスクリプト実行の最初の部分（つまり「scriptsig’」）は、アンロックスクリプトの制御外である。これは、通常、スタックにプッシュされるデータで構成される。INITIATE構成の目的は、プログラマがこのインプット（最も可能性の高いのは、インプットがスクリプトの残りの部分のために必要か否か）を管理できるようにすることである。
この構成は、予約ワードNUM_INPUTS（スタックにプッシュされる使用者の供給したインプットの中のアイテム数である）に「値を割り当てる」。最初のOP_CODEは常にOP_DEPTHである。その結果、スタックの一番上（この時点で）は、スタックにプッシュされたデータインプットの数を含む。スタック内のこの位置は、固定され、コンパイラにコンパイルのときに知られているが、実際の値はコンパイルのときに分からない。
●構文：
INITIATE
●コンパイラの動作：
WriteOP_DEPTH  OP_DEPTH    /*これはOP_DEPTHをNUM_INPUTSの値に設定する。
【００７３】
＜HLL構成：DECLARE＞
●説明：
実施形態において、これは、任意のHLLプログラムの必須の２番目の文である。
全ての定数及び変数を宣言する。したがって、コンパイラは、「メモリ記憶」（つまり、主及び／又はaltスタックの中の位置）を予約できる。規格は、主スタックに定数を、altスタックに変数を保持することである。コンパイラは、変数及び定数に与えられた名称をスタック上のそれらの位置に関連付ける。コンパイラは、使用者により提供されたデータインプットを既に含む（INITIATEを参照）指名されたアイテムを主スタックにプッシュする。主スタックの一番上には、それらのデータアイテムの数を表す値がある（これは、予約ワードNUM_INPUTSに関連付けられる）。
●構文：
【数２】
2020526814.tif 000004
●コンパイラの動作：
HLLプログラムの宣言された（DECLARE）定数値を（主スタックのような）メモリ記憶に置くために、PUSHDATAコマンドを記述する。コマンドは、一番上から開始して、１つずつアイテムをメモリ記憶にプッシュし得る。コンパイラは、メモリ記憶の中の各定数値の位置（例えば、主スタック位置）を追跡できる。
HLLプログラムの変数を（altスタックのような）メモリ記憶に置くために、OP−TOALTSTACKコマンドを記述する。ここでも、コンパイラは、メモリ記憶の中の各変数の位置（例えば、altスタック位置）を追跡できる。
【００７４】
●例：
【数３】
2020526814.tif 000005
コンパイラがこれらの文を実行するのに続き（必須のINITIATE文が幾つかの値を獲得すると仮定すると）、メモリ記憶（本例では、主スタック及びaltスタック）の状態は、以下ようになるだろう。
【数４】
2020526814.tif 000006
【００７５】
本例では、アンロックスクリプトに供給される何からの個数のインプットアイテムがあると仮定する。少なくとも、例え値が０であり且つその下にスタックに値が無くても、「NUM_INPUTS」（これは予約ワードである）とラベル付けされた位置には値がある。この値は、その下に何個のアイテムがあるかに拘わらず、メモリブロックの始めと考えられる。コンパイラは、メモリ内のアイテムの数、及び、それらの初期のスタックの一番上からの相対位置を知っている。これらのアイテムは、プログラム実行の期間中、位置を保つ。一時的な計算は、（図中に「一時変数用(for  temp  variables)」と示される）スタックの一番上にある空間を用いて行われる。アイテムが一時的に計算のために主スタックの一番上にプッシュされると、これは、メモリアイテムの装置位置を変化させる。しかしながら、コンパイラは、相対位置の知識を常に保持する。
【００７６】
例えば、DECLARE文が実行された後に、コンパイラは、Init−depthの値及びスタック内の各アイテムの位置を計算して内部的に保持する（私達の例ではInit−depth＝１２）。つまり、
【数５】
2020526814.tif 000007
【００７７】
コンパイラは、＜アイテムの初期深さ＞＋＜スタックに追加されるアイテムの数＞に基づき、コンパイル中の任意の時点における任意のアイテムの深さを計算できる。
【００７８】
＜HLL構成：INCREMENT＞
●説明：
変数は、メモリ内のその位置から読み出され、１だけ増加され、次にメモリ内のその位置に再配置される。
●構文：
INCREMENT  (Variable−name)
ここで、
Variable−name:変数を識別するために宣言（Declaration）部分の中で使用される名称。
●コンパイラの動作：
注：コンパイラは、両方のスタックの変化するアイテム数（つまり、Main_Stack_Height及びALT_Stack_Height）の知識を維持する。コンパイラは、宣言（Declaration）部分の間に確立される各変数及び定数の各スタック上の位置も知っている。つまり、Var−Posn＝altスタック内のVariable−nameの位置（つまり、スタックの一番下からのアイテムの数）。
【００７９】
演算は、Borrow  Block技術を使用する。
【数６】
2020526814.tif 000008
（Borrow  Blockの説明の例２を参照する）。
【００８０】
●例：変数Bをインクリメントする
【数７】
2020526814.tif 000009
【００８１】
タスクは、変数Bをインクリメントすることである。コンパイラは、altスタックの中のBの深さがB−Depth=５であると知っている。コンパイラは、以下のスクリプトコードを生成する。
【数８】
2020526814.tif 000010
【００８２】
＜HLL構成：IF  ELSE＞
●説明：
標準的なIFテスト。
●構文：
【数９】
2020526814.tif 000011
ここで、
Value１：ハードコードされた値又は変数名又は定数名
Value２：ハードコードされた値又は変数名又は定数名
Test−operation：「=」、「<」、「>」、「≦」、「≧」（等）のような算術的テスト演算子。
●コンパイラの動作：
構文をチェックする。以下を含む：
【数１０】
2020526814.tif 000012
【００８３】
＜HLL構成：RESET＞
●説明：
変数が指定値を割り当てられる。
●構文：
RESET(Variable−name,Reset−value)
ここで、
Variable−name：新しい値を割り当てられるべき変数の名称、
Reset−value：Variable−nameに割り当てられるべき値。
●コンパイラの動作：
注：コンパイラは、両方のスタックの変化するアイテム数（つまり、Main_Stack_Height及びALT_Stack_Height）の知識を維持する。コンパイラは、DECLARE部分の間に確立される、割り当てられたメモリ内の（つまり各スタック上の）各変数及び定数の位置も知っている。
Var−Posn＝altスタック内のVariable−nameの位置（つまり、スタックの一番下からのアイテムの数）とする。演算は、Borrow  Block技術を使用する。
【数１１】
2020526814.tif 000013
【００８４】
＜HLL構成：ABORT＞
●説明：
トランザクションを無効としてマークする。
●構文：
ABORT
●コンパイラの動作：
Write  OP_０  OP_VERIFY
【００８５】
＜HLL構成：POPULATE＞
●説明：
この構成の目的は、トランザクション使用者からのインプット（例えば、spendingトランザクションのアンロックスクリプトの実行により供給されるインプット）を用いて、プログラマにより宣言（DECLARE）された定数を投入（populate）することである。
ロックスクリプトへのインプット（つまり「scriptsig’」）は、主スタックに任意のデータをプッシュする。これは、DECLARE構成の前に生じる。したがって、これらのインプットはスタックの一番下にある。スタックアイテムの数（NUM_INPUTS）は、（必須）INITIATE文によりそれらの一番上に置かれている。プログラマの責務は、トランザクションのルールが満たされたか（例えば、正しい数のインプットが提供されたこと）を検証することである。
●構文：
POPULATE(Stack−position,Constant−name)
ここで、
Stack−position:整数。メモリブロックの一番下から、カウントダウンされる位置。メモリブロックの一番下は、アイテムNUM_INPUTSを常に含み、これより下は、ロッキングスクリプトコードが実行される前にスタックにプッシュされたインプットデータがあることに留意する。
Constant−name:投入されるべき定数の名称。
●コンパイラの動作：
shift−count＝保管のために主スタックからaltスタックへ一時的に移動されるべきスタックアイテムの数、を計算する。
shift−count＝ターゲットアイテム（Constant−name）の一番上にあるスタックアイテムの数。
【数１２】
2020526814.tif 000014
【００８６】
＜HLL構成：RAWSCRIPT＞
●説明：
Bitcoin  Scriptコードの有効なチャンクを表す値の配列。コンパイラは、先ず、配列がスクリプトコードの有効なチャンク（OP_CODE、COP_CODE、及び整数を含む）であることを保証するために、配列を検証する。
目的は、プログラマが低レベルコードをCompilerアウトプットに直接包含できるようにすることである。これは、現在利用可能なHLL構成を使用するより、スクリプトコードに直接コーディングすることが一層容易な機能にとって有用である。
●構文：
RAWSCRIPT  [Values]
ここで、
Values  OP_CODE、COP_CODE、及びそれらの整数インプットの配列（リスト）
●コンパイラの動作：
コンパイラは、先ず、値のセットが有効なBitcoinスクリプトを一緒に構成することを検証する。つまり、OP_CODEは全て、現在受け入れられ有効にされたOP_CODEの部分であり、COP_CODEは全て、COP_CODEの私達の語彙の中に存在し、それらは全て期待されるインプット値を有する。
次に、コンパイラは、アウトプットスクリプトの中の現在位置に値を単に書き出す。
【００８７】
＜HLL構成：CALCULATE  TEMP＞
●説明：
有効な計算が行われ、結果を主スタックの一番上に置く。「有効」は、HLLに現在利用可能な関数構成のうちの１つであることを意味する。プログラマは、後に参照されたときにTEMPが利用可能であるように（つまり、依然としてスタックの一番上にあるように）、プログラムを書かなければならない。TEMPは１回だけ参照できることに留意する。（１回より多く必要な場合には、代わりに変数として宣言（DECLARE）されるべきである）。
●構文：
CALCULATE  TEMP=expression
●コンパイラの動作：
表現（expression）が有効である（現在利用可能な関数構成のリストのメンバである）ことをチェックする。
該表現を実行して、結果（TEMP）をスタックの一番上に残す。
TEMPへの以下の参照をパースする。TEMPが参照のときにスタックの一番上に存在する必要があるかどうかを決定する。必要がない場合、コンパイルエラーを投じない。
●例：
CALCULATE  TEMP=HASH１６０  (１２３４５６７８９)
【００８８】
＜HLL構成：HASH１６０＞
●説明：
これは、OP_CODE:OP_HASH１６０と等価なハッシングアルゴリズムを実行する。
●構文：
HASH１６０(value１)
ここで、
value１は以下のいずれかである：
ハードコードされた整数
宣言（DECLARE）された定数
宣言（DECLARE）された変数
●コンパイラの動作：
Velue１がハードコードされた数ならば、スタックの一番上にプッシュされる。
Velue１が変数又は定数ならば、読み出される（RETRIEVED）（スタックの一番上に置かれる）。
コンパイラは以下を書き込む：
OP_HASH１６０
【００８９】
＜HLL構成：RETRIEVE＞
●説明：
変数又は定数は、それ自体のメモリ内の位置から読み出され、主スタックの一番上にコピーされる。元の値は、変更されないまま、それ自体の「メモリ」内の現在の位置に残る。
●構文：
RETRIEVE(Item−name)
ここで、
Item−name  宣言（DECLARE）された変数又は定数
●コンパイラの動作：
注：コンパイラは、両方のスタックの変化するアイテム数（つまり、Main_Stack_Height及びALT_Stack_Height）の知識を維持する。コンパイラは、宣言（Declaration）部分の間に確立される各変数及び定数の各スタック上の位置も知っている。つまり、Item−posn＝スタック内のItem−nameの位置（つまり、スタックの一番下からのアイテムの数）。演算は、Borrow  Block技術を使用する。
Item−Depth=Stack_Height−Item−posn+１を計算する。
必要なアイテムがaltスタックにある（つまり、変数である）場合、
【数１３】
2020526814.tif 000015
必要なアイテムが主スタックにある（つまり、定数である）場合、
【数１４】
2020526814.tif 000016
【００９０】
●例：変数Cのコピーを読み出す
メモリ割り当てが以下のように見えると仮定する。
【数１５】
2020526814.tif 000017
タスクは、変数Cのコピーを主スタックの一番上に配置することである。コンパイラは、altスタックの中のCの深さがC−Depth=４であると知っている。コンパイラは、以下のスクリプトコードを生成する。
【数１６−１】
2020526814.tif 000018
【数１６−２】
2020526814.tif 000019
【００９１】
＜予約ワード＞
●予約ワード：NUM_INPUTS
説明：これは、常にメモリブロックの一番下の定数である。つまり、割り当てられたスタック位置のブロック内の「最初の」アイテムである。これは定数であるが、コンパイルのときに分からない。したがって、これは、任意のハードコードされたスクリプト演算のためにコンパイラにより使用できない（例えば、これは、コンパイルされたコード内でOP_TOALTSTACK文が何回生成されるかを計数するための数値として使用できない）。これは、実行時間において分かる。したがって、これは、ループ及びIF文の中の条件テストのようなタスクのために、プログラマ又はコンパイラにより使用できる。
【００９２】
●予約ワード：TEMP
説明：これは、計算後にスタックの一番上に残される、一時的な一度限りの変数である。これは、プログラマが計算中に参照できるようにするために存在する。コンパイラは、プログラム中で後にTEMPが参照されるときに、TEMPが依然としてスタックの一番上にあることを保証するために、構文をチェックする。
【００９３】
●予約ワード：CONSTANTS
説明：これは、DECLARE構成と関連して使用される。この後に、主スタックにプッシュされる構成のリストが続く。
【００９４】
●予約ワード：VARIABLES
説明：これは、DECLARE構成と関連して使用される。この後に、altスタックにプッシュされる変数のリストが続く。
【００９５】
説明の目的で、ここで、WHILEループを含む使用例、例示的なHLLプログラム、及びそれからコンパイルされ得るBitcoinスクリプトコードを提供する。Bitcoinスクリプトコードは、Bitcoinスクリプト言語であるScriptに属するオペコードを利用する。Bitcoinスクリプトコードは、従来のように/*又は//で始まるコメントを含むことに留意する。これらのコメントは、コンパイラにより生成されるBitcoinスクリプトコードの部分である必要はないが、例示的なBitcoinスクリプトコードを生成する際のコンパイラの動作を説明する目的で以下に含まれる。
【００９６】
＜WHILEループの例〜トランザクション（Tx）＞
１０個のハードコードされたハッシュパズルの内部リストを有するブロックチェーントランザクション（Tx）を考える。Txのアウトプットをアンロックするために、使用者は、少なくとも３個の正しいハッシュ解を提供する必要がある。トランザクションのロックスクリプトは、同じインプット（つまり「scriptsig」）で最大１２回の試行を受け付け、それらは任意の順序であり得る。トランザクションは、各インプット「try」をハッシュし、それが内部に格納したハッシュ値のうちの１つに一致するかどうかをチェックする。
【００９７】
明確のため、BitcoinトランザクションのINPUTセクションでアンロックスクリプトを記述する従来の方法を考える。
<scriptSig>  <scriptPubkey>
最初の部分<scriptSig>は、使用されている前のトランザクションのOUTPUTをアンロックするために、spendingトランザクションに含まれるデータ及び／又はOP_CODEである。２番目の部分<scriptPubkey>は、使用されている前のトランザクションのOUTPUTの中で使用されるロックスクリプトである。
【００９８】
私達は、これらを以下のように表す。
<Spender  Input>  <locking  script>
【００９９】
使用者インプット（Spender  Input）がTRY１  TRY２  TRY３  TRY４  TRY５であると仮定する。
つまり、使用者は、５個の異なる可能なハッシュ解を試行した。上述のルールでは、トランザクションをアンロックするために、そのうちの３個は正しい必要がある。結合された<Spender  Input>  <locking  script>が実行されると、最初の演算は<Spender  Input>内のものになる。これは、本例では、単に５個のデータアイテムをスタックにプッシュすることである。
【０１００】
＜ロックスクリプトロジック〜擬似コード＞
注：ネストされたWHILEループがある。
標準的な第１ステップ：インプットの数を計数し、NUM_INPUTSとして保存する。
スクリプトの中で使用される変数及び定数を宣言し、既知の値に初期化する。
【数１７】
2020526814.tif 000020
【０１０１】
使用者のインプット値を有する内部配列を投入する（つまり、本例では、Try[１]−Try[５]をインプット値TRY１  TRY２  TRY３  TRY４  TRY５に割り当てる）。配列の残りのものはゼロの値のままである。
【０１０２】
/*外側ループがここで開始する：各インプット値（TRY１−TRY５）を得て、チェックのためにそれをハッシュする。
【数１８】
2020526814.tif 000021
【０１０３】
/*内側ループがここで開始する：保存したハッシュ値ごとに、ハッシュされたTry値に一致するかどうかをチェックする。
【数１９】
2020526814.tif 000022
【０１０４】
＜正式なHLLプログラム＞
以下のコードは、本開示の実施形態による構文を用いてHLLで記述されている。これは、WHILEの使用を説明することを目的とするが、やむを得ず、他のHLL構成も含み（これらは大文字である（CAPITALISED））、これらのうちの幾つかは上述され、従来の最新の高レベル言語により使用される構文に慣れている当業者に直ちに理解されるだろう。
【数２０】
2020526814.tif 000023
【０１０５】
/*配列要素毎に、スタック上に利用可能な対応するインプット値があるかどうかをチェックし、ある場合、対応する配列要素を投入するためにそれを使用する。
【数２１】
2020526814.tif 000024
【０１０６】
/*外側ループ。合成条件に留意する。
【数２２】
2020526814.tif 000025
/*内側ループ。別の合成条件。
【数２３】
2020526814.tif 000026
【０１０７】
＜コンパイルされたBitcoin  Script＞
/*INITIATE（初期化）
OP_DEPTH  //NUM_INPUTS(予約ワード)を決定し、スタックの一番上に置く
/*DECLARECONSTANTS（定数の宣言）定数を初期化し、主スタックに置く。コンパイラは、定数の位置を知っている。１２個の値の配列（これらは、「try値」であり、後に実際のインプット値を投入される）。
実際には、配列：Try[１２]
OP_０  OP_０  OP_０  OP_０  OP_０  OP_０  OP_０  OP_０  OP_０
OP_３  //Correct_Needed−TXをアンロックするために必要な正しいハッシュの数は３とハードコードされる
OP_１０  //Num_Hashes−配列内のハッシュの数は１０とハードコードされる
【０１０８】
/*ハードコードされたハッシュ値は、主スタックに格納される（つまり、次の２０バイトがスタックにプッシュされる）。実際には配列HASH−SAVED[１０]。
【数２４】
2020526814.tif 000027
【０１０９】
/*DECLARE  VARIABLEs（変数の宣言）。変数（インデックス及びブール）を初期化し、altスタックに置く。コンパイラは位置を知っている。
OP_０  OP_TOALTSTACK  //  Correct_Counter−正しいヒットの数（ハッシュの一致が見付かったとき）。
OP_０  OP_TOALTSTACK  //  Try_counter−外側ループのインデックス：試行されているインプット値のカウンタ。
OP_０  OP_TOALTSTACK  //  Hash_counter−内側ループのインデックス：試行されているハッシュのカウンタ。
OP_０  OP_TOALTSTACK  //  Match_found−ブールフラグ：ハッシュの一致が見付かったときに真（True）に設定される。
【０１１０】
/*この段階で、altスタックが投入され、変数のためのメモリストアとして動作する。コンパイラは、変数の位置、つまりaltスタックにおけるそれらの「深さ」を「追跡」する必要がある。主スタックは、定数を投入されている。コンパイラは、定数の位置も追跡する必要がある。主スタックメモリブロックの「最初の値」は、（何個のアイテムがその下にあるかに関係なく）NUM_INPUTSの位置にあると考えられる。
【０１１１】
/*この段階で、コンパイラは、NUM_INPUTSの値が主スタックの２７の深さにあることを知っている。以下の演算は、この値をスタックの一番上にコピーする。次に、これは、値「１２」をスタックの一番上にプッシュし、「>」を用いて比較する。NUM_INPUTS>１２ならば（許容される１２回の「試行」に対応する）、異常終了する。OP_VERIFYが結果をスタックの一番上に残すので、演算はOP_DROPを使用できる。
２７  OP_PICK  OP_１２  OP_GREATERTHAN  OP_VERIFY  OP_DROP
【０１１２】
/*POPULATE  THE  Try[]  array（Try[]配列を投入する）。注：Try[]配列を投入するためのコードブロックは、本願の明確さ及び読みやすさを向上するために、図２に移されている。私達は、コンパイラがTxアウトプットの使用者により供給されたインプット値を読み取りそれらをTry[]配列に投入するスクリプトコードのブロックを書き出すと仮定する。一例では、５個のインプット（つまり５回の「試行」）のみが提供され、したがって、Try[]の最初の５個の要素だけが投入され、他の要素は値０のままである。
【０１１３】
/*外側WHILEループ。（例えば所定のルールの毎に）可能な最大反復回数は１２である。したがって、コンパイラは、以下のオペコードのシーケンスを１２回複製することにより、外側WHILEループを展開する。
/*条件１（Condition１）のBorrow  Block：「is  Try_counter<NUM_Inputs  AND  Correct_counter<Correct_Needed?」。条件１の中のテストを行うために、私達は、altスタックから変数を抽出し、テストを実行し、次に変数を再び戻す（「borrow  block」）。
/*先ず、Try_counterのコピーを得て、スタックの一番上に置く。
【数２５】
2020526814.tif 000028
【０１１４】
/*次に、NUM_Inputsのコピーを得て、スタックの一番上に置く。コンパイラは、この定数が現在、主スタックの１４の深さにあることを知っている。
OP_１４  OP_PICK
/*ここで、条件１（Condition１）の部分１（part１）について、上位２個のスタックアイテムの比較を行う。これは「Try−Counter<NUM_Inputs?」をチェックし、結果をスタックの一番上に残す。
OP_LESSTHAN
/*条件１（Condition１）の部分２（part２）のチェックを行う（「is  Correct_counter<Correct_Needed?」）。結果をスタックの一番上に残す。
/*先ず、Correct_counterのコピーを得て、スタックの一番上に置く。
【数２６】
2020526814.tif 000029
【０１１５】
OP_１３  OP_PICK  //  Correct_Neededをスタックの一番上にコピーする：コンパイラは、この定数が現在１３の深さにあると知っている。
OP_LESSTHAN  //  ここで、条件１（Condition１）の部分２（part２）について、上位２個のスタックアイテムの比較を行う。これは「Correct_counter<Correct_needed?」をチェックし、結果をスタックの一番上に残す。
OP_BOOLAND  //  条件１（condition１）の結合したチェックを完了する：条件１の両方の部分の結果がスタックの一番上にある。この演算の後に、Condition１のテストの最終結果がスタックの一番上にある。以下のIFによりポップオフされる。
OP_IF
【０１１６】
/*Try−CounterのインクリメントのためのBorrow  block。最初のステップは、主スタックの一番上にそれを得ることである。コンパイラは、そのaltスタック上の深さを知っている（本例ではdepth=３）。
【数２７】
2020526814.tif 000030
【０１１７】
/*Hash_counter=０にリセットするためのBorrow  block。コンパイラは、この変数の位置を知っている。
【数２８】
2020526814.tif 000031
【０１１８】
/*Match−Found=FALSEにリセットするためのBorrow  block。コンパイラは、この変数の位置を知っている。
【数２９】
2020526814.tif 000032
【０１１９】
/*  必要な「Try」値をスタックの一番上にコピーし、それをハッシュする。
<Try−depth>OP_PICK
OP_HASH１６０  //正式なHLLでは、これはTEMPの値であり、スタックの一番上に残される。更なる演算は、より多くの値を主スタックにプッシュし及び／又は主スタックからポップオフする。目的は、TEMPの値が（等価チェックのために）次に必要なとき、スタックの一番上にあることである。コンパイラは、正式なHLLコードに基づき常にスタック内に何があるかを追跡できるので、コンパイラはコンパイルのときにこれを検証できる
【０１２０】
/*内側WHILEループ。
/*内側WHILEループは、与えられる例では１０の最大値を有するNum_Hashes回の反復の間、実行される。したがって、コンパイラは、外側WHILEループの各反復の中で、以下のオペコードのシーケンスを（１０回の反復以下である）Num_Hashes回の反復だけ複製することにより、内側WHILEループを展開する。
【０１２１】
/*条件２（Condition２）のBorrow  Block：「‘Is  Match_Found=FALSE  AND  Hash−Counter<NUM_Hashes?」。条件１の中のテストを行うために、私達は、altスタックから変数を抽出し、テストを実行し、次に変数を再び戻す（「borrow  block」）。
【０１２２】
/*先ず、Condition２の部分１の変数Match_Foundのコピーを取得し、スタックの一番上に置く。コンパイラは、この変数の位置を知っている。
【数３０】
2020526814.tif 000033
/*Match_Found=FALSEをチェックし、結果をスタックの一番上に置く。
OP_NOT
/*ここで、condition２の部分２の変数Hash_Counter及びNUM_Hashesのコピーを取得する（Hash_Counter<NUM_Hashesかどうかをテストする）。コンパイラは、これらの変数の位置を知っている。
【数３１】
2020526814.tif 000034
【０１２３】
/*Hash_Counter<NUM_Hashesをチェックする。
OP_LESSTHAN
/*condition２の結合したチェックを完了する。condition２チェックの両方の部分の結果は、スタックの一番上にある。この後に、最終結果がスタックの一番上に残される。
【０１２４】
OP_BOOLAND
【０１２５】
/*Condition２テストの結果は、スタックの一番上にある。以下のIFによりポップオフされる。
OP_IF
【０１２６】
/*Hash_CounterのインクリメントのためのBorrow  block。
必要なハッシュ値の深さ（つまり<Hash−depth>）は、「current−stack−height」−「Hash１−position」−Hash_counter+１としてコンパイラにより計算できる。
/*コンパイラは、全ての定数の位置の知識を維持でき、したがって、第１ハッシュ値の位置が９であることを知っている（なぜなら、５個のTry値があり、３個の多の定数がスタックの一番下にあるからである）。
/*主スタックの一番上に１つのTEMP値があり、したがって、現在スタック高は１９である。HASH−SAVED[４](Hash_counter=４)の深さが欲しい場合、深さは次の通りである。
「Hash−depth」=１９−９−４+１=８
（つまり、現在、主スタックの一番上から８である）。
【数３２】
2020526814.tif 000035
スタックの上から２番目は、内側ループ（TEMP）の直前に実行されたOP_HASH１６０演算の結果である。これに続く演算は、内部に保存したハッシュ値に対して、ハッシュされたTry値（TEMP）をチェックする。
【数３３】
2020526814.tif 000036
/*内側WHILEループの終了
/*NUM_INPUTSを読み出すオペコード
/*NUM_INPUTS≧１をチェックするオペコード
OP_IF
内側WHILEループの２回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS≧２をチェックするオペコード
OP_IF
内側WHILEループの３回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS≧３をチェックするオペコード
OP_IF
内側WHILEループの４回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS≧４をチェックするオペコード
OP_IF
内側WHILEループの５回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS≧５をチェックするオペコード
OP_IF
内側WHILEループの６回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS≧６をチェックするオペコード
OP_IF
内側WHILEループの７回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS>=７をチェックするオペコード
OP_IF
内側WHILEループの８回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS>=８をチェックするオペコード
OP_IF
内側WHILEループの９回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS>=９をチェックするオペコード
OP_IF
内側WHILEループの１０回目の反復のオペコードシーケンスの複製
END_IF
【０１２７】
/*外側WHILEループの終了
外側WHILEループの２回目の反復のオペコードシーケンスの複製（内側WHILEループの（最大１０回の）NUM_INPUTS回の反復のオペコードシーケンスの複製を含む）。
外側WHILEループの３回目の反復のオペコードシーケンスの複製（内側WHILEループの（最大１０回の）NUM_INPUTS回の反復のオペコードシーケンスの複製を含む）。
外側WHILEループの４回目の反復のオペコードシーケンスの複製（内側WHILEループの（最大１０回の）NUM_INPUTS回の反復のオペコードシーケンスの複製を含む）。
外側WHILEループの５回目の反復のオペコードシーケンスの複製（内側WHILEループの（最大１０回の）NUM_INPUTS回の反復のオペコードシーケンスの複製を含む）。
外側WHILEループの６回目の反復のオペコードシーケンスの複製（内側WHILEループの（最大１０回の）NUM_INPUTS回の反復のオペコードシーケンスの複製を含む）。
外側WHILEループの７回目の反復のオペコードシーケンスの複製（内側WHILEループの（最大１０回の）NUM_INPUTS回の反復のオペコードシーケンスの複製を含む）。
外側WHILEループの８回目の反復のオペコードシーケンスの複製（内側WHILEループの（最大１０回の）NUM_INPUTS回の反復のオペコードシーケンスの複製を含む）。
外側WHILEループの９回目の反復のオペコードシーケンスの複製（内側WHILEループの（最大１０回の）NUM_INPUTS回の反復のオペコードシーケンスの複製を含む）。
外側WHILEループの１０回目の反復のオペコードシーケンスの複製（内側WHILEループの（最大１０回の）NUM_INPUTS回の反復のオペコードシーケンスの複製を含む）。
外側WHILEループの１１回目の反復のオペコードシーケンスの複製（内側WHILEループの（最大１０回の）NUM_INPUTS回の反復のオペコードシーケンスの複製を含む）。
外側WHILEループの１２回目の反復のオペコードシーケンスの複製（内側WHILEループの（最大１０回の）NUM_INPUTS回の反復のオペコードシーケンスの複製を含む）。
外側WHILEループの１２回の反復が完了すると、コンパイラは、必要なヒット数に達したかをチェックする（つまり、Correct_counter≧Correct_Neededをチェックする）。
【数３４】
2020526814.tif 000037
【０１２８】
//この最終演算は、テスト結果をスタックの一番上に残す。真（TRUE）（つまり、Correct_counter≧Correct_Needed）且つ他のチェックが通る可能性がある場合、トランザクションは有効としてマークされる。
【０１２９】
実施形態では、ブロックチェーンコンパイラは、アウトプットスクリプトのより効率的な又は削減されたバージョンを提供するために、少なくとも１回、アウトプットスクリプトを最適化するよう構成され得る。これは、導関数のない最適化（derivative  free  optimisation：DFO）の使用を含んでよい。DFOは、従来知られた用語であり、当業者により直ちに理解される。追加又は代替として、アウトプットスクリプトを生成するステップは、導関数のない最適化の使用を含んでよい。
【０１３０】
実施形態では、ブロックチェーンコンパイラは、ソフトウェア開発キット（software  development  kit：SDK）の部分を形成し及び／又はそれと関連して動作するよう構成されてよい。SDKは、エディタ、デバッガ、及びコードに基づくソリューションの生成を促進するためにSDKと共に使用されるべき知られている他のコンポーネントを含んでよい。
【０１３１】
図３は、本開示の一実施形態によるブロックチェーンに関連付けられた例示的なブロックチェーンネットワーク１０００を示す。本実施形態では、例示的なブロックチェーンネットワーク１０００は、ブロックチェーンプロトコルのインスタンスを実行するピアツーピア分散型電子装置で構成される。幾つかの例では、分散型電子装置は、ノード１００２として参照される。ブロックチェーンプロトコルの一例はBitcoinプロトコルである。
【０１３２】
ノード１００２は、任意の適切なコンピューティング装置で（例えば、データセンタ内のサーバにより、クライアントコンピューティング装置により（例えばデスクトップコンピュータ、ラップトップコンピュータ、タブレットコンピュータ、スマートフォン、等）、コンピューティングリソースサービスプロバイダの分散型システム内の複数のコンピューティング装置により、又は図５のコンピューティング装置２６００のような任意の適切な電子クライアント装置により）構成されてよい。
【０１３３】
一実施形態では、ノード１００２のうちの１つ以上は、ノード１００２のうちの１つ以上の他のノードと通信可能に結合される。このような通信結合は、良く知られた有線又は無線通信リンクのうちの１つ以上を利用できる。実施形態では、ノード１００２は、それぞれ、ブロックチェーン内の全てのトランザクションの「台帳」の少なくとも一部を維持する。このように、台帳は分散台帳である。台帳に影響を与えるノードにより処理されるブロックチェーントランザクションは、台帳の完全性が維持されるように、他のノードのうちの１つ以上により検証される。
【０１３４】
一実施形態では、ノード１００２のうちの少なくとも幾つかは、暗号化問題を解くような複雑な計算に関連するマイニング処理を実行するマイナーノードである。暗号化問題を解くマイナーノードは、ブロックチェーンの新しいブロックを生成し、新しいブロックをノード１００２のうちの他のノードにブロードキャストする。ノード１００２のうちの他のノードは、マイナーノードの作業を検証する検証処理を実行し、検証すると、（例えばブロックをブロックチェーンの分散台帳に追加することにより）ブロックをブロックチェーン内へと受け付ける。幾つかの例では、ブロックは、トランザクションのグループであり、タイムスタンプ及び前のブロックの「指紋」（例えばハッシュ）によりマークされることがある。このように、各ブロックは前のブロックにリンクされるようになり、それにより、ブロックチェーン内のブロックをリンクする「チェーン」を生成する。実施形態では、有効なブロックは、ノード１００２の総意によりブロックチェーンに追加される。また、幾つかの例では、ブロックチェーンは検証済みブロックのリストを含む。
【０１３５】
一実施形態では、ノード１００２のうちの少なくとも幾つかは、本開示に記載のようにトランザクションを検証する検証処理を実行する検証ノードとして動作する。図３は、１つの例示的なラベル付けされたトランザクション１００４を示す。幾つかの例では、トランザクションは、デジタルアセットの所有権の証明を提供するデータ（例えば、Bitcoinトークンの量）、及びデジタルアセットの所有権／制御を受け入れる又は移転する条件を含む。幾つかの例では、「spendingトランザクション（spending  transaction）」は、前のトランザクションの未使用トランザクションアウトプット（unspent  transaction  output：UTXO）により示されるデジタルアセットの少なくとも一部を、ブロックチェーンアドレスに関連付けられたエンティティに再割り当てする（例えば、所有権又は制御を移転する）トランザクションを表す。幾つかの例では、「前のトランザクション」は、spendingトランザクションにより参照されているUTXOを含むトランザクションを表す。幾つかの実施形態では、トランザクションは、「アンロックスクリプト」及び「ロックスクリプト」を含み得る。ロックスクリプトは、トランザクションが有効にされ及び所有権／制御がトランザクションにより移転される前に満たされなければならない条件により、トランザクションを妨げるために使用できる。幾つかの実施形態では、ロックスクリプトは、トランザクションのアウトプットに関連付けることができ、アウトプットを使用するために必要な１つ以上の条件を定めるために使用できる。さらに、spendingトランザクションのアンロックスクリプトは、アンロックスクリプトの実行が、spendingトランザクションの検証のために前のトランザクションのロックスクリプトの実行により評価される条件セットを導出するために使用されるデータを提供するように、構成され得る。前のトランザクションのロックスクリプト及びspendingトランザクションのアンロックスクリプトは、BitcoinのScriptのような低レベルの機能的に制約されたスクリプト言語を用いて記述される。
【０１３６】
幾つかの実施形態では、spendingトランザクションの検証は、前のトランザクションのロックスクリプトにより記述された条件セットを満たし及び検証するために、spendingトランザクションのアンロックスクリプトの実行、それと共に前のトランザクションのロックスクリプトの実行を含んでよい。Spendingトランザクションの検証は、他のチェックを含み得る。Spendingトランザクションの検証に成功すると、spendingトランザクションは他のネットワークノードへ伝搬され得る。マイナーノードは、本願明細書に記載のように、有効なspendingトランザクションを、ブロックチェーンに追加されるブロックの部分として埋め込むために選択できる。
【０１３７】
図３に示すように、本願明細書に記載のブロックチェーンコンパイラ１００１は、HLLプログラムを、ブロックチェーンと互換性のあるスクリプト（又はスクリプトのフラグメント）に変換するために使用される。これは、ブロックチェーンコンパイラ１００１により提供されるアウトプットを形成し得るので、「アウトプットスクリプト」と呼ばれてよい。アウトプットスクリプトは、ブロックチェーントランザクション（Ｔｘ）に提供されてよい。アウトプットスクリプトは、トランザクションアウトプットに関連付けられたロックスクリプトの部分、又はトランザクションインプットに関連付けられたアンロックスクリプトの部分であってよい。アウトプットスクリプトは、ブロックチェーンネットワークのノードにより実行可能なブロックチェーンスクリプト言語から選択された、それに固有の及び／又はその部分を形成するオペコードで形成されてよい。オペコードは、プリミティブ又はコマンドと呼ばれてよい。スクリプトのオペコードは、ブロックチェーンネットワーク１０００のノード上で実行するインタープリタ又は仮想機械により実行され得る。インタープリタ又は仮想機械は、スクリプトのオペコードを機械実行可能（オブジェクト）コードに変換してよい。ブロックチェーンスクリプト言語は、例えば、Bitcoinプロトコル又はその変形と関連して使用されるScript言語であってよい。スクリプト言語は、暗号化、算術、及びスタック操作オペコードを含んでよい。
【０１３８】
コンパイラ１００１は、SDK、又は場合によっては、ブロックチェーンネットワークのボット若しくはノードにより実行可能なブロックチェーントランザクションスクリプト（又はスクリプトのフラグメント）を生成するために静的コンパイルを利用するオンラインサービスの部分であり得る。
【０１３９】
代替として、本願明細書に記載のコンパイラの方法は、ブロックチェーンネットワークのボット又はノードの実行時間の環境の部分として使用できる。ここで、実行時間の環境は、HLLプログラム（例えば、python、C++等のような３G言語で記述されたプログラム）のチャンクを、ブロックチェーンネットワークのボット又はノードにより実行可能なブロックチェーントランザクションスクリプト又はスクリプトフラグメントに解釈する又は動的にコンパイルする若しくは変換する。
【０１４０】
図４は、spending前のトランザクション２０２（「TX１」と付される）のアウトプットを使用するトランザクション２０４（「TX２」と付される）の検証及びマイニングのための例示的なブロックチェーンプロトコルを示す。前のトランザクション２０２は、トークン量（デジタルアセット）を含むアウトプットと、該トークン量を使用するために必要な条件セットを定めるよう構成されるロックスクリプトと、を有する。前のトランザクション２０２は検証されマイニングされる。その結果、前のトランザクション２０２はブロックに埋め込まれ、次に該ブロックが検証されて、該ブロックがブロックチェーン２０８に格納される。Spendingトランザクション２０４は、前のトランザクション２０２のアウトプットを参照するトランザクションアウトプット識別子フィールド（「Tx  output  ID」と付される）とアンロックスクリプトとを有するインプットを含む。前のトランザクション２０２のロックスクリプト及びspendingトランザクション２０４のアンロックスクリプトは、BitcoinのScriptのような低レベルの機能的に制約されたスクリプト言語を用いて記述される。spendingトランザクション２０４が有効と考えられるためには、インプットのアンロックスクリプトは、前のトランザクション２０２の参照されたアウトプットのロックスクリプトにより定められた条件セットを満たすデータを提供しなければならない。前のトランザクション２０２のロックスクリプト（又はその部分）及びspendingトランザクション２０４のアンロックスクリプトは、本願明細書に記載のブロックチェーンコンパイル方法及びツールにより生成され得る。
【０１４１】
Spendingトランザクション２０４は、前のトランザクション２０２のロックスクリプトにより記述される条件セットを満たし及び検証するために、spendingトランザクション２０４のアンロックスクリプトを実行するのと共に、前のトランザクション２０２のロックスクリプトを実行することにより、ブロックチェーンネットワーク（図４）の１つ以上のノードにより検証される。Spendingトランザクション２０２の検証は、他のチェックを含み得る。Spendingトランザクションの検証に成功すると、spendingトランザクションは他のネットワークノードへ伝搬され得る。マイナーノードは、本願明細書に記載のように、有効なspendingトランザクションを選択し、ブロックチェーン２０８に追加されるブロックの部分として埋め込むマイニング動作を実行できる。検証され、ブロックチェーン２０８に格納されると、トランザクション２０２及び２０４のシーケンスは、トランザクションにより参照されるトークン量（デジタルアセット）に対する制御の移転を提供する。
【０１４２】
図５は、本開示の少なくとも一実施形態を実施するために使用され得るコンピューティング装置２６００の簡略ブロック図を示す。種々の実施形態で、コンピューティング装置２６００は、図示した及び上述したブロックチェーンネットワークのブロックチェーンコンパイラ及びネットワークノードを実装するために使用されてよい。例えば、コンピューティング装置２６００は、データサーバ、ウェブサーバ、ポータブルコンピューティング装置、パーソナルコンピュータ、又は任意の電子コンピューティング装置としての使用のために構成されてよい。図５に示すように、コンピューティング装置２６００は、多数の周辺サブシステムとバスシステム２６０４を介して動作可能に結合され及び通信するよう構成されてよい１つ以上のプロセッサ２６０２を含んでよい。プロセッサ２６０２は、本願明細書に記載のように、HLLソースコードプログラムのブロックチェーンスクリプト（又はそのフラグメント）へのコンパイルのために利用されてよい。これらの周辺サブシステムは、メモリサブシステム２６０８及びファイル／ディスク記憶サブシステム２６１０を含む記憶サブシステム２６０６、１つ以上のユーザインタフェース入力装置２６１２、１つ以上のユーザインタフェース出力装置２６１４、及びネットワークインタフェースサブシステム２６１６を含んでよい。このような記憶サブシステム２６０６は、本開示に記載のトランザクションに関連する詳細事項のような情報の一時的又は長期記憶のために使用されてよい。
【０１４３】
バスサブシステム２６０４は、コンピューティング装置２６００の種々のコンポーネント及びサブシステムに、必要に応じて互いに通信させるメカニズムを提供してよい。バスサブシステム２６０４は概略的に単一バスとして示されるが、バスサブシステムの代替の実施形態は複数のバスを利用してよい。ネットワークインタフェースサブシステム２６１６は、他のコンピューティング装置及びネットワークへのインタフェースを提供してよい。ネットワークインタフェースサブシステム２６１６は、コンピューティング装置２６００からの他のシステムからデータを受信する及びそれへデータを送信するためのインタフェースとして機能してよい。例えば、ネットワークインタフェースサブシステム２６１６は、データ技術者が装置を無線ネットワークに接続することを可能にしてよい。その結果、データ技術者は、ユーザデータセンタのような遠隔の場所にいる間、データを送信及び受信可能であってよい。バスシステム２６０４は、詳細事項、検索語、等のようなデータを、本開示の監視モデルに通信するために利用されてよく、監視モデルのアウトプットを１つ以上のプロセッサ２６０２に及び商人及び／又は債権者にネットワークインタフェースサブシステム２６１６を介して通信するために利用されてよい。
【０１４４】
ユーザインタフェース入力装置２６１２は、キーボード、統合型マウスのようなポインティング装置、タッチパッド、又はグラフィックタブレット、スキャナ、バーコードスキャナ、ディスプレイに内蔵されたタッチスクリーン、音声認識システムのようなオーディオ入力装置、マイクロフォン、及び他の種類の入力装置のような、１つ以上のユーザ入力装置を含んでよい。概して、用語「入力装置」の使用は、コンピューティング装置２６００に情報を入力するためのあらゆる可能な種類の装置及びメカニズムを含むことを意図する。１つ以上のユーザインタフェース出力装置２６１４は、ディスプレイサブシステム、プリンタ、又はオーディオ出力装置のような非視覚ディスプレイ、等を含んでよい。ディスプレイサブシステムは、陰極線管（CRT）、液晶ディスプレイ（LCD）のような平面パネル装置、発光ダイオード（LED）ディスプレイ、又は投影若しくは他のディスプレイ装置を含み得る。概して、用語「出力装置」の使用は、コンピューティング装置２６００から情報を出力するためのあらゆる可能な種類の装置及びメカニズムを含むことを意図する。１つ以上のユーザインタフェース出力装置２６１４は、例えば、本願明細書に記載の処理及びその変形を実行するアプリケーションとのユーザ相互作用が適切な場合に、該相互作用を助けるために、ユーザインタフェースを提示するために使用されてよい。
【０１４５】
記憶サブシステム２６０６は、本開示の少なくとも一実施形態の機能を提供し得る基本プログラミング及びデータ構造を格納するコンピュータ可読記憶媒体を提供してよい。アプリケーション（プログラム、コードモジュール、命令）は、１つ以上のプロセッサにより実行されると、本開示の１つ以上の実施形態の機能を提供してよく、記憶サブシステム２６０６に格納されてよい。これらのアプリケーションモジュール又は命令は、１つ以上のプロセッサ２６０２により実行されてよい。記憶サブシステム２６０６は、さらに、本開示に従い使用されるデータを格納するレポジトリを提供してよい。記憶サブシステム２６０６は、メモリサブシステム２６０８及びファイル／ディスク記憶サブシステム２６１０を含んでよい。
【０１４６】
記憶サブシステム２６０８は、プログラム実行中の命令及びデータの記憶のための主ランダムアクセスメモリ（RAM）２６１８、及び固定命令が格納され得る読み出し専用メモリ（ROM）２６２０を含む多数のメモリを含み得る。ファイル／ディスク記憶サブシステム２６１０は、プログラム及びデータファイルのための非一時的永久（不揮発性）記憶を提供してよく、ハードディスクドライブ、関連取り外し可能媒体と一緒のフロッピーディスクドライブ、コンパクトディスク読み出し専用メモリ（CD−ROM）ドライブ、光ドライブ、取り外し可能媒体カートリッジ及び他の同様の記憶媒体を含んでよい。
【０１４７】
コンピューティング装置２６００は、少なくとも１つのローカルクロック２６２４を含んでよい。ローカルクロック２６２４は、特定の開始日から生じた時間数を表すカウンタであってよく、コンピューティング装置２６００の内部に統合されて置かれてよい。ローカルクロック２６２４は、コンピューティング装置２６００のプロセッサ及びその中に含まれる全サブシステム内で、特定クロックパルスにデータ転送を同期化するために使用されてよく、コンピューティング装置２６００とデータセンタ内の他のシステムとの間の同期動作を調整するために使用されてよい。一実施形態では、ローカルクロック２６２４は原子時計である。別の実施形態では、ローカルクロックはプログラム可能な間隔タイマである。
【０１４８】
コンピューティング装置２６００は、ポータブルコンピュータ装置、タブレットコンピュータ、ワークステーション、又は以下に記載の任意の他の装置を含む種々の種類であってよい。さらに、コンピューティング装置２６００は、コンピューティング装置２６００に１つ以上のポート（例えば、USB、ヘッドホンジャック、光コネクタ、等）を通じて接続され得る別の装置を含んでよい。コンピューティング装置２６００に接続され得る装置は、光ファイバコネクタを受けるよう構成される複数のポートを含んでよい。したがって、本装置は、光信号を電気信号に変換するよう構成されてよい。該電気信号は、処理のために、装置をコンピューティング装置２６００に接続するポートを通じて送信されてよい。コンピュータ及びネットワークの絶え間なく変わる特性により、図１３に示すコンピューティング装置２６００の説明は、装置の好適な実施形態を説明する目的で特定の例としてのみ意図される。図５に示したシステムより多数の又は少数のコンポーネントを有する多くの他の構成が可能である。
【０１４９】
留意すべきことに、上述の実施形態は、本開示を限定するのではなく説明し、当業者は添付の請求項により定められる本発明の範囲から逸脱することなく多数の代替の実施形態を考案できる。本開示の方法、システム、及び機器（又はそれらの部分）は、複数の別個の要素を有するハードウェアにより又は適切にプログラムされたコンピュータにより、実施されてよい。複数の手段を列挙している装置の請求項では、これらの複数の手段は、１つの同一のハードウェア要素により実装することができる。特定の量が相互に異なる従属請求項に記載されるという事実は、これらの量の組合せが有利に用いることが出来ないことを示すものではない。
【０１５０】
したがって本明細書と添付図面は限定的ではなく例示的であると解釈すべきである。しかしながら、請求の範囲に記載された本発明の範囲から逸脱することなく種々の変更を行うことができることが明らかである。同様に、他の変形は本開示の範囲内にある。したがって、開示の技術は、種々の変形及び代替構成の影響を受けるが、その特定の図示の実施形態が図面に示され、以上に詳細に記載された。しかしながら、理解されるべき点は、本発明が開示された１又は複数の特定の形式に限定されないこと、むしろ、添付の請求の範囲に記載のように、全ての変形、代案構成及び均等物が本発明の範囲に包含されることが意図されることである。
【０１５１】
請求項中、括弧内に記載された如何なる参照符号も、請求項を制限すると見なされるべきではない。さらに、開示の実施形態を説明する文脈における用語「a」、「an」、及び「the」、並びに同様の指示対象は（特に、以下の請求項の文脈において）、特に断りの無い限り又は文脈により明確に矛盾しないかぎり、単数及び複数の両方をカバーすると考えられるべきである。用語「含む」、「有する」、「含む」、「伴う」、「備える」（comprising、having、including、containing）は、特に断りのない限り広義の語として考えられるべきである（つまり、「を含む、しかし限定されない」を意味する）。用語「接続される」は、変更されず物理的接続を表すとき、何かが仲介する場合でも、部分的又は全体的に含まれる、取り付けられる又は一緒に結合される、として考えられるべきである。本開示において値の範囲の詳述は、本願明細書に特に断りの無い限り、単に、範囲に包含される各々の別個の値を個別に参照することの簡単明瞭な言い方として機能することを意図し、各々の個別の値は、それが本願明細書に個々に詳述されたかのように、本願明細書に組み込まれる。用語「セット」（例えば、「アイテムのセット」）又は「サブセット」の使用は、特に断りの無い限り又は文脈に矛盾しない限り、１つ以上の構成要素を含む空ではない集合として考えられるべきである。さらに、特に注記されない又は文脈に矛盾しない限り、対応するセットの用語「サブセット」は、必ずしも対応するセットの適正なサブセットを示さないが、サブセット及び対応するサブセットは等しくてよい。要素の単数の参照は、該要素の複数の存在を排除するものではなく、逆も同様である。
【０１５２】
「A、B、及びCのうちの少なくとも１つ」又は「少なくとも１つのA、B、及びC」の形式の句のような論理的言語は、特に断りの無い限り又は特に明確に文脈に矛盾しない限り、アイテム、後、等がA又はB又はCのいずれか、又はA及びB及びCのセットの任意の空でないサブセットであってよいことを表すために使用されることが理解される。例えば、３つの構成要素を有するセットの説明のための例では、論理的言語「A、B、及びCのうちの少なくとも１つ」又は「少なくとも１つのA、B、及びC」は、以下のセット：｛A｝、｛B｝、｛C｝、｛A,B｝、｛A,C｝、｛B,C｝、｛A,B,C｝のうちのいずれかを表す。したがって、このような論理的言語は、通常、特定の実施形態が少なくとも１つのA、少なくとも１つのB、及び少なくとも１つのCのそれぞれが存在必要があることを意味することを意図しない。
【０１５３】
記載の処理の動作は、特に示されない限り、又は文脈上明らかに矛盾しない限り、任意の適切な順序で実行できる。記載の処理（又はその変形及び／又は結合）は、実行可能命令により構成される１つ以上のコンピュータシステムの制御下で実行されてよく、１つ以上のプロセッサ上で集合的に実行するコード（例えば、実行可能命令、１つ以上のコンピュータプログラム又は１つ以上のアプリケーション）として、ハードウェアにより、又はそれらの組み合わせで実装されてよい。コードは、コンピュータ可読記憶媒体に、例えば１つ以上のプロセッサにより実行可能な複数の命令を含むコンピュータプログラムの形式で格納されてよい。コンピュータ可読記憶媒体は、非一時的であってよい。
【０１５４】
本願明細書で与えられる任意の及び全ての例又は例示的言語（例えば、「のような」）の使用は、単に、本発明の実施形態をより良好に解明することを意図しており、特に断りのない限り本発明の範囲を限定することを意図しない。明細書中のいかなる言語も、本発明の実施に不可欠な任意の非請求要素を示すと考えられるべきではない。
【０１５５】
本開示の実施形態は、本開示に記載され、本発明を実施するために発明者に知られている最適モードを含む。これらの実施形態の変形は、前述の説明を読んだ当業者に明らかになり得る。発明者は、熟練技術者が、これらの変形を適切に利用することを期待し、発明者は、本開示の実施形態が特に記載されたものと異なる方法で実施されることを意図する。したがって、本開示の範囲は、適切な法により許可されるように、添付の請求の範囲に詳述された主題の全ての変形及び均等物を含む。さらに、それらの全ての可能な変形における上述の要素の任意の組み合わせは、特に断りの無い限り又は文脈に明確に矛盾しない限り、本開示の範囲に包含される。
【０１５６】
引用される刊行物、本願、及び特許を含む全ての参考文献は、各参考文献が個々に具体的に示され、その全体が記載されたかのように、参照により本願明細書に組み込まれる。
【図１】
2020526814.tif 000038
【図２】
2020526814.tif 000039
【図３】
2020526814.tif 000040
【図４】
2020526814.tif 000041
【図５】
2020526814.tif 000042
【国際調査報告】
2020526814.tif 000043
2020526814.tif 000044