JP2020526814A - ブロックチェーンコンパイラ - Google Patents

ブロックチェーンコンパイラ Download PDF

Info

Publication number
JP2020526814A
JP2020526814A JP2019569887A JP2019569887A JP2020526814A JP 2020526814 A JP2020526814 A JP 2020526814A JP 2019569887 A JP2019569887 A JP 2019569887A JP 2019569887 A JP2019569887 A JP 2019569887A JP 2020526814 A JP2020526814 A JP 2020526814A
Authority
JP
Japan
Prior art keywords
blockchain
script
stack
source code
compiler
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2019569887A
Other languages
English (en)
Other versions
JP7317722B2 (ja
Inventor
スティーヴン ライト,クレイグ
スティーヴン ライト,クレイグ
サヴァナ,ステファヌ
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nchain Holdings Ltd
Original Assignee
Nchain Holdings Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Priority claimed from GBGB1710967.9A external-priority patent/GB201710967D0/en
Priority claimed from GBGB1710971.1A external-priority patent/GB201710971D0/en
Priority claimed from GBGB1710974.5A external-priority patent/GB201710974D0/en
Application filed by Nchain Holdings Ltd filed Critical Nchain Holdings Ltd
Publication of JP2020526814A publication Critical patent/JP2020526814A/ja
Priority to JP2023064745A priority Critical patent/JP7476390B2/ja
Application granted granted Critical
Publication of JP7317722B2 publication Critical patent/JP7317722B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/51Source to source
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45508Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/06Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols the encryption apparatus using shift registers or memories for block-wise or stream coding, e.g. DES systems or RC4; Hash functions; Pseudorandom sequence generators
    • H04L9/0618Block ciphers, i.e. encrypting groups of characters of a plain text message using fixed encryption transformation
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/06Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols the encryption apparatus using shift registers or memories for block-wise or stream coding, e.g. DES systems or RC4; Hash functions; Pseudorandom sequence generators
    • H04L9/0618Block ciphers, i.e. encrypting groups of characters of a plain text message using fixed encryption transformation
    • H04L9/0637Modes of operation, e.g. cipher block chaining [CBC], electronic codebook [ECB] or Galois/counter mode [GCM]
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/06Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols the encryption apparatus using shift registers or memories for block-wise or stream coding, e.g. DES systems or RC4; Hash functions; Pseudorandom sequence generators
    • H04L9/0643Hash functions, e.g. MD5, SHA, HMAC or f9 MAC
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/32Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
    • H04L9/3247Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials involving digital signatures
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/32Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
    • H04L9/3297Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials involving time stamps, e.g. generation of time stamps
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/50Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols using hash chains, e.g. blockchains or hash trees
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L2209/00Additional information or applications relating to cryptographic mechanisms or cryptographic arrangements for secret or secure communication H04L9/00
    • H04L2209/56Financial cryptography, e.g. electronic payment or e-cash
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L63/00Network architectures or network communication protocols for network security
    • H04L63/14Network architectures or network communication protocols for network security for detecting or protecting against malicious traffic
    • H04L63/1441Countermeasures against malicious traffic
    • H04L63/1458Denial of Service

Abstract

ブロックチェーンプラットフォーム上で高レベル言語(HLL)で記述されたソースコードの部分の実行を可能にし又は促進するコンピュータにより実施される方法(及び対応するシステム)が提供される。当該方法及びシステムは、高レベルソースコードの部分をブロックチェーンプラットフォームと共に使用可能な形式に変換するよう構成されるブロックチェーンコンパイラを含み得る。これは、Bitcoinブロックチェーン又は代替物であってよい。方法は、ソースコードの部分をインプットとして受信するステップと、複数のオペコードを含むアウトプットスクリプトを生成するステップと、を含み得る。オペコードは、機能的に制約されたブロックチェーンスクリプト言語に固有のオペコードのサブセットである。出力されるスクリプトは、実行されると、該スクリプトが、少なくとも部分的に、ソースコードの中で指定された機能を提供するように、構成され及び/又は生成される。ブロックチェーンスクリプト言語は、該言語が複雑な制御フロー構成又はジャンプに基づくループ若しくは他の反復プログラミング構成による反復を本来サポートしないという点で、制約される。アウトプットスクリプトを生成するステップは、ソースコード内で提供される少なくとも1つのループ構成を展開するステップを含み得る。当該方法は、アウトプットスクリプトをブロックチェーンプラットフォーム上で実行可能な形式に変換するよう構成されるインタープリタ又は仮想機械を提供する又は使用するステップ、を更に含み得る。

Description

本開示は、概して、分散台帳技術に関し、特に、Bitcoinネットワーク又は関連プロトコルのようなブロックチェーン技術に関する。本開示は、コンピュータに基づくコードの変換のためのコンパイラ及びコンパイラ関連技術にも関する。本発明の1つ以上の実施形態は、ブロックチェーンプラットフォーム又は機能的に制約されたスクリプトに基づく言語を含むプロトコル上で、高レベルプログラムの自動化及び実行を可能にする及び/又は促進するためのソリューションとしての使用に適する。
本願明細書で、用語「ブロックチェーン」は、あらゆる形式の電子的な、コンピュータに基づく、分散台帳を含むよう使用される。これらは、総意に基づくブロックチェーン及びトランザクションチェーン技術、許可及び未許可台帳、共有台帳、及びそれらの変形を含む。最も広く知られているブロックチェーン技術の用途はBitcoin台帳であるが、他のブロックチェーンの実装が提案され開発されている。ビットコインは便宜上及び説明を目的として本願明細書において言及されるが、本発明はビットコインのブロックチェーンと共に使用することに限定されず、代替のブロックチェーンの実装及びプロトコルが本発明の範囲に含まれることに留意すべきである。用語「ユーザ」は、人間又はコンピュータに基づくリソースを表すことがある。
ブロックチェーンは、ブロックにより構成される、コンピュータに基づく非集中型の分散型システムとして実装されるピアツーピア電子台帳である。また、ブロックはトランザクションにより構成される。各トランザクションは、ブロックチェーンシステム内で参加者間のデジタルアセットの制御の移転を符号化するデータ構造であり、少なくとも1つのインプット及び少なくとも1つのアウトプットを含む。各ブロックは前のブロックのハッシュを含み、ブロックは共にチェーンになって、その発端からブロックチェーンに書き込まれている全てのトランザクションの永久的な変更不可能なレコードを生成する。トランザクションは、そのインプット及びアウトプットに組み込まれたスクリプトとして知られる小さなプログラムを含む。スクリプトは、トランザクションのアウトプットがどのように及び誰によりアクセス可能かを指定する。ビットコインプラットフォーム上で、これらのスクリプトは、Scriptと呼ばれるスタックに基づくスクリプト言語を用いて記述される。スクリプトは、コマンド(オペコード)を用いて記述され、該コマンドはインタープリタにより実行可能コードに変換される。
トランザクションがブロックチェーンに書き込まれるために、「検証され」なければならない。ネットワークノード(マイナー)は、各トランザクションが有効であることを保証するために作業を実行し、無効なトランザクションはネットワークから拒否される。ノードにインストールされたソフトウェアクライアントは、自身のロック及びアンロックスクリプトを実行することにより、この検証作業を未使用トランザクション(UTXO)に対して実行する。ロック及びアンロックスクリプトの実行が真と評価した場合、及びチェックに合格した場合、トランザクションは有効であり、トランザクションはブロックチェーンに含まれるためにマイニングされる。したがって、トランザクションがブロックチェーンに書き込まれるためには、トランザクションは、i)トランザクションを受信した第1ノードにより検証され、トランザクションが検証された場合に、ノードは該トランザクションをネットワーク内の他のノードに中継し、ii)マイナーにより構築された新しいブロックに追加し、iii)マイニングされ、つまり過去のトランザクションの公開台帳に追加されなければならない。
ブロックチェーン技術は、暗号通貨実装の使用で最も広く知られているが、デジタル起業家が、新しいシステムを実装するために、Bitcoinの基づく暗号通貨セキュリティシステム、及びブロックチェーンに格納可能なデータの両方の使用を探索し始めている。ブロックチェーンが、暗号通貨の領域に限定されない自動タスク及びプロセスのために使用できれば、非常に有利である。このようなソリューションは、それらの用途において一層多様でありながら、ブロックチェーンの利点(例えば、永久的、イベントの耐タンパレコード、分散プロセス、等)を利用できる。したがって、黎明期のインターネットの採用及びウェブに基づくシステムの発展における後の急成長と同様に、新しいアプリケーションのための技術の幅広い採用及び技術革新の必要がある。
しかしながら、このようなスクリプト言語でプログラムを記述することは、例えば、低レベルプログラミング技術に関連する知識及び熟練を必要とするために、より広いプログラミングコミュニティにより直感的又は直ちに採用できない。これは、プログラマに、スタック及びその中のデータの位置を考慮することを要求する。低レベルオペコードで構成されるプログラムの記述は、C、Java(登録商標)、等のような高レベル言語(high−level language:HLL)でソースコードを記述するより時間及び労働集約的である。このようなHLLのために構築されるコンパイラ/インタープリタは、プログラマをメモリ管理等に関連する多くの面倒な低レベルな問題から遠ざける便利な抽象化レベルを提供する。1つ以上のスタックの中のデータを操作するためのオペコードのシーケンスの記述は、HLLでソースコードを記述するより、技術的に複雑であり且つ時間がかかる。したがって、低レベルオペコードの使用の困難な特性により、エラー及びバグの発生する可能性がより高い。
さらに、HLLは、プログラマが、ループ、case文、及び反復呼び出しのような複雑な制御フロー構成を彼らのソースコードに含めることを可能にする。プログラマは、所望のロジックに焦点を当て、「これが真の間はXを行う...」のようなメカニズムにより直感的方法で論理的フローを表現できる。しかしながら、BitcoinのScriptのような幾つかのブロックチェーンに関連するスクリプト言語は、それらが算術演算のような典型的な演算、並びにハッシュ演算及び署名検証のような暗号関数も含むが、それらは、HLLでは使用可能な、whileループのような複雑な制御構造のための固有のプリミティブを含まない、或いは、反復技術の使用を許容しない、という意味で機能的に制約されている。このような制約された言語は、ジャンプに基づく制御フローをサポートしない。したがって、設計により、それらは、ソースコードに包含するためにプログラマに提供される言語及び論理的構成を制約する。これは、一部の人々を、Scriptのような制約された言語がチューリング不完全であるという論争に導くが、この定義は他の者達により異議を唱えられている。したがって、私達は、「機能的に制約された」という表現を使用する。
この意図的な制約は、プログラマにとってコーディング処理を一層困難にすることがあるが、プログラム実行時間が限られ、重要なことに、悪意ある手段を防ぎ、例えばDoS(Denial of Service)攻撃を実施するための無限ループの使用から保護するので、重要なセキュリティメカニズムを提供することに留意する。
したがって、重大なセキュリティと、ブロックチェーンに基づく技術の発展を促進し、奨励し、及び向上させる必要との間にはトレードオフが存在する。後者の問題を解決するために、Ethereumは、それ自体のブロックチェーンプラットフォームに、固有の特徴としてHLL言語を組み込んでいる。Scriptと同様に、低レベルインタープリタが、コードの実行可能バージョンを生成するために要求される。EthereumのHLL言語は、Etherとして知られ、条件付き及び無条件ジャンプの使用を通じて、制御フローを実行させる。これは、反復も可能にする。DoS攻撃のような問題を回避するために、Ethereumは、ガス(gas)、つまり実行コストをカバーするために予め支払われる暗号通貨の一部、の概念を導入することにより、トランザクション実行時間を制限する。したがって、固有のHLLの使用により、技術的及び商業的に複雑な追加レイヤが必要である。さらに、Ethereumは、今まで、少なくとも1つの重大な反復に基づく攻撃に苦しんできた。例えば以下を参照する。http://hackingdistributed.com/2016/06/18/analysis−of−the−dao−exploit/
したがって、プログラマに親しみのあるHLL言語を用いて、しかし機能的に制約されたスクリプト言語により提供されるセキュリティを危険に晒すことなく、プログラマが有効なブロックチェーンソリューションを、より容易に、迅速に、且つ一層効率的な方法で開発し、設計し、及び生産できるメカニズムを提供することが望ましい。これは、決して自明な作業ではなく、有意な技術的革新を要求する。これは、特に、本開示により解決される技術的課題の1つである。
したがって、本開示によると、添付の請求の範囲に定められるようなシステム及び対応する方法が提供される。
したがって、本発明によると、コンピュータにより実施される方法及び対応するシステムが提供され得る。当該方法は、ブロックチェーンプラットフォーム上でソースコードの部分の実行を可能にする又は促進するよう構成されてよい。ソースコードは、高レベル言語で記述されてよい。本開示は、ソフトウェアコンパイラとして実装されてよいコンパイル技術及びシステム/コンポーネントを記載する。これは、以後、「ブロックチェーン又はBitcoinコンパイラ」と呼ばれてよい。ソフトウェアコンパイラは、Bitcoinブロックチェーン又は任意の他のブロックチェーンに基づくプロトコル/ネットワークと関連する使用のために構成されてよい。
有利なことに、本開示のソフトウェアコンパイラは、ユーザ(プログラマ)がブロックチェーンにより実行可能なプログラム/アプリケーションを、彼らに親しみのある言語で、例えばC、Java(登録商標)、C++スタイルの構文で記述し及び生成することを可能にし得る。これは、ブロックチェーンに基づく開発作業を、より広い開発コミュニティへと広げる。これは、以下に詳述するように、ブロックチェーンに基づくソリューションが、本発明により、より素早く記述でき及びエラーチェックされることも意味する。重大なことに、基礎にあるプロトコル及び関連するスクリプト言語のセキュリティ機能が保存され維持される。したがって、本発明は、スクリプト生成のプロセス中にブロックチェーンに関連するセキュリティを保存する技術及びシステムを提供し、ブロックチェーンネットワーク上のノードにより検証される有効な、エラーの無いスクリプト(したがってトランザクション)の生成を促進し又は可能にする。
1つの可能な実施形態によると、ソースコードの部分をブロックチェーンと互換性のあるスクリプトに変換する静的コンパイルを使用するコンピュータにより実施される方法が提供され得る。これは、コンパイラにより提供されるアウトプットを形成し得るので、「アウトプットスクリプト」と呼ばれてよい。本発明は、1つ以上のエラーをテストしてよい。本発明は、1つ以上のエラーが検出された場合に警告を提供してよい。静的コンパイルは、ループ展開ステップを含んでよく、ソースコードの部分の中で提供される1つ以上のループが展開されてよい。用語「静的コンパイル」及び「ループ展開」は従来知られた用語であり、それらは当業者により直ちに理解されることに留意する。
当該方法は、ブロックチェーンネットワークと共に使用するために構成されてよい。ブロックチェーンネットワークは、プロトコルに関連付けられてよい。これは「proof−of−work」ブロックチェーンであってよい。これは総意に基づくブロックチェーンであってよい。これは、パブリック及び/又は未許可ブロックチェーンであってよい。これはピアツーピア分散型ブロックチェーンであってよい。
ブロックチェーンネットワークは、ブロックチェーントランザクションを検証する複数のノードを含んでよい。ブロックチェーントランザクションは、複数のノードにより実行可能なスクリプトを含んでよい。スクリプトは、機能的に制約された(又はチューリング不完全としても表される)ブロックチェーンスクリプト言語に属するオペコード(op_code)のセットにより表され又はそれを含んでよい。当該方法は、ブロックチェーンネットワークのノードにより検証されたブロックチェーントランザクションへの包含のために、アウトプットスクリプトを生成するステップを含んでよい。アウトプットスクリプトは、機能的に制約されたブロックチェーンスクリプト言語に属するオペコードのセットにより表されてよく、アウトプットスクリプトは、ブロックチェーンネットワークのノードによるスクリプトの実行がソースコードの中で指定された機能を実行するように、構成され又は適応されてよい。
ソースコードの部分は、高レベル言語(high level language:HLL)で記述されてよい。HLLは、コンパイル可能HLLとして記載されてよい。HLLは、本発明に従い構成されるソフトウェアコンポーネント(コンパイラ)によりコンパイルされてよい。HLLは、インタープリタにより実行可能なスクリプトを生成するために、コンパイラによりコンパイルされてよい。スクリプトは、ブロックチェーントランザクション(Tx)に提供されてよい。スクリプトは、トランザクションのインプット又はアウトプットに関連付けられてよい。HLLは、反復、複雑な選択構造及び/又はループのような複雑な制御フローを実装する表現、構造、及び/又は文を許容し得るチューリング完全言語であってよい(現実世界の制約を受ける)。HLLに固有の構文は、WHILE、FOR、又はREPEATループのような、ループ関連構文を含んでよい。これは、暗号化、算術及びスタック操作演算の実行のためのプリミティブを含んでよい。HLLは、以下に実質的に記載される、カスタマイズされたオペコード及び/又は高レベル言語構成を含んでよい。
ブロックチェーンと互換性のあるスクリプトは、ブロックチェーン上で実行可能なブロックチェーンスクリプト言語から選択された、それに固有の及び/又はその部分を形成するオペコードで形成されるスクリプト(つまりプログラム)であってよい。オペコードは、プリミティブ又はコマンドと呼ばれてよい。スクリプトは、ブロックチェーン上で実行される/実行可能になる前に、インタープリタ又は仮想機械を通過してよい。(この文脈における用語「ブロックチェーン」は、プロトコル及び実装プラットフォームを含んでよい)。インタープリタは、スクリプトを機械実行可能(オブジェクト)コードに変換してよい。ブロックチェーンスクリプト言語は、例えば、Bitcoinプロトコル又はその変形と関連して使用されるScript言語であってよい。スクリプト言語は、ブロックチェーンプロトコルと共に使用するために構成されてよい。スクリプト言語は、暗号化、算術、及びスタック操作オペコードを含んでよい。
ブロックチェーンスクリプト言語は機能的に制約されてよい。ブロックチェーンスクリプト言語は、構文/インタープリタが許可する又は処理するよう構成される機能に関して制限されてよい。これは、反復、複雑な選択構造及び/又はループのような複雑な制御フロ―を、本来サポートしなくてよい。
追加又は代替として、ブロックチェーンプラットフォーム上で高レベル言語(HLL)で記述されたソースコードの部分の実行を可能にし又は促進する方法が提供され得る。ソースコードは、スマートコントラクトを実装するよう構成されてよい。スマートコントラクトは、従来知られているようなブロックチェーン上で実行可能な、機械可読且つ実行可能アプリケーションであってよい。
当該方法は、ソースコードの部分をインプットとして受信するステップを含んでよい。ソースコードの部分は、ソフトウェアにより実装されるコンパイラにより受信されてよい。
当該方法は、アウトプットスクリプトを生成するステップを含んでよい。アウトプットスクリプトは、上述のようなブロックチェーンと互換性のあるスクリプトであってよい。アウトプットスクリプトは、機能的に制約されたブロックチェーンスクリプト言語から選択された及び/又はそれに固有の複数のオペコードを含んでよい。このスクリプト言語は、上述の通りであってよい。実行されると、スクリプトは、少なくとも部分的に、ソースコードの中で指定された機能を提供してよい。
当該方法は、上述の方法のいずれかの実施形態を実行するよう構成されるコンパイラを提供する又は使用するステップを含んでよい。アウトプットスクリプトは、静的コンパイルを実行することにより生成されてよい。
静的コンパイルの使用は、結果として生じるスクリプトが常に停止するという利点を提供する。これは、実行時間において実用上の利点を提供するだけでなく、ソースコードの中で何からの種類のエラー又は無効な構成に遭遇した場合にブロックチェーンコンパイラが停止するので、本発明が検証ツールとして機能することを可能にする。スクリプト開発の間に検証ツールを使用できるという利点は、プログラマの時間及び労力を削減することにより、プログラミング作業が向上することを意味する。さらにまた、ブロックチェーンコンパイラは、バグ及びオーバーフローエラーをテストするという点で、セキュリティソリューションを提供し、プログラムが実行するか及び安全に実行するかをユーザ(プログラマ)が静的にテストすることを可能にする。
ブロックチェーンスクリプト言語は、該言語が複雑な制御フロー構成又はジャンプに基づくループ若しくは他の反復プログラミング構成による反復を本来サポートしないという点で、制約されてよい。アウトプットスクリプトを生成するステップは、ソースコード内で提供される少なくとも1つのループ構成を展開するステップを含んでよい。当該方法は、アウトプットスクリプトをブロックチェーンプラットフォーム上で実行可能な形式に変換するよう構成されるインタープリタ又は仮想機械を提供する又は使用するステップ、を含んでよい。
当該方法は、アウトプットスクリプトのより効率的な又は削減されたバージョンを提供するために、少なくとも1回、アウトプットスクリプトを最適化するステップ、を更に含んでよい。これは、導関数のない最適化(derivative free optimisation:DFO)の使用を含んでよい。DFOは、従来知られた用語であり、当業者により直ちに理解される。追加又は代替として、アウトプットスクリプトを生成するステップは、導関数のない最適化の使用を含んでよい。
ブロックチェーンコンパイラは、ソフトウェア開発キット(software development kit:SDK)の部分を形成し及び/又はそれと関連して動作するよう構成されてよい。SDKは、エディタ、デバッガ、及びコードに基づくソリューションの生成を促進するためにSDKと共に使用されるべき知られている他のコンポーネントを含んでよい。
HLLは、ブロックチェーンスクリプト言語に固有の1つ以上のプリミティブ/コマンド/オペコードに直接変換可能な、少なくとも1つのプリミティブ、演算子、又は構成を含んでよい。
ブロックチェーンスクリプト言語はスタックに基づいてよい。ブロックチェーンスクリプト言語は、1つ又は複数のスタックを操作するよう構成されてよい。HLLは、スクリプト言語により使用されるスタック上で演算の実行を引き起こすよう構成される1つ以上のプリミティブ又は演算子を含んでよい。
HLLは、ブロックチェーンスクリプト言語によるメモリ割り当てのために使用されるスタックに、ソースコードへの入力の数をプッシュするよう構成されるプリミティブ又は構成を含んでよい。HLLは、暗号化演算又は関数、及び算術演算、及び/又はループの実行を引き起こすよう構成される1つ以上のプリミティブを含んでよい。
HLLは、以下のプリミティブ又は演算子又はそれらの個々の機能的等価物のうちの少なくとも1つを含んでよい:
Initiate;
Declare;
Increment;
IF;
While;
Populate;
Monus;
Reset;
Rawscript;
Abort;
Retrieve
Hash, hash160,又はハッシュ演算又はその変形。
本開示は、ソースコードの部分をブロックチェーンと互換性のあるスクリプトに変換する静的コンパイルを用いるステップを含む方法を提供し得る。静的コンパイルは、ループ展開ステップを含んでよい。
ソースコードの部分は、少なくとも1つの高レベルプログラミング構成を含んでよい。アウトプットスクリプトは、高レベルプログラミング構成を、機能的に制約されたブロックチェーンスクリプト言語に属する1つ以上のオペコードに変換することにより生成されてよい。アウトプットスクリプトの1つ以上のオペコードは、ブロックチェーンネットワークのノードによる1つ以上のオペコードの実行が、ソースコードの少なくとも1つの高レベルプログラミング構成(の機能)を実行するように、構成され又は適応されてよい。
望ましくは、機能的に制約されたブロックチェーンスクリプト言語は、ループ構成をサポートしない。望ましくは、少なくとも1つの高レベルプログラミング構成は、ループ構成を含む。望ましくは、スクリプトは、ループ構成(「ループ構成」とも呼ばれてよい)を展開することにより生成される。望ましくは、ループ構成は、コードブロック及び反復の回数を指定する引数を含み、ループ構成の展開は、反復の回数だけ、コードブロックの機能をためのオペコードを記述することを含む。
当該方法は、ループ構成が反復の回数を指定する引数を含むこと、及び該引数が最大反復数を指定する制約を満たすこと、を保証するために、ループ構成の構文をチェックするステップを更に含んでよい。
ループ構成は、コードブロック、及び少なくとも1つの変数に基づくループ構成の反復の回数を指定するための条件、を含んでよい。望ましくは、ループ構成の展開は、アウトプットスクリプトの実行から決定された変数の値を用いる条件の評価に基づき、最大反復回数だけ、コードブロックの機能の複製されたオペコードを選択的に実行するオペコードコマンドを記述することに関連して、コードブロックの機能のオペコードを複製するステップを含む。
本開示によると、本願明細書に記載の方法のいずれかの実施形態のステップを実施するよう構成される、コンピュータにより実装されるシステムが提供される。
本開示の一実施形態によるコンピュータにより実施されるシステムは、コンパイラを含んでよい。コンパイラは、ソースコードの部分をインプットとして受信するよう構成されてよい。ソースコードは、高レベル言語(HLL)で記述されてよい。コンパイラは、アウトプットスクリプトを生成するよう構成されてよい。アウトプットスクリプトは、「ブロックチェーンスクリプト」又は「ブロックチェーンと互換性のあるスクリプト」と呼ばれてよく、複数のオペコードを含んでよい。これらのオペコードは、上述のような機能的に制約されたブロックチェーンスクリプト言語から選択され及び/又はそれに固有であってよく、実行されると、スクリプトは、少なくとも部分的にソースコードの中で指定された機能を提供する。
当該システムは、ソフトウェア開発キット(software development kit:SDK)を含んでよい。コンパイラは、SDKの部分を形成してよい。
本発明は、システムであって、プロセッサと、前記プロセッサによる実行の結果として前記システムに本願明細書に記載のコンピュータにより実施される方法の任意の実施形態を実行させる実行可能命令を含むメモリと、を含むシステムも提供する。
本発明は、実行可能命令を格納した非一時的コンピュータ可読記憶媒体であって、前記実行可能命令は、コンピュータシステムのプロセッサにより実行された結果として、前記コンピュータシステムに本願明細書に記載のコンピュータにより実施される方法の実施形態を少なくとも実行させる、非一時的コンピュータ可読記憶媒体も提供する。
本開示のある実施形態又は態様に関連して上述した任意の特徴は、1又は複数の他の実施形態又は態様に適用されてもよい。本開示の方法に関連して記載された任意の特徴は、本開示のシステムに等価に適用されてよく、逆も同様である。
本開示の上述の及び他の態様は、本願明細書に記載される実施形態から明らかであり、それらの実施形態を参照して教示される。本開示の実施形態は、単なる例として添付の図面を参照して以下に説明される。
本発明の概略を示す。 whileループを展開する以下の例に関連して議論されるTry[]アレイを投入するコードブロックを提供する。 種々の実施形態が実施され得るブロックチェーン環境を示す。 一実施形態による、前のブロックチェーントランザクションを参照するspendingブロックチェーントランザクションを検証し及びマイニングするブロックチェーンプロトコルを示す。 種々の実施形態が実施され得るコンピューティング環境を示す。
<概要>
以下では、私達は、参照を容易にするために、最も広く知られ採用されているので、Bitcoinプロトコル、ブロックチェーン、ネットワーク又はスクリプト言語を参照することがある。しかしながら、本発明は、Bitcoin関連ブロックチェーンと共に使用されることに限定されず、他のブロックチェーン技術が本開示の範囲に含まれる。
上述のように、大部分のプログラマは、今日、低レベルではなく、C、C++、Java(登録商標)等のような高レベル言語でコードを記述する。低レベルでコードを記述することは、より多くの時間がかかり、メモリ操作のためのより専門的な知識を要求し、結果としてエラーが導入され得る。したがって、基礎にある、制約されたスクリプト言語により提供されるセキュリティを危険に晒すことなく、プログラマにより親しみのある言語でブロックチェーンアプリケーションのための有効な、テストされた、エラーチェックされたコードを記述できることは、プログラマにとって有利であり得る。
本開示に記載の方法及びシステムは、特殊なブロックチェーントランザクション又はトランザクションのクラスタの生成のための「SDK」の開発を可能にする。例えば、トランザクションは、機械実行可能スマートコントラクトの条項及び条件を自動的に施行することを目的とし得る。しかしながら、多くの他のアプリケーションが可能であり、本発明はこれに関して限定されない。したがって、本発明は、ブロックチェーン関連技術を生成し及びテストするための「ツールキット」又はシステムの部分を形成してよい。
有利なことに、ブロックチェーンコンパイラは、ユーザのソースコードの静的コンパイルを実行し、ループ展開のような技術の使用により複雑な制御フローメカニズムの実装を可能にする。従来知られているように、「ループ展開(ループアンローリング、loop unrolling)」は、「ループ展開(ループアンワインディング、loop unwinding)」とも呼ばれてよい。ループ展開は、特定種類のループの中でブランチの頻度を削減するために及び/又はループ維持命令を削減するためにコンパイラにより使用可能なループ変換技術である。ソースコードの中で見付かったループを展開することにより、コンパイラは、ソースコードの変換されたバージョンを生成できる。これは、機能的に制約されたスクリプト言語を使用するブロックチェーンプラットフォーム上で実行可能である。
図1を参照すると、本開示の一実施形態は、ユーザ(プログラマ)が高レベル言語(HLL)を使用して所望のアプリケーション、例えばスマートコントラクトのためのコード1010を定義し、次にHLLコード101を実行ファイルにコンパイルするブロックチェーンコンパイラ102を実行することを可能にする。これらの実行ファイルは、ボットにより実行可能な(python、C++、等のような)3G言語プログラムのチャンクの形式であってよい。或いは、それらは、(例えばBitcoin)スクリプト103のチャンクの形式であってよい。後者は、特定機能を実行可能なスクリプトのチャンクを設計し生成することにより達成される。例えば、Bitcoinスクリプトの元のバージョンは、OP_MULと呼ばれる乗算のための関数を含んでいた。このオペコードは現在は無効にされている。しかしながら、小さなスクリプト部分の中で既存の有効なオペコードを使用することにより、同じ機能が再び生成できる。
本開示の実施形態は、以下の2種類のプリミティブのうちの一方又は両方を含んでよい。
・カスタマイズされたオペコード(以後、これをCOP_CODEと呼ぶ)、
・高レベル言語(HLL)構成。
HLL構成は、コンパイラ102がそれらをスクリプトコード103に変換することを必要とする。一方、COP_CODEは、COP_CODEからOP_CODEのブロックへの直接置換のみを必要とする。標準的に、プリミティブは、変数へのアクセスを必要としない場合に、つまり所与のプロトコル(及び他のCOP_CODE)のためにブロックチェーンスクリプト言語に既に存在するOP_CODE及びハードコードされたインプットのみを用いて完全に記述可能な場合に、COP_CODEにされる。
例えば、monusプリミティブはオペコードにより完全に記述でき、したがって以下のCOP_CODEにできる。
OP_SUB
OP_0
OP_MAX
しかしながら、WHILEループの実行は、所要の変数に依存する(例えば、実行のための条件、反復回数のためのカウンタ、等)。したがって、WHILEは、COP_CODEにするのには適さず、HLL構成として記述される。
有利なことに、2種類のプリミティブの結合が、更なる柔軟性をプログラマに提供する。プログラムをBitcoinスクリプトに直接記述する(つまり、HLLを使用しない)プログラマは、COP_CODEを用いて拡張されたスクリプト機能を使用できる。実際に、これらは、スクリプトプログラマに、彼らの必要な関数を実行するOP_CODEのブロックの置換を与え、プログラミング時間及び労力を削減する。COP_CODEを該COP_CODEを構成するOP_CODEのブロックで単純に置換する「COP−CODEコンパイラ」があればよい。低レベルBitcoinスクリプトでプログラムを書けない又は書きたくないプログラマは、代わりに本開示によりサポートされるHLLを使用できる。
カスタマイズOP_CODE(COP_CODE)は以下に更に議論される。
(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で乗算される」を意味する。
●実行前の検証
特定数のインプット又は特定のインプットフォーマットが期待される場合には、プリミティブは、機能ロジックを実行する前にチェックを実行し、インプットが期待と一致しない場合に異常終了する(トランザクションを無効としてマークする)。有利なことに、これは、関数が不正又は虚偽であるかも知れないアウトプットを実行し提供することを防ぐ。例えば、特定のプリミティブが正の数値であるインプットのみを演算することを目的とするが、それにも拘わらず負の数値に対してエラー無しに実行する場合、結果は「有効なトランザクション」になり得るが、予期しない又は不正な結果を伴う。
(2)高レベル言語(HLL)構成
これらは、本開示に従うコンパイラが認識でき及びBitcoinスクリプトに変換できる関数又は文である。総合して、これらは、プログラマに馴染みのある構文を用いる高レベルプログラミング言語を構成する。馴染みのある構成(例えばIF−ELSE、CASE、WHILEループ、等)と同様に、Bitcoinトランザクションが動作するために、HLLに非常に特有の馴染みのない構成もある。例えば、INITIATE構成は、主スタックに自動的にプッシュされるデータインプットの数が(予約ワードNUM_INPUTSに割り当てられた)メモリ割り当ての中で最初の定数として保存されることを保証するための非常に特有の機能である。実施形態では、INITIATE構成は、HLLプログラムの中の最初の文であり得、DECLARE構成(これは、定数及び変数のためにメモリ割り当てを実行する)はHLLプログラムの中の2番目の文であり得る。
HLL構成は、コンパイラによりコンパイルのときに利用可能な情報のみを用いてBitcoinスクリプトに(つまり、OP_CODE及びCOP_CODEに)変換可能なように、設計されなければならない。これは、通常、プログラムの中で定数が宣言され(DECLARE)値を割り当てられる、プログラマによる多数のハードコーディングを意味する。例えば、NUM_INPUTSが定数と考えられる場合でも、プログラムが実行するまで、コンパイラはその値へのアクセスを有しない。したがって、これは、(もちろんプログラマはこれをプログラムの中の他の定数と同様に使用できるが)コンパイル実行のために使用できない。
HLL構成を設計するとき、設計者は、擬似コード又は自然言語での明確な説明に、コンパイラの期待される動作を含むことができる。例えば、コンパイラは、正しい構文及び任意の制約(例えばサイズ制限)に従うことの検証のような特定のチェックを実行することを要求され得る。これは、特定の制約が未だ分からなくても、明確であるべきである。HLL構成を設計する作業は、コンパイラ自体を記述することを含まないが、コンパイラの全ての期待される動作が可能であることを保証しなければならない。
本開示の説明のための実施形態に従い使用され得るHLL構成の選択が以下に提供される。

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

Claims (18)

  1. コンピュータにより実施される方法であって、
    インプットとしてソースコードの部分を受信するステップであって、前記ソースコードの部分は、高レベル言語(HLL)で記述される、ステップと、
    機能的に制約されたブロックチェーンスクリプト言語から選択された及び/又は該言語に固有の複数のオペコードを含むアウトプットスクリプトを生成するステップであって、その結果、実行されると、前記スクリプトが少なくとも部分的に前記ソースコードの部分の中で指定された機能を提供する、ステップと、
    を含む方法。
  2. 請求項1のステップを実行するよう構成されるコンパイラを提供する又は使用するステップ、を含む請求項1に記載の方法。
  3. 前記アウトプットスクリプトは、静的コンパイルを実行することにより生成される、請求項1又は2に記載の方法。
  4. 前記ブロックチェーンスクリプト言語は制約されており、その結果、該言語は、複雑な制御フロー構成、反復、及び/又はジャンプに基づくループを本来サポートしない、請求項1、2、又は3に記載の方法。
  5. 前記アウトプットスクリプトを生成する前記ステップは、
    前記ソースコード内で提供される少なくとも1つのループ構成を展開するステップを含む、請求項1乃至4のいずれかに記載の方法。
  6. 前記アウトプットスクリプトをブロックチェーンプラットフォーム上で実行可能な形式に変換するよう構成されるインタープリタ又は仮想機械を提供する又は使用するステップ、
    を更に含む請求項1乃至5のいずれかに記載の方法。
  7. 前記アウトプットスクリプトのより効率的な又は削減されたバージョンを提供するために、少なくとも1回、前記アウトプットスクリプトを最適化するステップ、
    を更に含む請求項1乃至6のいずれかに記載の方法。
  8. 前記アウトプットスクリプトを生成する前記ステップは、導関数のない最適化の使用を含む、請求項1乃至7のいずれかに記載の方法。
  9. 請求項1乃至8のいずれかに記載のステップを実行するよう構成された前記HLL及び/又はコンパイラコンポーネントは、ソフトウェア開発キット(SDK)の部分を形成する、請求項1乃至8のいずれかに記載の方法。
  10. 前記ソースコードは、スマートコントラクトを実施するよう構成される、請求項1乃至9のいずれかに記載の方法。
  11. 前記HLLは、少なくとも1つのプリミティブ、又は前記ブロックチェーンスクリプト言語に固有の1つ以上のプリミティブに直接変換可能な構成を含む、請求項1乃至10のいずれかに記載の方法。
  12. 前記ブロックチェーンスクリプト言語はスタックに基づき、前記HLLは、前記スクリプト言語により使用されるスタックに対して演算を実行するよう構成される1つ以上のプリミティブを含む、請求項1乃至11のいずれかに記載の方法。
  13. 前記HLLは、前記ブロックチェーンスクリプト言語によるメモリ割り当てのために使用されるスタックに、前記ソースコードへの入力の数をプッシュするよう構成されるプリミティブを含む、請求項1乃至12のいずれかに記載の方法。
  14. 前記HLLは、以下のプリミティブ又は演算子又はそれらの機能的に等価なもの:
    Initiate;
    Declare;
    Increment;
    IF;
    While;
    Populate;
    Monus;
    Reset;
    Rawscript;
    Abort;
    Retrieve;
    Hash、hash 160、又は別のハッシュ演算若しくはその変形;
    のうちの少なくとも1つを含む、請求項1乃至13のいずれかに記載の方法。
  15. コンピュータにより実施される方法であって、
    ソースコードの部分をブロックチェーンと互換性のあるスクリプトに変換するために静的コンパイルを使用するステップであって、望ましくは前記静的コンパイルはループを展開するステップを含む、ステップ、
    を含む方法。
  16. コンピュータにより実装されるシステムであって、請求項1乃至15のいずれかに記載のステップを実施するよう構成されるシステム。
  17. インプットとしてソースコードの部分を受信し、前記ソースコードは、高レベル言語(HLL)で記述され、
    機能的に制約されたブロックチェーンスクリプト言語から選択された及び/又は該言語に固有の複数のオペコードを含むアウトプットスクリプトを生成し、その結果、実行されると、前記スクリプトが少なくとも部分的に前記ソースコードの中で指定された機能を提供する、
    よう構成されるシステム。
  18. ソフトウェア開発キット(SDK)を含む請求項16又は17に記載のシステム。
JP2019569887A 2017-07-07 2018-07-05 ブロックチェーンコンパイラ Active JP7317722B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2023064745A JP7476390B2 (ja) 2017-07-07 2023-04-12 ブロックチェーンコンパイラ

Applications Claiming Priority (13)

Application Number Priority Date Filing Date Title
GB1710974.5 2017-07-07
IBPCT/IB2017/054114 2017-07-07
GB1710971.1 2017-07-07
GBGB1710967.9A GB201710967D0 (en) 2017-07-07 2017-07-07 Computer-implemented system and method
IB2017054110 2017-07-07
IBPCT/IB2017/054110 2017-07-07
IB2017054113 2017-07-07
GBGB1710971.1A GB201710971D0 (en) 2017-07-07 2017-07-07 Computer-implemented system and method
GBGB1710974.5A GB201710974D0 (en) 2017-07-07 2017-07-07 Computer-implemented system and method
IBPCT/IB2017/054113 2017-07-07
GB1710967.9 2017-07-07
IB2017054114 2017-07-07
PCT/IB2018/054971 WO2019008533A1 (en) 2017-07-07 2018-07-05 SYSTEM AND METHOD FOR COMPILING A HIGH-LEVEL LANGUAGE CODE IN AN EXECUTABLE SCRIPT ON A BLOCK CHAIN PLATFORM

Related Child Applications (1)

Application Number Title Priority Date Filing Date
JP2023064745A Division JP7476390B2 (ja) 2017-07-07 2023-04-12 ブロックチェーンコンパイラ

Publications (2)

Publication Number Publication Date
JP2020526814A true JP2020526814A (ja) 2020-08-31
JP7317722B2 JP7317722B2 (ja) 2023-07-31

Family

ID=63077923

Family Applications (6)

Application Number Title Priority Date Filing Date
JP2019568221A Active JP7220678B2 (ja) 2017-07-07 2018-07-05 ブロックチェーン上で高レベル演算を提供する方法及びシステム
JP2019569887A Active JP7317722B2 (ja) 2017-07-07 2018-07-05 ブロックチェーンコンパイラ
JP2019568229A Pending JP2020526811A (ja) 2017-07-07 2018-07-05 ブロックチェーンスクリプトにおける制御フロー
JP2023012689A Pending JP2023052782A (ja) 2017-07-07 2023-01-31 ブロックチェーン上で高レベル演算を提供する方法及びシステム
JP2023064745A Active JP7476390B2 (ja) 2017-07-07 2023-04-12 ブロックチェーンコンパイラ
JP2023079779A Pending JP2023100981A (ja) 2017-07-07 2023-05-15 ブロックチェーンスクリプトにおける制御フロー

Family Applications Before (1)

Application Number Title Priority Date Filing Date
JP2019568221A Active JP7220678B2 (ja) 2017-07-07 2018-07-05 ブロックチェーン上で高レベル演算を提供する方法及びシステム

Family Applications After (4)

Application Number Title Priority Date Filing Date
JP2019568229A Pending JP2020526811A (ja) 2017-07-07 2018-07-05 ブロックチェーンスクリプトにおける制御フロー
JP2023012689A Pending JP2023052782A (ja) 2017-07-07 2023-01-31 ブロックチェーン上で高レベル演算を提供する方法及びシステム
JP2023064745A Active JP7476390B2 (ja) 2017-07-07 2023-04-12 ブロックチェーンコンパイラ
JP2023079779A Pending JP2023100981A (ja) 2017-07-07 2023-05-15 ブロックチェーンスクリプトにおける制御フロー

Country Status (8)

Country Link
US (6) US11416226B2 (ja)
EP (6) EP4325351A3 (ja)
JP (6) JP7220678B2 (ja)
KR (1) KR102608500B1 (ja)
CN (3) CN110869905A (ja)
SG (1) SG11201912227YA (ja)
WO (3) WO2019008533A1 (ja)
ZA (1) ZA201908552B (ja)

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11416226B2 (en) 2017-07-07 2022-08-16 Nchain Licensing Ag System and method for compiling high-level language code into a script executable on a blockchain platform
GB201811263D0 (en) * 2018-07-10 2018-08-29 Netmaster Solutions Ltd A method and system for managing digital using a blockchain
US10964145B2 (en) * 2018-08-24 2021-03-30 Sensormatic Electronics, LLC Access control system using blockchain ledger
CN111949315A (zh) * 2019-05-16 2020-11-17 富士通株式会社 用于区块链账本数据的管理装置和方法
US10699269B1 (en) 2019-05-24 2020-06-30 Blockstack Pbc System and method for smart contract publishing
US11513815B1 (en) * 2019-05-24 2022-11-29 Hiro Systems Pbc Defining data storage within smart contracts
US11657391B1 (en) 2019-05-24 2023-05-23 Hiro Systems Pbc System and method for invoking smart contracts
US10783082B2 (en) * 2019-08-30 2020-09-22 Alibaba Group Holding Limited Deploying a smart contract
US11436677B2 (en) 2019-12-09 2022-09-06 Eris Digital Holdings, Llc Electronic trading and settlement system for blockchain-integrated cryptographic difficulty-based financial instruments
US11314729B2 (en) * 2020-02-20 2022-04-26 International Business Machines Corporation Multi-candidate data structure for transaction validation
US20220066746A1 (en) * 2020-08-31 2022-03-03 Jpmorgan Chase Bank, N.A. Systems and methods for graphical programming and deployment of distributed ledger applications
CN113031931A (zh) * 2021-03-04 2021-06-25 嘉兴丰鸟科技有限公司 一种基于脚本交叉编译的Python安全扩展方法
US11902426B2 (en) * 2021-06-26 2024-02-13 Ceremorphic, Inc. Efficient storage of blockchain in embedded device
KR102460351B1 (ko) * 2021-06-29 2022-10-31 주식회사 퓨처에셋파이넨셜 파일코인 채굴 생산성 향상 장치 및 방법, 이를 구현하기 위한 프로그램이 저장된 기록매체 및 이를 구현하기 위해 매체에 저장된 컴퓨터프로그램
GB2618052A (en) * 2021-12-07 2023-11-01 Nchain Licensing Ag Blockchain script engine
US11770263B1 (en) * 2022-12-06 2023-09-26 Citibank, N.A. Systems and methods for enforcing cryptographically secure actions in public, non-permissioned blockchains using bifurcated self-executing programs comprising shared digital signature requirements
US11658833B1 (en) 2022-12-06 2023-05-23 Citibank, N.A. Systems and methods for conducting cryptographically secure actions in public, non-permissioned blockchains using bifurcated self-executing programs

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH04307625A (ja) * 1991-04-05 1992-10-29 Toshiba Corp ループ最適化方法及び装置
JP2014525632A (ja) * 2011-09-02 2014-09-29 マイクロソフト コーポレーション スクリプト・コードを有するマークアップ・コンテンツの高速プレゼンテーション
US20160342977A1 (en) * 2015-05-20 2016-11-24 Vennd.io Pty Ltd Device, method and system for virtual asset transactions
WO2017024071A1 (en) * 2015-08-03 2017-02-09 PokitDok, Inc. System and method for decentralized autonomous healthcare economy platform

Family Cites Families (42)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0185215B1 (en) 1984-11-21 1993-09-22 Harris Corporation Forth-like language microprocessor
US5761652A (en) * 1996-03-20 1998-06-02 International Business Machines Corporation Constructing balanced multidimensional range-based bitmap indices
US6760905B1 (en) 2000-09-21 2004-07-06 Curl Corporation Lazy compilation of template-generated classes in dynamic compilation execution environments
US7168059B2 (en) 2001-04-20 2007-01-23 Bryan Darrell Bowyer Graphical loop profile analysis
US6948160B2 (en) * 2001-05-31 2005-09-20 Sun Microsystems, Inc. System and method for loop unrolling in a dynamic compiler
JP4490084B2 (ja) 2003-12-03 2010-06-23 安川情報システム株式会社 プログラム開発システムにおけるプログラム作成方法
JP2006107339A (ja) * 2004-10-08 2006-04-20 Matsushita Electric Ind Co Ltd プログラム処理装置
US8227259B2 (en) 2005-03-31 2012-07-24 Georgetown University Free thyroxine and free triiodothyronine analysis by mass spectrometry
CN100487652C (zh) * 2005-04-02 2009-05-13 华为技术有限公司 脚本语言的自动机方法
JP5179822B2 (ja) 2007-09-27 2013-04-10 株式会社日立ソリューションズ 携帯電話、携帯電話スクリプト開発・実行システム
US8533666B2 (en) * 2008-10-17 2013-09-10 Microsoft Corporation Interactive design environments to visually model, debug and execute resource oriented programs
CN102999370A (zh) * 2011-09-16 2013-03-27 腾讯科技(深圳)有限公司 脚本的执行方法及系统
US8997070B2 (en) * 2011-12-15 2015-03-31 Sap Se Extension mechanism for scripting language compiler
US10417314B2 (en) * 2012-06-14 2019-09-17 Open Text Sa Ulc Systems and methods of a script generation engine
WO2014022326A1 (en) * 2012-07-31 2014-02-06 Microsoft Corporation Multilingual build integration for compiled applications
US8869122B2 (en) 2012-08-30 2014-10-21 Sybase, Inc. Extensible executable modeling
US9152400B2 (en) 2013-04-18 2015-10-06 Facebook, Inc. Eliminating redundant reference count operations in intermediate representation of script code
US9684499B2 (en) 2013-06-30 2017-06-20 Dropbox, Inc. Systems and methods for facilitating installation of software applications
KR102156371B1 (ko) 2013-11-27 2020-09-15 한국전자통신연구원 네이티브 빌드 기반의 임베디드 소프트웨어 개발 환경을 지원하기 위한 임베디드 소프트웨어 개발 도구 제공 방법 및 장치
EP3570502B1 (en) 2015-01-02 2021-08-04 Systech Corporation Control infrastructure
CN104484192B (zh) * 2015-01-07 2017-11-14 南威软件股份有限公司 一种复杂多分支结构代码自动生成的方法
US9892021B2 (en) * 2015-03-18 2018-02-13 Sap Se Injection of code modifications in a two session debug scripting environment
US10812274B2 (en) 2015-05-07 2020-10-20 Blockstream Corporation Transferring ledger assets between blockchains via pegged sidechains
US9735958B2 (en) 2015-05-19 2017-08-15 Coinbase, Inc. Key ceremony of a security system forming part of a host computer for cryptographic transactions
JP6547466B2 (ja) 2015-07-06 2019-07-24 富士通株式会社 コンパイラ装置、コンパイル方法およびコンパイラプログラム
US20170011460A1 (en) * 2015-07-09 2017-01-12 Ouisa, LLC Systems and methods for trading, clearing and settling securities transactions using blockchain technology
EP3125489B1 (en) * 2015-07-31 2017-08-09 BRITISH TELECOMMUNICATIONS public limited company Mitigating blockchain attack
WO2017027407A1 (en) 2015-08-07 2017-02-16 Kinestral Technologies, Inc. Electrochromic device assemblies
US9569206B1 (en) 2015-09-29 2017-02-14 International Business Machines Corporation Creating optimized shortcuts
KR20180115727A (ko) 2016-02-23 2018-10-23 엔체인 홀딩스 리미티드 보안 투표 및 분배에서 사용을 위한 블록체인 구현 카운팅 시스템 및 방법
WO2017173399A1 (en) 2016-03-31 2017-10-05 Clause, Inc. System and method for creating and executing data-driven legal contracts
US10720232B2 (en) * 2016-04-13 2020-07-21 Accenture Global Solutions Limited Distributed healthcare records management
US10180900B2 (en) 2016-04-15 2019-01-15 Red Hat Israel, Ltd. Recordation of user interface events for script generation
TWI770022B (zh) 2016-04-29 2022-07-11 安地卡及巴布達商區塊鏈控股有限公司 電腦實施之控制方法、系統及控制系統
CN106296191A (zh) * 2016-08-13 2017-01-04 深圳市樊溪电子有限公司 一种区块链功耗感知的PoW共识机制
CN106598579B (zh) 2016-12-06 2020-12-25 北京果仁宝科技有限公司 区块链上集成动态类型编程语言方法和装置
CN106598549B (zh) * 2016-12-08 2019-02-01 天津米游科技有限公司 一种基于区块链的智能合约系统及实现方法
CN106778343A (zh) * 2016-12-12 2017-05-31 武汉优聘科技有限公司 一种基于区块链的涉及隐私数据的数据共享方法
US10871948B1 (en) * 2017-03-30 2020-12-22 Wells Fargo Bank, N.A. Smart contract blockchain abstraction API
US10235280B2 (en) 2017-04-10 2019-03-19 Fmr Llc Automated script creation and source code generation for testing mobile devices
US10963790B2 (en) * 2017-04-28 2021-03-30 SparkCognition, Inc. Pre-processing for data-driven model creation
US11416226B2 (en) 2017-07-07 2022-08-16 Nchain Licensing Ag System and method for compiling high-level language code into a script executable on a blockchain platform

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH04307625A (ja) * 1991-04-05 1992-10-29 Toshiba Corp ループ最適化方法及び装置
JP2014525632A (ja) * 2011-09-02 2014-09-29 マイクロソフト コーポレーション スクリプト・コードを有するマークアップ・コンテンツの高速プレゼンテーション
US20160342977A1 (en) * 2015-05-20 2016-11-24 Vennd.io Pty Ltd Device, method and system for virtual asset transactions
WO2017024071A1 (en) * 2015-08-03 2017-02-09 PokitDok, Inc. System and method for decentralized autonomous healthcare economy platform

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
"evm-opcode-gas-costs", [オンライン], JPN6022018162, 12 April 2017 (2017-04-12), ISSN: 0004942673 *
"Solidity in Depth, Expressions and Control Structures", [オンライン], JPN6022018161, 3 July 2017 (2017-07-03), ISSN: 0004942674 *

Also Published As

Publication number Publication date
US20210081185A1 (en) 2021-03-18
CN110870249A (zh) 2020-03-06
JP7220678B2 (ja) 2023-02-10
JP2023089127A (ja) 2023-06-27
KR20200021993A (ko) 2020-03-02
JP7476390B2 (ja) 2024-04-30
US20230246811A1 (en) 2023-08-03
WO2019008531A1 (en) 2019-01-10
CN110869906A (zh) 2020-03-06
SG11201912227YA (en) 2020-01-30
KR102608500B1 (ko) 2023-12-04
US20220350579A1 (en) 2022-11-03
US11416226B2 (en) 2022-08-16
JP2020526810A (ja) 2020-08-31
CN110869905A (zh) 2020-03-06
US20200195442A1 (en) 2020-06-18
US20200174762A1 (en) 2020-06-04
EP3649759A1 (en) 2020-05-13
US20230057419A1 (en) 2023-02-23
JP2020526811A (ja) 2020-08-31
EP4328739A3 (en) 2024-04-03
US11941381B2 (en) 2024-03-26
WO2019008533A1 (en) 2019-01-10
EP3649547A1 (en) 2020-05-13
US11307835B2 (en) 2022-04-19
JP2023052782A (ja) 2023-04-12
EP4328739A2 (en) 2024-02-28
JP2023100981A (ja) 2023-07-19
EP3649548A1 (en) 2020-05-13
US11868745B2 (en) 2024-01-09
EP4300290A2 (en) 2024-01-03
ZA201908552B (en) 2023-06-28
WO2019008532A1 (en) 2019-01-10
EP4325351A3 (en) 2024-04-03
US11797278B2 (en) 2023-10-24
EP4300290A3 (en) 2024-02-21
JP7317722B2 (ja) 2023-07-31
EP4325351A2 (en) 2024-02-21
US11922149B2 (en) 2024-03-05

Similar Documents

Publication Publication Date Title
JP7476390B2 (ja) ブロックチェーンコンパイラ
Hajdu et al. solc-verify: A modular verifier for solidity smart contracts
Grech et al. Madmax: Surviving out-of-gas conditions in ethereum smart contracts
Sammler et al. RefinedC: automating the foundational verification of C code with refined ownership types
Chen et al. Coverage-directed differential testing of JVM implementations
EP3906488B1 (en) Method and contract rewriting framework system for supporting smart contracts in a blockchain network
US7818729B1 (en) Automated safe secure techniques for eliminating undefined behavior in computer software
EP3724806A1 (en) Blockchain-implemented systems and methods for concurrent bytecode interpretation
Nelson et al. Specification and verification in the field: Applying formal methods to {BPF} just-in-time compilers in the linux kernel
US20200201838A1 (en) Middleware to automatically verify smart contracts on blockchains
Grech et al. MadMax: Analyzing the out-of-gas world of smart contracts
WO2013036460A2 (en) Transformational context-aware data source management
US10423397B2 (en) Systems and/or methods for type inference from machine code
Garcia et al. Identifying message flow in distributed event-based systems
Nelaturu et al. Verified development and deployment of multiple interacting smart contracts with VeriSolid
Alt et al. SolCMC: Solidity compiler’s model checker
Toman et al. Taming the static analysis beast
US20240020109A1 (en) Method and system for supporting smart contracts in a blockchain network
JP2023507709A (ja) 統合された参照及び二次のマーキング
Lin et al. Solsee: a source-level symbolic execution engine for solidity
Valerievitch et al. Overview of the languages for safe smart contract programming
Cai et al. Asparagus: Automated synthesis of parametric gas upper-bounds for smart contracts
Schrans et al. Flint for safer smart contracts
Donaldson et al. Industrial deployment of compiler fuzzing techniques for two GPU shading languages
Stalker Runtime checking of graph programs

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20210608

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20220420

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20220517

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20220815

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20221213

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20230412

C60 Trial request (containing other claim documents, opposition documents)

Free format text: JAPANESE INTERMEDIATE CODE: C60

Effective date: 20230412

A911 Transfer to examiner for re-examination before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20230420

C21 Notice of transfer of a case for reconsideration by examiners before appeal proceedings

Free format text: JAPANESE INTERMEDIATE CODE: C21

Effective date: 20230425

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20230620

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20230719

R150 Certificate of patent or registration of utility model

Ref document number: 7317722

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150