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

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

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

<>
  • 特開-ブロックチェーンコンパイラ 図1
  • 特開-ブロックチェーンコンパイラ 図2
  • 特開-ブロックチェーンコンパイラ 図3
  • 特開-ブロックチェーンコンパイラ 図4
  • 特開-ブロックチェーンコンパイラ 図5
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024096926
(43)【公開日】2024-07-17
(54)【発明の名称】ブロックチェーンコンパイラ
(51)【国際特許分類】
   G06F 8/41 20180101AFI20240709BHJP
   G06F 9/455 20180101ALI20240709BHJP
【FI】
G06F8/41 170
G06F9/455 100
【審査請求】有
【請求項の数】14
【出願形態】OL
【外国語出願】
(21)【出願番号】P 2024066569
(22)【出願日】2024-04-17
(62)【分割の表示】P 2023064745の分割
【原出願日】2018-07-05
(31)【優先権主張番号】1710971.1
(32)【優先日】2017-07-07
(33)【優先権主張国・地域又は機関】GB
(31)【優先権主張番号】1710974.5
(32)【優先日】2017-07-07
(33)【優先権主張国・地域又は機関】GB
(31)【優先権主張番号】1710967.9
(32)【優先日】2017-07-07
(33)【優先権主張国・地域又は機関】GB
(31)【優先権主張番号】PCT/IB2017/054110
(32)【優先日】2017-07-07
(33)【優先権主張国・地域又は機関】IB
(31)【優先権主張番号】PCT/IB2017/054113
(32)【優先日】2017-07-07
(33)【優先権主張国・地域又は機関】IB
(31)【優先権主張番号】PCT/IB2017/054114
(32)【優先日】2017-07-07
(33)【優先権主張国・地域又は機関】IB
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.PYTHON
2.BITCOIN
(71)【出願人】
【識別番号】318001991
【氏名又は名称】エヌチェーン ライセンシング アーゲー
(74)【代理人】
【識別番号】100107766
【弁理士】
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【弁理士】
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100135079
【弁理士】
【氏名又は名称】宮崎 修
(72)【発明者】
【氏名】ライト,クレイグ スティーヴン
(72)【発明者】
【氏名】サヴァナ,ステファヌ
(57)【要約】      (修正有)
【課題】ブロックチェーンプラットフォーム又は機能的に制約されたスクリプトに基づく言語を含むプロトコル上で、高レベルプログラムの自動化及び実行を可能にする及び/又は促進する方法及びシステムを提供する。
【解決手段】方法は、インプットとしてソースコードの部分を受信して、ソースコードの部分を高レベル言語(HLL)で記述するステップと、ブロックチェーンスクリプト言語から選択された及び/又は該言語に固有の複数のオペコードを含むアウトプットスクリプトを生成するステップと、を含む。生成したアウトプットスクリプトは、少なくとも部分的にソースコードの部分の中で指定された機能を提供し、ブロックチェーンスクリプト言語は、反復プログラミング構成をサポートすることを制約されている。
【選択図】図1
【特許請求の範囲】
【請求項1】
コンピュータにより実施される方法であって、
インプットとしてソースコードの部分を受信するステップであって、前記ソースコードの部分は、高レベル言語(HLL)で記述される、ステップと、
ブロックチェーンスクリプト言語から選択された及び/又は該言語に固有の複数のオペコードを含むアウトプットスクリプトを生成するステップであって、その結果、実行されると、前記アウトプットスクリプトが少なくとも部分的に前記ソースコードの部分の中で指定された機能を提供し、前記ブロックチェーンスクリプト言語は反復プログラミング構成をサポートすることを制約されている、ステップと、
を含むコンピュータにより実施される方法。
【請求項2】
前記アウトプットスクリプトを生成するステップは、前記ソースコードの部分の中で提供されるループ構成を展開するステップを含み、前記ループ構成は、コードのブロック、条件、及び最大反復数を含む、請求項1に記載のコンピュータにより実施される方法。
【請求項3】
前記ループ構成はWHILEループである、請求項2に記載のコンピュータにより実施される方法。
【請求項4】
前記ループ構成を展開するステップは、前記アウトプットスクリプトの中で、前記最大反復数に等しい回数だけ、前記条件をテストする1つ以上のオペコードコマンドを複製するステップを含み、前記条件の後に、OP_IF/OP_ENDIFペアの内側に埋め込まれた前記コードのブロックの機能を表すオペコードのシーケンスが続く、請求項2又は3に記載のコンピュータにより実施される方法。
【請求項5】
前記条件は、真又は偽となる評価可能な表現である、請求項2~4のいずれかに記載のコンピュータにより実施される方法。
【請求項6】
前記ブロックチェーンスクリプト言語が反復プログラミング構成をサポートすることを制約されていることは、前記ブロックチェーンスクリプト言語が複雑な制御フロー構成、反復、及び/又はジャンプに基づくループを本来サポートしないという制約を更に含む、請求項1~5のいずれかに記載のコンピュータにより実施される方法。
【請求項7】
前記ブロックチェーンスクリプト言語はスタックに基づき、前記HLLは、前記ブロックチェーンスクリプト言語により使用されるスタック上で操作を実行するよう構成される1つ以上のプリミティブを含む、請求項1~6のいずれかに記載のコンピュータにより実施される方法。
【請求項8】
前記アウトプットスクリプトはコンパイラにより実行される、請求項1~7のいずれかに記載のコンピュータにより実施される方法。
【請求項9】
前記アウトプットスクリプトを実行するステップを更に含み、前記ブロックチェーンスクリプト言語はスタックに基づき、前記アウトプットスクリプトの実行中に、前記条件をテストする1つ以上のオペコードコマンドは、真又は偽の結果として評価し、前記真又は偽の結果をスタックの最上位に配置し、後続のOP_IF文の実行は、前記真の結果が前記スタックの最上位にあるとき、複製された前記コードのブロックを選択的に実行し、前記偽の結果が前記スタックの最上位にあるとき、OP_IF文の実行は、複製された前記コードのブロックの実行をバイパスする、請求項4に記載のコンピュータにより実施される方法。
【請求項10】
前記最大反復数は、前記ループ構成の中で指定されるパラメータにより定義される、請求項2に記載のコンピュータにより実施される方法。
【請求項11】
コンピュータにより実装されるシステムであって、1つ以上のプロセッサとコンピュータ実行可能命令を格納するメモリとを含み、前記コンピュータ実行可能命令は、実行の結果として、前記1つ以上のプロセッサに、
インプットとしてソースコードの部分を受信させ、前記ソースコードの部分は、高レベル言語(HLL)で記述され、
ブロックチェーンスクリプト言語から選択された及び/又は該言語に固有の複数のオペコードを含むアウトプットスクリプトを生成させ、その結果、実行されると、前記アウトプットスクリプトが少なくとも部分的に前記ソースコードの部分の中で指定された機能を提供し、前記ブロックチェーンスクリプト言語は反復プログラミング構成をサポートすることを制約されている、
システム。
【請求項12】
コンパイラを更に含み、前記コンパイラは、
インプットとして前記ソースコードの部分を受信し、前記ソースコードは、高レベル言語(HLL)で記述され、
機能的に制約されたブロックチェーンスクリプト言語から選択された複数のオペコードを含むアウトプットスクリプトを生成し、その結果、実行されると、前記アウトプットスクリプトが少なくとも部分的に前記ソースコードの部分の中で指定された機能を提供し、
前記アウトプットスクリプトを生成することは、前記ソースコードの部分の中で提供されるループ構成を展開することを含み、前記ループ構成は、コードのブロック、条件、及び最大反復数を含み、
前記ループ構成を展開することは、前記アウトプットスクリプトの中で、前記最大反復数に等しい回数だけ、前記条件をテストする1つ以上のオペコードコマンドを複製することを含み、前記条件の後に、OP_IF/OP_ENDIFペアの内側に埋め込まれた前記コードのブロックの機能を表すオペコードのシーケンスが続く、請求項11に記載のシステム。
【請求項13】
ソフトウェア開発キット(SDK)を更に含む請求項11又は12に記載のシステム。
【請求項14】
前記コンピュータ実行可能命令は、前記1つ以上のプロセッサに、更に、前記アウトプットスクリプトを実行させ、前記ブロックチェーンスクリプト言語はスタックに基づき、前記アウトプットスクリプトの実行中に、前記条件をテストする前記1つ以上のオペコードコマンドは、真又は偽の結果として評価し、前記真又は偽の結果をスタックの最上位に配置し、後続のOP_IF文の実行は、前記真の結果が前記スタックの最上位にあるとき、複製された前記コードのブロックを選択的に実行し、前記偽の結果が前記スタックの最上位にあるとき、OP_IF文の実行は、複製された前記コードのブロックの実行をバイパスする、請求項12に記載のシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、概して、分散台帳技術に関し、特に、Bitcoinネットワーク又は関連プロトコルのようなブロックチェーン技術に関する。本開示は、コンピュータに基づくコードの変換のためのコンパイラ及びコンパイラ関連技術にも関する。本発明の1つ以上の実施形態は、ブロックチェーンプラットフォーム又は機能的に制約されたスクリプトに基づく言語を含むプロトコル上で、高レベルプログラムの自動化及び実行を可能にする及び/又は促進するためのソリューションとしての使用に適する。
【背景技術】
【0002】
本願明細書で、用語「ブロックチェーン」は、あらゆる形式の電子的な、コンピュータに基づく、分散台帳を含むよう使用される。これらは、総意に基づくブロックチェーン及びトランザクションチェーン技術、許可及び未許可台帳、共有台帳、及びそれらの変形を含む。最も広く知られているブロックチェーン技術の用途はBitcoin台帳であるが、他のブロックチェーンの実装が提案され開発されている。ビットコインは便宜上及び説明を目的として本願明細書において言及されるが、本発明はビットコインのブロックチェーンと共に使用することに限定されず、代替のブロックチェーンの実装及びプロトコルが本発明の範囲に含まれることに留意すべきである。用語「ユーザ」は、人間又はコンピュータに基づくリソースを表すことがある。
【0003】
ブロックチェーンは、ブロックにより構成される、コンピュータに基づく非集中型の分散型システムとして実装されるピアツーピア電子台帳である。また、ブロックはトランザクションにより構成される。各トランザクションは、ブロックチェーンシステム内で参加者間のデジタルアセットの制御の移転を符号化するデータ構造であり、少なくとも1つのインプット及び少なくとも1つのアウトプットを含む。各ブロックは前のブロックのハッシュを含み、ブロックは共にチェーンになって、その発端からブロックチェーンに書き込まれている全てのトランザクションの永久的な変更不可能なレコードを生成する。トランザクションは、そのインプット及びアウトプットに組み込まれたスクリプトとして知られる小さなプログラムを含む。スクリプトは、トランザクションのアウトプットがどのように及び誰によりアクセス可能かを指定する。ビットコインプラットフォーム上で、これらのスクリプトは、Scriptと呼ばれるスタックに基づくスクリプト言語を用いて記述される。スクリプトは、コマンド(オペコード)を用いて記述され、該コマンドはインタープリタにより実行可能コードに変換される。
【0004】
トランザクションがブロックチェーンに書き込まれるために、「検証され」なければならない。ネットワークノード(マイナー)は、各トランザクションが有効であることを保証するために作業を実行し、無効なトランザクションはネットワークから拒否される。ノードにインストールされたソフトウェアクライアントは、自身のロック及びアンロックスクリプトを実行することにより、この検証作業を未使用トランザクション(UTXO)に対して実行する。ロック及びアンロックスクリプトの実行が真と評価した場合、及びチェックに合格した場合、トランザクションは有効であり、トランザクションはブロックチェーンに含まれるためにマイニングされる。したがって、トランザクションがブロックチェーンに書き込まれるためには、トランザクションは、i)トランザクションを受信した第1ノードにより検証され、トランザクションが検証された場合に、ノードは該トランザクションをネットワーク内の他のノードに中継し、ii)マイナーにより構築された新しいブロックに追加し、iii)マイニングされ、つまり過去のトランザクションの公開台帳に追加されなければならない。
【0005】
ブロックチェーン技術は、暗号通貨実装の使用で最も広く知られているが、デジタル起業家が、新しいシステムを実装するために、Bitcoinの基づく暗号通貨セキュリティシステム、及びブロックチェーンに格納可能なデータの両方の使用を探索し始めている。ブロックチェーンが、暗号通貨の領域に限定されない自動タスク及びプロセスのために使用できれば、非常に有利である。このようなソリューションは、それらの用途において一層多様でありながら、ブロックチェーンの利点(例えば、永久的、イベントの耐タンパレコード、分散プロセス、等)を利用できる。したがって、黎明期のインターネットの採用及びウェブに基づくシステムの発展における後の急成長と同様に、新しいアプリケーションのための技術の幅広い採用及び技術革新の必要がある。
【0006】
しかしながら、このようなスクリプト言語でプログラムを記述することは、例えば、低レベルプログラミング技術に関連する知識及び熟練を必要とするために、より広いプログラミングコミュニティにより直感的又は直ちに採用できない。これは、プログラマに、スタック及びその中のデータの位置を考慮することを要求する。低レベルオペコードで構成されるプログラムの記述は、C、Java(登録商標)、等のような高レベル言語(high-level language:HLL)でソースコードを記述するより時間及び労働集約的である。このようなHLLのために構築されるコンパイラ/インタープリタは、プログラマをメモリ管理等に関連する多くの面倒な低レベルな問題から遠ざける便利な抽象化レベルを提供する。1つ以上のスタックの中のデータを操作するためのオペコードのシーケンスの記述は、HLLでソースコードを記述するより、技術的に複雑であり且つ時間がかかる。したがって、低レベルオペコードの使用の困難な特性により、エラー及びバグの発生する可能性がより高い。
【0007】
さらに、HLLは、プログラマが、ループ、case文、及び反復呼び出しのような複雑な制御フロー構成を彼らのソースコードに含めることを可能にする。プログラマは、所望のロジックに焦点を当て、「これが真の間はXを行う...」のようなメカニズムにより直感的方法で論理的フローを表現できる。しかしながら、BitcoinのScriptのような幾つかのブロックチェーンに関連するスクリプト言語は、それらが算術演算のような典型的な演算、並びにハッシュ演算及び署名検証のような暗号関数も含むが、それらは、HLLでは使用可能な、whileループのような複雑な制御構造のための固有のプリミティブを含まない、或いは、反復技術の使用を許容しない、という意味で機能的に制約されている。このような制約された言語は、ジャンプに基づく制御フローをサポートしない。したがって、設計により、それらは、ソースコードに包含するためにプログラマに提供される言語及び論理的構成を制約する。これは、一部の人々を、Scriptのような制約された言語がチューリング不完全であるという論争に導くが、この定義は他の者達により異議を唱えられている。したがって、私達は、「機能的に制約された」という表現を使用する。
【0008】
この意図的な制約は、プログラマにとってコーディング処理を一層困難にすることがあるが、プログラム実行時間が限られ、重要なことに、悪意ある手段を防ぎ、例えばDoS(Denial of Service)攻撃を実施するための無限ループの使用から保護するので、重要なセキュリティメカニズムを提供することに留意する。
【0009】
したがって、重大なセキュリティと、ブロックチェーンに基づく技術の発展を促進し、奨励し、及び向上させる必要との間にはトレードオフが存在する。後者の問題を解決するために、Ethereumは、それ自体のブロックチェーンプラットフォームに、固有の特徴としてHLL言語を組み込んでいる。Scriptと同様に、低レベルインタープリタが、コードの実行可能バージョンを生成するために要求される。EthereumのHLL言語は、Etherとして知られ、条件付き及び無条件ジャンプの使用を通じて、制御フローを実行させる。これは、反復も可能にする。DoS攻撃のような問題を回避するために、Ethereumは、ガス(gas)、つまり実行コストをカバーするために予め支払われる暗号通貨の一部、の概念を導入することにより、トランザクション実行時間を制限する。したがって、固有のHLLの使用により、技術的及び商業的に複雑な追加レイヤが必要である。さらに、Ethereumは、今まで、少なくとも1つの重大な反復に基づく攻撃に苦しんできた。例えば以下を参照する。http://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/
【0010】
したがって、プログラマに親しみのあるHLL言語を用いて、しかし機能的に制約されたスクリプト言語により提供されるセキュリティを危険に晒すことなく、プログラマが有効なブロックチェーンソリューションを、より容易に、迅速に、且つ一層効率的な方法で開発し、設計し、及び生産できるメカニズムを提供することが望ましい。これは、決して自明な作業ではなく、有意な技術的革新を要求する。これは、特に、本開示により解決される技術的課題の1つである。
【発明の概要】
【0011】
したがって、本開示によると、添付の請求の範囲に定められるようなシステム及び対応する方法が提供される。
【0012】
したがって、本発明によると、コンピュータにより実施される方法及び対応するシステムが提供され得る。当該方法は、ブロックチェーンプラットフォーム上でソースコードの部分の実行を可能にする又は促進するよう構成されてよい。ソースコードは、高レベル言語で記述されてよい。本開示は、ソフトウェアコンパイラとして実装されてよいコンパイル技術及びシステム/コンポーネントを記載する。これは、以後、「ブロックチェーン又はBitcoinコンパイラ」と呼ばれてよい。ソフトウェアコンパイラは、Bitcoinブロックチェーン又は任意の他のブロックチェーンに基づくプロトコル/ネットワークと関連する使用のために構成されてよい。
【0013】
有利なことに、本開示のソフトウェアコンパイラは、ユーザ(プログラマ)がブロックチェーンにより実行可能なプログラム/アプリケーションを、彼らに親しみのある言語で、例えばC、Java(登録商標)、C++スタイルの構文で記述し及び生成することを可能にし得る。これは、ブロックチェーンに基づく開発作業を、より広い開発コミュニティへと広げる。これは、以下に詳述するように、ブロックチェーンに基づくソリューションが、本発明により、より素早く記述でき及びエラーチェックされることも意味する。重大なことに、基礎にあるプロトコル及び関連するスクリプト言語のセキュリティ機能が保存され維持される。したがって、本発明は、スクリプト生成のプロセス中にブロックチェーンに関連するセキュリティを保存する技術及びシステムを提供し、ブロックチェーンネットワーク上のノードにより検証される有効な、エラーの無いスクリプト(したがってトランザクション)の生成を促進し又は可能にする。
【0014】
1つの可能な実施形態によると、ソースコードの部分をブロックチェーンと互換性のあるスクリプトに変換する静的コンパイルを使用するコンピュータにより実施される方法が提供され得る。これは、コンパイラにより提供されるアウトプットを形成し得るので、「アウトプットスクリプト」と呼ばれてよい。本発明は、1つ以上のエラーをテストしてよい。本発明は、1つ以上のエラーが検出された場合に警告を提供してよい。静的コンパイルは、ループ展開ステップを含んでよく、ソースコードの部分の中で提供される1つ以上のループが展開されてよい。用語「静的コンパイル」及び「ループ展開」は従来知られた用語であり、それらは当業者により直ちに理解されることに留意する。
【0015】
当該方法は、ブロックチェーンネットワークと共に使用するために構成されてよい。ブロックチェーンネットワークは、プロトコルに関連付けられてよい。これは「proof-of-work」ブロックチェーンであってよい。これは総意に基づくブロックチェーンであってよい。これは、パブリック及び/又は未許可ブロックチェーンであってよい。これはピアツーピア分散型ブロックチェーンであってよい。
【0016】
ブロックチェーンネットワークは、ブロックチェーントランザクションを検証する複数のノードを含んでよい。ブロックチェーントランザクションは、複数のノードにより実行可能なスクリプトを含んでよい。スクリプトは、機能的に制約された(又はチューリング不完全としても表される)ブロックチェーンスクリプト言語に属するオペコード(op_code)のセットにより表され又はそれを含んでよい。当該方法は、ブロックチェーンネットワークのノードにより検証されたブロックチェーントランザクションへの包含のために、アウトプットスクリプトを生成するステップを含んでよい。アウトプットスクリプトは、機能的に制約されたブロックチェーンスクリプト言語に属するオペコードのセットにより表されてよく、アウトプットスクリプトは、ブロックチェーンネットワークのノードによるスクリプトの実行がソースコードの中で指定された機能を実行するように、構成され又は適応されてよい。
【0017】
ソースコードの部分は、高レベル言語(high level language:HLL)で記述されてよい。HLLは、コンパイル可能HLLとして記載されてよい。HLLは、本発明に従い構成されるソフトウェアコンポーネント(コンパイラ)によりコンパイルされてよい。HLLは、インタープリタにより実行可能なスクリプトを生成するために、コンパイラによりコンパイルされてよい。スクリプトは、ブロックチェーントランザクション(Tx)に提供されてよい。スクリプトは、トランザクションのインプット又はアウトプットに関連付けられてよい。HLLは、反復、複雑な選択構造及び/又はループのような複雑な制御フローを実装する表現、構造、及び/又は文を許容し得るチューリング完全言語であってよい(現実世界の制約を受ける)。HLLに固有の構文は、WHILE、FOR、又はREPEATループのような、ループ関連構文を含んでよい。これは、暗号化、算術及びスタック操作演算の実行のためのプリミティブを含んでよい。HLLは、以下に実質的に記載される、カスタマイズされたオペコード及び/又は高レベル言語構成を含んでよい。
【0018】
ブロックチェーンと互換性のあるスクリプトは、ブロックチェーン上で実行可能なブロックチェーンスクリプト言語から選択された、それに固有の及び/又はその部分を形成するオペコードで形成されるスクリプト(つまりプログラム)であってよい。オペコードは、プリミティブ又はコマンドと呼ばれてよい。スクリプトは、ブロックチェーン上で実行される/実行可能になる前に、インタープリタ又は仮想機械を通過してよい。(この文脈における用語「ブロックチェーン」は、プロトコル及び実装プラットフォームを含んでよい)。インタープリタは、スクリプトを機械実行可能(オブジェクト)コードに変換してよい。ブロックチェーンスクリプト言語は、例えば、Bitcoinプロトコル又はその変形と関連して使用されるScript言語であってよい。スクリプト言語は、ブロックチェーンプロトコルと共に使用するために構成されてよい。スクリプト言語は、暗号化、算術、及びスタック操作オペコードを含んでよい。
【0019】
ブロックチェーンスクリプト言語は機能的に制約されてよい。ブロックチェーンスクリプト言語は、構文/インタープリタが許可する又は処理するよう構成される機能に関して制限されてよい。これは、反復、複雑な選択構造及び/又はループのような複雑な制御フロ―を、本来サポートしなくてよい。
【0020】
追加又は代替として、ブロックチェーンプラットフォーム上で高レベル言語(HLL)で記述されたソースコードの部分の実行を可能にし又は促進する方法が提供され得る。ソースコードは、スマートコントラクトを実装するよう構成されてよい。スマートコントラクトは、従来知られているようなブロックチェーン上で実行可能な、機械可読且つ実行可能アプリケーションであってよい。
【0021】
当該方法は、ソースコードの部分をインプットとして受信するステップを含んでよい。ソースコードの部分は、ソフトウェアにより実装されるコンパイラにより受信されてよい。
【0022】
当該方法は、アウトプットスクリプトを生成するステップを含んでよい。アウトプットスクリプトは、上述のようなブロックチェーンと互換性のあるスクリプトであってよい。アウトプットスクリプトは、機能的に制約されたブロックチェーンスクリプト言語から選択された及び/又はそれに固有の複数のオペコードを含んでよい。このスクリプト言語は、上述の通りであってよい。実行されると、スクリプトは、少なくとも部分的に、ソースコードの中で指定された機能を提供してよい。
【0023】
当該方法は、上述の方法のいずれかの実施形態を実行するよう構成されるコンパイラを提供する又は使用するステップを含んでよい。アウトプットスクリプトは、静的コンパイルを実行することにより生成されてよい。
【0024】
静的コンパイルの使用は、結果として生じるスクリプトが常に停止するという利点を提供する。これは、実行時間において実用上の利点を提供するだけでなく、ソースコードの中で何からの種類のエラー又は無効な構成に遭遇した場合にブロックチェーンコンパイラが停止するので、本発明が検証ツールとして機能することを可能にする。スクリプト開発の間に検証ツールを使用できるという利点は、プログラマの時間及び労力を削減することにより、プログラミング作業が向上することを意味する。さらにまた、ブロックチェーンコンパイラは、バグ及びオーバーフローエラーをテストするという点で、セキュリティソリューションを提供し、プログラムが実行するか及び安全に実行するかをユーザ(プログラマ)が静的にテストすることを可能にする。
【0025】
ブロックチェーンスクリプト言語は、該言語が複雑な制御フロー構成又はジャンプに基づくループ若しくは他の反復プログラミング構成による反復を本来サポートしないという点で、制約されてよい。アウトプットスクリプトを生成するステップは、ソースコード内で提供される少なくとも1つのループ構成を展開するステップを含んでよい。当該方法は、アウトプットスクリプトをブロックチェーンプラットフォーム上で実行可能な形式に変換するよう構成されるインタープリタ又は仮想機械を提供する又は使用するステップ、を含んでよい。
【0026】
当該方法は、アウトプットスクリプトのより効率的な又は削減されたバージョンを提供するために、少なくとも1回、アウトプットスクリプトを最適化するステップ、を更に含んでよい。これは、導関数のない最適化(derivative free optimisation:DFO)の使用を含んでよい。DFOは、従来知られた用語であり、当業者により直ちに理解される。追加又は代替として、アウトプットスクリプトを生成するステップは、導関数のない最適化の使用を含んでよい。
【0027】
ブロックチェーンコンパイラは、ソフトウェア開発キット(software development kit:SDK)の部分を形成し及び/又はそれと関連して動作するよう構成されてよい。SDKは、エディタ、デバッガ、及びコードに基づくソリューションの生成を促進するためにSDKと共に使用されるべき知られている他のコンポーネントを含んでよい。
【0028】
HLLは、ブロックチェーンスクリプト言語に固有の1つ以上のプリミティブ/コマンド/オペコードに直接変換可能な、少なくとも1つのプリミティブ、演算子、又は構成を含んでよい。
【0029】
ブロックチェーンスクリプト言語はスタックに基づいてよい。ブロックチェーンスクリプト言語は、1つ又は複数のスタックを操作するよう構成されてよい。HLLは、スクリプト言語により使用されるスタック上で演算の実行を引き起こすよう構成される1つ以上のプリミティブ又は演算子を含んでよい。
【0030】
HLLは、ブロックチェーンスクリプト言語によるメモリ割り当てのために使用されるスタックに、ソースコードへの入力の数をプッシュするよう構成されるプリミティブ又は構成を含んでよい。HLLは、暗号化演算又は関数、及び算術演算、及び/又はループの実行を引き起こすよう構成される1つ以上のプリミティブを含んでよい。
【0031】
HLLは、以下のプリミティブ又は演算子又はそれらの個々の機能的等価物のうちの少なくとも1つを含んでよい:
Initiate;
Declare;
Increment;
IF;
While;
Populate;
Monus;
Reset;
Rawscript;
Abort;
Retrieve
Hash, hash160,又はハッシュ演算又はその変形。
【0032】
本開示は、ソースコードの部分をブロックチェーンと互換性のあるスクリプトに変換する静的コンパイルを用いるステップを含む方法を提供し得る。静的コンパイルは、ループ展開ステップを含んでよい。
【0033】
ソースコードの部分は、少なくとも1つの高レベルプログラミング構成を含んでよい。アウトプットスクリプトは、高レベルプログラミング構成を、機能的に制約されたブロックチェーンスクリプト言語に属する1つ以上のオペコードに変換することにより生成されてよい。アウトプットスクリプトの1つ以上のオペコードは、ブロックチェーンネットワークのノードによる1つ以上のオペコードの実行が、ソースコードの少なくとも1つの高レベルプログラミング構成(の機能)を実行するように、構成され又は適応されてよい。
【0034】
望ましくは、機能的に制約されたブロックチェーンスクリプト言語は、ループ構成をサポートしない。望ましくは、少なくとも1つの高レベルプログラミング構成は、ループ構成を含む。望ましくは、スクリプトは、ループ構成(「ループ構成」とも呼ばれてよい)を展開することにより生成される。望ましくは、ループ構成は、コードブロック及び反復の回数を指定する引数を含み、ループ構成の展開は、反復の回数だけ、コードブロックの機能をためのオペコードを記述することを含む。
【0035】
当該方法は、ループ構成が反復の回数を指定する引数を含むこと、及び該引数が最大反復数を指定する制約を満たすこと、を保証するために、ループ構成の構文をチェックするステップを更に含んでよい。
【0036】
ループ構成は、コードブロック、及び少なくとも1つの変数に基づくループ構成の反復の回数を指定するための条件、を含んでよい。望ましくは、ループ構成の展開は、アウトプットスクリプトの実行から決定された変数の値を用いる条件の評価に基づき、最大反復回数だけ、コードブロックの機能の複製されたオペコードを選択的に実行するオペコードコマンドを記述することに関連して、コードブロックの機能のオペコードを複製するステップを含む。
【0037】
本開示によると、本願明細書に記載の方法のいずれかの実施形態のステップを実施するよう構成される、コンピュータにより実装されるシステムが提供される。
【0038】
本開示の一実施形態によるコンピュータにより実施されるシステムは、コンパイラを含んでよい。コンパイラは、ソースコードの部分をインプットとして受信するよう構成されてよい。ソースコードは、高レベル言語(HLL)で記述されてよい。コンパイラは、アウトプットスクリプトを生成するよう構成されてよい。アウトプットスクリプトは、「ブロックチェーンスクリプト」又は「ブロックチェーンと互換性のあるスクリプト」と呼ばれてよく、複数のオペコードを含んでよい。これらのオペコードは、上述のような機能的に制約されたブロックチェーンスクリプト言語から選択され及び/又はそれに固有であってよく、実行されると、スクリプトは、少なくとも部分的にソースコードの中で指定された機能を提供する。
【0039】
当該システムは、ソフトウェア開発キット(software development kit:SDK)を含んでよい。コンパイラは、SDKの部分を形成してよい。
【0040】
本発明は、システムであって、プロセッサと、前記プロセッサによる実行の結果として前記システムに本願明細書に記載のコンピュータにより実施される方法の任意の実施形態を実行させる実行可能命令を含むメモリと、を含むシステムも提供する。
【0041】
本発明は、実行可能命令を格納した非一時的コンピュータ可読記憶媒体であって、前記実行可能命令は、コンピュータシステムのプロセッサにより実行された結果として、前記コンピュータシステムに本願明細書に記載のコンピュータにより実施される方法の実施形態を少なくとも実行させる、非一時的コンピュータ可読記憶媒体も提供する。
【0042】
本開示のある実施形態又は態様に関連して上述した任意の特徴は、1又は複数の他の実施形態又は態様に適用されてもよい。本開示の方法に関連して記載された任意の特徴は、本開示のシステムに等価に適用されてよく、逆も同様である。
【0043】
本開示の上述の及び他の態様は、本願明細書に記載される実施形態から明らかであり、それらの実施形態を参照して教示される。本開示の実施形態は、単なる例として添付の図面を参照して以下に説明される。
【図面の簡単な説明】
【0044】
図1】本発明の概略を示す。
図2】whileループを展開する以下の例に関連して議論されるTry[]アレイを投入するコードブロックを提供する。
図3】種々の実施形態が実施され得るブロックチェーン環境を示す。
図4】一実施形態による、前のブロックチェーントランザクションを参照するspendingブロックチェーントランザクションを検証し及びマイニングするブロックチェーンプロトコルを示す。
図5】種々の実施形態が実施され得るコンピューティング環境を示す。
【発明を実施するための形態】
【0045】
<概要>
以下では、私達は、参照を容易にするために、最も広く知られ採用されているので、Bitcoinプロトコル、ブロックチェーン、ネットワーク又はスクリプト言語を参照することがある。しかしながら、本発明は、Bitcoin関連ブロックチェーンと共に使用されることに限定されず、他のブロックチェーン技術が本開示の範囲に含まれる。
【0046】
上述のように、大部分のプログラマは、今日、低レベルではなく、C、C++、Java(登録商標)等のような高レベル言語でコードを記述する。低レベルでコードを記述することは、より多くの時間がかかり、メモリ操作のためのより専門的な知識を要求し、結果としてエラーが導入され得る。したがって、基礎にある、制約されたスクリプト言語により提供されるセキュリティを危険に晒すことなく、プログラマにより親しみのある言語でブロックチェーンアプリケーションのための有効な、テストされた、エラーチェックされたコードを記述できることは、プログラマにとって有利であり得る。
【0047】
本開示に記載の方法及びシステムは、特殊なブロックチェーントランザクション又はトランザクションのクラスタの生成のための「SDK」の開発を可能にする。例えば、トランザクションは、機械実行可能スマートコントラクトの条項及び条件を自動的に施行することを目的とし得る。しかしながら、多くの他のアプリケーションが可能であり、本発明はこれに関して限定されない。したがって、本発明は、ブロックチェーン関連技術を生成し及びテストするための「ツールキット」又はシステムの部分を形成してよい。
【0048】
有利なことに、ブロックチェーンコンパイラは、ユーザのソースコードの静的コンパイルを実行し、ループ展開のような技術の使用により複雑な制御フローメカニズムの実装を可能にする。従来知られているように、「ループ展開(ループアンローリング、loop unrolling)」は、「ループ展開(ループアンワインディング、loop unwinding)」とも呼ばれてよい。ループ展開は、特定種類のループの中でブランチの頻度を削減するために及び/又はループ維持命令を削減するためにコンパイラにより使用可能なループ変換技術である。ソースコードの中で見付かったループを展開することにより、コンパイラは、ソースコードの変換されたバージョンを生成できる。これは、機能的に制約されたスクリプト言語を使用するブロックチェーンプラットフォーム上で実行可能である。
【0049】
図1を参照すると、本開示の一実施形態は、ユーザ(プログラマ)が高レベル言語(HLL)を使用して所望のアプリケーション、例えばスマートコントラクトのためのコード1010を定義し、次にHLLコード101を実行ファイルにコンパイルするブロックチェーンコンパイラ102を実行することを可能にする。これらの実行ファイルは、ボットにより実行可能な(python、C++、等のような)3G言語プログラムのチャンクの形式であってよい。或いは、それらは、(例えばBitcoin)スクリプト103のチャンクの形式であってよい。後者は、特定機能を実行可能なスクリプトのチャンクを設計し生成することにより達成される。例えば、Bitcoinスクリプトの元のバージョンは、OP_MULと呼ばれる乗算のための関数を含んでいた。このオペコードは現在は無効にされている。しかしながら、小さなスクリプト部分の中で既存の有効なオペコードを使用することにより、同じ機能が再び生成できる。
【0050】
本開示の実施形態は、以下の2種類のプリミティブのうちの一方又は両方を含んでよい。
・カスタマイズされたオペコード(以後、これをCOP_CODEと呼ぶ)、
・高レベル言語(HLL)構成。
【0051】
HLL構成は、コンパイラ102がそれらをスクリプトコード103に変換することを必要とする。一方、COP_CODEは、COP_CODEからOP_CODEのブロックへの直接置換のみを必要とする。標準的に、プリミティブは、変数へのアクセスを必要としない場合に、つまり所与のプロトコル(及び他のCOP_CODE)のためにブロックチェーンスクリプト言語に既に存在するOP_CODE及びハードコードされたインプットのみを用いて完全に記述可能な場合に、COP_CODEにされる。
【0052】
例えば、monusプリミティブはオペコードにより完全に記述でき、したがって以下のCOP_CODEにできる。
OP_SUB
OP_0
OP_MAX
【0053】
しかしながら、WHILEループの実行は、所要の変数に依存する(例えば、実行のための条件、反復回数のためのカウンタ、等)。したがって、WHILEは、COP_CODEにするのには適さず、HLL構成として記述される。
【0054】
有利なことに、2種類のプリミティブの結合が、更なる柔軟性をプログラマに提供する。プログラムをBitcoinスクリプトに直接記述する(つまり、HLLを使用しない)プログラマは、COP_CODEを用いて拡張されたスクリプト機能を使用できる。実際に、これらは、スクリプトプログラマに、彼らの必要な関数を実行するOP_CODEのブロックの置換を与え、プログラミング時間及び労力を削減する。COP_CODEを該COP_CODEを構成するOP_CODEのブロックで単純に置換する「COP-CODEコンパイラ」があればよい。低レベルBitcoinスクリプトでプログラムを書けない又は書きたくないプログラマは、代わりに本開示によりサポートされるHLLを使用できる。
【0055】
カスタマイズOP_CODE(COP_CODE)は以下に更に議論される。
【0056】
(1)カスタマイズ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_2DROP」は、「上位2個のスタックアイテムを除去する」を意味し、一方で「OP_1ADD」は「1がインプットに加算される」を意味する。したがって、COP_2MULTは具体的に「インプットが2で乗算される」を意味する。
●実行前の検証
特定数のインプット又は特定のインプットフォーマットが期待される場合には、プリミティブは、機能ロジックを実行する前にチェックを実行し、インプットが期待と一致しない場合に異常終了する(トランザクションを無効としてマークする)。有利なことに、これは、関数が不正又は虚偽であるかも知れないアウトプットを実行し提供することを防ぐ。例えば、特定のプリミティブが正の数値であるインプットのみを演算することを目的とするが、それにも拘わらず負の数値に対してエラー無しに実行する場合、結果は「有効なトランザクション」になり得るが、予期しない又は不正な結果を伴う。
【0057】
(2)高レベル言語(HLL)構成
これらは、本開示に従うコンパイラが認識でき及びBitcoinスクリプトに変換できる関数又は文である。総合して、これらは、プログラマに馴染みのある構文を用いる高レベルプログラミング言語を構成する。馴染みのある構成(例えばIF-ELSE、CASE、WHILEループ、等)と同様に、Bitcoinトランザクションが動作するために、HLLに非常に特有の馴染みのない構成もある。例えば、INITIATE構成は、主スタックに自動的にプッシュされるデータインプットの数が(予約ワードNUM_INPUTSに割り当てられた)メモリ割り当ての中で最初の定数として保存されることを保証するための非常に特有の機能である。実施形態では、INITIATE構成は、HLLプログラムの中の最初の文であり得、DECLARE構成(これは、定数及び変数のためにメモリ割り当てを実行する)はHLLプログラムの中の2番目の文であり得る。
【0058】
HLL構成は、コンパイラによりコンパイルのときに利用可能な情報のみを用いてBitcoinスクリプトに(つまり、OP_CODE及びCOP_CODEに)変換可能なように、設計されなければならない。これは、通常、プログラムの中で定数が宣言され(DECLARE)値を割り当てられる、プログラマによる多数のハードコーディングを意味する。例えば、NUM_INPUTSが定数と考えられる場合でも、プログラムが実行するまで、コンパイラはその値へのアクセスを有しない。したがって、これは、(もちろんプログラマはこれをプログラムの中の他の定数と同様に使用できるが)コンパイル実行のために使用できない。
【0059】
HLL構成を設計するとき、設計者は、擬似コード又は自然言語での明確な説明に、コンパイラの期待される動作を含むことができる。例えば、コンパイラは、正しい構文及び任意の制約(例えばサイズ制限)に従うことの検証のような特定のチェックを実行することを要求され得る。これは、特定の制約が未だ分からなくても、明確であるべきである。HLL構成を設計する作業は、コンパイラ自体を記述することを含まないが、コンパイラの全ての期待される動作が可能であることを保証しなければならない。
【0060】
本開示の説明のための実施形態に従い使用され得るHLL構成の選択が以下に提供される。

<HLL構成:WHILEループ>
●説明
コードブロック(又はcode-block、標準的にループ本体と呼ばれる)は、指定された条件が真である限り、最大反復回数まで、繰り返し実行される。最大反復回数は、コンパイルのときに知られており及び指定されなければならない。ループは、「ループを展開する」として知られる技術によりエミュレートされる。これは、コードブロックの機能(演算のシーケンス)を表すオペコードのシーケンスが、指定された最大反復回数まで複製されることを意味する。コードブロックの各複製されたオペコードのシーケンスの前にあるIF文は、コードブロックのオペコードのシーケンスが実行されるかどうかを決定する。IF条件は、ループの始めに(つまり、コードブロックのオペコードのシーケンスの最初の実行の前に)チェックされる。
【0061】
●構文:
【数1】
ここで、
Iterations:
正整数
コードブロック(Code-Block)が実行され得る最大回数。コンパイラは、この回数だけCode-Blockを生成するので、この値を知る必要がある。これは、ハードコードされ得る、又はDECLARE文の中にある定数を参照し得る。
Condition:
真(TRUE)又は偽(FALSE)に分けられる評価可能な表現。
合成条件であってよい。つまり、AND、OR、等(どちらでもコンパイラにより現在認識されている)を用いる。
【0062】
●コンパイラの動作:
構文チェックを実行する。
反復(Iterations)が任意の制約(例えば、所定範囲に含まれる)を満たすことをチェックする。
条件(Condition)内の表現が評価可能であることをチェックする。
表現内の全ての定数/変数は、メモリ割り当て(DECLARE)リスト内に存在する。
表現内で使用される全ての演算子が現在許可されていることをチェックする(=、<、>、等)。
合成表現が任意の制約を満たすことをチェックする(例えば、AND、OR、等)。
Code-Blockの機能を「Iterations」回だけ複製する。
START OF REPLICATED CODE(複製したコードの開始)
条件(Condition)を解決する(つまり、実行が真又は偽をスタックの一番上に残す)1つ以上のオペコードを記述する。
【0063】
一般的な処理は、テストのために必要な各値をフェッチし該値を主スタックの一番上に置くRETRIEVE構成を利用し、次に関連するテスト動作(つまり、OP_EQUAL、OP_LESSTHAN、OP_GREATERTHAN等)を実行し得る。テストされるべき値が定数である場合、該値は、割り当てられたメモリ内の既知の位置にあり(つまり、主スタック上の既知の位置)、OP_PICKを用いてスタックの一番上にコピーされる。テストされるべき値が変数である場合(この場合、テストされるべき値はスクリプト実行中に決定される)、変数の位置は、割り当てられたメモリ内の既知の位置にあり(つまり、altスタック上の既知の位置)、「Borrow Block」メソッドを用いて主スタックの一番上にコピーできる。
【0064】
テストが(AND、OR、等を用いる)合成条件を利用する場合、各下位条件は別個に評価され、最終結果(0又は1)が主スタックの一番上に残される。これらは、次に、合成条件をテストするために結合される。例えば、合成条件が「Exp1 OR Exp2」の形式である場合、動作は、最初にExp1を評価し、次にExp2を評価し、そしてスタック上の上位2個の値を比較するOP_BOOLORを記述する(つまり、Exp1及びExp2の評価結果)。
【0065】
評価結果は、主スタックの一番上に残される。他の値はスタック上にない(もちろん、割り当てられたメモリを除く)。値は、次の動作(OP_IF)により使用される。
【0066】
Code-Blockの機能(演算のシーケンス)をCode-Blockの機能を表すオペコードのシーケンスに変換する。このような変換は、Code-Blockに含まれる任意のCOP_CODEについてバイパスできる。これは、COP_CODEのCode-Blockのオペコードのシーケンスへの直接置換が必要なだけである。次に、OP_IF/OP_ENDIFペアの中でCode-Blockの機能を表すオペコードのシーケンスを記述する。
END OF REPLICATED CODE(複製されたコードの終了)
【0067】
幾つかの実施形態では、複製されたCode-Blockを表すオペコードのシーケンスは、WHILEループ構成の反復毎にオペコードのシーケンスによりアクセスされる定数及び変数の初期スタック位置がループ反復に渡り一定であるように、構成され得る。変数の値はループ反復に渡り更新され得るが、各ループ反復の実行を開始するときのこのような定数及び変数のスタック位置は、ループ反復に渡り一定のままである。このような動作は、オペコードの複製されたシーケンスが、各ループ反復の間にスタックに格納された適切な定数及び/又は変数にアクセスすることを保証する。
【0068】
幾つかの実施形態では、Code-Blockを複製するための条件(Condition)は、スクリプト実行中に決定される1つ以上の変数の値に依存し、したがって、ループ反復に渡り更新され得る。この場合、複製されたCode-Blockの各反復は、関連する条件(Condition)をテストする1つ以上のオペコードコマンドを含み得る。該条件の後に、OP_IF/OP_ENDIFペアの中に埋め込まれた複製されたCode-Blockを表すオペコードのシーケンスが続く。この構成では、スクリプトの実行中、関連する条件(Condition)をテストするオペコードコマンドは、真(TRUE)又は偽(FALSE)として評価し、真(TRUE)又は偽(FALSE)の結果をスタックの一番上に置く。続くOP_IF文の実行は、真(TRUE)の結果がスタックの一番上にあるときだけ、複製されたCode-Blockを選択的に実行する。したがって、偽(FALSE)の結果がスタックの一番上にあるとき、OP_IF文の実行は、複製されたCode-Blockの実行をバイパスする。
【0069】
さらに、Code-Blockを複製する条件(Condition)は、最大反復回数により制限できる。これは、WHILEループ構成の中で指定されるパラメータ、システム設計により肯定されたパラメータ、又は何らかの他のパラメータにより定義できる。この場合、条件(Condition)をテストするオペコードコマンド、及びそれに続く、OP_IF/OP_ENDIFペアの中に埋め込まれた複製されたCode-Blockを表すオペコードのシーケンスは、パラメータにより定義された最大反復回数に対応する回数だけ複製できる。
【0070】
また、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ループ構成の反復回数だけオペコードシーケンスを含む。
【0071】
また、WHILEループネスティングは拡張でき、追加内側WHILEループ構成が内側(第1内側)WHILEループ構成のCode-Block内に含まれる、及び更なるネスティングの可能性を有することに留意する。この場合、本願明細書に記載のようなループ展開動作は、この更なるネスティングを解決するために直ちに拡張可能である。
【0072】
<HLL構成:INITIATE>
●説明:
実施形態において、これは、任意のHLLプログラムの必須の最初の文である。
トランザクション使用者により供給されるスクリプト実行の最初の部分(つまり「scriptsig’」)は、アンロックスクリプトの制御外である。これは、通常、スタックにプッシュされるデータで構成される。INITIATE構成の目的は、プログラマがこのインプット(最も可能性の高いのは、インプットがスクリプトの残りの部分のために必要か否か)を管理できるようにすることである。
この構成は、予約ワードNUM_INPUTS(スタックにプッシュされる使用者の供給したインプットの中のアイテム数である)に「値を割り当てる」。最初のOP_CODEは常にOP_DEPTHである。その結果、スタックの一番上(この時点で)は、スタックにプッシュされたデータインプットの数を含む。スタック内のこの位置は、固定され、コンパイラにコンパイルのときに知られているが、実際の値はコンパイルのときに分からない。
●構文:
INITIATE
●コンパイラの動作:
WriteOP_DEPTH OP_DEPTH /*これはOP_DEPTHをNUM_INPUTSの値に設定する。
【0073】
<HLL構成:DECLARE>
●説明:
実施形態において、これは、任意のHLLプログラムの必須の2番目の文である。
全ての定数及び変数を宣言する。したがって、コンパイラは、「メモリ記憶」(つまり、主及び/又はaltスタックの中の位置)を予約できる。規格は、主スタックに定数を、altスタックに変数を保持することである。コンパイラは、変数及び定数に与えられた名称をスタック上のそれらの位置に関連付ける。コンパイラは、使用者により提供されたデータインプットを既に含む(INITIATEを参照)指名されたアイテムを主スタックにプッシュする。主スタックの一番上には、それらのデータアイテムの数を表す値がある(これは、予約ワードNUM_INPUTSに関連付けられる)。
●構文:
【数2】
●コンパイラの動作:
HLLプログラムの宣言された(DECLARE)定数値を(主スタックのような)メモリ記憶に置くために、PUSHDATAコマンドを記述する。コマンドは、一番上から開始して、1つずつアイテムをメモリ記憶にプッシュし得る。コンパイラは、メモリ記憶の中の各定数値の位置(例えば、主スタック位置)を追跡できる。
HLLプログラムの変数を(altスタックのような)メモリ記憶に置くために、OP-TOALTSTACKコマンドを記述する。ここでも、コンパイラは、メモリ記憶の中の各変数の位置(例えば、altスタック位置)を追跡できる。
【0074】
●例:
【数3】
コンパイラがこれらの文を実行するのに続き(必須のINITIATE文が幾つかの値を獲得すると仮定すると)、メモリ記憶(本例では、主スタック及びaltスタック)の状態は、以下ようになるだろう。
【数4】
【0075】
本例では、アンロックスクリプトに供給される何からの個数のインプットアイテムがあると仮定する。少なくとも、例え値が0であり且つその下にスタックに値が無くても、「NUM_INPUTS」(これは予約ワードである)とラベル付けされた位置には値がある。この値は、その下に何個のアイテムがあるかに拘わらず、メモリブロックの始めと考えられる。コンパイラは、メモリ内のアイテムの数、及び、それらの初期のスタックの一番上からの相対位置を知っている。これらのアイテムは、プログラム実行の期間中、位置を保つ。一時的な計算は、(図中に「一時変数用(for temp variables)」と示される)スタックの一番上にある空間を用いて行われる。アイテムが一時的に計算のために主スタックの一番上にプッシュされると、これは、メモリアイテムの装置位置を変化させる。しかしながら、コンパイラは、相対位置の知識を常に保持する。
【0076】
例えば、DECLARE文が実行された後に、コンパイラは、Init-depthの値及びスタック内の各アイテムの位置を計算して内部的に保持する(私達の例ではInit-depth=12)。つまり、
【数5】
【0077】
コンパイラは、<アイテムの初期深さ>+<スタックに追加されるアイテムの数>に基づき、コンパイル中の任意の時点における任意のアイテムの深さを計算できる。
【0078】
<HLL構成:INCREMENT>
●説明:
変数は、メモリ内のその位置から読み出され、1だけ増加され、次にメモリ内のその位置に再配置される。
●構文:
INCREMENT (Variable-name)
ここで、
Variable-name:変数を識別するために宣言(Declaration)部分の中で使用される名称。
●コンパイラの動作:
注:コンパイラは、両方のスタックの変化するアイテム数(つまり、Main_Stack_Height及びALT_Stack_Height)の知識を維持する。コンパイラは、宣言(Declaration)部分の間に確立される各変数及び定数の各スタック上の位置も知っている。つまり、Var-Posn=altスタック内のVariable-nameの位置(つまり、スタックの一番下からのアイテムの数)。
【0079】
演算は、Borrow Block技術を使用する。
【数6】
(Borrow Blockの説明の例2を参照する)。
【0080】
●例:変数Bをインクリメントする
【数7】
【0081】
タスクは、変数Bをインクリメントすることである。コンパイラは、altスタックの中のBの深さがB-Depth=5であると知っている。コンパイラは、以下のスクリプトコードを生成する。
【数8】
【0082】
<HLL構成:IF ELSE>
●説明:
標準的なIFテスト。
●構文:
【数9】
ここで、
Value1:ハードコードされた値又は変数名又は定数名
Value2:ハードコードされた値又は変数名又は定数名
Test-operation:「=」、「<」、「>」、「≦」、「≧」(等)のような算術的テスト演算子。
●コンパイラの動作:
構文をチェックする。以下を含む:
【数10】
【0083】
<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技術を使用する。
【数11】
【0084】
<HLL構成:ABORT>
●説明:
トランザクションを無効としてマークする。
●構文:
ABORT
●コンパイラの動作:
Write OP_0 OP_VERIFY
【0085】
<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)の一番上にあるスタックアイテムの数。
【数12】
【0086】
<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の私達の語彙の中に存在し、それらは全て期待されるインプット値を有する。
次に、コンパイラは、アウトプットスクリプトの中の現在位置に値を単に書き出す。
【0087】
<HLL構成:CALCULATE TEMP>
●説明:
有効な計算が行われ、結果を主スタックの一番上に置く。「有効」は、HLLに現在利用可能な関数構成のうちの1つであることを意味する。プログラマは、後に参照されたときにTEMPが利用可能であるように(つまり、依然としてスタックの一番上にあるように)、プログラムを書かなければならない。TEMPは1回だけ参照できることに留意する。(1回より多く必要な場合には、代わりに変数として宣言(DECLARE)されるべきである)。
●構文:
CALCULATE TEMP=expression
●コンパイラの動作:
表現(expression)が有効である(現在利用可能な関数構成のリストのメンバである)ことをチェックする。
該表現を実行して、結果(TEMP)をスタックの一番上に残す。
TEMPへの以下の参照をパースする。TEMPが参照のときにスタックの一番上に存在する必要があるかどうかを決定する。必要がない場合、コンパイルエラーを投じない。
●例:
CALCULATE TEMP=HASH160 (123456789)
【0088】
<HLL構成:HASH160>
●説明:
これは、OP_CODE:OP_HASH160と等価なハッシングアルゴリズムを実行する。
●構文:
HASH160(value1)
ここで、
value1は以下のいずれかである:
ハードコードされた整数
宣言(DECLARE)された定数
宣言(DECLARE)された変数
●コンパイラの動作:
Velue1がハードコードされた数ならば、スタックの一番上にプッシュされる。
Velue1が変数又は定数ならば、読み出される(RETRIEVED)(スタックの一番上に置かれる)。
コンパイラは以下を書き込む:
OP_HASH160
【0089】
<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+1を計算する。
必要なアイテムがaltスタックにある(つまり、変数である)場合、
【数13】
必要なアイテムが主スタックにある(つまり、定数である)場合、
【数14】
【0090】
●例:変数Cのコピーを読み出す
メモリ割り当てが以下のように見えると仮定する。
【数15】
タスクは、変数Cのコピーを主スタックの一番上に配置することである。コンパイラは、altスタックの中のCの深さがC-Depth=4であると知っている。コンパイラは、以下のスクリプトコードを生成する。
【数16-1】
【数16-2】
【0091】
<予約ワード>
●予約ワード:NUM_INPUTS
説明:これは、常にメモリブロックの一番下の定数である。つまり、割り当てられたスタック位置のブロック内の「最初の」アイテムである。これは定数であるが、コンパイルのときに分からない。したがって、これは、任意のハードコードされたスクリプト演算のためにコンパイラにより使用できない(例えば、これは、コンパイルされたコード内でOP_TOALTSTACK文が何回生成されるかを計数するための数値として使用できない)。これは、実行時間において分かる。したがって、これは、ループ及びIF文の中の条件テストのようなタスクのために、プログラマ又はコンパイラにより使用できる。
【0092】
●予約ワード:TEMP
説明:これは、計算後にスタックの一番上に残される、一時的な一度限りの変数である。これは、プログラマが計算中に参照できるようにするために存在する。コンパイラは、プログラム中で後にTEMPが参照されるときに、TEMPが依然としてスタックの一番上にあることを保証するために、構文をチェックする。
【0093】
●予約ワード:CONSTANTS
説明:これは、DECLARE構成と関連して使用される。この後に、主スタックにプッシュされる構成のリストが続く。
【0094】
●予約ワード:VARIABLES
説明:これは、DECLARE構成と関連して使用される。この後に、altスタックにプッシュされる変数のリストが続く。
【0095】
説明の目的で、ここで、WHILEループを含む使用例、例示的なHLLプログラム、及びそれからコンパイルされ得るBitcoinスクリプトコードを提供する。Bitcoinスクリプトコードは、Bitcoinスクリプト言語であるScriptに属するオペコードを利用する。Bitcoinスクリプトコードは、従来のように/*又は//で始まるコメントを含むことに留意する。これらのコメントは、コンパイラにより生成されるBitcoinスクリプトコードの部分である必要はないが、例示的なBitcoinスクリプトコードを生成する際のコンパイラの動作を説明する目的で以下に含まれる。
【0096】
<WHILEループの例~トランザクション(Tx)>
10個のハードコードされたハッシュパズルの内部リストを有するブロックチェーントランザクション(Tx)を考える。Txのアウトプットをアンロックするために、使用者は、少なくとも3個の正しいハッシュ解を提供する必要がある。トランザクションのロックスクリプトは、同じインプット(つまり「scriptsig」)で最大12回の試行を受け付け、それらは任意の順序であり得る。トランザクションは、各インプット「try」をハッシュし、それが内部に格納したハッシュ値のうちの1つに一致するかどうかをチェックする。
【0097】
明確のため、BitcoinトランザクションのINPUTセクションでアンロックスクリプトを記述する従来の方法を考える。
<scriptSig> <scriptPubkey>
最初の部分<scriptSig>は、使用されている前のトランザクションのOUTPUTをアンロックするために、spendingトランザクションに含まれるデータ及び/又はOP_CODEである。2番目の部分<scriptPubkey>は、使用されている前のトランザクションのOUTPUTの中で使用されるロックスクリプトである。
【0098】
私達は、これらを以下のように表す。
<Spender Input> <locking script>
【0099】
使用者インプット(Spender Input)がTRY1 TRY2 TRY3 TRY4 TRY5であると仮定する。
つまり、使用者は、5個の異なる可能なハッシュ解を試行した。上述のルールでは、トランザクションをアンロックするために、そのうちの3個は正しい必要がある。結合された<Spender Input> <locking script>が実行されると、最初の演算は<Spender Input>内のものになる。これは、本例では、単に5個のデータアイテムをスタックにプッシュすることである。
【0100】
<ロックスクリプトロジック~擬似コード>
注:ネストされたWHILEループがある。
標準的な第1ステップ:インプットの数を計数し、NUM_INPUTSとして保存する。
スクリプトの中で使用される変数及び定数を宣言し、既知の値に初期化する。
【数17】
【0101】
使用者のインプット値を有する内部配列を投入する(つまり、本例では、Try[1]-Try[5]をインプット値TRY1 TRY2 TRY3 TRY4 TRY5に割り当てる)。配列の残りのものはゼロの値のままである。
【0102】
/*外側ループがここで開始する:各インプット値(TRY1-TRY5)を得て、チェックのためにそれをハッシュする。
【数18】
【0103】
/*内側ループがここで開始する:保存したハッシュ値ごとに、ハッシュされたTry値に一致するかどうかをチェックする。
【数19】
【0104】
<正式なHLLプログラム>
以下のコードは、本開示の実施形態による構文を用いてHLLで記述されている。これは、WHILEの使用を説明することを目的とするが、やむを得ず、他のHLL構成も含み(これらは大文字である(CAPITALISED))、これらのうちの幾つかは上述され、従来の最新の高レベル言語により使用される構文に慣れている当業者に直ちに理解されるだろう。
【数20】
【0105】
/*配列要素毎に、スタック上に利用可能な対応するインプット値があるかどうかをチェックし、ある場合、対応する配列要素を投入するためにそれを使用する。
【数21】
【0106】
/*外側ループ。合成条件に留意する。
【数22】
/*内側ループ。別の合成条件。
【数23】
【0107】
<コンパイルされたBitcoin Script>
/*INITIATE(初期化)
OP_DEPTH //NUM_INPUTS(予約ワード)を決定し、スタックの一番上に置く
/*DECLARECONSTANTS(定数の宣言)定数を初期化し、主スタックに置く。コンパイラは、定数の位置を知っている。12個の値の配列(これらは、「try値」であり、後に実際のインプット値を投入される)。
実際には、配列:Try[12]
OP_0 OP_0 OP_0 OP_0 OP_0 OP_0 OP_0 OP_0 OP_0
OP_3 //Correct_Needed-TXをアンロックするために必要な正しいハッシュの数は3とハードコードされる
OP_10 //Num_Hashes-配列内のハッシュの数は10とハードコードされる
【0108】
/*ハードコードされたハッシュ値は、主スタックに格納される(つまり、次の20バイトがスタックにプッシュされる)。実際には配列HASH-SAVED[10]。
【数24】
【0109】
/*DECLARE VARIABLEs(変数の宣言)。変数(インデックス及びブール)を初期化し、altスタックに置く。コンパイラは位置を知っている。
OP_0 OP_TOALTSTACK // Correct_Counter-正しいヒットの数(ハッシュの一致が見付かったとき)。
OP_0 OP_TOALTSTACK // Try_counter-外側ループのインデックス:試行されているインプット値のカウンタ。
OP_0 OP_TOALTSTACK // Hash_counter-内側ループのインデックス:試行されているハッシュのカウンタ。
OP_0 OP_TOALTSTACK // Match_found-ブールフラグ:ハッシュの一致が見付かったときに真(True)に設定される。
【0110】
/*この段階で、altスタックが投入され、変数のためのメモリストアとして動作する。コンパイラは、変数の位置、つまりaltスタックにおけるそれらの「深さ」を「追跡」する必要がある。主スタックは、定数を投入されている。コンパイラは、定数の位置も追跡する必要がある。主スタックメモリブロックの「最初の値」は、(何個のアイテムがその下にあるかに関係なく)NUM_INPUTSの位置にあると考えられる。
【0111】
/*この段階で、コンパイラは、NUM_INPUTSの値が主スタックの27の深さにあることを知っている。以下の演算は、この値をスタックの一番上にコピーする。次に、これは、値「12」をスタックの一番上にプッシュし、「>」を用いて比較する。NUM_INPUTS>12ならば(許容される12回の「試行」に対応する)、異常終了する。OP_VERIFYが結果をスタックの一番上に残すので、演算はOP_DROPを使用できる。
27 OP_PICK OP_12 OP_GREATERTHAN OP_VERIFY OP_DROP
【0112】
/*POPULATE THE Try[] array(Try[]配列を投入する)。注:Try[]配列を投入するためのコードブロックは、本願の明確さ及び読みやすさを向上するために、図2に移されている。私達は、コンパイラがTxアウトプットの使用者により供給されたインプット値を読み取りそれらをTry[]配列に投入するスクリプトコードのブロックを書き出すと仮定する。一例では、5個のインプット(つまり5回の「試行」)のみが提供され、したがって、Try[]の最初の5個の要素だけが投入され、他の要素は値0のままである。
【0113】
/*外側WHILEループ。(例えば所定のルールの毎に)可能な最大反復回数は12である。したがって、コンパイラは、以下のオペコードのシーケンスを12回複製することにより、外側WHILEループを展開する。
/*条件1(Condition1)のBorrow Block:「is Try_counter<NUM_Inputs AND Correct_counter<Correct_Needed?」。条件1の中のテストを行うために、私達は、altスタックから変数を抽出し、テストを実行し、次に変数を再び戻す(「borrow block」)。
/*先ず、Try_counterのコピーを得て、スタックの一番上に置く。
【数25】
【0114】
/*次に、NUM_Inputsのコピーを得て、スタックの一番上に置く。コンパイラは、この定数が現在、主スタックの14の深さにあることを知っている。
OP_14 OP_PICK
/*ここで、条件1(Condition1)の部分1(part1)について、上位2個のスタックアイテムの比較を行う。これは「Try-Counter<NUM_Inputs?」をチェックし、結果をスタックの一番上に残す。
OP_LESSTHAN
/*条件1(Condition1)の部分2(part2)のチェックを行う(「is Correct_counter<Correct_Needed?」)。結果をスタックの一番上に残す。
/*先ず、Correct_counterのコピーを得て、スタックの一番上に置く。
【数26】
【0115】
OP_13 OP_PICK // Correct_Neededをスタックの一番上にコピーする:コンパイラは、この定数が現在13の深さにあると知っている。
OP_LESSTHAN // ここで、条件1(Condition1)の部分2(part2)について、上位2個のスタックアイテムの比較を行う。これは「Correct_counter<Correct_needed?」をチェックし、結果をスタックの一番上に残す。
OP_BOOLAND // 条件1(condition1)の結合したチェックを完了する:条件1の両方の部分の結果がスタックの一番上にある。この演算の後に、Condition1のテストの最終結果がスタックの一番上にある。以下のIFによりポップオフされる。
OP_IF
【0116】
/*Try-CounterのインクリメントのためのBorrow block。最初のステップは、主スタックの一番上にそれを得ることである。コンパイラは、そのaltスタック上の深さを知っている(本例ではdepth=3)。
【数27】
【0117】
/*Hash_counter=0にリセットするためのBorrow block。コンパイラは、この変数の位置を知っている。
【数28】
【0118】
/*Match-Found=FALSEにリセットするためのBorrow block。コンパイラは、この変数の位置を知っている。
【数29】
【0119】
/* 必要な「Try」値をスタックの一番上にコピーし、それをハッシュする。
<Try-depth>OP_PICK
OP_HASH160 //正式なHLLでは、これはTEMPの値であり、スタックの一番上に残される。更なる演算は、より多くの値を主スタックにプッシュし及び/又は主スタックからポップオフする。目的は、TEMPの値が(等価チェックのために)次に必要なとき、スタックの一番上にあることである。コンパイラは、正式なHLLコードに基づき常にスタック内に何があるかを追跡できるので、コンパイラはコンパイルのときにこれを検証できる
【0120】
/*内側WHILEループ。
/*内側WHILEループは、与えられる例では10の最大値を有するNum_Hashes回の反復の間、実行される。したがって、コンパイラは、外側WHILEループの各反復の中で、以下のオペコードのシーケンスを(10回の反復以下である)Num_Hashes回の反復だけ複製することにより、内側WHILEループを展開する。
【0121】
/*条件2(Condition2)のBorrow Block:「‘Is Match_Found=FALSE AND Hash-Counter<NUM_Hashes?」。条件1の中のテストを行うために、私達は、altスタックから変数を抽出し、テストを実行し、次に変数を再び戻す(「borrow block」)。
【0122】
/*先ず、Condition2の部分1の変数Match_Foundのコピーを取得し、スタックの一番上に置く。コンパイラは、この変数の位置を知っている。
【数30】
/*Match_Found=FALSEをチェックし、結果をスタックの一番上に置く。
OP_NOT
/*ここで、condition2の部分2の変数Hash_Counter及びNUM_Hashesのコピーを取得する(Hash_Counter<NUM_Hashesかどうかをテストする)。コンパイラは、これらの変数の位置を知っている。
【数31】
【0123】
/*Hash_Counter<NUM_Hashesをチェックする。
OP_LESSTHAN
/*condition2の結合したチェックを完了する。condition2チェックの両方の部分の結果は、スタックの一番上にある。この後に、最終結果がスタックの一番上に残される。
【0124】
OP_BOOLAND
【0125】
/*Condition2テストの結果は、スタックの一番上にある。以下のIFによりポップオフされる。
OP_IF
【0126】
/*Hash_CounterのインクリメントのためのBorrow block。
必要なハッシュ値の深さ(つまり<Hash-depth>)は、「current-stack-height」-「Hash1-position」-Hash_counter+1としてコンパイラにより計算できる。
/*コンパイラは、全ての定数の位置の知識を維持でき、したがって、第1ハッシュ値の位置が9であることを知っている(なぜなら、5個のTry値があり、3個の多の定数がスタックの一番下にあるからである)。
/*主スタックの一番上に1つのTEMP値があり、したがって、現在スタック高は19である。HASH-SAVED[4](Hash_counter=4)の深さが欲しい場合、深さは次の通りである。
「Hash-depth」=19-9-4+1=8
(つまり、現在、主スタックの一番上から8である)。
【数32】
スタックの上から2番目は、内側ループ(TEMP)の直前に実行されたOP_HASH160演算の結果である。これに続く演算は、内部に保存したハッシュ値に対して、ハッシュされたTry値(TEMP)をチェックする。
【数33】
/*内側WHILEループの終了
/*NUM_INPUTSを読み出すオペコード
/*NUM_INPUTS≧1をチェックするオペコード
OP_IF
内側WHILEループの2回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS≧2をチェックするオペコード
OP_IF
内側WHILEループの3回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS≧3をチェックするオペコード
OP_IF
内側WHILEループの4回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS≧4をチェックするオペコード
OP_IF
内側WHILEループの5回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS≧5をチェックするオペコード
OP_IF
内側WHILEループの6回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS≧6をチェックするオペコード
OP_IF
内側WHILEループの7回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS>=7をチェックするオペコード
OP_IF
内側WHILEループの8回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS>=8をチェックするオペコード
OP_IF
内側WHILEループの9回目の反復のオペコードシーケンスの複製
END_IF
/*NUM_INPUTS>=9をチェックするオペコード
OP_IF
内側WHILEループの10回目の反復のオペコードシーケンスの複製
END_IF
【0127】
/*外側WHILEループの終了
外側WHILEループの2回目の反復のオペコードシーケンスの複製(内側WHILEループの(最大10回の)NUM_INPUTS回の反復のオペコードシーケンスの複製を含む)。
外側WHILEループの3回目の反復のオペコードシーケンスの複製(内側WHILEループの(最大10回の)NUM_INPUTS回の反復のオペコードシーケンスの複製を含む)。
外側WHILEループの4回目の反復のオペコードシーケンスの複製(内側WHILEループの(最大10回の)NUM_INPUTS回の反復のオペコードシーケンスの複製を含む)。
外側WHILEループの5回目の反復のオペコードシーケンスの複製(内側WHILEループの(最大10回の)NUM_INPUTS回の反復のオペコードシーケンスの複製を含む)。
外側WHILEループの6回目の反復のオペコードシーケンスの複製(内側WHILEループの(最大10回の)NUM_INPUTS回の反復のオペコードシーケンスの複製を含む)。
外側WHILEループの7回目の反復のオペコードシーケンスの複製(内側WHILEループの(最大10回の)NUM_INPUTS回の反復のオペコードシーケンスの複製を含む)。
外側WHILEループの8回目の反復のオペコードシーケンスの複製(内側WHILEループの(最大10回の)NUM_INPUTS回の反復のオペコードシーケンスの複製を含む)。
外側WHILEループの9回目の反復のオペコードシーケンスの複製(内側WHILEループの(最大10回の)NUM_INPUTS回の反復のオペコードシーケンスの複製を含む)。
外側WHILEループの10回目の反復のオペコードシーケンスの複製(内側WHILEループの(最大10回の)NUM_INPUTS回の反復のオペコードシーケンスの複製を含む)。
外側WHILEループの11回目の反復のオペコードシーケンスの複製(内側WHILEループの(最大10回の)NUM_INPUTS回の反復のオペコードシーケンスの複製を含む)。
外側WHILEループの12回目の反復のオペコードシーケンスの複製(内側WHILEループの(最大10回の)NUM_INPUTS回の反復のオペコードシーケンスの複製を含む)。
外側WHILEループの12回の反復が完了すると、コンパイラは、必要なヒット数に達したかをチェックする(つまり、Correct_counter≧Correct_Neededをチェックする)。
【数34】
【0128】
//この最終演算は、テスト結果をスタックの一番上に残す。真(TRUE)(つまり、Correct_counter≧Correct_Needed)且つ他のチェックが通る可能性がある場合、トランザクションは有効としてマークされる。
【0129】
実施形態では、ブロックチェーンコンパイラは、アウトプットスクリプトのより効率的な又は削減されたバージョンを提供するために、少なくとも1回、アウトプットスクリプトを最適化するよう構成され得る。これは、導関数のない最適化(derivative free optimisation:DFO)の使用を含んでよい。DFOは、従来知られた用語であり、当業者により直ちに理解される。追加又は代替として、アウトプットスクリプトを生成するステップは、導関数のない最適化の使用を含んでよい。
【0130】
実施形態では、ブロックチェーンコンパイラは、ソフトウェア開発キット(software development kit:SDK)の部分を形成し及び/又はそれと関連して動作するよう構成されてよい。SDKは、エディタ、デバッガ、及びコードに基づくソリューションの生成を促進するためにSDKと共に使用されるべき知られている他のコンポーネントを含んでよい。
【0131】
図3は、本開示の一実施形態によるブロックチェーンに関連付けられた例示的なブロックチェーンネットワーク1000を示す。本実施形態では、例示的なブロックチェーンネットワーク1000は、ブロックチェーンプロトコルのインスタンスを実行するピアツーピア分散型電子装置で構成される。幾つかの例では、分散型電子装置は、ノード1002として参照される。ブロックチェーンプロトコルの一例はBitcoinプロトコルである。
【0132】
ノード1002は、任意の適切なコンピューティング装置で(例えば、データセンタ内のサーバにより、クライアントコンピューティング装置により(例えばデスクトップコンピュータ、ラップトップコンピュータ、タブレットコンピュータ、スマートフォン、等)、コンピューティングリソースサービスプロバイダの分散型システム内の複数のコンピューティング装置により、又は図5のコンピューティング装置2600のような任意の適切な電子クライアント装置により)構成されてよい。
【0133】
一実施形態では、ノード1002のうちの1つ以上は、ノード1002のうちの1つ以上の他のノードと通信可能に結合される。このような通信結合は、良く知られた有線又は無線通信リンクのうちの1つ以上を利用できる。実施形態では、ノード1002は、それぞれ、ブロックチェーン内の全てのトランザクションの「台帳」の少なくとも一部を維持する。このように、台帳は分散台帳である。台帳に影響を与えるノードにより処理されるブロックチェーントランザクションは、台帳の完全性が維持されるように、他のノードのうちの1つ以上により検証される。
【0134】
一実施形態では、ノード1002のうちの少なくとも幾つかは、暗号化問題を解くような複雑な計算に関連するマイニング処理を実行するマイナーノードである。暗号化問題を解くマイナーノードは、ブロックチェーンの新しいブロックを生成し、新しいブロックをノード1002のうちの他のノードにブロードキャストする。ノード1002のうちの他のノードは、マイナーノードの作業を検証する検証処理を実行し、検証すると、(例えばブロックをブロックチェーンの分散台帳に追加することにより)ブロックをブロックチェーン内へと受け付ける。幾つかの例では、ブロックは、トランザクションのグループであり、タイムスタンプ及び前のブロックの「指紋」(例えばハッシュ)によりマークされることがある。このように、各ブロックは前のブロックにリンクされるようになり、それにより、ブロックチェーン内のブロックをリンクする「チェーン」を生成する。実施形態では、有効なブロックは、ノード1002の総意によりブロックチェーンに追加される。また、幾つかの例では、ブロックチェーンは検証済みブロックのリストを含む。
【0135】
一実施形態では、ノード1002のうちの少なくとも幾つかは、本開示に記載のようにトランザクションを検証する検証処理を実行する検証ノードとして動作する。図3は、1つの例示的なラベル付けされたトランザクション1004を示す。幾つかの例では、トランザクションは、デジタルアセットの所有権の証明を提供するデータ(例えば、Bitcoinトークンの量)、及びデジタルアセットの所有権/制御を受け入れる又は移転する条件を含む。幾つかの例では、「spendingトランザクション(spending transaction)」は、前のトランザクションの未使用トランザクションアウトプット(unspent transaction output:UTXO)により示されるデジタルアセットの少なくとも一部を、ブロックチェーンアドレスに関連付けられたエンティティに再割り当てする(例えば、所有権又は制御を移転する)トランザクションを表す。幾つかの例では、「前のトランザクション」は、spendingトランザクションにより参照されているUTXOを含むトランザクションを表す。幾つかの実施形態では、トランザクションは、「アンロックスクリプト」及び「ロックスクリプト」を含み得る。ロックスクリプトは、トランザクションが有効にされ及び所有権/制御がトランザクションにより移転される前に満たされなければならない条件により、トランザクションを妨げるために使用できる。幾つかの実施形態では、ロックスクリプトは、トランザクションのアウトプットに関連付けることができ、アウトプットを使用するために必要な1つ以上の条件を定めるために使用できる。さらに、spendingトランザクションのアンロックスクリプトは、アンロックスクリプトの実行が、spendingトランザクションの検証のために前のトランザクションのロックスクリプトの実行により評価される条件セットを導出するために使用されるデータを提供するように、構成され得る。前のトランザクションのロックスクリプト及びspendingトランザクションのアンロックスクリプトは、BitcoinのScriptのような低レベルの機能的に制約されたスクリプト言語を用いて記述される。
【0136】
幾つかの実施形態では、spendingトランザクションの検証は、前のトランザクションのロックスクリプトにより記述された条件セットを満たし及び検証するために、spendingトランザクションのアンロックスクリプトの実行、それと共に前のトランザクションのロックスクリプトの実行を含んでよい。Spendingトランザクションの検証は、他のチェックを含み得る。Spendingトランザクションの検証に成功すると、spendingトランザクションは他のネットワークノードへ伝搬され得る。マイナーノードは、本願明細書に記載のように、有効なspendingトランザクションを、ブロックチェーンに追加されるブロックの部分として埋め込むために選択できる。
【0137】
図3に示すように、本願明細書に記載のブロックチェーンコンパイラ1001は、HLLプログラムを、ブロックチェーンと互換性のあるスクリプト(又はスクリプトのフラグメント)に変換するために使用される。これは、ブロックチェーンコンパイラ1001により提供されるアウトプットを形成し得るので、「アウトプットスクリプト」と呼ばれてよい。アウトプットスクリプトは、ブロックチェーントランザクション(Tx)に提供されてよい。アウトプットスクリプトは、トランザクションアウトプットに関連付けられたロックスクリプトの部分、又はトランザクションインプットに関連付けられたアンロックスクリプトの部分であってよい。アウトプットスクリプトは、ブロックチェーンネットワークのノードにより実行可能なブロックチェーンスクリプト言語から選択された、それに固有の及び/又はその部分を形成するオペコードで形成されてよい。オペコードは、プリミティブ又はコマンドと呼ばれてよい。スクリプトのオペコードは、ブロックチェーンネットワーク1000のノード上で実行するインタープリタ又は仮想機械により実行され得る。インタープリタ又は仮想機械は、スクリプトのオペコードを機械実行可能(オブジェクト)コードに変換してよい。ブロックチェーンスクリプト言語は、例えば、Bitcoinプロトコル又はその変形と関連して使用されるScript言語であってよい。スクリプト言語は、暗号化、算術、及びスタック操作オペコードを含んでよい。
【0138】
コンパイラ1001は、SDK、又は場合によっては、ブロックチェーンネットワークのボット若しくはノードにより実行可能なブロックチェーントランザクションスクリプト(又はスクリプトのフラグメント)を生成するために静的コンパイルを利用するオンラインサービスの部分であり得る。
【0139】
代替として、本願明細書に記載のコンパイラの方法は、ブロックチェーンネットワークのボット又はノードの実行時間の環境の部分として使用できる。ここで、実行時間の環境は、HLLプログラム(例えば、python、C++等のような3G言語で記述されたプログラム)のチャンクを、ブロックチェーンネットワークのボット又はノードにより実行可能なブロックチェーントランザクションスクリプト又はスクリプトフラグメントに解釈する又は動的にコンパイルする若しくは変換する。
【0140】
図4は、spending前のトランザクション202(「TX1」と付される)のアウトプットを使用するトランザクション204(「TX2」と付される)の検証及びマイニングのための例示的なブロックチェーンプロトコルを示す。前のトランザクション202は、トークン量(デジタルアセット)を含むアウトプットと、該トークン量を使用するために必要な条件セットを定めるよう構成されるロックスクリプトと、を有する。前のトランザクション202は検証されマイニングされる。その結果、前のトランザクション202はブロックに埋め込まれ、次に該ブロックが検証されて、該ブロックがブロックチェーン208に格納される。Spendingトランザクション204は、前のトランザクション202のアウトプットを参照するトランザクションアウトプット識別子フィールド(「Tx output ID」と付される)とアンロックスクリプトとを有するインプットを含む。前のトランザクション202のロックスクリプト及びspendingトランザクション204のアンロックスクリプトは、BitcoinのScriptのような低レベルの機能的に制約されたスクリプト言語を用いて記述される。spendingトランザクション204が有効と考えられるためには、インプットのアンロックスクリプトは、前のトランザクション202の参照されたアウトプットのロックスクリプトにより定められた条件セットを満たすデータを提供しなければならない。前のトランザクション202のロックスクリプト(又はその部分)及びspendingトランザクション204のアンロックスクリプトは、本願明細書に記載のブロックチェーンコンパイル方法及びツールにより生成され得る。
【0141】
Spendingトランザクション204は、前のトランザクション202のロックスクリプトにより記述される条件セットを満たし及び検証するために、spendingトランザクション204のアンロックスクリプトを実行するのと共に、前のトランザクション202のロックスクリプトを実行することにより、ブロックチェーンネットワーク(図4)の1つ以上のノードにより検証される。Spendingトランザクション202の検証は、他のチェックを含み得る。Spendingトランザクションの検証に成功すると、spendingトランザクションは他のネットワークノードへ伝搬され得る。マイナーノードは、本願明細書に記載のように、有効なspendingトランザクションを選択し、ブロックチェーン208に追加されるブロックの部分として埋め込むマイニング動作を実行できる。検証され、ブロックチェーン208に格納されると、トランザクション202及び204のシーケンスは、トランザクションにより参照されるトークン量(デジタルアセット)に対する制御の移転を提供する。
【0142】
図5は、本開示の少なくとも一実施形態を実施するために使用され得るコンピューティング装置2600の簡略ブロック図を示す。種々の実施形態で、コンピューティング装置2600は、図示した及び上述したブロックチェーンネットワークのブロックチェーンコンパイラ及びネットワークノードを実装するために使用されてよい。例えば、コンピューティング装置2600は、データサーバ、ウェブサーバ、ポータブルコンピューティング装置、パーソナルコンピュータ、又は任意の電子コンピューティング装置としての使用のために構成されてよい。図5に示すように、コンピューティング装置2600は、多数の周辺サブシステムとバスシステム2604を介して動作可能に結合され及び通信するよう構成されてよい1つ以上のプロセッサ2602を含んでよい。プロセッサ2602は、本願明細書に記載のように、HLLソースコードプログラムのブロックチェーンスクリプト(又はそのフラグメント)へのコンパイルのために利用されてよい。これらの周辺サブシステムは、メモリサブシステム2608及びファイル/ディスク記憶サブシステム2610を含む記憶サブシステム2606、1つ以上のユーザインタフェース入力装置2612、1つ以上のユーザインタフェース出力装置2614、及びネットワークインタフェースサブシステム2616を含んでよい。このような記憶サブシステム2606は、本開示に記載のトランザクションに関連する詳細事項のような情報の一時的又は長期記憶のために使用されてよい。
【0143】
バスサブシステム2604は、コンピューティング装置2600の種々のコンポーネント及びサブシステムに、必要に応じて互いに通信させるメカニズムを提供してよい。バスサブシステム2604は概略的に単一バスとして示されるが、バスサブシステムの代替の実施形態は複数のバスを利用してよい。ネットワークインタフェースサブシステム2616は、他のコンピューティング装置及びネットワークへのインタフェースを提供してよい。ネットワークインタフェースサブシステム2616は、コンピューティング装置2600からの他のシステムからデータを受信する及びそれへデータを送信するためのインタフェースとして機能してよい。例えば、ネットワークインタフェースサブシステム2616は、データ技術者が装置を無線ネットワークに接続することを可能にしてよい。その結果、データ技術者は、ユーザデータセンタのような遠隔の場所にいる間、データを送信及び受信可能であってよい。バスシステム2604は、詳細事項、検索語、等のようなデータを、本開示の監視モデルに通信するために利用されてよく、監視モデルのアウトプットを1つ以上のプロセッサ2602に及び商人及び/又は債権者にネットワークインタフェースサブシステム2616を介して通信するために利用されてよい。
【0144】
ユーザインタフェース入力装置2612は、キーボード、統合型マウスのようなポインティング装置、タッチパッド、又はグラフィックタブレット、スキャナ、バーコードスキャナ、ディスプレイに内蔵されたタッチスクリーン、音声認識システムのようなオーディオ入力装置、マイクロフォン、及び他の種類の入力装置のような、1つ以上のユーザ入力装置を含んでよい。概して、用語「入力装置」の使用は、コンピューティング装置2600に情報を入力するためのあらゆる可能な種類の装置及びメカニズムを含むことを意図する。1つ以上のユーザインタフェース出力装置2614は、ディスプレイサブシステム、プリンタ、又はオーディオ出力装置のような非視覚ディスプレイ、等を含んでよい。ディスプレイサブシステムは、陰極線管(CRT)、液晶ディスプレイ(LCD)のような平面パネル装置、発光ダイオード(LED)ディスプレイ、又は投影若しくは他のディスプレイ装置を含み得る。概して、用語「出力装置」の使用は、コンピューティング装置2600から情報を出力するためのあらゆる可能な種類の装置及びメカニズムを含むことを意図する。1つ以上のユーザインタフェース出力装置2614は、例えば、本願明細書に記載の処理及びその変形を実行するアプリケーションとのユーザ相互作用が適切な場合に、該相互作用を助けるために、ユーザインタフェースを提示するために使用されてよい。
【0145】
記憶サブシステム2606は、本開示の少なくとも一実施形態の機能を提供し得る基本プログラミング及びデータ構造を格納するコンピュータ可読記憶媒体を提供してよい。アプリケーション(プログラム、コードモジュール、命令)は、1つ以上のプロセッサにより実行されると、本開示の1つ以上の実施形態の機能を提供してよく、記憶サブシステム2606に格納されてよい。これらのアプリケーションモジュール又は命令は、1つ以上のプロセッサ2602により実行されてよい。記憶サブシステム2606は、さらに、本開示に従い使用されるデータを格納するレポジトリを提供してよい。記憶サブシステム2606は、メモリサブシステム2608及びファイル/ディスク記憶サブシステム2610を含んでよい。
【0146】
記憶サブシステム2608は、プログラム実行中の命令及びデータの記憶のための主ランダムアクセスメモリ(RAM)2618、及び固定命令が格納され得る読み出し専用メモリ(ROM)2620を含む多数のメモリを含み得る。ファイル/ディスク記憶サブシステム2610は、プログラム及びデータファイルのための非一時的永久(不揮発性)記憶を提供してよく、ハードディスクドライブ、関連取り外し可能媒体と一緒のフロッピーディスクドライブ、コンパクトディスク読み出し専用メモリ(CD-ROM)ドライブ、光ドライブ、取り外し可能媒体カートリッジ及び他の同様の記憶媒体を含んでよい。
【0147】
コンピューティング装置2600は、少なくとも1つのローカルクロック2624を含んでよい。ローカルクロック2624は、特定の開始日から生じた時間数を表すカウンタであってよく、コンピューティング装置2600の内部に統合されて置かれてよい。ローカルクロック2624は、コンピューティング装置2600のプロセッサ及びその中に含まれる全サブシステム内で、特定クロックパルスにデータ転送を同期化するために使用されてよく、コンピューティング装置2600とデータセンタ内の他のシステムとの間の同期動作を調整するために使用されてよい。一実施形態では、ローカルクロック2624は原子時計である。別の実施形態では、ローカルクロックはプログラム可能な間隔タイマである。
【0148】
コンピューティング装置2600は、ポータブルコンピュータ装置、タブレットコンピュータ、ワークステーション、又は以下に記載の任意の他の装置を含む種々の種類であってよい。さらに、コンピューティング装置2600は、コンピューティング装置2600に1つ以上のポート(例えば、USB、ヘッドホンジャック、光コネクタ、等)を通じて接続され得る別の装置を含んでよい。コンピューティング装置2600に接続され得る装置は、光ファイバコネクタを受けるよう構成される複数のポートを含んでよい。したがって、本装置は、光信号を電気信号に変換するよう構成されてよい。該電気信号は、処理のために、装置をコンピューティング装置2600に接続するポートを通じて送信されてよい。コンピュータ及びネットワークの絶え間なく変わる特性により、図13に示すコンピューティング装置2600の説明は、装置の好適な実施形態を説明する目的で特定の例としてのみ意図される。図5に示したシステムより多数の又は少数のコンポーネントを有する多くの他の構成が可能である。
【0149】
留意すべきことに、上述の実施形態は、本開示を限定するのではなく説明し、当業者は添付の請求項により定められる本発明の範囲から逸脱することなく多数の代替の実施形態を考案できる。本開示の方法、システム、及び機器(又はそれらの部分)は、複数の別個の要素を有するハードウェアにより又は適切にプログラムされたコンピュータにより、実施されてよい。複数の手段を列挙している装置の請求項では、これらの複数の手段は、1つの同一のハードウェア要素により実装することができる。特定の量が相互に異なる従属請求項に記載されるという事実は、これらの量の組合せが有利に用いることが出来ないことを示すものではない。
【0150】
したがって本明細書と添付図面は限定的ではなく例示的であると解釈すべきである。しかしながら、請求の範囲に記載された本発明の範囲から逸脱することなく種々の変更を行うことができることが明らかである。同様に、他の変形は本開示の範囲内にある。したがって、開示の技術は、種々の変形及び代替構成の影響を受けるが、その特定の図示の実施形態が図面に示され、以上に詳細に記載された。しかしながら、理解されるべき点は、本発明が開示された1又は複数の特定の形式に限定されないこと、むしろ、添付の請求の範囲に記載のように、全ての変形、代案構成及び均等物が本発明の範囲に包含されることが意図されることである。
【0151】
請求項中、括弧内に記載された如何なる参照符号も、請求項を制限すると見なされるべきではない。さらに、開示の実施形態を説明する文脈における用語「a」、「an」、及び「the」、並びに同様の指示対象は(特に、以下の請求項の文脈において)、特に断りの無い限り又は文脈により明確に矛盾しないかぎり、単数及び複数の両方をカバーすると考えられるべきである。用語「含む」、「有する」、「含む」、「伴う」、「備える」(comprising、having、including、containing)は、特に断りのない限り広義の語として考えられるべきである(つまり、「を含む、しかし限定されない」を意味する)。用語「接続される」は、変更されず物理的接続を表すとき、何かが仲介する場合でも、部分的又は全体的に含まれる、取り付けられる又は一緒に結合される、として考えられるべきである。本開示において値の範囲の詳述は、本願明細書に特に断りの無い限り、単に、範囲に包含される各々の別個の値を個別に参照することの簡単明瞭な言い方として機能することを意図し、各々の個別の値は、それが本願明細書に個々に詳述されたかのように、本願明細書に組み込まれる。用語「セット」(例えば、「アイテムのセット」)又は「サブセット」の使用は、特に断りの無い限り又は文脈に矛盾しない限り、1つ以上の構成要素を含む空ではない集合として考えられるべきである。さらに、特に注記されない又は文脈に矛盾しない限り、対応するセットの用語「サブセット」は、必ずしも対応するセットの適正なサブセットを示さないが、サブセット及び対応するサブセットは等しくてよい。要素の単数の参照は、該要素の複数の存在を排除するものではなく、逆も同様である。
【0152】
「A、B、及びCのうちの少なくとも1つ」又は「少なくとも1つのA、B、及びC」の形式の句のような論理的言語は、特に断りの無い限り又は特に明確に文脈に矛盾しない限り、アイテム、後、等がA又はB又はCのいずれか、又はA及びB及びCのセットの任意の空でないサブセットであってよいことを表すために使用されることが理解される。例えば、3つの構成要素を有するセットの説明のための例では、論理的言語「A、B、及びCのうちの少なくとも1つ」又は「少なくとも1つのA、B、及びC」は、以下のセット:{A}、{B}、{C}、{A,B}、{A,C}、{B,C}、{A,B,C}のうちのいずれかを表す。したがって、このような論理的言語は、通常、特定の実施形態が少なくとも1つのA、少なくとも1つのB、及び少なくとも1つのCのそれぞれが存在必要があることを意味することを意図しない。
【0153】
記載の処理の動作は、特に示されない限り、又は文脈上明らかに矛盾しない限り、任意の適切な順序で実行できる。記載の処理(又はその変形及び/又は結合)は、実行可能命令により構成される1つ以上のコンピュータシステムの制御下で実行されてよく、1つ以上のプロセッサ上で集合的に実行するコード(例えば、実行可能命令、1つ以上のコンピュータプログラム又は1つ以上のアプリケーション)として、ハードウェアにより、又はそれらの組み合わせで実装されてよい。コードは、コンピュータ可読記憶媒体に、例えば1つ以上のプロセッサにより実行可能な複数の命令を含むコンピュータプログラムの形式で格納されてよい。コンピュータ可読記憶媒体は、非一時的であってよい。
【0154】
本願明細書で与えられる任意の及び全ての例又は例示的言語(例えば、「のような」)の使用は、単に、本発明の実施形態をより良好に解明することを意図しており、特に断りのない限り本発明の範囲を限定することを意図しない。明細書中のいかなる言語も、本発明の実施に不可欠な任意の非請求要素を示すと考えられるべきではない。
【0155】
本開示の実施形態は、本開示に記載され、本発明を実施するために発明者に知られている最適モードを含む。これらの実施形態の変形は、前述の説明を読んだ当業者に明らかになり得る。発明者は、熟練技術者が、これらの変形を適切に利用することを期待し、発明者は、本開示の実施形態が特に記載されたものと異なる方法で実施されることを意図する。したがって、本開示の範囲は、適切な法により許可されるように、添付の請求の範囲に詳述された主題の全ての変形及び均等物を含む。さらに、それらの全ての可能な変形における上述の要素の任意の組み合わせは、特に断りの無い限り又は文脈に明確に矛盾しない限り、本開示の範囲に包含される。
【0156】
引用される刊行物、本願、及び特許を含む全ての参考文献は、各参考文献が個々に具体的に示され、その全体が記載されたかのように、参照により本願明細書に組み込まれる。
【符号の説明】
【0157】
101 HLLソースコード(CPO_Codes、HLL構成)
102 ブロックチェーンコンパイラ
103 ブロックチェーンプロトコル/プラットフォームと互換性のあるスクリプト(オペコード)
104 インタープリタ
105 ブロックチェーン上で実行
図1
図2
図3
図4
図5
【外国語明細書】