(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-12-09
(45)【発行日】2022-12-19
(54)【発明の名称】ブロックチェーン実装スクリプトベースのバイト解釈のための方法とシステム
(51)【国際特許分類】
G06F 9/52 20060101AFI20221212BHJP
G06F 9/455 20060101ALI20221212BHJP
【FI】
G06F9/52 150C
G06F9/455 100
(21)【出願番号】P 2020507073
(86)(22)【出願日】2018-08-06
(86)【国際出願番号】 IB2018055892
(87)【国際公開番号】W WO2019034959
(87)【国際公開日】2019-02-21
【審査請求日】2021-07-07
(32)【優先日】2017-08-15
(33)【優先権主張国・地域又は機関】GB
(73)【特許権者】
【識別番号】318001991
【氏名又は名称】エヌチェーン ライセンシング アーゲー
(74)【代理人】
【識別番号】100107766
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100091214
【氏名又は名称】大貫 進介
(72)【発明者】
【氏名】チャン,イーン
(72)【発明者】
【氏名】クレイマー,ディーン
【審査官】坂庭 剛史
(56)【参考文献】
【文献】特開2017-098806(JP,A)
【文献】株式会社ストーンシステム、石黒尚久、河除光瑠,最新ブロックチェーンがよ~くわかる本,第1版,日本,株式会社秀和システム,2017年08月01日,pp.108-118, 147,ISBN978-4-7980-5118-5 C3055
【文献】MOESER, Malte et al.,Bitcoin Covenants,Financial Cryptography and Data Security. FC 2016,LNSC,volume 9604,ドイツ,Springer, Berlin, Heidelberg,2016年08月31日,pp.126-141,https://doi.org/10.1007/978-3-662-53357-4_9,ISBN978-3-662-53356-7
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/52
G06F 9/455
(57)【特許請求の範囲】
【請求項1】
コンピュータで実施される方法であって、
少なくとも1つのデジタルアセットまたはその一部の制御を移転するために支出ブロックチェーントランザクションを受信するステップであり、支出トランザクションは、バイトコードシーケンスによって表されるロッキングスクリプトを含み、前記支出トランザクションは、第1および第2ロッキングスクリプトが同一のバイトコードシーケンスを共有するように、バイトコードシーケンスによって表されるロッキングスクリプトを含む以前トランザクションを参照する、ステップと、
前記支出トランザクションのロッキングスクリプトのバイトコードシーケンスが、前記以前トランザクションのロッキングスクリプトのバイトコードシーケンスと一致することを検証することによって、前記支出トランザクションを確認するステップと、
を含む、方法。
【請求項2】
前記支出トランザクションは、さらに、インタープリタコードを含み、
前記以前トランザクションは、さらに、前記支出トランザクションおよび前記以前トランザクションが、前記ロッキングスクリプトのバイトコードシーケンスを解釈するために同一のインタープリタコードを共有するように、インタープリタコードを含み、
前記支出トランザクションを確認するステップは、さらに、前記支出トランザクションのインタープリタコードが、前記以前トランザクションのインタープリタコードと一致することを検証するステップを含む、
請求項1に記載の方法。
【請求項3】
前記以前トランザクションは、ブロックチェーンにおいて保管されており、かつ/あるいは、
前記インタープリタコードは、前記支出トランザクションおよび前記以前トランザクション両方のロッキングスクリプトの一部として含まれており、かつ/あるいは、
前記インタープリタコードは、少なくとも1つのハイレベルバイトコードオペレーションを、ノードによって実行されるローレベルバイトコードオペレーションへと変換することをサポートする、
請求項
2に記載の方法。
【請求項4】
前記以前トランザクションのロッキングスクリプトおよび前記支出トランザクションのロッキングスクリプトは、さらに、前記以前トランザクションのロッキングスクリプトおよび前記支出トランザクションのロッキングスクリプトによって共有される前記バイトコードシーケンスの異なる実行状態に関するデータを含み、前記データは、前記支出トランザクションを確認するときに、前記バイトコードシーケンスの解釈の実行を制御するために使用される、
請求項1乃至3いずれか一項に記載の方法。
【請求項5】
前記以前トランザクションのロッキングスクリプトは、さらに、前記ロッキングスクリプトのバイトコードシーケンスの現在の実行状態に対する状態データ、並びに、前記ロッキングスクリプトのバイトコードシーケンスの前記現在の実行状態に対応する実行ポインタを含み、
前記支出トランザクションのロッキングスクリプトは、さらに、前記ロッキングスクリプトのバイトコードシーケンスの次の実行状態に対する状態データ、並びに、前記ロッキングスクリプトのバイトコードシーケンスの前記次の実行状態に対応する実行ポインタを含み、かつ、
前記支出トランザクションを確認するステップは、さらに、
i)前記バイトコードシーケンスの前記現在の実行状態を復元するために、前記ロッキングスクリプトのバイトコードシーケンスの前記現在の実行状態を表しているデータを使用すること、
ii)前記バイトコードシーケンスの前記現在の実行状態に対応する前記実行ポインタにおいて開始し、かつ、前記バイトコードシーケンスの前記次の実行状態に対応する前記実行ポインタにおいて終了する、前記ロッキングスクリプトのバイトコードシーケンスを実行すること、および、
iii)状態データが一致することを検証するために、前記ロッキングスクリプトのバイトコードシーケンスの実行から結果として生じる状態データを、前記支出トランザクションに含まれる前記ロッキングスクリプトのバイトコードシーケンスの前記次の実行状態の状態データと比較すること、
を含む、請求項4に記載の方法。
【請求項6】
前記支出トランザクションを確認するステップは、さらに、
前記ロッキングスクリプトのバイトコードシーケンスの前記現在の実行状態に対する前記状態データを、仮想メモリから読み出すステップと、
前記ロッキングスクリプトのバイトコードシーケンスの前記現在の実行状態に対応する前記実行ポインタを、仮想メモリから読み出すステップと、
前記ロッキングスクリプトのバイトコードシーケンスの前記次の実行状態に対応する前記実行ポインタを、仮想メモリから読み出すステップと、
を含む、請求項5に記載の方法。
【請求項7】
前記仮想メモリは、前記バイトコードシーケンスの異なる実行状態に関するデータを、異なる第1および第2フォーマットで保管し、
前記第1フォーマットは、前記ロッキングスクリプトの一部として、前記データを保管するために使用され、かつ、
前記第2フォーマットは、前記ロッキングスクリプトのバイトコードシーケンスを実行するときに、前記仮想メモリ内のデータを操作するのに適している、
請求項
6に記載の方法。
【請求項8】
前記仮想メモリは、少なくとも1つのスタックデータ構造を含み、前記第1フォーマットは、シリアル化バイトフォーマットを含み、かつ、前記第2フォーマットは、スタックフォーマットを含む、
請求項7に記載の方法。
【請求項9】
前記方法は、さらに、
前記バイトコードシーケンスの前記現在の実行状態を表すデータを、バイトフォーマットからスタックフォーマットへ非シリアル化することによって、前記仮想メモリから前記ロッキングスクリプトのバイトコードシーケンスの現在の実行状態に対する状態データを抽出するステップ、及び/又は、
前記ロッキングスクリプトのバイトコードシーケンスの実行の結果として生じる状態データを、スタックフォーマットからバイトフォーマットへ、前記ロッキングスクリプトのバイトコードシーケンスの実行の結果として生じる前記状態データをシリアル化することにより前記支出トランザクションに含まれる、前記ロッキングスクリプトのバイトコードシーケンスの前記次の実行状態の状態データと、比較するステップ、
を含む、請求項8に記載の方法。
【請求項10】
前記少なくとも1つのデジタルアセットまたはその一部の制御は、前記ロッキングスクリプトの実行の結果として移転され、かつ、前記ロッキングスクリプトは、前記支出トランザクションの確認のための一連の条件を課す、
請求項1乃至9いずれか一項に記載の方法。
【請求項11】
前記支出トランザクションは、さらに、アンロッキングスクリプトを含み、
前記アンロッキングスクリプトの実行は、前記支出トランザクションの確認のための一連の条件を導出するために使用されるデータを提供する、
請求項10に記載の方法。
【請求項12】
前記支出トランザクションの少なくとも一部は、終了条件が満たされるまで、新たな支出トランザクションを生成するために複製される、
請求項1乃至11いずれか一項に記載の方法。
【請求項13】
前記支出トランザクションおよび前記以前トランザクションは、スマートコントラクトの一部を構成する、
請求項1乃至12いずれか一項に記載の方法。
【請求項14】
システムであって、
プロセッサと、
前記プロセッサによる実行の結果、請求項1乃至13いずれか一項に記載の方法を前記システムに実行させる、実行可能な命令を含むメモリと、
を含む、システム。
【請求項15】
実行可能な命令を保管した有形のコンピュータで読取り可能な記憶媒体であって、コンピュータシステムのプロセッサによって実行される結果として、前記コンピュータシステムに請求項1乃至13いずれか一項に記載の方法を少なくとも実行させる、コンピュータで読取り可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、一般的にブロックチェーン技術に関する。そして、より特定的には、支出トランザクション(spending transaction)スクリプトを採用しているブロックチェーントランザクションに関する。本発明は、これらに限定されるわけではないが、スマートコントラクトの自動実行における使用について特に適している。
【0002】
本出願は、2017年8月15日に出願された英国特許出願第1713046.9号に基づく優先権を主張するものであり、ここにおいてその全体が参照により組み込まれている。
【背景技術】
【0003】
この書類において、用語「ブロックチェーン(“blockchain”)」は、全ての形態の電子的な、コンピュータベースな、分散型台帳を含むように使用されている。これらは、コンセンサスベース(consensus-based)ブロックチェーンおよびトランザクションチェーン(transaction-chain)技術、許可型(permissioned)および非許可型(un-permissioned)台帳、共有台帳(shared ledger)、およびそれらの変形を含むものである。ブロックチェーン技術の最も広く知られているアプリケーションはビットコイン台帳(Bitcoin ledger)であるが、他のブロックチェーン実装が提案され、そして、開発されてきている。「ビットコイン(“Bitcoin”)」は、本開示において便利および説明の目的のために参照され得るが、本発明はビットコインブロックチェーンを用いる使用に限定されるものではなく、かつ、代替的なブロックチェーン実装およびプロトコルは本発明の範囲内にあることが留意されるべきである。例えば、本発明は、トランザクション内でどの制約がエンコードできるかに関してビットコインと同様な制限を有する他のブロックチェーン実装において有用であり得る。
【0004】
ブロックチェーンは、ピアツーピア(peer-to-peer)の、電子台帳であり、ブロックから構成されるコンピュータベースの非集中的な(decentralised)分散システムとして実装されており、さらに、トランザクションおよびその他の情報から構成されている。例えば、ビットコインについて、各トランザクションは、ブロックチェーンシステムにおける参加者(participants)間でのデジタルアセット(digital assets)の制御に係る移転をエンコードするデータ構造であり、そして、少なくとも1つの入力および少なくとも1つの出力を含んでいる。いくつかの実装において、デジタルアセットの制御の移転は、デジタルアセットの少なくとも一部分を第1エンティティから第2エンティティに対して再結合すること(re-associating)によって実行することができる。各ブロックは、以前ブロック(previous block)のハッシュ(hash)を含んでおり、そうして、ブロックは一緒にチェーン化され、ブロックチェーンの始まり(inception)以降に書き込まれてきた全てのトランザクションの永続的で、イミュータブル(immutable)なレコードを作成する。トランザクションは、トランザクションの入力および出力の中に埋め込まれた(embedded)スクリプト(script)として知られている小さなプログラムを含んでいる。そのトランザクションの出力がどのように、そして、誰によってアクセスできるかを特定するものである。ビットコインのプラットフォームにおいて、これらのスクリプトはスタックベース(stack-based)のスクリプト言語を使用して書かれている。
【0005】
つまり、スタックベースのスクリプト言語は、スタック(stack)と呼ばれるデータ構造を利用することができる。スタックについて、値は、スタックのトップ(top)の上にプッシュされ、または、スタックのトップからポップされ得る。
【0006】
トランザクションがブロックチェーンに書き込まれるためには、それが「確認済(“validated”)」であることを要する。ネットワークノード(マイナー(miner))は、各トランザクションが妥当(valid)であることを保証するために作業を行い、無効(invalid)なトランザクションがネットワークからリジェクト(reject)される。1つのノードは、他のノードとは異なる妥当性の標準を有することができる。ブロックチェーンにおける妥当性はコンセンサスに基づいているので、トランザクションが妥当であることに大多数のノードが同意する場合に、トランザクションは妥当であるとみなされる。ノードにおいてインストールされているソフトウェアクライアントは、UTXOのロッキング(locking)およびアンロッキング(unlocking)スクリプトを実行することによって、未使用トランザクション(UTXO)を部分的に参照して、トランザクションについてこの妥当性確認作業(validation work)を実行する。ロッキングスクリプトおよびアンロッキングスクリプトの実行がTRUEとして評価され、かつ、その他の妥当性確認条件が、適用可能であれば、満たされている場合に、トランザクションはノードによって妥当である。確認済トランザクションは、他のネットワークノードに伝搬され、そこで、マイナーノード(miner node)は、トランザクションをブロックチェーンの中に含めるように選択することができる。従って、トランザクションがブロックチェーンに書き込まれるために、トランザクションは、i)そのトランザクションを受け取った第1ノードによって確認されることを要する。トランザクションが確認された場合、ノードは、それをネットワークにおける他のノードへ中継する。そして、トランザクションは、ii)マイナーによって構築された新たなブロックへ追加されることを要し、かつ、iii)マイニングされる(mined)されること、すなわち、過去のトランザクションのパブリック台帳(public ledger)に追加されることを要する。トランザクションを実質的に不可逆にするように、ブロックチェーンに対して十分な数のブロックが追加されたときに、トランザクションが確認された(confirmed)ものとみなされる。
【発明の概要】
【0007】
現在の研究の1つの領域は、「スマートコントラクト(“smart contracts”)」の実装のためにブロックチェーンを使用することである。マシンで読取り可能なコントラクトまたは契約(agreement)の条件(terms)の実行を自動化するために設計されたコンピュータプログラムが存在している。自然言語で書かれるであろう従来のコントラクトとは異なり、スマートコントラクトは、結果を生成するために入力を処理することができるルール(rules)を含むマシンで実行可能なプログラムであり、次いで、それらの結果に依存してアクションが実行されるようにすることができる。
【0008】
実施形態において、スマートコントラクトは、作成者(creator)、または他のいくらかの特定なエンティティが、スマートコントラクトの実施(enforcement)及び/又は実行(execution)に任されていないという意味において「スマート(“smart”)」である。つまり、特定のエンティティとのインタラクション(interaction)はスマートコントラクトにおける特定のステップでエンコードされ得るが、そうでなければ、スマートコントラクトはマシンによって自動的に実行され、そして、自己執行(self-enforced)され得るものである。それは、マシンで読取り可能であり、かつ、実行可能である。いくつかの実施例において、自動実行は、UTXOを使うことができ、かつ、そのようにするインセンティブ(例えば、報酬)を有している任意のエンティティを参照する。そうした実施において、UTXOを使うことができる「任意のエンティティ(“any entity”)」とは、何らかの秘密の知識を証明するように要求されることなく、アンロッキングスクリプト(unlocking script)を作成することができるエンティティを参照することに留意する。別の言葉で言えば、支出トランザクションは、データのソースが暗号秘密(例えば、プライベート非対称鍵、対称鍵、等)に対するアクセスを有することを検証することなく、確認され得る。また、そうした実施例において、自己執行は、制約に従って支出トランザクションを執行するようにされているブロックチェーンネットワークの確認ノード(validation node)を参照する。いくつかの実施例において、UTXOを「消費すること(“spending”)」は、UTXOを参照し、そして、妥当として実行する支出トランザクションを作成することを指す。
【0009】
ブロックチェーントランザクションの出力は、ロッキングスクリプト(locking script)、および、ビットコインといったデジタルアセットのオーナーシップに関する情報を含んでいる。ロッキングスクリプトは、負担(encumbrance)としても参照され、出力を消費(spend)するために満たされる必要がある条件を指定することによって、デジタルアセットを「ロック(“locks”)」する。例えば、ロッキングスクリプトは、関連するデジタルアセットをアンロック(unlock)するために、所定のデータがアンロッキングスクリプト内に提供されることを要求することができるだろう。ロッキングスクリプトは、また、ビットコインにおける“scriptPubKey”としても知られている。デジタルアセットをアンロックするためのデータを提供するよう当事者(party)に要求する技術は、ロッキングスクリプトの中にデータのハッシュを埋め込むこと(embedding)を含んでいる。
【0010】
従って、これらの態様の1つまたはそれ以上においてブロックチェーン技術を改善する改良された方法及びシステムを提供することが望ましい。従って、本発明に従って、添付の請求項において定義される方法および対応するシステムが提供される。
【0011】
本発明は、検証方法/システムとして、及び/又は、ブロックチェーンを介したデジタルリソースまたはアセットの交換または移転を制御するための制御方法/システムとして説明され得る。用語「アセット(“asset”)」および「リソース(“resource”)」は、ここにおいて互換的に使用されてよい。デジタルリソースは、トークン、または、暗号通貨の一部、等であってよい。以下で説明されるように、本発明は、また、ブロックチェーンネットワークまたはプラットフォームを介してオペレーションを実行する新たな、改良され、そして、有利な方法のためのセキュリティ方法/システムとしても説明され得る。
【0012】
以下でさらに詳細に説明されるように、一つの実施形態において、トラストレス(trustless)な、決定論的状態マシン(deterministic state machine)が、バイトコード(bytecode)シーケンスによって実現され、または表現される(第1)ロッキングスクリプトによって、具体化され得る。実施形態において、ロッキングスクリプトは、パラメータ化(parameterized)されたスマートコントラクトの一部であり、または、含むことができ、それによって、デジタルアセット/リソースの制御を移転するために、第1(「支出(“spending”)」)ブロックチェーントランザクションが使用されている。支出トランザクションは、バイトコードシーケンスを有するロッキングスクリプトを含む以前トランザクション(previous transaction)を参照し得る。支出トランザクションは、また、以前トランザクションおよび支出トランザクションのロッキングスクリプトが同じバイトコードシーケンスを共有するように、バイトコードシーケンスを有するロッキングスクリプトを含んでもよい。支出トランザクションは、ブロックチェーンネットワーク内のノードで受け取ることができる。それは、以前トランザクションを取得し、そして、以前トランザクションおよび支出トランザクションのロッキングスクリプトが同じバイトコードシーケンスを共有することを検証することによって、確認され得る。
【0013】
他の実施形態において、以前トランザクションのロッキングスクリプトは、また、以前トランザクションのロッキングスクリプトのバイトコードシーケンスを解釈するために使用されるインタープリタコード(interpreter code)を含んでもよく、そして、支出トランザクションのロッキングスクリプトは、また、以前トランザクションおよび支出トランザクションのロッキングスクリプトが同じインタープリタコードを共有するように、インタープリタコードを含むこともできる。インタープリタコードは、支出トランザクションを確認するノードによって実行される、少なくとも1つのハイレベルバイトコードオペレーションのローレベルバイトコードオペレーションへの変換(translation)をサポートし得る。この場合、支出トランザクションの確認は、さらに、以前トランザクションおよび支出トランザクションのロッキングスクリプトが同じインタープリタコードを共有することを検証することを含み得る。
【0014】
以下により詳細に説明されるように、一つの実施形態において、ロッキングスクリプトのバイトコードシーケンス及び/又はインタープリタコードは、終了条件が満たされるまで、支出トランザクションの順序付けられた数(またはシーケンス)のロッキングスクリプトの一部として複製(replicated)され得る。
【0015】
よって、本発明の一つの実施形態に従って、コンピュータで実施される方法が提供され得る。本方法は、
少なくとも1つのデジタルアセットまたはその一部の制御を移転するために第1ブロックチェーントランザクション(「支出トランザクション(“spending transaction”)」)を受信するステップであり、第1ブロックチェーントランザクションは、バイトコードシーケンスによって表される(第1)ロッキングスクリプトを含み、かつ、第1ブロックチェーントランザクションは、第1および第2ロッキングスクリプトが同一のバイトコードシーケンスを共有するように、バイトコードシーケンスによって表される(第2)ロッキングスクリプトを含む以前(ブロックチェーン)トランザクションを参照する、ステップを含む。第1トランザクションは、「支出」トランザクションとして参照され得る。それは、ブロックチェーンネットワーク内のノードで受信され得る。それは、デジタルアセット(「デジタルリソース(“digital resource”)」としても参照され得るもの)制御を、ネットワークを介してエンティティ、パーティ、またはノードへ移転するように構成され得る。
【0016】
本方法は、また、以下のステップも含む。
第1ロッキングスクリプトのバイトコードシーケンスが、以前トランザクションのロッキングスクリプト(すなわち、第2ロッキングスクリプト)のバイトコードシーケンスと一致することを検証することによって、第1(支出)ブロックチェーントランザクションを確認するステップ。
【0017】
好ましくは、第1ブロックチェーントランザクションは、さらに、インタープリタコードを含み、以前トランザクションは、さらに、第1ブロックチェーントランザクションおよび以前トランザクションが、第1および第2ロッキングスクリプトのバイトコードシーケンスを解釈するために同一のインタープリタコードを共有するように、インタープリタコードを含む。そして、第1ブロックチェーントランザクションを確認するステップは、さらに、第1ブロックチェーントランザクションのインタープリタコードが、以前トランザクションのインタープリタコードと一致することを検証するステップを含む。
【0018】
好ましくは、第1ブロックチェーントランザクションは、ブロックチェーンネットワーク内のノードによって受信され、かつ/あるいは、確認される。追加的または代替的に、以前のブロックチェーントランザクションは、ブロックチェーンネットワークのノードによって維持されるブロックチェーン上に保管されてよい。追加的または代替的に、第1ブロックチェーントランザクションは、以前ブロックチェーントランザクションの少なくとも一部を複製する(replicating)ことによって生成されてよい。追加的または代替的に、第1ロッキングスクリプトは、第1ロッキングスクリプトのバイトコードシーケンスが第2ロッキングスクリプトのバイトコードシーケンスと一致することを検証する少なくとも1つのオペレーションを含んでよい。インタープリタコードは、第1および第2ロッキングスクリプトの一部として含まれてよい。追加的または代替的に、インタープリタコードは、少なくとも1つのハイレベルバイトコードオペレーションを、ノードによって実行されるローレベルバイトコードオペレーションへと変換することをサポートし得る。追加的または代替的に、第1ロッキングスクリプトは、第1ロッキングスクリプトのインタープリタコードが第2ロッキングスクリプトのインタープリタコードと一致することを検証するように構成された少なくとも1つのオペレーションを含んでよい。
【0019】
好ましくは、第1および第2ロッキングスクリプト(すなわち、支出トランザクションおよび以前トランザクションのロッキングスクリプト)は、さらに、第1および第2ロッキングスクリプトによって共有されるバイトコードシーケンスの異なる実行状態に関するデータを含む。ここで、そうしたデータは、第1ブロックチェーントランザクションを確認するときに、バイトコードシーケンスの解釈の実行を制御するために使用される。
【0020】
好ましくは、第2ロッキングスクリプトは、バイトコードシーケンスの現在の実行状態に対する状態データ、並びに、バイトコードシーケンスの現在の実行状態に対応する実行ポインタを含む。ここで、第1ロッキングスクリプトは、さらに、バイトコードシーケンスの次の実行状態に対する状態データ、並びに、(ロッキングスクリプトの)バイトコードシーケンスの次の実行状態に対応する実行ポインタを含む。そして、第1ブロックチェーントランザクションを確認するステップは、さらに、i)バイトコードシーケンスの現在の実行状態を復元(restore)するために、バイトコードシーケンスの現在の実行状態を表しているすデータを使用すること、ii)バイトコードシーケンスの現在の実行状態に対応する実行ポインタにおいて開始し、かつ、バイトコードシーケンスの次の実行状態に対応する実行ポインタにおいて終了する、バイトコードシーケンスを実行すること、および、iii)そうした状態データが一致することを検証するために、バイトコードシーケンスの実行から結果として生じる状態データを、第1ブロックチェーントランザクションに含まれる第2ロッキングスクリプトのバイトコードシーケンスの次の実行状態に対する状態データと比較すること、を含む。
【0021】
好ましくは、第1ブロックチェーントランザクションを確認するステップは、さらに、バイトコードシーケンスの現在の実行状態に関する状態データを仮想メモリから読み出すステップと、バイトコードシーケンスの現在の実行状態に対応する実行ポインタを仮想メモリから読み出すステップと、バイトコードシーケンスの次の実行状態に対応する実行ポインタを仮想メモリから読み出すステップと、含む。
【0022】
好ましくは、仮想メモリは、バイトコードシーケンスの異なる実行状態に関するデータを、異なる第1および第2フォーマットで保管する。ここで、第1フォーマットは、ロッキングスクリプトの一部として、そうしたデータを保管するために使用される。そして、ここで、第2フォーマットは、ロッキングスクリプトのバイトコードシーケンスを実行するときに、仮想メモリ内のデータを操作するのに適している。
【0023】
好ましくは、仮想メモリは、少なくとも1つのスタックデータ構造を含み、第1フォーマットは、シリアル化バイトフォーマットを含み、かつ/あるいは、第2フォーマットは、スタックフォーマットを含む。
【0024】
本方法は、さらに、バイトコードシーケンスの現在の実行状態を表すデータを、バイトフォーマットからスタックフォーマットへ非シリアル化(deserialization)することによって、仮想メモリからバイトコードシーケンスの現在の実行状態に対する状態データを抽出するステップ、及び/又は、ロッキングスクリプトのバイトコードシーケンスの実行の結果として生じる状態データを、スタックフォーマットからバイトフォーマットへ、ロッキングスクリプトのバイトコードシーケンスの実行の結果として生じる前記状態データをシリアル化することにより支出トランザクションに含まれる、ロッキングスクリプトのバイトコードシーケンスの次の実行状態の状態データと、比較するステップ、を含む。
【0025】
好ましくは、少なくとも1つのデジタルアセットまたはその一部の制御は、第1ロッキングスクリプトの実行の結果として移転され、かつ、第2ロッキングスクリプトは、第1ブロックチェーントランザクションの確認のための一連の条件を課す。
【0026】
好ましくは、第1ブロックチェーントランザクションは、さらに、アンロッキングスクリプトを含む。ここで、アンロッキングスクリプトの実行は、第1ブロックチェーントランザクションの確認のための一連の条件を導出するために使用されるデータ(決定されたデータソースまたは未決定のデータソースであり得る)を提供する。
【0027】
好ましくは、第1ブロックチェーントランザクションの少なくとも一部は、終了条件が満たされるまで、新たなブロックチェーントランザクションを生成するために複製される(第1ブロックチェーントランザクションに関連するデジタルアセットが移転されるためには不十分なサイズである、といった場合)。
【0028】
好ましくは、第1ブロックチェーントランザクションおよび以前ブロックチェーントランザクションは、スマートコントラクトの一部を構成する。
【0029】
また、本発明に従って、上述の方法に係る任意の実施形態を実施するように構成されたシステムも提供される。本システムは、
プロセッサと、
プロセッサによる実行の結果、上記実施形態のうちいずれか1つのコンピュータ実施方法を本システムに実行させる、実行可能な命令を含むメモリと、を含んでよい。
【0030】
また、実行可能な命令を保管した有形のコンピュータで読取り可能な記憶媒体も提供される。命令は、コンピュータシステムのプロセッサによって実行される結果として、上記実施形態のうちいずれか1つのコンピュータ実施方法を本コンピュータシステムに少なくとも実行させる。
【0031】
本開示において記載および示唆される技術は、デジタルアセットを再結合(reassociating)または移転(transferring)するための基準を設定し、かつ、実施するためにブロックチェーンネットワークおよび暗号技術を利用することによって、コンピューティングの分野、特にブロックチェーン技術(マシンで実行可能なスマートコントラクトの実行を含む)の分野を改善する。加えて、本開示において記載および示唆される技術は、ブロックチェーントランザクションが状態マシンとして機能するのを可能にすることによって、ブロックチェーンネットワークの機能性を改善する。
【0032】
さらに、本開示において説明および示唆される技術は、セキュリティ上の理由で機能性を制限するように特別にデザインされてきたスクリプト言語(例えば、ビットコインのスクリプト)を使用する分散台帳技術およびブロックチェーン技術について特に起因する問題を克服するため、コンピュータ技術に必然的に根ざしている。例えば、ビットコインのスクリプト言語は、複雑なフロー制御の機能性(例えば、ループ)の発生を元々サポートしていない。この制限の1つの利点は、プログラムが予測可能な実行時間を有していることである。スクリプトを線形(linear)またはツリー状の決定タスクに制限することの別の著しい利点は、このことが無限ループ(infinite loops)を回避することであり、これはドス攻撃(denial of service、DoSまたはDDoS)といったエクスプロイト(exploits)を開始する手段として使用され得るものである。従って、ブロックチェーン転送/交換のセキュリティが、強化され、かつ、維持されているが、メカニズムは、言語自体によっては許可されていない、または、提供されていない機能性を実装するように見いだされる必要がある。本発明は、この観点において進歩を提供し、自己複製および自己複製的ブロックチェーントランザクションのロッキングスクリプトの実装を用いて、少なくとも部分的に、ブロックチェーントランザクションの現在の制限に対処している。従って、本発明は、技術的な問題に対して技術的ソリューションを提供し、そして、セキュリティ、ブロックチェーンを介したデジタルアセットの交換/移転の改善された制御、および現在のブロックチェーン関連の機能性の拡張に関して利点を提供する。
【図面の簡単な説明】
【0033】
本発明に係るこれら及び他の態様は、ここにおいて説明される実施形態から明らかになり、かつ、それらを参照して解明されるだろう。本発明の実施形態が、これから、単なる例示として、そして、添付の図面を参照して説明される。
【
図1】
図1は、様々な実施形態を実装することができるブロックチェーン環境を示している。
【
図2】
図2は、一つの実施形態に従って、トランザクションのシーケンスにわたり複製されるバイトコードシーケンスを含んでいるロッキングスクリプトを使用するスマートコントラクトの一つの実施例を示している。
【
図3】
図3は、
図2のロッキングスクリプトの一つの実施例を示しており、一つの実施形態に従って、トラストレスな、決定論的状態マシンを実現するために解釈されるバイトコードシーケンスを使用している。
【
図4A】
図4Aは、まとめて、一つの実施形態に従って、支出トランザクションのアンロッキングスクリプト、および、
図3の以前トランザクションのロッキングスクリプトを実行するオペレーションの一つの実施例を説明するフローチャートである。
【
図4B】
図4Bは、まとめて、一つの実施形態に従って、支出トランザクションのアンロッキングスクリプト、および、
図3の以前トランザクションのロッキングスクリプトを実行するオペレーションの一つの実施例を説明するフローチャートである。
【
図4C】
図4Cは、まとめて、一つの実施形態に従って、支出トランザクションのアンロッキングスクリプト、および、
図3の以前トランザクションのロッキングスクリプトを実行するオペレーションの一つの実施例を説明するフローチャートである。
【
図5】
図5は、一つの実施形態に従って、ロッキングスクリプトのバイトコードシーケンスを実行するために使用され得る例示的な仮想スタックデータ構造の概略図である。
【
図6】
図6は、一つの実施形態に従って、
図3のロッキングスクリプトの一部として保管され得るシリアル化(serialized)状態データの概略図である。
【
図7】
図7は、一つの実施形態に従って、ロッキングスクリプトの一部として保管されたシリアル化状態データを
図5のスタックデータ構造における保管のために適したフォーマットへと変換するために使用され得るオペレーションの概略図である。
【
図8】
図8は、一つの実施形態に従って、
図5のスタックデータ構造のフォーマットで保管された状態データを、ロッキングスクリプト内の保管のために適したシリアル化状態データへと変換するために使用され得るオペレーションの概略図である。
【
図9】
図9は、
図2のロッキングスクリプトの別の実施例を示しており、一つの実施形態に従って、トラストレスな、決定論的状態マシンを実施するために、バイトコードシーケンスおよびインタープリタコードを使用する。
【
図10A】
図10Aは、一つの実施形態に従って、支出トランザクションのアンロッキングスクリプトおよび
図9の以前トランザクションのロッキングスクリプトを実行するオペレーションの一つの実施例を説明するフローチャートである。
【
図10B】
図10Bは、一つの実施形態に従って、支出トランザクションのアンロッキングスクリプトおよび
図9の以前トランザクションのロッキングスクリプトを実行するオペレーションの一つの実施例を説明するフローチャートである。
【
図10C】
図10Cは、一つの実施形態に従って、支出トランザクションのアンロッキングスクリプトおよび
図9の以前トランザクションのロッキングスクリプトを実行するオペレーションの一つの実施例を説明するフローチャートである。
【
図11】
図11は、
図9のロッキングスクリプトのインタープリタコードの実行を説明する概略図であり、一つの実施形態に従って、ロッキングスクリプトのバイトコードシーケンスを解釈するために、確認ノードのランタイム(run-time)システム(例えば、ブロックチェーンクライアント)に係るビルトインソフトウェアインタープリタの実行と協働する。
【
図12A】
図12Aは、
図10Aから
図10Cまでのオペレーションの一部としてロッキングスクリプトのインタープリタコードの例示的なオペレーションの概略図であり、ロッキングスクリプトの一部としてVOP_ADDバイトコードを解釈する。
【
図12B】
図12Bは、
図10Aから
図10Cまでのオペレーションの一部としてロッキングスクリプトのインタープリタコードの例示的なオペレーションの概略図であり、ロッキングスクリプトの一部としてVOP_ADDバイトコードを解釈する。
【
図13】
図13は、様々な実施形態を実装できるコンピューティング環境を示している。
【発明を実施するための形態】
【0034】
最初に
図1を参照すると、本開示の一つの実施形態に従って、ブロックチェーンと関連付けられたブロックチェーンネットワーク100の実施例が示されている。本実施形態において、例示的なブロックチェーンネットワーク100は、ブロックチェーンプロトコルのインスタンスを実行するピアツーピア(peer-to-peer)分散電子デバイスから構成されている。いくつかの実施例において、分散電子デバイスは、ノード102として参照されている。ブロックチェーンプロトコルの一つの例は、ビットコインプロトコル、または、その任意のバージョン/バリエーションである。
【0035】
ノード102は、任意の適切なコンピューティングデバイスから構成されてよい(例えば、データセンタ内のサーバにより、クライアントコンピューティングデバイス(例えば、デスクトップコンピュータ、ラップトップコンピュータ、タブレットコンピュータ、スマートフォン、等)により、コンピュータリソースサービスプロバイダの分散システムにおける複数のコンピューティングデバイスにより、または、
図11のコンピューティングデバイス2600といった任意の適切な電子クライアント装置による)。
【0036】
一つの実施形態において、ノード102のうち1つまたはそれ以上は、ノード102のうち他の1つまたはそれ以上に対して通信可能に接続されている。そうした通信カップリングは、周知のように、有線または無線通信リンクのうち1つまたはそれ以上を使用することができる。実施形態において、ノード102それぞれは、ブロックチェーンの中に全てのトランザクションの「台帳(“ledger“)」の少なくとも一部を維持している。このように、台帳は分散型台帳(distributed ledger)である。台帳に影響する、ノードによって処理されるトランザクションは、台帳の完全性(integrity)が維持されるように、1つまたはそれ以上の他のノードによって検証可能である。
【0037】
一つの実施形態において、ノード102の少なくともいくつかは、暗号学的問題を解くといった、複雑な計算含んでいるマイニングプロセスを実行するマイナーノード(miner node)である。暗号問題を解くマイナーノードは、ブロックチェーンのための新たなブロックを作成し、そして、他のノード102に対して新たなブロックをブロードキャスト(broadcast)する。他のノード102は、マイナーノードの作業を検証する検証プロセスを実行し、そして、検証されると(upon verification)、ブロックチェーンの中にブロックを受け入れる(例えば、ブロックチェーンの分散型台帳にブロックを追加することによる)。いくつかの実施例において、ブロックは、トランザクションのグループであり、しばしば、タイムスタンプおよび以前ブロックの「フィンガープリント(“fingerprint”)」(例えばハッシュ)を用いてマークされる。このようにして、各ブロックは、以前ブロックにリンクされるようになり、それによって、ブロックチェーンの中でブロックをリンクする「チェーン(“chain”)」を作成している。実施形態においては、妥当なブロックが、ノード102のコンセンサスによってブロックチェーンに対して追加されている。いくつかの実施例において、ブロックチェーンは、また、確認済ブロックのリストも含んでいる。
【0038】
一つの実施形態において、ノード102の少なくともいくつかは、本開示において説明されるように、トランザクションを確認する妥当性確認プロセス(validation process)を実行する確認ノード(validating node)としてオペレーションする。
図1は、104とラベル付けされた一つの典型的なトランザクションを示している。いくつかの実施例において、トランザクションは、デジタルアセット(例えば、ビットコインの数)のオーナーシップ(ownership)の証明(proof)、および、デジタルアセットのオーナーシップ/制御(control)の受入または移転の条件を提供するデータを含んでいる。いくつかの実施例において、「支出トランザクション(“spending transaction”)」は、デジタルアセットの少なくとも一部分、以前トランザクションの未使用トランザクション出力(unspent transaction output、UTXO)によって示されるもの、をブロックチェーンアドレスに関連するエンティティに対して再び関連付ける(re-associates)(例えば、オーナーシップまたは制御を移転する)トランザクションを参照する。いくつかの実施例において、「以前トランザクション(“previous transaction”)」は、支出トランザクションによって参照されているUTXOを含むトランザクションを参照する。いくつかの実施形態において、トランザクションは、そのトランザクションが確認され、かつ、オーナーシップ/制御がそのトランザクションによって移転される前に満たされなければならない条件を用いてトランザクションを担保(encumbers)する「アンロッキングスクリプト(“unlocking script”)」および「ロッキングスクリプト(“locking script”)」を含んでいる。いくつかの実施形態において、ロッキングスクリプトは、トランザクションの出力に関連付けることができ、出力を消費(spend)するために必要な1つまたはそれ以上の条件を定義するように構成することができる。さらに、支出トランザクションのアンロッキングスクリプトは、アンロッキングスクリプトの実行がデータ提供するように構成することができる。データは、支出トランザクションの確認のための以前トランザクションのロッキングスクリプトの実行によって評価される一連の条件を導出するために使用されるものである。いくつかの実施形態において、ブロックチェーンアドレスは、デジタルアセットの少なくとも一部分の制御が移転され/再び関連付けられるエンティティに関連する英数字の文字列である。いくつかの実施形態において実装されるいくつかのブロックチェーンプロトコルにおいては、エンティティと関連付けられた公開鍵(public key)とブロックチェーンアドレスとの間に一対一の対応が存在している。トランザクションの確認は、トランザクションのロッキングスクリプト及び/又はアンロッキングスクリプトにおいて指定された1つまたはそれ以上の条件の確認を含み得る。トランザクションの確認が成功すると、確認ノードは、トランザクションを他のネットワークノードに対して伝搬(propagate)することができ、それにより、マイナーノードは、ここにおいて説明されるように、ブロックチェーンに追加されるブロックの一部としてトランザクションを埋め込むように選択することができる。
【0039】
ビットコインといった、いくつかのブロックチェーン技術は、デジタル署名のための数学的スキームとして楕円曲線デジタル署名アルゴリズム(elliptic curve digital signature algorithm、ECDSA)を使用する。実施形態において、ECDSAは、承認されていないエンティティによって消費される(spent)ことからUTXOを守るために使用される暗号化デジタル署名である。ビットコインにおける楕円曲線デジタル署名(ECDSA)は、典型的に、末尾(end)に付加された署名ハッシュフラグ(SIGHASHタイプ)と共に現れる。しかしながら、本開示の技術は、SIGHASHタイプを実装しないブロックチェーン技術を用いて使用可能であることが考慮されている。そうしたブロックチェーン技術において、ECDSは、特定のブロックチェーン技術の署名作成原則(principle)に準拠するように考慮されている。
【0040】
いくつかの実施形態において、SIGHASHタイプは、シリアル化(例えば、正規化)およびハッシュ化される前にトランザクションから抽出されるフィールドのセットを参照する。例えば、SIGHASHタイプは、署名の中にトランザクションのどのフィールドが含まれるかに影響を与え得る。いくつかの実施例において、SIGHASHタイプは、ビットコインプロトコルにおいて使用されているように、SIGHASH_ALL、SIGHASH_NONE、SIGHASH_SINGLE、またはSIGHASH_ANYONECANPAYのうち1つまたはそれ以上であり得る。
【0041】
ビットコインプロトコルは、様々なオペレーションを実行するための「スクリプト(“Script”)」と呼ばれるスクリプトシステムを使用している。本開示においては、様々なオペレーションを実行するために、様々なスクリプトオペレーションコード(または、op_codes)およびキーワードが参照されている。しかしながら、他のブロックチェーン技術は異なる命令セットを実装できるであろうことが考慮されており、そして、従って、本開示において説明されるオペレーションコードは、スクリプトにおける特定のオペレーションコードではなく、むしろオペレーションコードによって実行されるオペレーションを例示するものと考えられる。いくつかの実施形態において、スクリプトシステムは、チューリング不完全命令セット(Turing incomplete instruction set)である(例えば、ループ、再帰(recursion)、ゴーツー(goto)ステートメント、等に対するサポートを欠いている)。他の実施形態において、スクリプトシステムはチューリング完全命令セット(Turing complete instruction set)であり得る。
【0042】
本開示の特定の実施形態は、記述された命令セットを実施するためのスクリプトシステムまたは他のシステムが、単一のスクリプトにおいて200を超える命令(例えば、オペレーションコードまたは、op_codes)を許可しているという仮定の下でオペレーションする。同様に、本開示の特定の実施形態は、さらに、以下を仮定している。
・特定のロ-レベル(low-level)オペレーションコードによって提供される機能性が、オペレーションコードスクリプト/命令セットを実行するシステムにおいて存在し、かつ、使用可能とされていること。及び/又は、
・特定のハイレベル(high-level)オペレーションコード(または、ハイレベルバイトコードオペレーション)によって提供される機能性が、所望の振る舞い(behavior)を提供するように記載されているカスタマイズされたファンクション(function)の作成によって実現され得ること。これらのカスタマイズされたファンクションは、言語の中に存在するが無効にされているop_codesの機能性を実装するために記載されているか、または、スクリプト言語において本来提供されていない特定の機能性を提供する「新たな(“new”)」op_codesであってよい。
【0043】
スクリプトシステムによってサポートされ得るローレベルのオペレーションコードの例は、以下を含んでいる。
・OP_1SUB、スタックのトップアイテムから値「1」が差し引かれる
・OP_2DUP、スタックの上位2つのアイテムを複製する
・OP_ADD、スタックに上位2つのアイテムを追加する
・OP_CAT、スタックの上位2つのアイテムを連結(concatenate)する
・OP_CHECKSIG、スタックから公開鍵および署名がポップされ、そして、SIGHASHタイプに従ってトランザクションフィールドの署名に対して検証される。署名が妥当である場合は1、そうでない場合は0を返す
・OP_CHECKSIGVERIFY、OP_CHECKSIGと同様に機能するが、その後でOP_VERIFYが実行される
・OP_DROP、スタックのトップアイテムを削除またはポップ(pop)する
・OP_DUP、スタックのトップアイテムを複製する
・OP_ELSE、先行するOP_IF、OP_NOTIF、またはOP_ELSEが実行されなかった場合に、これらのステートメントが実行され、そうでなければ、先行するOP_IF、OP_NOTIF、またはOP_ELSEが実行された場合に、これらのステートメントは実行されない
・OP_ENDIF、if/elseブロックを終了する
・OP_EQUAL、入力が正確に等しい場合には1、そうでなければ0を返す
・OP_EQUALVERIFY 、OP_EQUALと同様であるが、その後でOP_VERIFYを実行する
・OP_FROMALTSTACK、入力をメインスタックのトップの上に置き、そして、それを代替スタックから削除する
・OP_HASH256、入力が2回ハッシュされる、最初はSHA-256を用い、そして、次いで、RIPEMD-160を用いる
・OP_IF、スタックのトップの値(top stack value)が誤り(False)でない場合に、ステートメントが実行され、そして、スタックのトップの値が削除される
・OP_LEFT、文字列において指定されたポイントの左側の文字だけを保持する
・OP_MUL、スタックの上位2つのアイテムを乗算する
・OP_NOTIF、スタックのトップの値が誤りである場合に、ステートメントが実行され、そして、スタックのトップの値が削除される
・OP_RIGHT、文字列において指定されたポイントの右側の文字だけを保持する
・OP_ROLL、スタックにおける深さがn個アイテムであるアイテムがトップに移動される
・OP_ROT、スタックの上位3つのアイテムを左に回転させる
・OP_SIZE、スタックのトップエレメントの文字列長を(ポップアップすることなく)プッシュする
・OP_SUBSTR、文字列のセクションを返す
・OP_SWAP、スタックの上位2つのアイテムが交換される
・OP_TOALTSTACK、入力を代替スタックのトップの上に置き、そして、それをメインスタックから削除する
・OP_TUCK、スタックのトップにあるアイテムがコピーされ、かつ、トップ2番目のアイテムの前に挿入される
・OP_VERIFY、スタックのトップの値が真(true)でない場合に、無効なものとしてトランザクションをマークする
【0044】
これらのローレベルオペレーションコードは、現在、ビットコインプロトコルのスクリプトシステムによってサポートされている。
【0045】
本開示の方法およびシステムによってサポートされ得るハイレベルオペレーションコードの例は、以下を含んでいる。
・OP_ECPX、楕円曲線点のx座標を返す
・OP_BIGMOD、スタックにおける上位2つのアイテムを分割した後で余り(remainder)を返す
・OP_BIGMODADD、スタックモジュラスの上位2つのアイテムモジュラス加算(modulus addition)をスタックの3番目のアイテムに実行する
・OP_BIGMODINVERSE、モジュラス負の指数演算(exponent operation)を実行する
・OP_BIGMODMUL、スタックモジュラスの上位2つのアイテムモジュラス乗算(modulus multiplication)をスタックの3番目のアイテムに実行する
・OP_DERENCODE、スタックにおける上位2つのアイテムをDER形式でエンコードする
・OP_ECPMULT、スタックにおける上位2つのアイテムの楕円曲線点乗算(楕円曲線スカラ乗算としても参照されるもの)を実行する
【0046】
これらのハイレベルオペレーションコードは、ビットコインプロトコルのスクリプトシステムにおいては本来提供されていない特定の機能性を提供することができる。
【0047】
図2は、トランザクションのシーケンスの一部としてロッキングスクリプトを使用するスマートコントラクトの実施例2100を説明している。ここで、ロッキングスクリプトは、毎回1ユニットだけ、支出トランザクションに送信されるデジタルアセットの金額(amount)を減らすように構成されており、そして、また、1ユニットのデジタルアセットをアリス(Alice)にも支払う。つまり、第1トランザクション202は、ロッキングスクリプトを含み、そして、初期金額Xを保持している。第1トランザクション202は、確認され、そして、次いで、ブロックの中に埋め込まれるようにマイニング(mined)される。そして、次いで、ブロックが、ブロックチェーン208において保管されるように、検証される。第1トランザクション202のロッキングスクリプト(またはその一部)は、複製され、そして、第2トランザクション204のロッキングスクリプトの一部として組み込まれる。第2トランザクション204は、第1トランザクション202のロッキングスクリプトを実行することによって確認された支出トランザクションであり、第1トランザクション202によって保持される初期金額Xのうち1ユニットを、アリスに属するペイ・ツー・パブリック・キー・ハッシュ(pay-to-public-key-hash)アドレスに対して支払い、そして、新たな合計(X'=X-1)を保持するように構成されている。いくつかの実施例において、P2PKまたはP2PKHは、それぞれの公開鍵に関連するエンティティへのデジタルアセットの直接移転(direct transfer)に対するアドレスとして使用することができる。第2トランザクション204が、次いで、ブロックの中に埋め込まれるようにマイニングされ、そして、次いで、ブロックが、ブロックチェーン208において保管されるように確認される。第2トランザクション204のロッキングスクリプト(またはその一部)が複製(replicated)され、そして、第3トランザクション206のロッキングスクリプトの一部として組み込まれる。第3トランザクション206は、第2トランザクション204のロッキングスクリプトを実行することによって確認された支出トランザクションであり、第2トランザクション204によって保持される金額X'の1ユニットを、アリスに属するペイ・ツー・パブリック・キー・ハッシュ(P2PKH)アドレスに対して支払い、かつ、新たな合計(X"=X'-1)を保持するように構成されている。第3トランザクション206が、次いで、ブロックの中に埋め込まれるようにマイニングされ、そして、次に、ブロックがブロックチェーン208において保管されるように検証される。第3トランザクション206のロッキングスクリプト(またはその一部)は、必要に応じて、上記に説明されるように、複製され、そして、支出トランザクションに続く(follow on)1つまたはそれ以上のロッキングスクリプトの一部として組み込まれ得る。従って、初期金額Xに関係なくプロセスが継続すると、支出できない(unspendable)金額のデジタルアセット(例えば、ゼロ)を出力するように、支出トランザクションが最終的に生成されることが分かる。これは、様々なブロックチェーンプロトコルで控除される(deducted)最低トランザクション手数料(minimum transaction fee)を差し引かなくても、その後の各支出トランザクションが以前トランザクションよりも小さい金額のデジタルアセットを有するのを観察することによって直感的に理解することができる。その結果、金額出力はゼロに向かって収束し、その時点でトランザクションを処理することは無意味(pointless)になる。しかしながら、本開示の実施形態は、そうした支出できない支出トランザクションを回避するために終了条件を実施することによる、この問題に対するソリューションを含んでいる。一旦、確認され、そして、ブロックチェーンにおいて保管されると、トランザクション202、204、206等のそれぞれのシーケンスは、トランザクションによって参照されるデジタルアセットに対する制御の移転を提供する。
【0048】
さらに、実施形態において、スマートコントラクトのトランザクション202、204、206等のシーケンスは、全てのトランザクションにわたってコピーされ、または、複製されるバイトコードシーケンスを伴うロッキングスクリプトを含んでいる。従って、スマートコントラクトの各支出トランザクションに対する確認プロセスは、以前トランザクションからロッキングスクリプトのバイトコードシーケンスを抽出すること、支出トランザクションからロッキングスクリプトのバイトコードシーケンスを抽出すること、そして、これらの2つの抽出されたバイトコードシーケンスが相互に一致することを検証することを含むことができる。
【0049】
このプロセスの基本的な概要が表1において、以下に示されている。
【表1】
【0050】
上記のスクリプトに見られるように、以前トランザクション(例えば、第1トランザクション202)のロッキングスクリプトのバイトコードシーケンス、つまり以前トランザクションのUTXOをアンロックするロッキングスクリプトは、支出トランザクション(例えば、第2トランザクション204)のロッキングスクリプトのバイトコードシーケンスに対して検証され、それは、この支出トランザクションが以前トランザクションである将来のときに、別の支出トランザクション(例えば、第3トランザクション206)へ引き換えられる(redeemed)。従って、各トランザクションについて異なる支出トランザクションを作成するより、むしろ、ロッキングスクリプトは、代わりに、両方のロッキングスクリプトについてバイトコードシーケンスが同一でなければならないことを強制(enforce)する。以前トランザクションのロッキングスクリプトに対するバイトコードシーケンスが、支出トランザクションのロッキングスクリプトのバイトコードシーケンスと同一である場合に、両方のロッキングスクリプトは、真正(genuine)であると保証(assured)される。
【0051】
実施形態において、終了条件(termination condition)は、以前トランザクションが不十分な資金(fund)を有しているが、ロッキングスクリプトが未だに妥当である場合、すなわち、使用不可能なトランザクション(un-spendable transaction)を回避する。例えば、終了条件は、次のトランザクションを実行するための十分なデジタルアセットが存在することを検証するために実施され、そうでなければ、確認を終了することができる。より具体的な例として、初期のプールが、365ユニットのデジタルアセットと、各トランザクション手数料(transaction fee)のために必要な金額(例えば、1年について1日ごとに1回のトランザクションについて十分である)を含む場合に、終了条件は、残りのユニット数がトランザクションを完了するために必要な数より多いことを検証することができる。例えば、十分な資金が存在する限りは、トランザクションの確認を継続する。そうでなければ、資金が不十分である場合に、終了条件が満たされ、そして、確認が停止する。従って、366日目の資金が不足している場合、366番目の支出トランザクションのロッキングスクリプトの確認は不要であり、そして、終了条件は、トランザクションの複製および関連するロッキングスクリプトを終了することを確保する。
【0052】
上述のように、アリスに属するペイ・ツー・パブリック・キー・ハッシュ(P2PKH)アドレスに対してデジタルアセットを支払う、
図2のスマートコントラクトは、例示的なものであることに留意する。実施形態においては、ここにおいて説明されるロッキングスクリプトの原理およびオペレーションは、ブロックチェーンを使用する広範なスマートコントラクトをサポートするように拡張され得る。この文書において、我々は、用語「スマートコントラクト(“smart contract”)」を、トランザクションをブロックチェーン上に保管するようにコンピュータ化されたトランザクションプロトコルを使用する一連のトランザクションによって、その条件が実行される契約を含むように使用している。
【0053】
図3は、本開示の一つの実施形態に従って、トラストレスな決定論的状態マシンを実現するために、共通のバイトコードシーケンスを有するロッキングスクリプトを使用する例示的なトランザクションを示している。より具体的に、共通のバイトコードシーケンスは、良好に定義された(well-defined)状態のセットを用いて状態ルールを具現化する状態マシンとして考えることができるコンピュータプログラムであり、それによって、バイトコードシーケンス(コンピュータプログラム)のバイトコードの実行が、状態マシンの状態間の遷移を提供する。
【0054】
図3において概略的に示されるように、以前トランザクション302は、状態マシン306のための状態ルールのセット(set)を表すバイトコードシーケンスを有するロッキングスクリプト304を含んでいる。ロッキングスクリプト304は、また、現在の状態実行ポインタ(または「現在の実行ポインタ(“current execution pointer”)」)、および、バイトコードシーケンスによって表される状態マシン306の状態の中で現在の状態を表すシリアル化(serialized)状態データも含んでいる。図示された例において、ロッキングスクリプト304の現在の実行ポインタおよびシリアル化状態データは、現在の状態「S1」を表し、そして、バイトコードシーケンスによって表される状態マシン306の状態ルールのセットは、現在の状態S1に続く次の状態について2つの可能な状態(「S2」または「S3」)を提供する。ロッキングスクリプト304の一部として含まれる現在の実行ポインタは、現在の状態(この場合は、「S1」)に対応するバイトコードシーケンスの実行点(execution point)を参照する。ロッキングスクリプト304の一部として含まれるシリアル化状態データは、ロッキングスクリプト304に含まれる現在の実行ポインタによって参照される実行ポイントにおけるバイトコードシーケンスによって表される状態マシンの状態を表している。
【0055】
図3の例を見れば分かるように、支出トランザクション308は、状態マシン314に対する状態ルールのセットを表すバイトコードシーケンスを伴うロッキングスクリプト312を含んでおり、それは、以前トランザクション302のロッキングスクリプト304のバイトコードシーケンスによって表される状態マシン306のコピーである。ロッキングスクリプト312は、また、次の状態実行ポインタ(または「次の実行ポインタ(“next execution pointer”)」)、および、現在の状態S1に続く可能性のある次の状態の1つ(この場合は、状態「S2」)を表すシリアル化状態データを含んでいる。ロッキングスクリプト312の一部として含まれる次の実行ポインタは、現在の状態S1に続く次の状態(この場合は、状態「S2」)に対応するバイトコードシーケンスの実行点を参照する。ロッキングスクリプト312の一部として含まれるシリアル化状態データは、ロッキングスクリプト312に含まれる次の実行ポインタによって参照される実行ポイントでのバイトコードシーケンスによって表される状態マシンの状態を表している。
【0056】
ロッキングスクリプト312の一部として含まれるシリアル化状態データは、ロッキングスクリプト312に含まれる次の実行ポインタを生成またはアクセスすることによって、支出トランザクションを作成するときに決定され得ることに留意する。ロッキングスクリプト312のバイトコードシーケンスの現在の実行状態を復元(restore)するために以前トランザクションのロッキングスクリプト304のシリアル化状態データを使用し、そして、次いで、ロッキングスクリプトのバイトコードシーケンスを実行するものである。そうした実行は、以前トランザクション302に含まれる現在の実行ポインタに対応するポイント(またはオペレーション)で始まり、そして、ロッキングスクリプト312に含まれる次の実行ポインタに対応するポイント(またはオペレーション)で終了する。そうした実行は、また、支出トランザクション308のアンロッキングスクリプトの実行によって決定された入力データ310を使用することもできる。
【0057】
支出トランザクション308の確認の一部として、支出トランザクション308のアンロッキングスクリプトおよびロッキングスクリプト304/312の共通バイトコードシーケンスが実行される。共通バイトコードシーケンスの実行は、支出トランザクション308のアンロッキングスクリプトの実行から決定された入力データ310と、現在の実行ポインタおよび以前トランザクション302のロッキングスクリプト304に含まれるシリアル化状態データよって具現化された現在の状態「S1」と、支出トランザクション308のロッキングスクリプト312に含まれる次の実行ポインタと、を入力としてとり、そして、以前トランザクション302のロッキングスクリプト304に含まれる現在の状態実行ポインタに対応するポイント(またはオペレーション)から、支出トランザクション308のロッキングスクリプト312に含まれる次の実行ポインタに対応するポイント(またはオペレーション)まで、ロッキングスクリプト304/312の共通バイトコードシーケンスを実行する。そうした実行は、共通バイトコードシーケンスによって表される状態ルールのセット314から適切な次の状態(第2状態「S2」といったもの)を決定する。この次の状態(状態「S2」といったもの)は、支出トランザクション308のロッキングスクリプト312に含まれる次の実行ポインタに対応するポイント(またはオペレーション)までの共通バイトコードシーケンスの実行から決定されるものであるが、支出トランザクション308のロッキングスクリプト312の一部として含まれる状態データのシリアル化フォーマットに従うシリアル化状態データとして構成される。共通バイトコードシーケンスの実行から決定されたシリアル化状態データは、次に、支出トランザクション308のロッキングスクリプト312の一部として含まれるシリアル化状態データに対して検証される。再び、各トランザクションについて異なる支出トランザクションを作成するのではなく、むしろ、ロッキングスクリプトの実行は、支出トランザクションの確認中にロッキングスクリプトのバイトコードシーケンスの実行から結果として生じる実行状態が、支出トランザクションを作成するとき、支出トランザクションに含まれるロッキングスクリプトの期待される結果として生じる実行状態と一致することを強制する。これら2つの結果として生じる実行状態が同一である場合に、ロッキングスクリプトは妥当であると保証される。
【0058】
図3の例は、支出トランザクション308のロッキングスクリプト312のバイトコードシーケンスによって表される状態マシンの状態が、状態「S2」から次の状態遷移について可能な新たな状態「S4」または「S5」を提供することを示していることに留意する。ロッキングスクリプトのバイトコードシーケンスによって表される状態ルールのセットは、現在の状態および1つまたはそれ以上の入力によってパラメータ化されたスイッチステートメントまたは他の条件ステートメント(例えば、「そうである場合に(“if-then-else“)」)としてコード化され得ることに留意する。
【0059】
実施形態において、トランザクションのロッキングスクリプトに含まれるバイトコードシーケンスは、状態マシンの状態ルールのセットを表し、そして、実行ポインタおよびトランザクションのロッキングスクリプトの実行ポインタおよびシリアル化状態データは、状態マシンの状態を表している。そうした実施形態において、トランザクションのロッキングスクリプトのバイトコードシーケンスは、デジタルアセットの制御を次のトランザクションへ移転しようと試みる全ての支出トランザクションにコピーまたは複製され、現在のトランザクションへリンクされなければならない。このプロセスは、終了条件が満たされるまで繰り返される。支出トランザクションのアンロッキングスクリプトの実行から決定された入力データが、固定されておらず、そして、未決定データであり得るので、状態マシンの状態は、特定の外部入力に基づいて変更がなされ得る。従って、未決定データは、次の状態に影響し得る入力を提供する。
【0060】
さらに、支出トランザクションの確認時に実行されるロッキングスクリプトのバイトコードオペレーションの数は、以前トランザクションに含まれるようなロッキングスクリプトのバイトコードシーケンスの現在の実行状態に係る実行ポインタと支出トランザクションに含まれるようなロッキングスクリプトのバイトコードシーケンスの次の実行状態に係る実行ポインタとの差異によって決まるものであるが、支出トランザクションに含まれるようなロッキングスクリプトのバイトコードシーケンスの次の実行状態に係る実行ポインタを選択し、または、変更することによるデザインによって変化させ得るものである。このようにして、支出トランザクションの確認時に実行されるロッキングスクリプトのバイトコードオペレーションの数は、制約されるか、または、支出トランザクション(ロッキングスクリプトを使用するトランザクション)の制約のパラメータ化において使用され得る。このパラメータ化された制約は、トランザクション間で実行されるバイトコードオペレーションの数を制限するため(例えば、スマートコントラクトのバイトコードシーケンスの非効率的なオペレーションを回避するため)、支出トランザクションのシーケンスにわたり実行される異なるセグメントへとスマートコントラクトのバイトコードシーケンスを論理的に分割するため、パラメータ化された制約に基づいて新たなトランザクションを作成するエンティティに対する報酬(reward)を計算するため、または、他の可能な使用のために使用され得る。
【0061】
1つの例として、アリスはボブ(Bob)にいくらかの金を貸し付け(loans)、そして、ボブはアリスに返済することを同意している。上述のような、トラストレスな、決定論的状態マシンは、ボブがアリスに対して行う支払いを表すスマートコントラクトを実装するために使用され得る。例えば、スマートコントラクトは、ボブが次の3ヶ月について毎月アリスに対して支払いを行い、そして、支払いを逃した場合には、ボブの負債(debt)が債権回収段階(debt collection phase)に入るように、構築され得るだろう。従って、ボブが彼の毎月の支払いを行う限り、現在の状態は返済状態のままである。しかしながら、ボブが支払いを逃したことを示す入力を外部のエンティティが提供する場合に、状態は、未払い状態(missed payment state)へ分岐する。未払い状態において、アリスは、トランザクションをリリース(release)し、そして、それを債権回収者に引き渡す(turn over)ことができ、その結果、トラストレスな、決定論的状態マシンは、債権回収状態に切り替わる。債権回収状態において、債権回収者は、ボブから負債を回収する。そうしたスマートコントラクトは、
図2および
図3に示される実施形態のスクリプトにおけるバリエーションを使用して作成することができる。
【0062】
別の例において、アリスは、毎月1ユニットのデジタルアセットを寄付している非常に慈善的な人物である。彼女のルールは、誰でもデジタルアセットを請求できるが、毎月には1ユニットだけ請求できるというものである。アリスは、本開示において説明される方法でスマートコントラクトを作成し、そして、デジタルアセット3ユニットの初期プールを用いてそれをシード(seed)する。アリスは、任意のエンティティが毎月に1ユニットのデジタルアセットを取得できるスクリプトを構築することができる。デジタルアセットの残りの部分は、後続のスマートコントラクトに対して複製(replicated)される。
【0063】
他の実施形態においては、ブロックチェーンを使用する広範なスマートコントラクトをサポートするために、ここにおいて説明されるロッキングスクリプトの原理およびオペレーションが拡張され得る。
【0064】
以下の表2は、本開示のトラストレス決定論的状態マシンを実装するアンロッキングスクリプトおよびロッキングスクリプトの1つの例を示している。
【表2-1】
【表2-2】
【0065】
図4A-
図4Cは、集合的に、スマートコントラクトの一部として、支出トランザクションのアンロッキングスクリプトおよび以前トランザクションのロッキングスクリプトを実行する例示的なオペレーションを説明しているフローチャートである。このオペレーションは、支出トランザクションの妥当性確認プロセス(validation process)の一部であってよい。支出トランザクションは、本開示の実施形態に従ってトラストレス決定論的状態マシンを実装するバイトコードシーケンスを伴うロッキングスクリプトを含んでいる。ロッキングスクリプトは、また、次の状態実行ポインタ(または「次の実行ポインタ(“next execution pointer”)」)および状態マシンの次の実行状態を表すシリアル化状態データを含む。次の実行ポインタは、ロッキングスクリプトの一部として、次の実行状態に対応するバイトコードシーケンスの実行ポイントを参照する。シリアル化状態データは、ロッキングスクリプトの一部として、支出トランザクションのロッキングスクリプトに含まれる次の実行ポインタによって参照される実行ポイントにおけるバイトコードシーケンスによって表される状態マシンの実行状態を表す。
【0066】
支出トランザクションのロッキングスクリプトの一部として含まれているシリアル化状態データは、支出トランザクションのロッキングスクリプトに含まれる次の実行ポインタを生成またはアクセスし、以前トランザクションのロッキングスクリプトのシリアル化状態データを使用して状態マシンの現在の実行状態を復元し、次いでロッキングスクリプトのバイトコードシーケンスを実行することによって支出トランザクションを作成するときに決定できることに留意する。そうした実行は、以前トランザクションのロッキングスクリプトに含まれる現在の実行ポインタに対応するポイント(またはオペレーション)において開始し、そして、支出トランザクションのロッキングスクリプトに含まれる次の実行ポインタに対応するポイント(またはオペレーション)において終了する。そうした実行は、また、支出トランザクションのアンロッキングスクリプトの入力を使用することもできる。支出トランザクションの作成は、ウォレット(wallet)、エージェントノード、またはブロックチェーンネットワークのいくらかの他のノードを含むオペレーションを含むことができるものと考えられる。
【0067】
図4A-
図4Cのオペレーションのいくらか又は全て(または、説明される他の任意のプロセス、もしくは、これらのプロセスの変形及び/又は組み合わせ)は、実行可能な命令及び/又は他のデータを用いて構成された1つまたはそれ以上のコンピュータシステムの制御の下で実行することができ、そして、1つまたはそれ以上のプロセッサ上で集合的に実行する実行可能な命令として実装することができる。実行可能な命令及び/又は他のデータは、非一時的な、コンピュータで読取り可能な記憶媒体において保管され得る(例えば、磁気媒体、光学媒体、またはフラッシュ媒体において永続的に保管されたコンピュータプログラム)。
【0068】
例えば、
図4A-
図4Cのオペレーションのいくらか又は全ては、
図1の例示的なブロックチェーンネットワーク100といった、例示的なブロックチェーンネットワークにおける確認ノードによって実行され得る。そうした確認ノードは、任意の適切なコンピューティングデバイスから構成され得る(例えば、データセンタ内のサーバにより、クライアントコンピューティングデバイスにより、計算リソースサービスプロバイダの分散システム内の複数のコンピューティングデバイスにより、または、
図13のコンピューティングデバイス2600といった電子クライアント装置による)。
【0069】
以前トランザクションのロッキングスクリプトと支出トランザクションのバイトコードシーケンスが同じであることを検証する
図4A-
図4Cのオペレーションは、以前トランザクションから現在の実行状態を取得し、支出トランザクションのアンロッキングスクリプトの実行から入力を取得し、ロッキングスクリプトのバイトコードシーケンスの解釈に少なくとも部分的に基づいて次の実行状態を決定し、そして、ロッキングスクリプトの実行から決定された次の実行状態が、支出トランザクションのロッキングスクリプトの一部として含まれる次の状態データによって表される次の実行状態と一致することを検証する。
図4A-
図4Cのオペレーションは、表2に見られる例示的なスクリプトのバリエーションを反映している。以前トランザクションのロッキングスクリプト(例えば、scriptPubKey)、並びに、支出トランザクションのアンロッキングスクリプト(例えば、scriptSig)およびロッキングスクリプト(例えば、scriptPubKey)は、全て仮想メモリに保管されており、これは、スタック、スタックフレーム(stack frame)、またはヒープ(heap)といった、1つまたはそれ以上のランタイムデータ構造によって具現化することができる。
【0070】
401においては、終了条件が満たされているか否かが判断される。実施形態において、終了条件は、満たされた際に、ロッキングスクリプトのバイトコードシーケンスによって表される状態マシン遷移を終了させる条件であり得る。終了条件が満たされた場合に、オペレーションは435へ進み、そこでは、ロッキングスクリプトのさらなる複製が回避され、そうして、スマートコントラクトの一部としてのロッキングスクリプトの複製が終了し、そして、以下に説明されるようにオペレーションは427および429へ続く。終了条件が満たされない場合に、オペレーションは403へ続く。
【0071】
403においては、以前トランザクションのロッキングスクリプトのバイトコードシーケンスが仮想メモリから読み出され(retrieved)、支出トランザクションのロッキングスクリプトのバイトコードシーケンスが仮想メモリから読み出され、そして、2つのロッキングスクリプトのバイトコードシーケンスが相互に比較され、それらが一致するかを判断する。
【0072】
405においては、403において比較された2つのロッキングスクリプトのバイトコードシーケンスが相互に一致するか判断される。一致しない場合に、オペレーションは433へ進み、そこで、支出トランザクションは無効であると決定される。一致する場合には、オペレーションは407へ続く。
【0073】
407においては、(以前トランザクションのロッキングスクリプトに含まれている)ロッキングスクリプトのバイトコードシーケンスの現在の実行状態に対する実行ポインタが仮想メモリから読み出される(retrieved)。
【0074】
409においては、(支出トランザクションのロッキングスクリプトに含まれている)ロッキングスクリプトのバイトコードシーケンスの次の実行状態に対する実行ポインタが仮想メモリから読み出される。
【0075】
411においては、(以前トランザクションのロッキングスクリプトに含まれている)ロッキングスクリプトの現在の状態データが仮想メモリから読み出され、そして、仮想メモリ内のロッキングスクリプトのバイトコードシーケンスの実行状態を復元(restore)するために使用される。例えば、ロッキングスクリプトの現在の状態データは、シリアル化フォーマットで仮想メモリから読み出され、そして、次いで、ロッキングスクリプトのバイトコードシーケンスの以前の実行の終了時に存在した仮想メモリのスタックデータ構造の復元において使用するためにスタックフォーマットへと非シリアル化(deserialized)され得る(ここで、以前トランザクションのロッキングスクリプトに含まれているので、実行ポインタは現在の状態実行ポインタにあった)。
【0076】
413においては、(以前トランザクションのロッキングスクリプトに含まれる)ロッキングスクリプトのバイトコードシーケンスが仮想メモリに保管された入力または複数の入力に基づいて実行される可能性がある。ロッキングスクリプトのバイトコードシーケンスの実行は、407で読み出されたロッキングスクリプトのバイトコードシーケンスの現在の実行状態に対する実行ポインタで開始し、そして、409で読み出されたロッキングスクリプトのバイトコードシーケンスの次の実行状態に対する実行ポインタに到達したときに終了する。実施形態において、ロッキングスクリプトのバイトコードシーケンスのバイトコードは、支出トランザクションを確認するノードのランタイムシステム(例えば、ブロックチェーンクライアント)の一部であるソフトウェアインタープリタによる解釈を含む、効率的な実行のために設計されたコンピュータ命令であるが、マシンコードではない(そして、従って、特定のCPUハードウェアに結び付けられていない)。ソフトウェアインタープリタの実行は、(例えば、ロッキングスクリプトのバイトコードシーケンスの現在の実行状態の実行ポインタからロッキングスクリプトのバイトコードシーケンスの次の実行状態の実行ポインタへ)バイトコードシーケンスセグメントのバイトコードを、実行時に必要に応じて支出トランザクションを確認し、かつ、特定のCPUハードウェア上でマシンコードを実行する、ノードの特定のCPUハードウェアにおける実行に適したマシンコードへと変換するように構成することができる。ソフトウェアインタープリタの実行は、バイトコードシーケンスセグメントのバイトコードを、一度に連続的に1つのバイトコードへと変換し(例えば、単純な解釈(simple interpretation))、または、コードシーケンスセグメント(またはその一部)が実行時に必要に応じてマシンコードへとコンパイルされ、そして、次いで、結果としてのマシンコードが実行される、ジャストインタイム(just-in-time)コンパイル方法を使用することができる。結果としてのマシンコードは、再コンパイルを必要とすることなく、後で、キャッシュされ、そして、再利用される可能性がある。
【0077】
415においては、ロッキングスクリプトのバイトコードシーケンスの実行が、ロッキングスクリプトのバイトコードシーケンスの次の実行状態に対する実行ポインタに対応するポイントに達したか否かが判断される。そうでない場合に、オペレーションは、413へ戻り、そこで、ロッキングスクリプトのバイトコードシーケンスの実行が継続する。そうである場合、オペレーションは、417へ続く。
【0078】
417においては、仮想メモリに保管された結果としての実行状態が真であるとして(as true)評価されるか否かが判断される。実施形態において、このチェックは、支出トランザクションのアンロッキングスクリプトのオペレーションおよび以前トランザクションのロッキングスクリプトのオペレーションの両方がエラーなしに完了したこと、および、支出トランザクションのアンロッキングスクリプトおよび以前トランザクションのロッキングスクリプトによってエンコードされた、いくらかの又は全ての条件が満たされたことを確保する。そうでない場合に、オペレーションは433へ続き、そこで、支出トランザクションは無効であると決定される。そうである場合、オペレーションは419へ続く。
【0079】
419においては、(ロッキングスクリプトのバイトコードシーケンスの次の実行状態に対する実行ポインタが到達された後で)仮想メモリに保管されたロッキングスクリプトのバイトコードシーケンスの結果としての実行状態が、ロッキングスクリプトのバイトコードシーケンスの次の実行状態を表すシリアル化状態データとして構成され、そして、保管される。シリアル化状態データは、支出トランザクションに含まれるようにシリアル化フォーマットで仮想メモリに保管される。
【0080】
421においては、ロッキングスクリプトのバイトコードシーケンスの次の実行状態を表すシリアル化状態データが、仮想メモリから読み出される。
【0081】
423においては、シリアル化状態データが一致するかを判断するために、419において決定された、ロッキングスクリプトのバイトコードシーケンスの次の実行状態を表すシリアル化状態データが、421において仮想メモリから読み出され、支出トランザクションに含まれる、ロッキングスクリプトのバイトコードシーケンスの次の実行状態を表すシリアル化状態データに対して比較される。
【0082】
425においては、シリアル化状態データが一致するか否か判断される。そうでない場合に、オペレーションは433へ進み、そこで、支出トランザクションは無効であると決定される。そうである場合、オペレーションは427および429へ続く。
【0083】
427および429において、オペレーションは、支出トランザクションの確認について1つまたはそれ以上の他の条件が満たされているか否かを判断する。そうした条件は、支出トランザクションのロッキングスクリプトまたはアンロッキングスクリプトにおいて指定された他の制約を含み得るものである。そうである場合に、オペレーションは431へ続き、そこで、支出トランザクションは、確認プロセスを実行するシステムによって妥当であるとみなすことができる。そうでない場合、オペレーションは433へ続き、そこで、支出トランザクションは無効であると決定される。401-435において実行される1つまたはそれ以上のオペレーションは、並列を含む、様々な順序および組み合わせにおいて実行され得ることに留意する。
【0084】
また、(例えば、431において)支出トランザクションが妥当であると判断され、そして、ブロックチェーンに保管されている可能性があるとき、および、その場合には、支出トランザクションのロッキングスクリプトのバイトコードシーケンスが、「新たな(“new”)」支出トランザクションを生成するために複製(replicated)され得ることにも留意する。このようにして、「古い(“old”)」支出トランザクションの一部が、それを支出するトランザクションの中へ複製される。この場合に、「新たな」支出トランザクションの入力は、この「古い」支出トランザクションを参照することができ、そして、「新たな」支出トランザクションの出力は、この「古い」支出トランザクションのロッキングスクリプトのバイトコードシーケンスのコピーを含むロッキングスクリプトを含むことができる。「新たな」支出トランザクションの確認プロセスは、確認プロセスの一部として、「古い」支出トランザクションを以前トランザクションと同等視(equate)することができる。
【0085】
また、「新たな」支出トランザクションを確認するときに実行されるロッキングスクリプトのバイトコードオペレーションの数は、「古い」支出トランザクションに含まれるロッキングスクリプトの現在の実行状態の実行ポインタと「新たな」支出トランザクションに含まれるロッキングスクリプトの次の実行状態の実行ポインタとの間の差異によって規定(dictated)されるが、「新たな」支出トランザクションに含まれるロッキングスクリプトの次の実行状態の実行ポインタを選択または変更することにより設計によって変化させることができる。このようにして、「新たな」支出トランザクションを確認するときに実行されるロッキングスクリプトのバイトコードオペレーションの数は、制約(constrained)され、または、「新たな」支出トランザクション(ロッキングスクリプトを支払う(spending)トランザクションである)における制約のパラメータ化において使用され得る。このパラメータ化された制約は、トランザクション間で実行されるバイトコードオペレーションの数を制限するため(例えば、スマートコントラクトのバイトコードシーケンスの非効率的なオペレーションを回避するため)、支出トランザクションのシーケンス上で実行される異なるセグメントへとスマートコントラクトのバイトコードシーケンスを論理的に分割するため、パラメータ化された制約に基づいて新たなトランザクションを作成するエンティティに対する報酬(reward)を計算するため、または、他の可能な使用のために使用され得る。
【0086】
また、上述の1つまたはそれ以上の実施形態においては、所与のロッキングスクリプトについて、支出トランザクションは、その入力の1つにおけるロッキングスクリプトを参照するトランザクションであり、そして、以前トランザクションは、支出トランザクションの入力の1つにおいて参照されるロッキングスクリプトを含むトランザクションであることにも留意する。さらに、支出トランザクションの入力が存在するのと同じだけ多くの以前トランザクションが存在し得る。さらに、ブロックチェーンプロトコルは、ロッキングスクリプトが支出トランザクション、または以前トランザクションの1つをクエリ(query)することを許可しなくてよい。しかしながら、トランザクションは単に特定のプロパティを伴うだけのデータであり、そして、ロッキングスクリプトは単に所定のデータを含むようにアンロッキングスクリプトにおける制約をエンコードするだけなので、これらのプロパティは、支出トランザクションおよび以前トランザクションをアンロッキングスクリプトの中へ注入(injection)させるロッキングスクリプトを提供するために利用することができる。これにより、ロッキングスクリプトは、支出トランザクションを制約し(例えば、支出トランザクションは1つの出力を有することを要する)、そして、また、以前トランザクションからデータを抽出することができる。ロッキングスクリプトは、既にブロックチェーンに書き込まれているため、以前トランザクションを制約することができないことに留意する。両方の手段の組み合わせは、ロッキングスクリプトが、以前トランザクションからデータを抽出し、そして、以前トランザクションおよび支出トランザクションのロッキングスクリプトが同じバイトコードシーケンスを含む場合に支出トランザクションを制約できることを意味する。
【0087】
さらに、ロッキングスクリプトのバイトコードシーケンス、並びに、アンロッキングおよびロッキングスクリプト自体は、コンピュータプログラムであるとみなすことができる。そういうものとして、アンロッキングおよびロッキングスクリプトは、アンロッキングおよびロッキングスクリプトを実行するCPUのメモリシステムに対するアクセスを要求する。実施形態において、メモリシステムの一部は、ここにおいて仮想メモリとして参照されるが、バイトコードシーケンス、および、ロッキングスクリプトおよびアンロッキングスクリプトの関連データを保管するために割り当てられ、そして、管理され得る。
【0088】
ここにおいて説明されているロッキングスクリプトのバイトコードインタープリタは、システムの設計によって指示されるように種々のバイトコードオペレーションをサポートするように構成され得ることに留意する。しかしながら、サポートされるバイトコードオペレーションのセットが仮想メモリとのインタラクションを可能にすることはほぼ確実である。ビットコインスクリプト言語においては、メモリ管理を取扱うバイトコードの範囲が存在する。少数が以下に示されている。
・OP_TOALTSTACK:トップアイテムをメインスタックから代替スタックのトップへ移動する
・OP_FROMALTSTACK:トップアイテムを代替スタックからメインスタックのトップへ移動する
・OP_SWAP:スタックの上位2つのアイテムを入れ替える(swap)
・OP_PICK:スタック内の特定のアイテムを取得し、トップへコピーする
・OP_ROLL:スタック内の特定のアイテムを取得し、トップへ置く
【0089】
さらに、ここにおいて説明される実施形態において、ロッキングスクリプトのバイトコードシーケンスは、確認ノードのランタイムシステム(例えば、ブロックチェーンクライアント)のソフトウェアインタープリタによってサポートされている、ローレベルバイトコードオペレーションの対応するシーケンスまたは組み合わせへと解釈(interpreted)されるハイレベルバイトコードオペレーション(または「仮想バイトコードオペレーション」)を含むことができる。この場合に、ロッキングスクリプトのバイトコードシーケンスは、ソフトウェアがオペレーティングシステムの上でどのように実行するのかと同じように、本質的にはプログラム内のプログラムである。そうした実施形態において、ロッキングスクリプトに対する状態データおよび実行ポインタは、
図5に示されるように仮想メモリ内に存在する2つの仮想スタックにおいて維持することができる。これらは、一般的に、仮想メインスタック(Virtual Main Stack)および仮想代替スタック(Virtual Alt Stack)として参照され、そして、ビットコインのメインスタックの一部として保管することができる。仮想メインスタックは、仮想代替スタックのトップに(on top)あることに留意する。これら2つのスタックデータ構造の開始を追跡するために、メインスタックは仮想メインスタックのトップへのポインタを含んでいる。これら2つのスタックデータ構造それぞれは、1セットのアイテムを保管することができる。最初はスタック高さ(それ自身はカウントしない)であり、その後にデータが続くものである。この構成において、ロッキングスクリプトに対する状態データおよび実行ポインタは、別のより大きな仮想メモリデータ構造(メインスタック)の中に埋め込まれている2つの仮想メモリデータ構造(仮想メインスタックおよび仮想代替スタック)において効果的に保管される。
【0090】
例えば、表3Aおよび表3Bは、VOP_SWAPおよびVOP_DROPとして参照される、2つのハイレベルバイトコードオペレーションを示しており、
図5の仮想メインスタックおよび仮想代替スタックにおいて以下のようにオペレーションする。
【表3A】
【表3B】
【0091】
これら2バイトコードオペレーションのスクリプトは、それぞれのオペレーションを実行する前にあらゆる必要なエラーチェック(例えば、仮想メインスタック高さ≧2)が実行されることを前提としていることに留意する。
【0092】
ここにおいて説明される実施形態においては、以前トランザクションに含まれるロッキングスクリプトのバイトコードシーケンスの現在の実行状態が、処理のために仮想メモリから抽出され、または、読み出される(例えば、上述の411を参照のこと)。同様に、ロッキングスクリプトのバイトコードシーケンスの実行の後に、仮想メモリに保管されるロッキングスクリプトのバイトコードシーケンスの結果としての実行状態は、シリアル化状態データとして構成され、そして、支出トランザクションのロッキングスクリプトに含まれているシリアル化状態データと比較される(例えば、上述の419、421および423を参照のこと)。実施形態において、ロッキングスクリプトの状態データは、2つのフォーマットを有している。トランザクション内に埋め込むための第1シリアル化フォーマット、および、仮想メモリにおける「容易/直接的(“easy/direct”)」解釈および操作のための第2フォーマットである。さらに、第1シリアル化フォーマットから第2フォーマット(上述の411の一部であり得る)への変化は、非シリアル化(deserialization)として参照することができ、そして、第2フォーマットから第1シリアル化フォーマットへの変化は、シリアル化(上述の419の一部であり得る)として参照され得る。
図5は、第2フォーマットを示している。
図6は、第1シリアル化フォーマットを示しており、ここで、実行状態データは、以下を含む順序付けられたバイト文字列(byte string)によって表される。
-スタック高さフィールド、バイト文字列内のスタックアイテムの数をエンコードする
-それぞれがサイズフィールドとデータフィールドを含むいくつかのスタックアイテム、ここで、サイズフィールドはスタックアイテムのデータフィールドのバイト数を示す
【0093】
図7は、ロッキングスクリプトのバイトコードシーケンスの現在の状態を復元するやり方で(例えば、上述の411を参照のこと)、仮想メモリ内に保管するための以前トランザクションに含まれる、ロッキングスクリプトのバイトコードシーケンスの現在の実行状態を表すバイトストリングの非シリアル化を説明している。
図5の仮想メインスタックおよび仮想代替スタック内に保管するための以前トランザクションに含まれている、ロッキングスクリプトのバイトコードシーケンスの現在の状態を表すバイトストリングを非シリアル化するスクリプトの1つの例が以下の表4に示されている。
【表4-1】
【表4-2】
【表4-3】
【0094】
図8は、仮想メモリに保管されたロッキングスクリプトのバイトコードシーケンスの結果としての実行状態を、支出トランザクションに含まれるロッキングスクリプトのバイトコードシーケンスの次の状態データを表すシリアル化バイト文字列へとシリアル化することを示している(例えば、上述の419を参照のこと)。
図5の仮想メインスタックおよび仮想代替スタックに保管されたロッキングスクリプトのバイトコードシーケンスの結果としての実行状態を、支出トランザクションに含まれるロッキングスクリプトのバイトコードシーケンスの次の状態データを表すシリアル化バイト文字列へとシリアル化するスクリプトの一つの例が、以下の表5に提供されている。
【表5-1】
【表5-2】
【0095】
実施形態において、支出トランザクションのシーケンスにわたり複製されるロッキングスクリプトは、ロッキングスクリプトのバイトコードシーケンスを解釈するために使用されるインタープリタコード(interpreter code)を含むことができる。インタープリタコードは、確認ノードのランタイムシステム(例えばブロックチェーンクライアント)のソフトウェアインタープリタによってサポートされるローレベルバイトコードオペレーションを拡張または補足する、ハイレベルバイトコードまたはコマンドの変換をサポートすることができる。例えば、インタープリタコードは、ハイレベルバイトコード(または仮想バイトコード)を、確認ノードのランタイムシステムのソフトウェアインタープリタによってサポートされるローレベルバイトコードオペレーションに係る各シーケンスまたは組み合わせへと変換することをサポートすることができる。この場合に、インタープリタコードは、表3Aおよび表3Bの仮想バイトコードオペレーションVOP_SWAPおよびVOP_DROPを、ビットコインスクリプト言語に属し、かつ、確認ノードのランタイムシステム(例えば、ビットコインクライアント)のソフトウェアインタープリタによってサポートされるop_codesまたはコマンドへと変換することをサポートすることができる。別の例において、インタープリタコードは、確認ノードのランタイムシステムのソフトウェアインタープリタによる解釈のために、ハイレベルプログラミング言語で書かれたスクリプトバイトコードオペレーションの翻訳をサポートすることができる。この場合に、インタープリタコードは、ハイレベルプログラミング言語で書かれたスクリプトバイトコードオペレーションを、ビットコインスクリプト言語に属し、かつ、確認ノードのランタイムシステムのソフトウェアインタープリタによってサポートされるop_codeまたはコマンドへと変換することをサポートすることができる。
【0096】
さらに、実施形態において、スマートコントラクトの各支出トランザクションに対する確認プロセスは、以前トランザクションからロッキングスクリプトのバイトコードシーケンスを抽出すること、支出トランザクションからロッキングスクリプトのバイトコードシーケンスを抽出すること、これら2つの抽出されたバイトコードシーケンスが相互に一致するのを検証すること、以前トランザクションからロッキングスクリプトのインタープリタコードを抽出すること、支出トランザクションからロッキングスクリプトのインタープリタコードを抽出すること、および、これら2つの抽出されたインタープリタコードが相互に一致するのを検証すること、を含み得る。
【0097】
図9は、本開示の一つの実施形態に従って、トラストレスな、決定論的状態マシンを実施するために、共通バイトコードシーケンスおよび共有インタープリタコードを有するロッキングスクリプトを使用する例示的なトランザクションを示している。より具体的に、共通のバイトコードシーケンスは、良好に定義された(well-defined)状態のセットを用いて状態ルールを具現化する状態マシンとして考えることができるコンピュータプログラムであり、それによって、バイトコードシーケンス(コンピュータプログラム)のバイトコードの実行は、状態マシンの状態間の遷移を提供する。共有インタープリタコードは、ロッキングスクリプトのバイトコードシーケンスの解釈をサポートする。
【0098】
図9に概略的に示されるように、以前トランザクション302'は、状態マシン306'のための状態ルールのセットを表すバイトコードシーケンス、並びに、ロッキングスクリプト304'のバイトコードシーケンスの解釈をサポートするインタープリタコードを有するロッキングスクリプト304'を含んでいる。ロッキングスクリプト304'は、また、現在の状態実行ポインタ(または「現在の実行ポインタ」)、および、ロッキングスクリプト304'のバイトコードシーケンスによって表される状態マシン306'の状態の中で現在の状態を表すシリアル化状態データも含んでいる。図示された例において、ロッキングスクリプト304'の現在の実行ポインタおよびシリアル化状態データは、現在の状態「S1」を表し、そして、バイトコードシーケンスによって表される状態マシン306'の状態ルールのセットは、現在の状態S1に続く次の状態について2つの可能な状態(「S2」または「S3」)を提供する。ロッキングスクリプト304'の一部として含まれる現在の実行ポインタは、現在の状態(この場合は、「S1」)に対応するバイトコードシーケンスの実行点を参照する。ロッキングスクリプト304'の一部として含まれるシリアル化状態データは、ロッキングスクリプト304'に含まれる現在の実行ポインタによって参照される実行ポイントにおけるバイトコードシーケンスによって表される状態マシンの状態を表している。
【0099】
図9の例を見れば分かるように、支出トランザクション308'は、状態マシン314'に対する状態ルールのセットを表すバイトコードシーケンス、並びに、ロッキングスクリプト312'のバイトコードシーケンスの解釈をサポートするインタープリタコードを伴うロッキングスクリプト312'を含んでいる。状態マシン314'は、以前トランザクション302'のロッキングスクリプト304'のバイトコードシーケンスによって表される状態マシン306'のコピーであり、そして、インタープリタコードは、以前トランザクション302'のロッキングスクリプト304'のインタープリタコードのコピーである。ロッキングスクリプト312'は、また、次の状態実行ポインタ(または「次の実行ポインタ」)、および、現在の状態S1に続く可能性のある次の状態の1つ(この場合は、状態「S2」)を表すシリアル化状態データを含んでいる。ロッキングスクリプト312'の一部として含まれる次の実行ポインタは、現在の状態S1に続く次の状態(この場合は、状態「S2」)に対応するバイトコードシーケンスの実行点を参照する。ロッキングスクリプト312'の一部として含まれるシリアル化状態データは、ロッキングスクリプト312'に含まれる次の実行ポインタによって参照される実行ポイントでのバイトコードシーケンスによって表される状態マシンの状態を表している。
【0100】
ロッキングスクリプト312'に含まれるシリアル化状態データは、ロッキングスクリプト312'に含まれる次の実行ポインタを生成またはアクセスすることによって、支出トランザクションを作成するときに決定され得ることに留意する。ロッキングスクリプトのバイトコードシーケンスの現在の実行状態を復元するために以前トランザクションのロッキングスクリプト304'のシリアル化状態データを使用し、そして、次いで、ロッキングスクリプトのバイトコードシーケンスを実行するものである。そうした実行は、以前トランザクション302'に含まれる現在の実行ポインタに対応するポイント(またはオペレーション)で始まり、そして、ロッキングスクリプト312'に含まれる次の実行ポインタに対応するポイント(またはオペレーション)で終了する。そうした実行は、また、支出トランザクション308'のアンロッキングスクリプトの実行によって決定された入力データ310'を使用することもできる。
【0101】
支出トランザクション308'の確認の一部として、支出トランザクション308'のアンロッキングスクリプトおよびロッキングスクリプト304'/3122の共通バイトコードシーケンスが実行される。共通バイトコードシーケンスの実行は、支出トランザクション308'のアンロッキングスクリプトの実行により決定された入力データ310'と、現在の実行ポインタおよび以前トランザクション302'のロッキングスクリプト304'に含まれるシリアル化状態データよって具現化された現在の状態「S1」と、支出トランザクション308'のロッキングスクリプト312'に含まれる次の実行ポインタと、を入力としてとり、そして、以前トランザクション302'のロッキングスクリプト304'に含まれる現在の状態実行ポインタに対応するポイント(またはオペレーション)から、支出トランザクション308'のロッキングスクリプト312'に含まれる次の実行ポインタに対応するポイント(またはオペレーション)まで、ロッキングスクリプトの共通バイトコードシーケンスを解釈するために共有インタープリタコードを実施する。そうした解釈は、バイトコードシーケンスによって表される状態ルールのセット314'から適切な次の状態(第2状態「S2」といったもの)を決定する。この次の状態(状態「S2」といったもの)は、支出トランザクション308'のロッキングスクリプト312'に含まれる次の実行ポインタに対応するポイント(またはオペレーション)までのバイトコードシーケンスの解釈から決定されるものであるが、支出トランザクション308'のロッキングスクリプト312'の一部として含まれる状態データのシリアル化フォーマットに従うシリアル化状態データとして構成される。バイトコードシーケンスの解釈から決定されたシリアル化状態データは、次に、支出トランザクション308'のロッキングスクリプト312'の一部として含まれるシリアル化状態データに対して検証される。再び、各トランザクションについて異なる支出トランザクションを作成するのではなく、むしろ、ロッキングスクリプトの実行は、支出トランザクションの確認中にロッキングスクリプトのバイトコードシーケンスの実行から生じる結果が、支出トランザクションを作成するとき、支出トランザクションに含まれるロッキングスクリプトの期待される結果として生じる実行状態と一致することを強制する。これら2つの結果として生じる実行状態が同一である場合に、支出トランザクション308'に対するロッキングスクリプトは妥当であると保証される。
【0102】
図9の例は、支出トランザクション308'のロッキングスクリプト312'のバイトコードシーケンスによって表される状態マシンの状態が、状態「S2」からの次の状態遷移について可能な新たな状態「S4」または「S5」を提供することを示していることに留意する。ロッキングスクリプトのバイトコードシーケンスによって表される状態ルールのセットは、現在の状態および1つまたはそれ以上の入力によってパラメータ化されたスイッチステートメントまたは他の条件ステートメント(例えば、「そうである場合に(“if-then-else“)」)としてコード化され得ることに留意する。
【0103】
実施形態において、トランザクションのロッキングスクリプトに含まれるバイトコードシーケンスは、状態マシンの状態ルールのセットを表し、そして、実行ポインタおよびトランザクションのロッキングスクリプトに含まれるシリアル化状態データは、状態マシンの状態を表している。ロッキングスクリプトは、また、ロッキングスクリプトのバイトコードシーケンスの解釈のために使用されるインタープリタコードをも含んでいる。そうした実施形態において、トランザクションのロッキングスクリプトのバイトコードシーケンスおよびインタープリタコードは、デジタルアセットの制御を次のトランザクションへ移転しようと試みる全ての支出トランザクションにコピーまたは複製され、現在のトランザクションへリンクされなければならない。このプロセスは、終了条件が満たされるまで繰り返される。支出トランザクションのアンロッキングスクリプトの実行から決定された入力データが、固定されておらず、そして、未決定データであり得るので、状態マシンの状態は、特定の外部入力に基づいて変更がなされ得る。従って、未決定データは、次の状態に影響し得る入力を提供する。
【0104】
さらに、支出トランザクションの確認時に解釈されるロッキングスクリプトのバイトコードオペレーションの数は、以前トランザクションに含まれるようなロッキングスクリプトのバイトコードシーケンスの現在の実行状態に係る実行ポインタと支出トランザクションに含まれるようなロッキングスクリプトのバイトコードシーケンスの次の実行状態に係る実行ポインタとの差異によって決まるものであるが、支出トランザクションに含まれるようなロッキングスクリプトのバイトコードシーケンスの次の実行状態に係る実行ポインタを選択し、または、変更することによるデザインによって変化させ得るものである。このようにして、支出トランザクションの確認時に解釈されるロッキングスクリプトのバイトコードオペレーションの数は、制約されるか、または、支出トランザクション(ロッキングスクリプトを使用するトランザクション)の制約のパラメータ化において使用され得る。このパラメータ化された制約は、トランザクション間で解釈されるバイトコードオペレーションの数を制限するため(例えば、スマートコントラクトのバイトコードシーケンスの非効率的なオペレーションを回避するため)、支出トランザクションのシーケンスにわたり実行される異なるセグメントへとスマートコントラクトのバイトコードシーケンスを論理的に分割するため、パラメータ化された制約に基づいて新たなトランザクションを作成するエンティティに対する報酬を計算するため、または、他の可能な使用のために使用され得る。
【0105】
以下の表6は、本開示のトラストレスな決定論的状態マシンを実装する、アンロッキングスクリプトおよびロッキングスクリプトの一つの例を示している。
【表6-1】
【表6-2】
【0106】
図10A-
図10Cは、集合的に、スマートコントラクトの一部である、支出トランザクションのアンロッキングスクリプトおよび以前トランザクションのロッキングスクリプトを実行する例示的なオペレーションを説明しているフローチャートである。このオペレーションは、支出トランザクションの確認プロセスの一部であってよい。支出トランザクションは、本開示の実施形態に従ってトラストレス決定論的状態マシンを実装するバイトコードシーケンスおよびインタープリタコードを伴うロッキングスクリプトを含んでいる。ロッキングスクリプトは、また、次の状態実行ポインタ(または「次の実行ポインタ」)および状態マシンの次の実行状態を表すシリアル化状態データを含む。次の実行ポインタは、ロッキングスクリプトの一部として、次の実行状態に対応するバイトコードシーケンスの実行ポイントを参照する。シリアル化状態データは、ロッキングスクリプトの一部として、ロッキングスクリプトに含まれる次の実行ポインタによって参照される実行ポイントにおけるバイトコードシーケンスによって表される状態マシンの実行状態を表す。インタープリタコードは、ロッキングスクリプトのバイトコードシーケンスを解釈するために使用される。
【0107】
支出トランザクションのロッキングスクリプトの一部として含まれているシリアル化状態データは、支出トランザクションのロッキングスクリプトに含まれる次の実行ポインタを生成またはアクセスし、以前トランザクションのロッキングスクリプトのシリアル化状態データを使用して状態マシンの現在の実行状態を復元し、次いでロッキングスクリプトのバイトコードシーケンスを実行することによって支出トランザクションを作成するときに決定できることに留意する。そうした実行は、以前トランザクションに含まれる現在の実行ポインタに対応するポイント(またはオペレーション)において開始し、そして、支出トランザクションのロッキングスクリプトに含まれる次の実行ポインタに対応するポイント(またはオペレーション)において終了する。そうした実行は、また、支出トランザクションのアンロッキングスクリプトの入力を使用することもできる。支出トランザクションの作成は、ウォレット、エージェントノード、またはブロックチェーンネットワークのいくらかの他のノードを含むオペレーションを含むことができるものと考えられる。
【0108】
図10A-
図10Cのオペレーションのいくらか又は全て(または、説明される他の任意のプロセス、もしくは、これらのプロセスの変形及び/又は組み合わせ)は、実行可能な命令及び/又は他のデータを用いて構成された1つまたはそれ以上のコンピュータシステムの制御の下で実行することができ、そして、1つまたはそれ以上のプロセッサ上で集合的に実行する実行可能な命令として実装することができる。実行可能な命令及び/又は他のデータは、非一時的な、コンピュータで読取り可能な記憶媒体において保管され得る(例えば、磁気媒体、光学媒体、またはフラッシュ媒体において永続的に保管されたコンピュータプログラム)。
【0109】
例えば、
図10A-
図10Cのオペレーションのいくらか又は全ては、
図1の例示的なブロックチェーンネットワーク100といった、例示的なブロックチェーンネットワークにおける確認ノードによって実行され得る。そうした確認ノードは、任意の適切なコンピューティングデバイスから構成され得る(例えば、データセンタ内のサーバにより、クライアントコンピューティングデバイスにより、計算リソースサービスプロバイダの分散システム内の複数のコンピューティングデバイスにより、または、
図13のコンピューティングデバイス2600といった電子クライアント装置による)。
【0110】
図10A-
図10Cのオペレーションは、スマートコントラクトの以前トランザクションおよび支出トランザクションに係るロッキングスクリプトのバイトコードシーケンスとインタープリタコードの両方が同じであることを検証し、以前トランザクションから現在の実行状態を取得し、支出トランザクションのアンロッキングスクリプトの実行から入力を取得し、ロッキングスクリプトのバイトコードシーケンスの解釈に少なくとも部分的に基づいて次の実行状態を決定し、そして、支出トランザクションのロッキングスクリプトの実行から決定された次の実行状態が、支出トランザクションのロッキングスクリプトの一部として含まれる次の状態データによって表される次の実行状態と一致することを検証する。
図10A-
図10Cのオペレーションは、表6に見られる例示的なスクリプトのバリエーションを反映している。以前トランザクションのロッキングスクリプト(例えば、scriptPubKey)、並びに、アンロッキングスクリプト(例えば、scriptSig)および支出トランザクションのアンロッキングスクリプト(例えば、scriptSig)は、全てが仮想メモリに保管されており、これは、スタック、スタックフレーム、またはヒープといった1つまたはそれ以上のランタイムデータ構造によって実現され得るものである。
【0111】
1001では、終了条件が満たされているか否かが判断される。実施形態において、終了条件は、達成の際に、ロッキングスクリプトのバイトコードシーケンスによって表される状態マシンの遷移を終了させる条件であり得る。終了条件が満たされた場合に、オペレーションは、1039へ進み、そこでは、スマートコントラクトの一部としてのロッキングスクリプトの複製が終了し、そして、以下に説明されるようにオペレーションが1031および1033へ続くように、ロッキングスクリプトのさらなる複製が回避される。終了条件が満たされない場合に、オペレーションは1003へ続く。
【0112】
1003においては、以前トランザクションのロッキングスクリプトのバイトコードシーケンスが仮想メモリから読み出され、かつ、支出トランザクションのロッキングスクリプトのバイトコードシーケンスが仮想メモリから読み出され、そして、2つのロッキングスクリプトのバイトコードシーケンスが相互に比較され、それらが一致するかどうか判断される。
【0113】
1005においては、1003で比較された2つのロッキングスクリプトのバイトコードシーケンスが相互に一致するかどうかが決定される。そうでない場合に、オペレーションは1037へ続き、そこで、支出トランザクションが無効であると決定される。そうである場合、オペレーションは、1007へ続く。
【0114】
1007においては、以前トランザクションのロッキングスクリプトのインタープリタコードが仮想メモリから読み出され、かつ、支出トランザクションのロッキングスクリプトのインタープリタコードが仮想メモリから読み出され、そして、2つのロッキングスクリプトのインタープリタコードが相互に比較され、それらが一致するかどうか判断される。
【0115】
1009においては、1007で比較された2つのロッキングスクリプトのインタープリタコードが相互に一致するかどうかが決定される。そうでない場合に、オペレーションは1037へ続き、そこで、支出トランザクションが無効であると決定される。そうである場合、オペレーションは、1011へ続く。
【0116】
1011においては、ロッキングスクリプトのバイトコードシーケンスの現在の実行状態に対する実行ポインタ(以前トランザクションのロッキングスクリプトに含まれている)が、仮想メモリから読み出される。
【0117】
1013においては、ロッキングスクリプトのバイトコードシーケンスの次の実行状態に対する実行ポインタ(支出トランザクションのロッキングスクリプトに含まれている)が、仮想メモリから読み出される。
【0118】
1015においては、ロッキングスクリプトの現在の状態データ(以前トランザクションのロッキングスクリプトに含まれている)が仮想メモリから読み出され、そして、仮想メモリにおけるロッキングスクリプトのバイトコードシーケンスの実行状態を復元するために使用される。例えば、ロッキングスクリプトの現在の状態データは、シリアル化フォーマットで仮想メモリから取り出され、そして、次いで、スタックフォーマットへと非シリアル化され、ロッキングスクリプトの以前の実行の終わりに存在していた仮想メモリのスタックデータ構造を復元する際に使用される(ここで、実行ポインタは、以前トランザクションのロッキングスクリプトに含まれていた現在の状態実行ポインタにあったものである)。
【0119】
1017においては、インタープリタコード(以前トランザクションのロッキングスクリプトに含まれている)が呼び出され、仮想メモリに保管された入力または複数の入力に基づいて、ロッキングスクリプトのバイトコードシーケンスを解釈する可能性がある。ロッキングスクリプトのバイトコードシーケンスの解釈は、1011で取り出されたロッキングスクリプトの現在の実行状態に対する実行ポインタにおいて開始し、そして、1013で取り出されたロッキングスクリプトの次の実行状態に対する実行ポインタに到達したときに終了する。実施形態において、ロッキングスクリプトのバイトコードシーケンスのバイトコードは、以前トランザクションに含まれるインタープリタコードの実行による解釈のために設計されたコンピュータ命令である。
【0120】
実施形態において、インタープリタコードの実行は、ロッキングスクリプトのバイトコードシーケンスのバイトコードを、確認ノードのランタイムシステム(例えば、ブロックチェーンクライアント)のソフトウェアインタープリタによってサポートされるオペコードまたはコマンドへと変換する。そうしたオペコードまたはコマンドを、
図11に示されるように、確認ノードのCPUハードウェア上で実行されるマシンコードへ変換するものである。インタープリタコードの実行は、確認ノードのランタイムシステムのソフトウェアインタープリタによってサポートされるローレベルのバイトコードオペレーションを拡張または補足する、ハイレベルのバイトコードまたはコマンドの変換をサポートすることができる。例えば、インタープリタコードは、確認ノードのランタイムシステムのソフトウェアインタープリタによってサポートされるバイトコードオペレーションの組み合わせを表す、仮想バイトコードの変換をサポートすることができる。この場合に、インタープリタコードは、表4Aおよび表4Bの仮想バイトコードオペレーションOP_VSWAPおよびOP_VDROPを、ビットコインスクリプト言語に属し、かつ、確認ノードのランタイムシステム(例えば、ビットコインクライアント)のソフトウェアインタープリタによってサポートされるop_codeまたはコマンドへと変換することをサポートすることができる。別の例において、インタープリタコードは、確認ノードのランタイムシステムのソフトウェアインタープリタによる解釈のために、ハイレベルなプログラミング言語で書かれたスクリプトバイトコードオペレーションの変換をサポートすることができる。この場合に、インタープリタコードは、ハイレベルなプログラミング言語で書かれたスクリプトバイトコードオペレーションを、ビットコインスクリプト言語に属し、かつ、確認ノードのランタイムシステムのソフトウェアインタープリタによってサポートされるop_codeまたはコマンドへと変換することをサポートすることができる。ソフトウェアインタープリタの実行は、オペコードまたはコマンドを、1バイトコードへと一度に連続的に変換することができ(例えば、単純解釈(simple interpretation))、あるいは、ジャストインタイムコンパイル方法を使用する可能性がある。バイトコードシーケンスセグメント(またはその一部)が必要に応じてランタイムにおいてマシンコードへとコンパイルされ、そして、次いで、結果としてのマシンコードが実行されるものである。結果としてのマシンコードは、再コンパイルされる必要なく、キャッシュされ、そして、後で再利用される可能性がある。
【0121】
1019においては、インタープリタコードが、ロッキングスクリプトのバイトコードシーケンスを、ロッキングスクリプトのバイトコードシーケンスの次の実行状態のための実行ポインタに対応するポイントに対して解釈されたか否かが判断される。そうでない場合に、オペレーションは1017へ戻り、そこでは、インタープリタコードの実行が続く。そうである場合、オペレーションは、1021へ続く。
【0122】
1021においては、仮想メモリに保管された結果としての実行状態が真であるか否かが判断される。実施形態において、このチェックは、支出トランザクションのアンロッキングスクリプトのオペレーションおよび以前トランザクションのロッキングスクリプトのバイトコードシーケンスのオペレーションの両方がエラーなしに完了したこと、そして、支出トランザクションのアンロッキングスクリプトおよび以前トランザクションのロッキングスクリプトによってエンコードされる全ての条件が満たされたことを確保する。そうでない場合、オペレーションは1037へ続き、そこで、支出トランザクションは無効であると決定される。そうである場合、オペレーションは1023へ続く。
【0123】
1023においては、(ロッキングスクリプトのバイトコードシーケンスの次の実行状態に対する実行ポインタに到達した後で)仮想メモリに保管されたロッキングスクリプトのバイトコードシーケンスの結果としての実行状態が、ロッキングスクリプトのバイトコードシーケンスの次の実行状態を表すシリアル化状態データとして構成され、そして、保管される。シリアル化状態データは、支出トランザクションに含まれるシリアル化フォーマットである。
【0124】
1025においては、ロッキングスクリプトのバイトコードシーケンスの次の実行状態を表すシリアル化状態データが、仮想メモリから読み出される。
【0125】
1027においては、1023で決定された、ロッキングスクリプトのバイトコードシーケンスの次の実行状態を表すシリアル化状態データが、1025において仮想メモリから読み出された支出トランザクションに含まれる、ロッキングスクリプトのバイトコードシーケンスの次の実行状態を表すシリアル化状態データと比較され、シリアル化状態データが一致するかどうかを判断する。
【0126】
1029においては、シリアル化状態データが一致するか否かが決定される。そうである場合に、オペレーションは1031へ続く。そうでない場合、オペレーションは1037へ続き、そこで、支出トランザクションが無効であると決定される。
【0127】
1031および1033において、オペレーションは、支出トランザクションの妥当性について1つまたはそれ以上の他の条件が満たされているか否かを決定する。そうした条件は、以前トランザクションのアンロッキングスクリプトおよび支出トランザクションのロッキングスクリプトにおいて指定された他の制約を含み得る。そうである場合に、オペレーションは1035へ続き、そこで、支出トランザクションは、確認プロセスを実行するシステムによって妥当であるとみなされ得る。そうでない場合、オペレーションは1037へ続き、そこで、支出トランザクションが無効であると決定される。1001-1039で実行されるオペレーションの1つまたはそれ以上は、並列を含む、様々な順序および組み合わせで実行され得ることに留意する。
【0128】
また、支出トランザクションが(例えば、1035で)妥当であると判断され、そして、ブロックチェーンにおいて保管されている可能性がある場合には、「新たな」支出トランザクションを生成するために、支出トランザクションのロッキングスクリプトのバイトコードシーケンスが複製され得ることにも留意する。このようにして、「古い」支出トランザクションの一部が、それを支払うトランザクションへと複製される。この場合に、「新たな」支出トランザクションの入力は、この「古い」支出トランザクションを参照することができ、そして、「新たな」支出トランザクションの出力は、バイトコードシーケンスのコピーを埋め込み、そして、この「古い」支出トランザクションのロッキングスクリプトのインタープリタコードを共有する、ロッキングスクリプトを含むことができる。「新たな」支出トランザクションの確認プロセスは、確認プロセスの一部として、「古い」支出トランザクションを以前トランザクションと同等視することができる。
【0129】
さらに、「新たな」支出トランザクションを確認するときに解釈されるロッキングスクリプトのバイトコードオペレーションの数は、「古い」支出トランザクションに含まれるロッキングスクリプトのバイトコードシーケンスの現在の実行状態の実行ポインタと、「新たな」支出トランザクションに含まれるロッキングスクリプトのバイトコードシーケンスの次の実行状態の実行ポインタとの間の差異によって規定されるが、「新たな」支出トランザクションに含まれるロッキングスクリプトのバイトコードシーケンスの次の実行状態の実行ポインタを選択または変更することにより、設計によって変化させることができる。このようにして、「新たな」支出トランザクションを確認するときに実行されるロッキングスクリプトのバイトコードオペレーションの数は、制約され、または、「新たな」支出トランザクション(ロッキングスクリプトを支払うトランザクションである)における制約のパラメータ化において使用され得る。このパラメータ化された制約は、トランザクション間で実行されるバイトコードオペレーションの数を制限するため(例えば、スマートコントラクトのバイトコードシーケンスの非効率的なオペレーションを回避するため)、支出トランザクションのシーケンス上で実行される異なるセグメントへとスマートコントラクトのバイトコードシーケンスを論理的に分割するため、パラメータ化された制約に基づいて新たなトランザクションを作成するエンティティに対する報酬を計算するため、または、他の可能な使用のために使用され得る。
【0130】
また、上述の1つまたはそれ以上の実施形態においては、所与のロッキングスクリプトについて、支出トランザクションは、その入力の1つにおけるロッキングスクリプトを参照するトランザクションであり、そして、以前トランザクションは、支出トランザクションの入力の1つにおいて参照されるロッキングスクリプトを含むトランザクションであることにも留意する。さらに、支出トランザクションの入力が存在するのと同じだけ多くの以前トランザクションが存在し得る。さらに、ブロックチェーンプロトコルは、ロッキングスクリプトが支出トランザクション、または以前トランザクションの1つをクエリすることを許可しなくてよい。しかしながら、トランザクションは単に特定のプロパティを伴うだけのデータであり、そして、ロッキングスクリプトは単に所定のデータを含むようにアンロッキングスクリプトにおける制約をエンコードするだけなので、これらのプロパティは、支出トランザクションおよび以前トランザクションをアンロッキングスクリプトの中へ注入させるロッキングスクリプトを提供するために利用することができる。これにより、ロッキングスクリプトは、支出トランザクションを制約し(例えば、支出トランザクションは1つの出力を有することを要する)、そして、また、以前トランザクションからデータを抽出することもできる。ロッキングスクリプトは、既にブロックチェーンに書き込まれているため、以前トランザクションを制約することができないことに留意する。両方の手段の組み合わせは、ロッキングスクリプトが、以前トランザクションからデータを抽出し、そして、以前トランザクションおよび支出トランザクションのロッキングスクリプトが同じバイトコードシーケンスを含む場合に支出トランザクションを制約できることを意味する。
【0131】
さらに、ロッキングスクリプトのバイトコードシーケンス、並びに、アンロッキングおよびロッキングスクリプト自体は、コンピュータプログラムであるとみなすことができる。そういうものとして、アンロッキングおよびロッキングスクリプトは、アンロッキングおよびロッキングスクリプトを実行するCPUのメモリシステムに対するアクセスを要求する。実施形態において、メモリシステムの一部は、ここにおいて仮想メモリとして参照されるが、バイトコードシーケンス、および、ロッキングスクリプトおよびアンロッキングスクリプトの関連データを保管するために割り当てられ、そして、管理され得る。
【0132】
図12Aは、ロッキングスクリプトに含まれるバイトコードシーケンスの解釈において、インタープリタコードを実行することによって遂行される例示的なオペレーションを示している。実施形態において、インタープリタコードおよびバイトコードシーケンスの両方は、ここにおいて説明されるように、ロッキングスクリプトの一部として含まれている。
図5の仮想メモリについて、バイトコードシーケンスの解釈は、最初に、ロッキングスクリプトの現在の状態から仮想メインスタックおよび仮想代替スタックを復元すること、そして、次いで、現在の状態の実行ポインタから開始し、次の状態の実行ポインタに到達するまで単一バイトコードを解釈することを含むことができる。
【0133】
バイトコードの解釈の一部として、インタープリタコードの実行は、解釈を必要とする次のバイトコードを得るためにオペレーションすることができる。以下の表7は、OP_GETOPとして参照される、この機能を実行するオペコードを提供している。このオペコードは、本質的に解釈されたバイトコードをとり(takes)、以前トランザクションから現在の位置を抽出し、そして、必要とされるバイト、この場合には次のバイトコード、をスタックのトップへ返す。
【表7】
【0134】
以下の表8は、一つの例示的なバイトコード、特には
図12Bにおいて概略的に示されるVOP_ADDバイトコード、を解釈するようにオペレーションするインタープリタコードの実行を記述するスクリプトである。
【表8】
【0135】
開示された実施形態を説明するコンテクストにおいては、別段の規定がない限り、「命令(“instructions”)」が通常は援助なく(unaided)実行しないオペレーション(例えば、データの送信、計算、等)を実行する、実行可能な命令(コード、アプリケーション、エージェント、等としても参照されるもの)に関する表現の使用は、命令がマシンによって実行されていることを意味し、それによって、指定されたオペレーションをマシンに実行させている。
【0136】
図13は、本開示の少なくとも1つの実施形態を実施するために使用され得る、コンピューティングデバイス2600の例示的な単純化されたブロック図である。様々な実施形態において、コンピューティングデバイス2600は、上記に例示され、説明されたシステムのいずれかを実装するために使用され得る。例えば、コンピューティングデバイス2600は、データサーバ、ウェブサーバ、ポータブルコンピューティングデバイス、パーソナルコンピュータ、または任意の電子コンピューティングデバイスとしての使用のために構成され得る。
図13に示されるように、コンピューティングデバイス2600は、バスサブシステム2604を介して多数のペリフェラルサブシステムと通信し、そして、動作可能に結合されるように構成され得る、1つまたはそれ以上のプロセッサ2602を含んでよい。プロセッサ2602は、ここにおいて説明されるように、支出トランザクションの確認の一部としてアンロッキングスクリプトおよびロッキングスクリプトを処理するために利用され得る。これらのペリフェラルサブシステムは、ストレージサブシステム2606を含んでよく、メモリサブシステム2608およびファイル/ディスクストレージサブシステム2610、1つまたはそれ以上のユーザインターフェイス入力装置2612、1つまたはそれ以上のユーザインターフェイス出力装置2614、およびネットワークインターフェイスサブシステム2616を備えている。そうしたストレージサブシステム2606は、本開示において説明されるトランザクションに関連する詳細といった、情報の一時的または長期間の保管のために使用されてよい。
【0137】
バスサブシステム2604は、コンピューティングデバイス2600の様々なコンポーネントおよびサブシステムが、意図されるように相互に通信することを可能にするメカニズムを提供することができる。バスサブシステム2604は、単一のバスとして模式的に示されているが、バスサブシステムの代替的な実施形態は、複数のバスを利用し得る。ネットワークインターフェイスサブシステム2616は、他のコンピューティングデバイスおよびネットワークへのインターフェイスを提供し得る。ネットワークインターフェイスサブシステム2616は、他のシステムからデータを受信し、そして、コンピューティングデバイス2600から他のシステムへデータを送信するためのインターフェイスとして機能し得る。例えば、ネットワークインターフェイスサブシステム2616は、データ技術者が、ユーザデータセンタといった、遠隔地に居る間にデータを送信および受信できるように、データ技術者がデバイスを無線ネットワークに接続することを可能にし得る。バスサブシステム2604は、詳細、検索語、等といったデータを、本開示の監視モデルに通信するために利用されてよく、そして、監視モデルの出力を、1つまたはそれ以上のプロセッサ2602に対して、かつ、ネットワークインターフェイスサブシステム2616を介して商人(merchant)及び/又は債権者(creditor)に対して通信するために利用されてよい。
【0138】
ユーザインターフェイス入力装置2612は、1つまたはそれ以上のユーザ入力装置を含んでよい。キーボードや、統合マウス、トラックボール、タッチパッド、またはグラフィックスタブレットといったポインティングデバイスや、スキャナや、バーコードスキャナや、ディスプレイの中に組み込まれたタッチスクリーンや、音声認識システム、マイクロフォンといった音声入力装置や、他のタイプの入力装置といったものである。一般的に、用語「入力装置(“input device”)」の使用は、コンピューティングデバイス2600に対して情報を入力するためのあらゆる可能なタイプの装置およびメカニズムを含むように意図されている。1つまたはそれ以上のユーザインターフェイス出力装置2614は、ディスプレイサブシステム、プリンタ、またはオーディオ出力装置といった非視覚的ディスプレイ、等を含んでよい。ディスプレイサブシステムは、ブラウン管(CRT)や、液晶ディスプレイ(LCD)、発光ダイオード(LED)ディスプレイといったフラットパネル装置や、またはプロジェクションもしくは他のディスプレイ装置であってよい。一般的に、用語「出力装置」の使用は、コンピューティングデバイス2600から情報を出力するためのあらゆる可能なタイプの装置およびメカニズムを含むように意図されている。1つまたはそれ以上のユーザインターフェイス出力装置2614は、例えば、ユーザインターフェイスを提示するために使用されてよく、ここにおいて説明されたプロセスおよび変形を実行しているアプリケーションとのユーザ対話(interaction)を、そうした対話が適切であり得る場合に、促進する。
【0139】
ストレージサブシステム2606は、本開示の少なくとも1つの実施形態の機能性を提供し得る基本プログラミングおよびデータ構造を保管するためのコンピュータ読取可能記憶媒体を提供し得る。アプリケーション(プログラム、コードモジュール、命令)は、1つまたはそれ以上のプロセッサによって実行されるとき、本開示の1つまたはそれ以上の実施形態に係る機能性を提供することができ、そして、ストレージサブシステム2606において保管され得る。これらのアプリケーションモジュールまたは命令は、1つまたはそれ以上のプロセッサ2602によって実行され得る。ストレージサブシステム2606は、本開示に従って使用されるデータを保管するためのリポジトリ(repository)を追加的に提供し得る。ストレージサブシステム2606は、メモリサブシステム2608およびファイル/ディスクストレージサブシステム2610を含み得る。
【0140】
メモリサブシステム2608は、プログラム実行の最中に命令およびデータを保管するためのメインランダムアクセスメモリ(RAM)2618および固定された命令が保管され得るリードオンリーメモリ(ROM)2620を含み、多数のメモリを有し得る。ファイル/ディスクストレージサブシステム2610は、プログラムファイルおよびデータファイルのための非一時的な永続性の(不揮発性)ストレージを備えてよく、そして、ハードディスクドライブ、関連するリムーバブル媒体と一緒にフロッピー(登録商標)ディスクドライブ、コンパクトディスクリードオンリーメモリドライブ(CD-ROM)、光学式ドライブ、リムーバブル媒体カートリッジ、および、他の同様の記憶媒体を含み得る。
【0141】
コンピューティングデバイス2600は、少なくとも1つのローカルクロック2624を含み得る。ローカルクロック2624は、特定の開始日から発生した時間(numbers of ticks)を表すカウンタであり、そして、コンピューティングデバイス2600の中に一体的に配置され得る。ローカルクロック2624は、特定のクロックパルスにおいて、コンピューティングデバイス2600のためのプロセッサ及びそこに含まれる全てのサブシステムにおけるデータ転送を同期させるために使用され、そして、コンピューティングデバイス2600とデータセンタ内の他のシステムとの間の同期オペレーションを調整するために使用され得る。一つの実施形態において、ローカルクロック2624は、原子時計(atomic clock)である。別の実施形態において、ローカルクロックは、プログラム可能なインターバルタイマである。
【0142】
コンピューティングデバイス2600は、ポータブルコンピューティングデバイス、タブレットコンピュータ、ワークステーション、または、以下に記載されるあらゆる他の装置を含む、様々なタイプのものであってよい。追加的に、コンピューティングデバイス2600は、1つまたはそれ以上のポート(例えば、USB、ヘッドフォンジャック、ライティングコネクタ(Lightning connector)、等)を介してコンピューティングデバイス2600に接続され得る別の装置を含んでよい。コンピューティングデバイス2600に接続され得る装置は、光ファイバコネクタを受け入れるように構成された複数のポートを含んでよい。従って、この装置は、光信号を、装置を接続しているポートを介してコンピューティングデバイス2600へ処理のために送信され得る電気信号に変換するように構成されてよい。コンピュータおよびネットワークの絶えず変化する性質のため、
図13に示されるコンピューティングデバイス2600の説明は、装置の好ましい実施形態を説明する目的のための特定の例としてだけ意図されたものである。
図13に示されるシステムより多くの又は少ないコンポーネントを有する他の多くの構成が可能である。
【0143】
本明細書および図面は、従って、限定的な意味ではなく、むしろ、例示的な意味に考えられるべきである。しかしながら、請求項に記載される本発明の範囲から逸脱することなく、様々な修正および変更が成され得ることが明らかであろう。同様に、他の変形は本開示の範囲内のものである。従って、開示された技術は、様々な修正および代替的な構成を受けやすいが、それらの所定の例示された実施形態が、図面に示され、そして、上記で詳細に説明されてきた。しかしながら、本発明を開示された特定の形式に限定する意図は存在せず、逆に、添付の請求項において定義されているような、本発明の範囲内にある全ての変更、代替的な構成、および均等物をカバーする意図であることが理解されるべきである。
【0144】
用語「一つの(“a”と“an”)」および「その(“the”)」、ならびに、開示された実施形態を説明するコンテクスト(特に、以降の請求項のコンテクスト)における類似の参照の使用は、別段の指示がない限り、またはコンテクストにより明らかに矛盾しない限り、単数および複数の両方をカバーするものと解釈される。用語「含む(“comprising”、“having”、および“containing”)」は、別段の記載がない限り、オープンエンド(open-end)な用語(すなわち、「含むが、限定されない(“including, but not limited to”)」を意味する)として解釈される。用語「接続された(“connected”)」は、変更されず、かつ、物理的接続を指す場合には、たとえ何らかの介在するものが存在しても、部分的または全体的に、内部に含まれ、取り付けされ、または、一緒に結合されているものと解釈される。本開示における値の範囲の引用は、別段の指示がない限り、範囲内に入るそれぞれ別個の値を個々に参照する簡略された方法として機能するように単に意図されたものであり、そして、それぞれ別個の値はあたかも個々に引用されているかのように明細書の中に組み込まれている。用語「セット(“set”)」(例えば、「アイテムセット(“a set of items”)」または「サブセット(“subset”)」の使用は、コンテクストによる別段の注記または矛盾がない限り、1つまたはそれ以上のメンバーを含む空でない(nonempty)収集として解釈されるべきである。さらに、コンテクストによる別段の注記または矛盾がない限り、対応するセットに係る用語「サブセット」は、必ずしも対応するセットの適切なサブセットを示すものではないが、サブセットおよび対応するセットは同等であってよい。
【0145】
「A、B、およびCのうち少なくとも1つ(“at least one of A,B,and C”または“at least one of A,B andC”)」の形式のフレーズといった結合的な言語は、特に別段の記載がない限り、または、コンテクストによって明らかに矛盾しない限り、一般的に使用されるコンテクストとして理解され、アイテム、用語、等が、AまたはBまたはCのいずれか、もしくは、AおよびBおよびCのセットのうち任意の空でないサブセットであり得ることを示す。例えば、3つのメンバーを有するセットの例示的な例において、結合的な言語「A、B、およびCのうち少なくとも1つ」は、以下の集合(set)のうちいずれかを指す。{A}、{B}、{C}、{A,B}、{A,C}、{A,B,C}。従って、そうした結合的な言語は、一般的に、所定の実施形態が、少なくとも1つのA、少なくとも1つのB、および、少なくとも1つのCがそれぞれ存在するように要求することを意味するようには意図されていない。
【0146】
説明されたプロセスのオペレーションは、別段の指示がない限り、またはコンテクストにより明らかに矛盾しない限り、任意の適切な順序で実行することができる。説明されるプロセス(または、その変形及び/又は組合せ)は、実行可能な命令を伴って構成される1つまたはそれ以上のコンピュータシステムの制御の下で実行され、そして、ハードウェアまたはそれらの組合せによって、1つまたはそれ以上のプロセッサ上でまとまって実行されるコード(例えば、実行可能な命令、1つまたはそれ以上のコンピュータプログラム、または1つまたはそれ以上のアプリケーション)として実装され得る。コードは、例えば、1つまたはそれ以上のプロセッサによって実行可能な複数の命令を含むコンピュータプログラムの形式で、コンピュータ読取可能記憶媒体上に保管され得る。コンピュータ読取可能記憶媒体は、非一時的なものであり得る。
【0147】
提供されるあらゆる全ての実施例、または、例示的な言語(例えば、「といった(“such as”)」)の使用は、本発明の実施形態をより良く明確にするようにだけ意図されたものであり、そして、他に請求されない限り、本発明の範囲を限定するものではない。明細書における言語は、任意の請求されていない要素を本発明の実施に不可欠なものとして示しているものと解釈されてはならない。
【0148】
本発明を実施するために発明者に知られているベストモードを含めて、本開示の実施形態が説明されている。これらの実施形態の変形は、前述の説明を読めば、当業者にとって明らかになり得る。発明者は、そうした変形を当業者が適宜採用することを期待しており、そして、発明者は、本開示の実施形態が、特定的に説明された以外のもので実施されるように意図している。従って、本開示の範囲は、適用可能な法律によって許容されるように、添付される請求項に記載された技術的事項(subject matter)の全ての変更および均等物を含んでいる。さらに、上述のエレメントのあらゆる可能な変形における任意の組合せは、別段の指示がない限り、またはコンテクストにより明らかに矛盾しない限り、本開示の範囲に包含されるものである。
【0149】
刊行物、特許出願、および特許を含む、引用された全ての参考文献は、まるで各参考文献が個別にかつ特定的に参照により包含され、そして、その全体が明らかであるかのように、同じ程度に、参考として本明細書に組み込まれている。
【0150】
上述の実施形態は、本発明を限定するものではなく、むしろ本発明を例示するものであること、および、当業者は、添付の請求項によって定義されるように、本発明の範囲から逸脱することなく、多くの代替的な実施形態を設計することができることに留意すべきである。請求項においては、括弧内に置かれたあらゆる参照符号は、クレームを限定するものとして解釈されてはならない。用語「含む(“comprising”、“comprises”)」、等は、あらゆる請求項または明細書全体において列挙されたもの以外の要素またはステップの存在を排除するものではない。本明細書において、「含む(“comprises”)」とは、「含む、または、から構成される」ことを意味し、そして、「含む(“comprising”)」とは、「含んでいる、または、から構成されている」ことを意味する。要素の単数形の参照は、そうした要素の複数形の参照を排除するものではなく、そして、その逆もまた同様である。本発明は、いくつかの別個の要素を含むハードウェアによって、および、適切にプログラムされたコンピュータによって実施することができる。いくつかの手段を列挙している装置クレームにおいて、これらの手段のいくらかは、1つおよび同じハードウェアのアイテムによって具体化され得る。所定の手段が相互に異なる従属請求項に記載されているという単なる事実は、これらの手段の組合せが有利に利用され得ないことを示すものではない。