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

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

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

特許7654567ブロックチェーントランザクションの中のインスクリプト関数
<>
  • 特許-ブロックチェーントランザクションの中のインスクリプト関数 図1
  • 特許-ブロックチェーントランザクションの中のインスクリプト関数 図2
  • 特許-ブロックチェーントランザクションの中のインスクリプト関数 図3
  • 特許-ブロックチェーントランザクションの中のインスクリプト関数 図4
  • 特許-ブロックチェーントランザクションの中のインスクリプト関数 図5A
  • 特許-ブロックチェーントランザクションの中のインスクリプト関数 図5B
  • 特許-ブロックチェーントランザクションの中のインスクリプト関数 図5C
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2025-03-24
(45)【発行日】2025-04-01
(54)【発明の名称】ブロックチェーントランザクションの中のインスクリプト関数
(51)【国際特許分類】
   H04L 9/32 20060101AFI20250325BHJP
【FI】
H04L9/32 200Z
【請求項の数】 12
(21)【出願番号】P 2021569440
(86)(22)【出願日】2020-04-22
(65)【公表番号】
(43)【公表日】2022-07-27
(86)【国際出願番号】 IB2020053817
(87)【国際公開番号】W WO2020240299
(87)【国際公開日】2020-12-03
【審査請求日】2023-03-24
(31)【優先権主張番号】1907347.7
(32)【優先日】2019-05-24
(33)【優先権主張国・地域又は機関】GB
(73)【特許権者】
【識別番号】318001991
【氏名又は名称】エヌチェーン ライセンシング アーゲー
(74)【代理人】
【識別番号】100107766
【弁理士】
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【弁理士】
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100135079
【弁理士】
【氏名又は名称】宮崎 修
(72)【発明者】
【氏名】タータン,クロエ
(72)【発明者】
【氏名】アマール,バセム
(72)【発明者】
【氏名】デイヴィーズ,ジャック
(72)【発明者】
【氏名】ジャーン,ウエイ
(72)【発明者】
【氏名】ヴォーン,オーウェン
(72)【発明者】
【氏名】ライト,クレイグ
(72)【発明者】
【氏名】ワハブ,ジャド
【審査官】青木 重徳
(56)【参考文献】
【文献】松浦 健一郎 ほか,入門 仮想通貨の作り方,第1版第1刷,日本,株式会社秀和システム,2018年12月25日,p.141-148
【文献】淵田 康之,特集:イノベーションと金融 ブロックチェーンと金融取引の革新,野村資本市場クォータリー,日本,株式会社野村資本市場研究所,2015年11月01日,第19巻第2号(通巻74号),p.11-35
【文献】株式会社ストーンシステム,図解入門 最新ブロックチェーンがよ~くわかる本,第1版第4刷,日本,株式会社秀和システム,2018年04月15日,p.108-122
【文献】アーヴィンド・ナラヤナン ほか (長尾 高弘),仮想通貨の教科書,第1版第2刷,日本,日経BP社,2017年12月20日,p.117-130
(58)【調査した分野】(Int.Cl.,DB名)
H04L 9/32
(57)【特許請求の範囲】
【請求項1】
ブロックチェーンのトランザクションを実行する法であって、前記トランザクションは、ロックスクリプトを含む少なくとも1つのアウトプットを含み、前記ロックスクリプトは、第1オペコードのインスタンス、及び第2オペコードの1つ以上のインスタンスを含み、前記第2オペコードの各インスタンスは、前記ロックスクリプトの部分を分け、前記方法は、ブロックチェーンネットワークのノードのコンピュータ機器により実行され、
前記第1オペコードのインスタンスを呼び出すと、前記ノードのスクリプトエンジンが、少なくとも1つのスタックから第1データ要素をリードするステップであって、前記第1データ要素は、異なるトランザクションのアンロックスクリプトにより、前記スクリプトエンジンによる前記ロックスクリプトの実行の間に生成される、ステップと、
前記第2オペコードの前記1つ以上のインスタンスのうち前記第1データ要素に対応するインスタンスに続く、前記ロックスクリプトの第1部分を出力するステップと、
を含む方法。
【請求項2】
前記スクリプトエンジンが、前記ロックスクリプトの前記第1部分のうちの少なくとも一部を実行するステップ、を含む請求項1に記載の方法。
【請求項3】
前記スクリプトエンジンが、サブスクリプトを生成するステップであって、前記サブスクリプトは、前記第2オペコードの第1インスタンスから開始し、前記ロックスクリプトの、前記第2オペコードの前記第1インスタンスの後に実行される部分が続き、前記ロックスクリプトの前記第1部分は前記サブスクリプトの第1部分である、ステップ、を含む請求項1又は2に記載の方法。
【請求項4】
前記ロックスクリプト及び前記サブスクリプトは、前記ノードのメモリに格納され、前記スクリプトエンジンが、前記ロックスクリプトの未実行部分を前記メモリ内の前記サブスクリプトの前記第1部分により置き換えるステップ、を含む請求項3に記載の方法。
【請求項5】
前記スクリプトエンジンによる前記ロックスクリプトの実行の前に、前記スクリプトエンジンが、前記第1オペコードのインスタンスについて前記ロックスクリプトをスキャンするステップと、
前記ロックスクリプトが前記第1オペコードのインスタンスを含む場合、前記スクリプトエンジンが、前記サブスクリプトを生成するステップと、
を含む請求項3又は4に記載の方法。
【請求項6】
前記スクリプトエンジンが、前記第1データ要素を前記第2オペコードのインスタンスのアドレスとして解釈するステップ、を含む請求項1~5のいずれかに記載の方法。
【請求項7】
以下:
前記第1データ要素が正整数ではない、
前記第1データ要素が前記第2オペコードのインスタンスの合計数より多い、
のうちの少なくとも1つの場合に、前記スクリプトエンジンが、前記ロックスクリプトの実行を終了するステップ、を含む請求項1~6のいずれかに記載の方法。
【請求項8】
前記ロックスクリプトの前記第1部分は、前記第1オペコードの第2インスタンスを含み、前記方法は、
前記第1オペコードの前記第2インスタンスを呼び出すと、前記スクリプトエンジンが、少なくとも1つのスタックから第2データ要素をリードするステップであって、前記第2データ要素は、前記ロックスクリプトの第1部分の実行中に生成される、ステップと、
前記第2オペコードの前記1つ以上のインスタンスのうち前記第2データ要素に対応するインスタンスに続く、前記ロックスクリプトの第2部分を出力するステップと、
を含む、請求項2に従属する請求項3~7のいずれかに記載の方法。
【請求項9】
前記スクリプトエンジンが、前記ロックスクリプトの前記第2部分のうちの少なくとも一部を実行するステップ、
を含む請求項8に記載の方法。
【請求項10】
前記ロックスクリプトの前記第2部分は前記サブスクリプトの第2部分であり、前記方法は、前記スクリプトエンジンが、前記ロックスクリプトの前記第1部分の未実行部分を、前記メモリ内のサブスクリプトの第2部分により置き換えるステップ、を含む請求項4に従属する請求項9に記載の方法。
【請求項11】
ブロックチェーンネットワークのノードにより実行されると前記ノードに請求項1~10のいずれかに記載の方法を実行させるコンピュータプログラム。
【請求項12】
コンピュータ機器であって、
1つ以上のメモリユニットを含むメモリと、
1つ以上の処理ユニットを含む処理機器と、
を含み、
前記メモリはコードを格納し、前記コードは前記処理機器上で実行されると前記処理機器に請求項1~10のうちのいずれかに記載の方法を実行させるよう構成される、コンピュータ機器。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、インスクリプト(in-script)合成関数(composite function)を実施するために、ブロックチェーンのトランザクションを使用することに関する。例えば、合成関数は、トランザクションのスクリプト内でループを生成するために使用されてよい。
【背景技術】
【0002】
ブロックチェーンとは、分散型データ構造の形式を指し、ブロックチェーンの複製のコピーは、ピアツーピア(peer-to-peer (P2P))ネットワーク内の複数のノードのそれぞれにおいて維持される。ブロックチェーンは、データのブロックのチェーンを含み、各ブロックは1つ以上のトランザクションを含む。各トランザクションは、シーケンスの中の先行するトランザクションを指してよい。トランザクションは、新しいブロックに含まれるようネットワークへ提出され得る。新しいブロックは、「マイニング」として知られる処理により生成される。「マイニング」は、複数のマイニングノードの各々が「proof-of-work」を実行するために競争する、つまりブロックに含まれることを待っている保留中のトランザクションのプールに基づき、暗号パズルを解くことを含む。
【0003】
従来、ブロックチェーン内のトランザクションは、デジタルアセット、すなわち、価値のストアとして機能するデータを伝達するために使用される。しかし、ブロックチェーンの上に追加の機能を積み重ねるために、ブロックチェーンを利用することもできる。例えば、ブロックチェーンプロトコルは、トランザクションのアウトプットに追加のユーザデータを格納することを可能にしてよい。現代のブロックチェーンは、単一トランザクション内に格納できる最大データ容量を増加させ、より複雑なデータを組み込むことを可能にしている。例えば、これは、ブロックチェーン内に電子ドキュメント(electronic document)、或いはオーディオ若しくはビデオデータを格納するために使用され得る。
【0004】
ネットワーク内の各ノードは、転送、マイニング、及び記憶のうちの任意の1、2、又は3つ全部の役割を有することができる。転送ノードは、ネットワークのノードを通じてトランザクションを伝播させる。マイニングノードは、トランザクションのマイニングを実行してブロックにする。記憶ノードは、それぞれ、ブロックチェーンのマイニングされたブロックの彼ら自身のコピーを格納する。トランザクションをブロックチェーンに記録させるために、パーティは、該トランザクションを、伝播させるようにネットワークのノードのうちの1つへ送信する。トランザクションを受信したマイニングノードは、トランザクションをマイニングして新しいブロックにするよう競争してよい。各ノードは、トランザクションが有効であるための1つ以上の条件を含む同じノードプロトコルを尊重するよう構成される。無効なトランザクションは、伝播されず、マイニングされてブロックにされることもない。トランザクションが検証され、それによってブロックチェーンに受け入れられたと仮定すると、(任意のユーザデータを含む)トランザクションは、従って、不変の公開レコードとしてP2Pネットワークの各ノードに格納されたままである。
【0005】
最新のブロックを生成するためにproof-of-workパズルを解くことに成功したマイナーは、標準的に、デジタルアセットの新しい額を生成する「生成トランザクション(generation transaction)」と呼ばれる新しいトランザクションにより報酬を受ける。proof-of-workは、ブロックをマイニングするために膨大な量の計算リソースを必要とするので、及び二重支払いの企てを含むブロックは他のノードにより受け入れられない可能性があるので、マイナーが、彼らのブロックに二重支払いトランザクションを含めることによりシステムを騙さないことを奨励する。
【0006】
「アウトプットに基づく」モデル(UTXOに基づくモデルと呼ばれることもある)では、所与のトランザクションのデータ構造は、1つ以上のインプット及び1つ以上のアウトプットを含む。任意の使用可能アウトプットは、時にUTXO(「unspent transaction output(未使用トランザクションアウトプット)」)と呼ばれる、デジタルアセットの額を指定する要素を含む。アウトプットは、アウトプットを償還(redeem)するための条件を指定するロックスクリプトを更に含んでよい。各インプットは、先行するトランザクション内のそのようなアウトプットへのポインタを含み、ポイントされたアウトプットのロックスクリプトをアンロックするためのアンロックスクリプトを更に含んでよい。従って、トランザクションのペアを考えるとき、それらを、第1トランザクション及び第2トランザクション(又は「ターゲット」トランザクション)と呼ぶ。第1トランザクションは、デジタルアセットの額を指定する、及びアウトプットをアンロックする1つ以上の条件を定義するロックスクリプトを含む、少なくとも1つのアウトプットを含む。第2のターゲットトランザクションは、第1トランザクションのアウトプットへのポインタと、第1トランザクションのアウトプットをアンロックするためのアンロックスクリプトと、を含む少なくとも1つのインプットを含む。
【0007】
このようなモデルでは、第2のターゲットトランザクションが、伝播されてブロックチェーンに記録されるようP2Pネットワークへ送信されると、各ノードにおいて適用される有効性のための条件のうちの1つは、アンロックスクリプトが第1トランザクションのロックスクリプト内で定義された1つ以上の条件のうちの全部を満たすことである。もう1つは、第1トランザクションのアウトプットが、別の前の有効なトランザクションによって未だ償還されていないことである。これらの条件のうちのいずれかに従いターゲットトランザクションが無効であると分かった任意のノードは、該トランザクションを伝播させず、ブロックチェーンに記録させるためにマイニングしてブロックに含めることもしない。
【0008】
トランザクションモデルの代替のタイプは、アカウントに基づくモデルである。この場合、各トランザクションは、過去の一連のトランザクションにおいて、先行するトランザクションのUTXOに戻って参照することによって移転される量を定義するのではなく、絶対的な口座(アカウント)残高を参照することによって移転される。すべてのアカウントの現在の状態は、ブロックチェーンとは別個のマイナーによって格納され、絶えず更新される。
【0009】
ブロックチェーンプロトコルは、トランザクションのためにスクリプト言語を使用し得る。スクリプトは、基本的に要素のリストであり、要素はデータ又は命令であってよい。命令は、スクリプトワード、オペコード、コマンド、又は関数のような文書の中で参照される。オペコード(オペレーションコードの略)は、スクリプト内のデータに対する所定の演算を実行する。
【0010】
1つのブロックチェーンスクリプト言語は、任意のループ機能の実行を伴うForthに基づくデュアルスタック実装である。Forthは、メインスタックであるデータスタックと、追加スタックであるリターンスタックと、を有するデュアルスタックを使用する。
【発明の概要】
【0011】
1つのこのようなオペコードはOP_RETURNである。元々のブロックチェーンプロトコルでは、OP_RETURNの目的はスクリプトの実行を終了することであった。それは、スクリプトを含むトランザクションを無効にしない。しかしながら、これは、OP_RETURNがトランザクションのインプットスクリプトに含まれるとき、詐欺攻撃をもたらす。具体的には、OP_RETURNを含んだトランザクションのインプットスクリプトは、前のトランザクションのアウトプットスクリプトをアンロックするために使用されている可能性がある。従って、既存のブロックチェーンプロトコルにおいて、オペコードOP_RETURNが証明可能な未使用トランザクションアウトプットを表すように、プロトコルが変更されて、ブロックチェーン上でデータの記憶を可能にした。既存のプロトコルでは、OP_RETURNオペコードは、スクリプトの実行を終了するため、及び同時にトランザクションを無効にするために使用される。しかしながら、インプットスクリプト内にOP_RETURNを有するトランザクションは、アンロックスクリプトと一緒に実行するとき「TRUE」(又は有効)の実行を生じないので、これは、ブロックチェーン内の機能の損失をもたらす。
【0012】
もう1つのオペコードはOP_CODESEPARATOR(OCS)である。OCSは、オペコードOP_CHECKSIGに「見える」オペコードであり、これはOP_CHECKSIGが、スクリプト内で次のOCSが位置する場所を特定できることを意味する。完全性のために、通常、OP_CHECKSIGは、最後のOCSが実行された後に、スクリプト内の署名を全部のデータに対してチェックする。
【0013】
本願明細書に開示される一態様によると、ブロックチェーンのトランザクションを実行する、コンピュータにより実施される方法であって、前記トランザクションは、ロックスクリプトを含む少なくとも1つのアウトプットを含み、前記ロックスクリプトは、第1オペコードのインスタンス、及び第2オペコードの1つ以上のインスタンスを含み、前記第2オペコードの各インスタンスは、前記ロックスクリプトの部分を分け、前記方法は、
前記第1オペコードのインスタンスを呼び出すと、少なくとも1つのスタックから第1データ要素をリードするステップであって、前記第1データ要素は、異なるトランザクションのアンロックスクリプトにより前記ロックスクリプトの実行の間に生成される、ステップと、
前記第1データ要素に対応する前記第2オペコードのインスタンスに続く、前記ロックスクリプトの第1部分を出力するステップと、
を含む方法が提供される。
【0014】
ここで、第1オペコードは、第2オペコードの可視性(visibility)を有し、ロックスクリプトの部分を選択させることを可能にする。つまり、第2オペコードの特定のインスタンスの後に位置するスクリプトの部分は、例えば実行されるように、識別され出力され得る。これは、ロックスクリプトのある部分から別の部分へとジャンプすることによる等で、インスクリプト(スクリプト内、in-script)ループを可能にするために使用できる。
【0015】
第1オペコードは、OP_RETURNオペコードであってよい。ここで、OP_RETURNの機能は再定義される。その目的は、もはや、スクリプトの実行を終了し、トランザクションを無効にすることではない。代わりに、OP_RETURNは、第2オペコードの識別子又はインスタンスを受信し、第2オペコードの該インスタンスに続くスクリプトを出力する。幾つかの例では、スクリプトを端から端まで実行する代わりに、OP_RETURNは、スクリプトの別の部分へ前方へ又は後方へジャンプするために使用できる。例えば、スクリプトの幾つかの部分は、1回より多く実行されてよく、スクリプトの幾つかの部分は全く実行されなくてよく、或いは、それらは異なる順序で実行されてよい。
【0016】
第2オペコードは、OP_CODESEPARATOR(OCS)オペコードであってよい。OCSは、スクリプトの部分と部分との間に置かれ、それらの部分を実質的に分離する。OP_RETURNは、特定のインスタンスに続くスクリプトを出力するために、スクリプト内のOCSのインスタンスの位置を特定することができる。
【0017】
簡単のために、第1オペコードは、以後、「OP_RETURN」又は「終了オペコード」と呼ばれ、第2オペコードは、「OP_CODESEPARATOR」又は「分離オペコード」と呼ばれる。しかしながら、本開示は、これらの特定のラベルを有するオペコードに限定されない。より一般的には、実施形態はブロックチェーンスクリプト言語のOP_RETURNの観点で説明されるが、同じ教示が、スクリプトエンジン(例えば、スクリプトインタープリタ)により呼び出されるとき、スタックから第1データ要素をリードし、該データ要素に対応する第2オペコードのインスタンスに続くスクリプトの部分を出力する任意のオペコードにより実施できる。同様に、実施形態はOP_CODESEPARATORの観点で説明されるが、同じ教示が、第1オペコードに見える、スクリプトの部分を分離する任意のオペコードにより実施できる。
【0018】
第1オペコードの第1及び第2インスタンスへの言及は、同じタイプのオペコードのインスタンスとして解釈されるべきである。同様に、第2オペコードの第1及び第2インスタンスへの言及は、同じタイプのオペコードのインスタンスとして解釈されるべきであり、第1及び第2オペコードは異なる種類のオペコードである。
【図面の簡単な説明】
【0019】
本開示の実施形態の理解を助け、そのような実施形態がどのように実施され得るかを示すために、例としてのみ、以下の添付の図面を参照する。
図1】ブロックチェーンを実装するためのシステムの概略ブロック図である。
図2】ブロックチェーンに記録されるトランザクションのいくつかの例を概略的に示している。
図3】トランザクションを実行するためのノードソフトウェアの概略ブロック図である。
図4】インプットa=105及びb=28についてユークリッドアルゴリズムのインスクリプト合成関数からのループのパック解除の例である。
図5A】インプット7,Gについて、インスクリプト楕円曲線点乗算の例である。
図5B図5Aの続きであり、インプット7,Gについて、インスクリプト楕円曲線点乗算の例である。
図5C図5Bの続きであり、インプット7,Gについて、インスクリプト楕円曲線点乗算の例である。
【発明を実施するための形態】
【0020】
図1は、ブロックチェーン150を実装するための例示的なシステム100を示す。システム100は、典型的にはインターネットのような広域インターネットワークであるパケット交換ネットワーク101を含む。パケット交換ネットワーク101は、パケット交換ネットワーク101内にピアツーピア(P2P)オーバレイネットワーク106を形成するように配置された複数のノード104を含む。各ノード104は、異なるピアに属する異なるノード104を有するピアのコンピュータ装置を含む。各ノード104は、1つ以上のプロセッサ、例えば、1つ以上の中央処理装置(CPU)、アクセラレータプロセッサ、特定用途向けプロセッサ、及び/又はフィールドプログラマブルゲートアレイ(FPGA)を含む処理装置を含む。各ノードはまた、メモリ、すなわち、1つ以上の非一時的コンピュータ読取可能媒体の形態のコンピュータ読取可能記憶装置を備える。メモリは、1つ以上のメモリ媒体、例えば、ハードディスクなどの磁気媒体、固体ドライブ(solid-state drive (SSD))、フラッシュメモリ又はEEPROMなどの電子媒体、及び/又は光ディスクドライブなどの光学的媒体を使用する1つ以上のメモリユニットを含んでもよい。
【0021】
ブロックチェーン150は、データのブロック151のチェーンを指し、ブロックチェーン150のそれぞれのコピーは、ピアツーピア(peer-to-peer (P2P))ネットワーク160内の複数のノードのそれぞれにおいて維持される。チェーン内の各ブロック151は、1つ以上のトランザクション152を含み、この文脈ではトランザクションは、一種のデータ構造を参照する。データ構造の性質は、トランザクションモデル又はスキームの一部として使用されるトランザクションプロトコルのタイプに依存する。所与のブロックチェーンは、典型的には、全体を通して、1つの特定のトランザクションプロトコルを使用する。1つの一般的なタイプのトランザクションプロトコルでは、各トランザクション152のデータ構造は、少なくとも1つのインプット及び少なくとも1つのアウトプットを含む。各アウトプットは、そのアウトプットが暗号的にロックされている(アンロックされ、それによって償還又は使用されるために、そのユーザ103の署名を必要とする)ユーザに属するデジタルアセットの数量を表す額(amount)を指定する。各インプットは、先行するトランザクション152のアウトプットを逆にポイントし、それによってトランザクションをリンクする。
【0022】
ノード104の少なくとも幾つかは、トランザクション152を転送し、それによって伝播する転送ノード104Fの役割を引き受ける。ノード104の少なくともいくつかは、ブロック151をマイニングするマイナー104Mの役割を担う。ノード104の少なくとも幾つかは、記憶ノード104S(「フル(full-copy)」ノードとも呼ばれる)の役割を引き受け、各ノードは、それぞれのメモリに同じブロックチェーン150のそれぞれのコピーを格納する。各マイナーノード104Mは、マイニングされてブロック151にされることを待ってるトランザクション152のプール154も維持する。所与のノード104は、転送ノード104、マイナー104M、記憶ノード104S、又はこれらの2つ若しくは全部の任意の組み合わせであり得る。
【0023】
所与の現在のトランザクション152jにおいて、インプット(又はそのそれぞれ)は、トランザクションのシーケンスの中の先行トランザクション152iのアウトプットを参照するポインタを含み、このアウトプットが現在のトランザクション152jにおいて償還されるか又は「消費される(spent)」ことを指定する。一般に、先行するトランザクションは、プール154又は任意のブロック151内の任意のトランザクションであり得る。先行するトランザクション152iは、必ずしも、現在のトランザクション152jが生成された又はネットワーク106へ送信されたときに存在する必要はないが、先行するトランザクション152iは、現在のトランザクションが結う意向であるために存在し検証されている必要がある。従って、本願明細書で「先行する」は、ポインタによりリンクされた論理的シーケンスの中で先行するものを表し、必ずしも時系列の中での生成又は送信の時間を表さない。従って、それは、必ずしも、トランザクション152i,152jが順不同で生成され又は送信されることを排除しない(以下の親のない(orphan)トランザクションに関する議論を参照する)。先行するトランザクション152iは、等しく、祖先(antecedent)又は先行(predecessor)トランザクションと呼ばれ得る。
【0024】
現在のトランザクション152jのインプットは、先行するトランザクション152iのアウトプットがロックされているユーザ103aの署名も含む。また、現在のトランザクション152jのアウトプットは、新しいユーザ103bに暗号的にロックできる。従って、現在のトランザクション152jは、先行するトランザクション152iのインプットで定義された量を、現在のトランザクション152jのアウトプットで定義された新しいユーザ103bに移転することができる。幾つかの場合には、トランザクション152が複数のアウトプットを有し、複数のユーザ間でインプット量を分割してよい(変更を行うために、そのうちの1人がオリジナルユーザとなる)。場合によっては、トランザクションが複数のインプットを有し、1つ以上の先行するトランザクションの複数のアウトプットから量をまとめ、現在のトランザクションの1つ以上のアウトプットに再分配することもできる。
【0025】
上記は「アウトプットベースの」トランザクションプロトコルと呼ばれることがあり、時には「未使用のトランザクションアウトプット(unspent transaction output (UTXO))タイプのプロトコル」(アウトプットはUTXOと呼ばれる)とも呼ばれる。ユーザの合計残高は、ブロックチェーンに格納されている1つの数値で定義されるのではなく、代わりに、ユーザは、ブロックチェーン151内の多くの異なるトランザクション152に分散されている該ユーザのすべてのUTXOの値を照合するために、特別な「ウォレット」アプリケーション105を必要とする。
【0026】
アカウントベースのトランザクションモデルの一部として、別のタイプのトランザクションプロトコルを「アカウントベース」のプロトコルと呼ぶことがある。アカウントベースの場合、各トランザクションは、過去の一連のトランザクションにおいて、先行するトランザクションのUTXOに戻って参照することによって移転される量を定義するのではなく、絶対的な口座(アカウント)残高を参照することによって移転される。すべてのアカウントの現在の状態は、ブロックチェーンとは別個のマイナーによって格納され、絶えず更新される。このようなシステムでは、トランザクションは、アカウントの連続したトランザクション記録(いわゆる「ポジション」)を用いて発注される。この値は、送信者により彼らの暗号署名の一部として署名され、トランザクション参照計算の一部としてハッシュされる。さらに、任意的なデータフィールドもトランザクションに署名することができる。このデータフィールドは、例えば、前のトランザクションIDがデータフィールドに含まれている場合、前のトランザクションを遡ってポイントしてよい。
【0027】
どちらのタイプのトランザクションプロトコルでも、ユーザ103が新しいトランザクション152jを実行したい場合、ユーザは、自分のコンピュータ端末102からP2Pネットワーク106のノードの1つ104(現在は、通常、サーバ又はデータセンタであるが、原則として、他のユーザ端末でもよい)に新しいトランザクションを送信する。このノード104は、各ノード104に適用されるノードプロトコルに従って、トランザクションが有効であるかどうかをチェックする。ノードプロトコルの詳細は、問題のブロックチェーン150で使用されているトランザクションプロトコルのタイプに対応し、全体のトランザクションモデルを一緒に形成する。ノードプロトコルは、典型的には、ノード104に、新しいトランザクション152j内の暗号署名が、トランザクション152の順序付けされたシーケンスの中の前のトランザクション152iに依存する、期待される署名と一致することをチェックすることを要求する。アウトプットベースの場合、これは、新しいトランザクション152jのインプットに含まれるユーザの暗号署名が、新しいトランザクションが消費する先行するトランザクション152jのアウトプットに定義された条件と一致することをチェックすることを含んでよく、この条件は、典型的には、新しいトランザクション152jのインプット内の暗号署名が、新しいトランザクションのインプットがポイントする前のトランザクション152iのアウトプットをアンロックすることを少なくともチェックすることを含む。いくつかのトランザクションプロトコルでは、条件は、少なくとも部分的に、インプット及び/又はアウトプットに含まれるカスタムスクリプトによって定義されてもよい。あるいは、単にノードプロトコルだけで固定することもできるし、あるいは、これらの組み合わせによることもある。いずれにせよ、新しいトランザクション152jが有効であれば、現在のノードは新しいトランザクションをP2Pネットワーク106内のノード104の1つ以上の他のノードに転送する。これらのノード104の少なくともいくつかは、同じノードプロトコルに従って同じテストを適用し、新しいトランザクション152jを1つ以上のさらなるノード104に転送するなど、転送ノード104Fとしても機能する。このようにして、新しいトランザクションは、ノード104のネットワーク全体に伝播される。
【0028】
アウトプットベースのモデルでは、与えられたアウトプット(例えば、UTXO)が消費されるかどうかの定義は、ノードプロトコルに従って別の今後の(onward)トランザクション152jのインプットによって既に有効に償還されているかどうかである。トランザクションが有効であるための別の条件は、それが消費又は償還を試みる先行するトランザクション152iのアウトプットが、別の有効なトランザクションによって未だ消費/償還されていないことである。ここでも、有効でない場合、トランザクション152jは、ブロックチェーンに伝播又は記録されない。これは、支払者が同じトランザクションのアウトプットを複数回消費しようとする二重支出を防ぐ。一方、アカウントベースのモデルは、口座残高を維持することによって、二重支出を防ぐ。この場合も、トランザクションの順序が定義されているため、口座残高は、一度に単一の定義された状態を有する。
【0029】
検証に加えて、ノード104Mのうちの少なくともいくつかは、「proof of work」に支えられているマイニングと呼ばれるプロセスで、トランザクションのブロックを最初に作成するために競合する。マイニングノード104Mでは、まだブロックに現れていない有効なトランザクションのプールに新しいトランザクションが追加される。そして、マイナーは、暗号パズルを解決しようと試みることにより、トランザクションのプール154からトランザクション152の新しい有効なブロック151を組み立てるために競争する。これは、典型的には、ノンスがトランザクションのプール154と連結され、ハッシュされるときに、ハッシュのアウトプットが所定の条件を満たすような「ノンス」値を探すことを含む。例えば、所定の条件は、ハッシュのアウトプットが、所定の数の先行ゼロを有することであってもよい。ハッシュ関数の特性は、インプットに関して予測不可能なアウトプットを持つことである。従って、この探索は、ブルートフォースによってのみ実行することができ、従って、パズルを解決しようとしている各ノード104Mにおいて、相当量の処理リソースを消費する。
【0030】
パズルを解く最初のマイナーノード104Mは、これをネットワーク106に通知し、その解を証明として提供する。この解は、ネットワーク内の他のノード104によって簡単にチェックすることができる(ハッシュが対する解が与えられれば、ハッシュのアウトプットが条件を満たすことを確認することは簡単である)。勝者がパズルを解いたトランザクションのプール154は、各ノードで勝者が発表した解をチェックしたことに基づいて、記憶ノード104Sとして機能するノード104のうちの少なくともいくつかによってブロックチェーン150の新しいブロック151として記録される。また、新しいブロック151nにはブロックポインタ155が割り当てられ、チェーン内で前に作成されたブロック151n-1を指すようになっている。proof-of-workは、新しいブロックを151作成するのに多大な労力を要し、二重の支出を含むブロックは他のノード104によって拒否される可能性が高く、従ってマイニングノード104Mが二重支払いを彼らのブロックに含まないようにするインセンティブが働くので、二重の支出のリスクを減じるのを助ける。一旦生成されると、ブロック151は、同じプロトコルに従ってP2Pネットワーク106内の各格納ノード104Siで認識され、維持されるため、変更することはできない。また、ブロックポインタ155は、ブロック151に順序を課す。トランザクション152は、P2Pネットワーク106内の各記憶ノード104Sで順序付けられたブロックに記録されるので、これはトランザクションの不変の公開台帳を提供する。
【0031】
パズルを解決するために常に競争している異なるマイナー104Mは、いつ解を探し始めたかによって、いつでもマイニングされていないトランザクションプール154の異なるスナップショットに基づいてパズルを解いているかもしれないことに留意する。パズルを解く者は誰でも、最初に次の新しいブロック151nに含まれるトランザクション152を定義し、現在のマイニングされていないトランザクションのプール154が更新される。そして、マイナー104Mは、新たに定義された未解決のプール154からブロックを作り出すために、競争を続ける。また、生じ得る「分岐(フォーク、fork)」を解決するためのプロトコルも存在する。これは、2人のマイナー104Mが互いに非常に短い時間内にパズルを解決し、ブロックチェーンの矛盾したビューが伝播する場合である。要するに、分岐の枝が伸びるときは常に、最長のものが最終的なブロックチェーン150になる。
【0032】
ほとんどのブロックチェーンでは、勝ったマイナー104Mは、何も無いものから新しい量のデジタルアセットを生み出す特別な種類の新しいトランザクションによって自動的に報酬を受けている(通常のトランザクションでは、あるユーザから別のユーザにデジタルアセットの量を移転する)。したがって、勝ったノードは、ある量のデジタルアセットを「マイニング」したと言われる。この特殊なタイプのトランザクションは「生成(generation)」トランザクションと呼ばれることもある。それは自動的に新しいブロック151nの一部を形成する。この報酬は、マイナー104Mがproof-of-work競争に参加するインセンティブを与える。多くの場合、通常の(非生成)トランザクションは、そのトランザクションが含まれたブロック151nを生成した勝ったマイナー104Mにさらに報酬を与えるために、追加のトランザクション手数料をそのアウトプットの1つにおいて指定する。
【0033】
マイニングに含まれる計算リソースのために、典型的には、少なくともマイナーノード104Mの各々は、1つ以上の物理的サーバユニットを含むサーバ、又はデータセンタ全体の形態をとる。各転送ノード104M及び/又は記憶ノード104Sは、サーバ又はデータセンタの形態をとることもできる。しかしながら、原則として、任意の所与のノード104は、ユーザ端末又は互いにネットワーク接続されたユーザ端末のグループを含むことができる。
【0034】
各ノード104のメモリは、それぞれの1つ以上の役割を実行し、ノードプロトコルに従ってトランザクション152を処理するために、ノード104の処理装置上で動作するように構成されたソフトウェアを記憶する。ノード104に属するいずれの動作も、それぞれのコンピュータ装置の処理装置上で実行されるソフトウェアによって実行され得ることが理解されよう。ノードソフトウェアは、アプリケーションレイヤにおける1つ以上のアプリケーション、又はオペレーティングシステムレイヤ若しくはプロトコルレイヤのような下位レイヤ、又はこれらの任意の組合せの中に実装されてよい。また、本明細書で使用される「ブロックチェーン」という用語は、一般的な技術の種類を指す一般的な用語であり、任意の特定の専有のブロックチェーン、プロトコル又はサービスに限定されない。
【0035】
また、ネットワーク101には、消費者ユーザの役割を果たす複数のパーティ103の各々のコンピュータ装置102も接続されている。これらは、トランザクションにおける支払人及び被支払人の役割を果たすが、他のパーティの代わりにトランザクションをマイニングし又は伝播することに必ずしも参加しない。それらは必ずしもマイニングプロトコルを実行するわけではない。2つのパーティ103及びそれぞれの機器102は、説明のために示されており、第1パーティ103a及びそのそれぞれのコンピュータ機器102a、ならびに第2パーティ103b及びそのそれぞれのコンピュータ機器102bである。より多くのこのようなパーティ103及びそれらのそれぞれのコンピュータ機器102がシステムに存在し、参加することができるが、便宜上、それらは図示されていないことが理解されよう。各パーティ103は、個人又は組織であってもよい。純粋に例示として、第1パーティ103aは、本明細書においてアリスと称され、第2パーティ103bは、ボブと称されるが、これは限定的なものではなく、本明細書においてアリス又はボブという言及は、それぞれ「第1パーティ」及び「第2パーティ」と置き換えることができることは理解されるであろう。
【0036】
各パーティ103のコンピュータ機器102は、1つ以上のプロセッサ、例えば1つ以上のCPU、GPU、他のアクセラレータプロセッサ、特定用途向けプロセッサ、及び/又はFPGAを備えるそれぞれの処理装置を備える。各パーティ103のコンピュータ機器102は、さらに、メモリ、すなわち、非一時的コンピュータ読取可能媒体又は媒体の形態のコンピュータ読取可能記憶装置を備える。このメモリは、例えば、ハードディスクなどの磁気媒体、SSD、フラッシュメモリ又はEEPROMなどの電子媒体、及び/又は光ディスクドライブなどの光学的媒体を使用する1つ以上のメモリユニットを含んでもよい。各パーティ103のコンピュータ機器102上のメモリは、処理装置上で動作するように配置された少なくとも1つのクライアントアプリケーション105のそれぞれのインスタンスを含むソフトウェアを記憶する。所与のノード104に属するいずれの動作も、それぞれのコンピュータ機器102の処理装置上で実行されるソフトウェアを使用することにより実行され得ることが理解されよう。各パーティ103のコンピュータ機器102は、少なくとも1つのユーザ端末、例えばデスクトップ又はラップトップコンピュータ、タブレット、スマートフォン、又はスマートウォッチのようなウェアラブルデバイスを備えている。所与のパーティ103のコンピュータ装置102は、ユーザ端末を介してアクセスされるクラウドコンピューティングリソースのような、1つ以上の他のネットワーク接続されたリソースを含んでもよい。
【0037】
クライアントアプリケーション105は、最初に、1つ以上の適切なコンピュータ読取可能な記憶媒体、例えばサーバからダウンロードされたもの、又はリムーバブルSSD、フラッシュメモリキー、リムーバブルEEPROM、リムーバブル磁気ディスクドライブ、磁気フロッピーディスク又はテープ、光ディスク、例えばCD又はDVD ROM、又はリムーバブル光学ドライブなどのリムーバブル記憶装置上で、任意の所与のパーティ103のコンピュータ機器102に提供され得る。
【0038】
クライアントアプリケーション105は、少なくとも「ウォレット」機能を備える。これには主に2つの機能を有する。これらのうちの1つは、それぞれのユーザパーティ103が、ノード104のネットワーク全体にわたって伝播され、それによってブロックチェーン150に含まれるトランザクション152を作成し、署名し、送信することを可能にすることである。もう1つは、現在所有しているデジタルアセットの量をそれぞれのパーティに報告することである。アウトプットベースのシステムでは、この第2の機能は、当該パーティに属するブロックチェーン150全体に散在する様々なトランザクション152のアウトプットの中で定義される量を照合することを含む。
【0039】
注:種々のクライアント機能が所与のクライアントアプリケーション105に統合されるとして説明されることがあるが、これは、必ずしも限定的ではなく、代わりに、本願明細書に記載される任意のクライアント機能が2つ以上の異なるアプリケーションのスーツに実装されてよく、例えばAPIを介してインタフェースし、又は一方が他方へのプラグインである。より一般的には、クライアント機能は、アプリケーションレイヤ、又はオペレーティングシステムのような下位レイヤ、又はこれらの任意の組合せにおいて実装され得る。以下は、クライアントアプリケーション105の観点で説明されるが、これは限定的ではないことが理解される。
【0040】
各コンピュータ機器102上のクライアントアプリケーション又はソフトウェア105のインスタンスは、P2Pネットワーク106の転送ノード104Fの少なくとも1つに動作可能に結合される。これにより、クライアント105のウォレット機能は、トランザクション152をネットワーク106に送信することができる。クライアント105は、また、記憶ノード104のうちの1つ、一部、又は全部にコンタクトして、それぞれのパーティ103が受領者である任意のトランザクションについてブロックチェーン150に問い合わせることができる(又は、実施形態では、ブロックチェーン150は、部分的にその公開視認性を通じてトランザクションの信頼を提供する公開的設備であるため、実際には、ブロックチェーン150内の他のパーティのトランザクションを検査する)。各コンピュータ機器102上のウォレット機能は、トランザクションプロトコルに従ってトランザクション152を形成し、送信するように構成される。各ノード104は、ノードプロトコルに従ってトランザクション152を検証するように構成されたソフトウェアを実行し、転送ノード104Fの場合は、ネットワーク106全体にトランザクション152を伝播させるためにトランザクション152を転送する。トランザクションプロトコルとノードプロトコルは互いに対応し、所与のトランザクションプロトコルは所与のノードプロトコルと共に所与のトランザクションモデルを実装する。同じトランザクションプロトコルが、ブロックチェーン150内のすべてのトランザクション152に使用される(ただし、トランザクションプロトコルは、トランザクションの異なるサブタイプを許可することができる)。同じノードプロトコルは、ネットワーク106内のすべてのノード104によって使用される(ただし、多くのノードは、そのサブタイプに対して定義されたルールに従って異なるトランザクションのサブタイプを異なるように処理し、また、異なるノードは異なる役割を引き受け、従って、プロトコルの異なる対応する側面を実装することができる)。
【0041】
上述のように、ブロックチェーン150は、ブロック151のチェーンを含み、各ブロック151は、前述のように、proof-of-workプロセスによって作成された1つ以上のトランザクション152のセットを含む。各ブロック151は、また、ブロック151への逐次的順序を定義するように、チェーン内の先に生成されたブロック151を遡ってポイントするブロックポインタ155を含む。ブロックチェーン150はまた、proof-of-workプロセスによって新しいブロックに含まれることを待つ有効なトランザクション154のプールを含む。各トランザクション152は、トランザクションのシーケンスに順序を定義するために、前のトランザクションへのポインタを含む(注:トランザクション152のシーケンスは、分岐することが許される)。ブロック151のチェーンは、チェーンの最初のブロックであったジェネシスブロック(genesis block (Gb))153にまで戻る。チェーン150の初期に1つ以上のオリジナルトランザクション152は、先行するトランザクションではなくジェネシスブロック153を指し示した。
【0042】
所与のパーティ103、例えばAliceがブロックチェーン150に含まれる新たなトランザクション152jを送信したいと望む場合、彼女は関連するトランザクションプロトコルに従って(彼女のクライアントアプリケーション105のウォレット機能を使用して)新たなトランザクションを定式化する(formulate)。次に、クライアントアプリケーション105からトランザクション152を、彼女が接続されている1つ以上の転送ノード104Fの1つに送信する。例えば、これは、Aliceのコンピュータ102に最も近いか又は最も良好に接続されている転送ノード104Fであってもよい。任意の所与のノード104が新しいトランザクション152jを受信すると、ノードプロトコル及びそのそれぞれの役割に従って、それを処理する。これは、最初に、新たに受信されたトランザクション152jが「有効」であるための特定の条件を満たしているかどうかをチェックすることを含み、その例については、簡単に詳述する。いくつかのトランザクションプロトコルでは、検証のための条件は、トランザクション152に含まれるスクリプトによってトランザクションごとに構成可能であってよい。あるいは、条件は単にノードプロトコルの組み込み機能であってもよく、あるいはスクリプトとノードプロトコルの組み合わせによって定義されてもよい。
【0043】
新たに受信されたトランザクション152jが、有効であると見なされるテストに合格したという条件で(すなわち、「有効である」という条件で)、トランザクション152jを受信した任意の記憶ノード104Sは、そのノード104Sに維持されているブロックチェーン150のコピー内のプール154に、新たに有効とされたトランザクション152を追加する。さらに、トランザクション152jを受信する任意の転送ノード104Fは、検証済みトランザクション152をP2Pネットワーク106内の1つ以上の他のノード104に伝播する。各転送ノード104Fは同じプロトコルを適用するので、トランザクション152jが有効であると仮定すると、これは、P2Pネットワーク106全体に間もなく伝播されることを意味する。
【0044】
ひとたび1つ以上の記憶ノード104で維持されるブロックチェーン150のコピー内のプール154に入ると、マイナーノード104Mは、新しいトランザクション152を含むプール154の最新バージョンのproof-of-workパズルを解決するために競争を開始する(他のマイナー104Mは、依然として、プール154の古いビューに基づいてパズルを解決しようとしているが、そこに到達した者は誰でも、最初に、次の新しいブロック151が終了し、新しいプール154が開始する場所を定義し、最終的には、誰かが、Aliceのトランザクション152jを含むプール154の一部のパズルを解決する)。一旦、新しいトランザクション152jを含むプール154についてproof-of-workが行われると、ブロックチェーン150内のブロック151の1つの一部となる。各トランザクション152は、以前のトランザクションへのポインタを含むので、トランザクションの順序もまた、不変的に記録される。
【0045】
異なるノード104は、最初に所与のトランザクションの異なるインスタンスを受信する可能性があり、従って、1つのインスタンスがマイニングされてブロック150になる前に、どのインスタンスが「有効」であるかについて矛盾するビューを有することがあり、その時点で、全部のノード104は、マイニングされたインスタンスのみが有効なインスタンスであることに合意する。ノード104が1つのインスタンスを有効であるとして受け入れ、次に第2のインスタンスがブロックチェーン150に記録されていることを発見した場合、該ノード104は、これを受け入れなければならず、最初に受け入れた未だマイニングされていないインスタンスを破棄する(つまり、無効であるとして扱う)。
【0046】
図2は、トランザクションプロトコルの例を示している。これは、UTXOベースのプロトコルの例である。トランザクション152(「Tx」と略す)は、ブロックチェーン150(各ブロック151は1つ以上のトランザクション152を含む)の基本的なデータ構造である。以下は、アウトプットベース又は「UTXO」ベースのプロトコルを参照して説明される。しかし、これは、全ての可能な実施形態に限定されるものではない。
【0047】
UTXOベースのモデルでは、各トランザクション(「Tx」)152は、1つ以上のインプット202及び1つ以上のアウトプット203を含むデータ構造を含む。各アウトプット203は、未使用トランザクションアウトプット(UTXO)を含んでもよく、これは、別の新しいトランザクションのインプット202のソースとして使用することができる(UTXOがまだ償還されていない場合)。UTXOは、デジタルアセット(値のストア)の量を指定する。それは、情報の中でも特にその元となったトランザクションのトランザクションIDを含む。トランザクションデータ構造はまた、ヘッダ201も含んでよく、ヘッダ201は、インプットフィールド202及びアウトプットフィールド203のサイズの指示子を含んでもよいヘッダ201を含んでよい。ヘッダ201は、トランザクションのIDも含んでもよい。実施形態において、トランザクションIDは、トランザクションデータのハッシュ(トランザクションID自体を除く)であり、マイナー104Mに提出された未処理トランザクション152のヘッダ201に格納される。
【0048】
例えばAlice103aは、問題のデジタルアセットの量をBob103bに移転するトランザクション152jを作成したいと考えているとする。図2において、Aliceの新しいトランザクション152jは「Tx」とラベル付けされている。これは、Aliceへのロックされているデジタルアセットの量を、シーケンス内の先行するトランザクション152iのアウトプット203に取り入れ、その少なくとも一部をBobに移転する。先行するトランザクション152iは、図2において「Tx」とラベル付けされている。Tx0とTx1は、単なる任意のラベルである。これらは、必ずしも、Tx0がブロックチェーン151の最初のトランザクションであること、又は、Tx1がプール154の直ぐ次のトランザクションであることを意味しない。Txは、まだAliceへのロックされた未使用アウトプット203を有する任意の先行する(つまり祖先)トランザクションのいずれかを指し示すことができる。
【0049】
先行するトランザクションTx0は、Aliceがその新しいトランザクションTx1を作成するとき、又は少なくとも彼女がそれをネットワーク106に送信するときまでに、既に検証され、ブロックチェーン150に含まれていてもよい。それは、その時点で既にブロック151のうちの1つに含まれていてもよく、あるいは、プール154内でまだ待機していてもよく、その場合、新しいブロック151にすぐに含まれることになる。あるいは、Tx0及びTx1が生成されネットワーク102に送信されることができ、あるいは、ノードプロトコルが「孤児(orphan)」トランザクションのバッファリングを許容する場合にはTx1の後にTx0が送信されることもできる。ここでトランザクションのシーケンスの文脈で使用される「先行する」及び「後の」という用語は、トランザクション内で指定されたトランザクションポインタ(どのトランザクションがどの他のトランザクションを指すかなど)によって定義されるシーケンス内のトランザクションの順序を指す。それらは、「先行者」及び「相続者」又は「祖先」及び「子孫」、「親」及び「子」、等により、等しく置き換えられ得る。これは、必ずしも、それらが作成され、ネットワーク106に送られ、又は任意の所与のノード104に到達する順序を意味しない。それにもかかわらず、先行するトランザクション(祖先トランザクション又は「親」)を指す後続のトランザクション(子孫トランザクション又は「子」)は、親トランザクションが検証されない限り、検証されない。親の前にノード104に到着した子は孤児とみなされる。それは、ノードプロトコル及び/又はマイナーの行動に応じて、親を待つために特定の時間、破棄又はバッファリングされることがある。
【0050】
先行するトランザクションTx0の1つ以上のアウトプット203のうちの1つは、本明細書でUTXO0とラベル付けされた特定のUTXOを含む。各UTXOは、UTXOによって表されるデジタルアセットの量を指定する値と、後続のトランザクションが検証されるために、従ってUTXOが正常に償還されるために、後続のトランザクションのインプット202の中のアンロックスクリプトによって満たされなければならない条件を定義するロックスクリプトとを含む。典型的には、ロックスクリプトは、特定のパーティ(それが含まれているトランザクションの受益者)に量をロックする。すなわち、ロックスクリプトは、標準的に以下のようなアンロック条件を定義する:後続のトランザクションのインプット内のアンロックスクリプトは、先行するトランザクションがロックされたパーティの暗号署名を含む。
【0051】
ロックスクリプト(別名scriptPubKey)は、ノードプロトコルによって認識されるドメイン固有の言語で書かれたコードの一部である。そのような言語の特定の例は、「スクリプト」(Script,capital S)と呼ばれる。ロックスクリプトは、トランザクションアウトプット203を消費するために必要な情報、例えば、Aliceの署名の必要条件を指定する。トランザクションのアウトプットには、アンロックスクリプトが現れる。アンロックスクリプト(別名:scriptSig)は、ロックスクリプトの基準を満たすために必要な情報を提供するドメイン固有の言語で書かれたコードの一部である。例えば、Bobの署名を含んでもよい。アンロックスクリプトは、トランザクションのインプット202に現れる。
【0052】
図示の例では、Txのアウトプット203のUTXOは、ロックスクリプト[ChecksigPA]を含み、これは、UTXOが償還されるために(厳密には、UTXOを償還しようとする後続のトランザクションが有効であるために)、Aliceの署名SigPAを必要とする。[ChecksigPA]は、Aliceの公開鍵と秘密鍵のペアからの公開鍵PAを含む。Txのインプット202は、Txを指すポインタ(例えば、そのトランザクションID、実施形態ではトランザクションTx全体のハッシュであるTxIDによる)を含む。Txのインプット202は、Txの任意の他の可能なアウトプットの中でそれを識別するために、Tx内のUTXOを識別するインデックスを含む。Tx1のインプット202は、さらに、Aliceが鍵ペアからのAliceの秘密鍵をデータの所定の部分(暗号において「メッセージ」と呼ばれることもある)に適用することによって作成された、Aliceの暗号署名を含むアンロックスクリプト<SigPA>を含む。有効な署名を提供するためにAliceが署名する必要があるデータ(又は「メッセージ」)は、ロックスクリプトにより、又はノードプロトコルにより、又はこれらの組み合わせによって定義され得る。
【0053】
新しいトランザクションTx1がノード104に到着すると、ノードはノードプロトコルを適用する。これは、ロックスクリプトとアンロックスクリプトを一緒に実行して、アンロックスクリプトがロックスクリプトで定義されている条件(この条件は1つ以上の基準を含むことができる)を満たしているかどうかをチェックすることを含む。実施形態では、これは、2つのスクリプトの連結を含む。
【数1】
ここで、「||」は連結を表し、「<...>」はスタックにデータを配置することを意味し、「[...]」はアンロックスクリプトに含まれる機能である(本例では、スタックベースの言語)。同等に、スクリプトは。、スクリプトを連結するのではなく共通のスタックにより1つずつ実行されてよい。いずれの方法でも、一緒に実行する場合、スクリプトは、Txのアウトプット内のロックスクリプトに含まれるAliceの公開鍵PAを使用して、Txのインプット内のロックスクリプトが、データの期待部分に署名するAliceの署名を含むことを認証する。また、データの期待部分(「メッセージ」)も、この認証を実行するためにTx0に含まれる必要がある。実施形態において、署名されたデータは、Tx0の全体を含む(従って、別個の要素は、データの署名された部分がすでに本質的に存在するので、データの署名された部分の指定にクリアに含まれる必要がある)。
【0054】
公開-秘密暗号法による認証の詳細は、当業者には周知であろう。基本的に、Aliceが彼女の秘密鍵によりメッセージを暗号化することによってメッセージに署名した場合、Aliceの公開鍵とそのメッセージが明らか(暗号化されていないメッセージ)ならば、ノード104のような別のエンティティは、そのメッセージの暗号化されたバージョンがAliceによって署名されていなければならないことを認証することができる。署名は、典型的には、メッセージをハッシュし、ハッシュに署名し、署名としてメッセージのクリアなバージョンにこれをタグ付けすることによって、公開鍵の所有者が署名を認証することを可能にする。従って、実施形態では、特定のデータ片又はトランザクションの部分等に署名するという言及は、データ片又はトランザクションの部分のハッシュに署名することを意味し得る。
【0055】
Tx1内のアンロックスクリプトが、Tx0のロックスクリプトで指定された1つ以上の条件を満たす場合(示される例では、Aliceの署名がTx1内で提供され、認証されている場合)、ノード104は、Tx1が有効であるとみなす。それが記憶ノード104Sである場合、これは、proof-of-workを待つトランザクションのプール154にそれを追加することを意味する。それが転送ノード104Fである場合、それはトランザクションTx1をネットワーク106内の1つ以上の他のノード104に転送し、それによって、それがネットワーク全体に伝播されることになる。一旦、Tx1が検証され、ブロックチェーン150に含まれると、これは、Tx0からのUTXO0を消費したものとして定義する。Tx1は、未使用トランザクションアウトプット203を使用する場合にのみ有効であることに留意されたい。別のトランザクション152によってすでに消費されたアウトプットを消費しようとする場合、Tx1は、たとえ他のすべての条件が満たされていても無効となる。従って、ノード104は、先行するトランザクションTx0において参照されたUTXOが既に使用されているかどうか(既に別の有効なトランザクションへの有効なインプットを形成しているかどうか)もチェックする必要がある。これが、ブロックチェーン150がトランザクション152に定義された順序を課すことが重要である理由の1つである。実際には、所与のノード104は、トランザクション152が消費されたUTXO203をマークする別個のデータベースを維持することができるが、最終的には、UTXOが消費されたかどうかを定義するのは、ブロックチェーン150内の別の有効なトランザクションへの有効なインプットを既に形成しているかどうかである。
【0056】
所与のトランザクション152の全部のアウトプット203の中で指定された総量が全部のそのインプット202により指される総量より大きい場合、これは、殆どのトランザクションモデルにおいて無効の別の基礎である。従って、このようなトランザクションは、伝播されず、マイニングされてブロック151にされることもない。
【0057】
UTXOベースのトランザクションモデルでは、所定のUTXOを全体として使用する必要があることに注意する。UTXOで定義されている量のうち、別の分量が消費されている一方で、分量を「残しておく」ことはできない。ただし、UTXOからの量は、次のトランザクションの複数のアウトプットに分割できる。例えば、Tx0のUTXO0で定義された量は、Tx1の複数のUTXOに分割できる。したがって、AliceがBobにUTXO0で定義された量のすべてを与えることを望まない場合、彼女は残りの量を使って、Tx1の第2のアウトプットの中で自分自身にお釣りを与えるか、又は別のパーティに支払うことができる。
【0058】
実際には、Aliceは通常、勝ったマイナーのための手数料も含める必要がある。なぜなら、今日では、生成トランザクションの報酬だけでは、マイニングを動機づけるには通常十分ではないからである。Aliceがマイナーのための手数料を含まない場合、Tx0はマイナーのノード104Mによって拒否される可能性が高く、したがって、技術的には有効であるが、それは依然として伝播されず、ブロックチェーン150に含まれない(マイナーのプロトコルは、マイナーが望まない場合には、マイナー104Mにトランザクション152を受け入れるよう強制しない)。一部のプロトコルでは、マイニング料金は、独自の別個のアウトプット203を必要としない(すなわち、別個のUTXOを必要としない)。代わりに、インプット202によって指される総量と、所与のトランザクション152のアウトプット203の中で指定される総量との間の差は、勝ったマイナー104に自動的に与えられる。例えば、UTXO0へのポインタがTx1への唯一のインプットであり、Tx1は1つのアウトプットUTXO1しか持っていないとする。UTXO0で指定されたデジタルアセットの量がUTXO1で指定された量より多い場合、その差は自動的に勝ったマイナー104Mへ行く。しかし、代替的又は追加的に、必ずしも、トランザクション152のUTXO203のうちの独自のものにおいて、マイナー手数料を明示的に指定できることは除外されない。
【0059】
Alice及びBobのデジタルアセットは、ブロックチェーン150内の任意のトランザクション152の中で彼らへのロックされた未使用UTXOで構成されている。従って、典型的には、所与のパーティ103のアセットは、ブロックチェーン150を通して、様々なトランザクション152のUTXO全体に分散される。ブロックチェーン150内のどこにも、所与のパーティ103の総残高を定義する1つの数値は記憶されていない。各パーティへのロックされた、別の将来の(onward)トランザクションにまだ消費されていないすべての様々なUTXOの値をまとめることは、クライアントアプリケーション105におけるウォレット機能の役割である。これは、記憶ノード104Sのいずれかに記憶されたブロックチェーン150のコピーを、例えば、各パーティのコンピュータ機器02に最も近いか、又は最も良好に接続されている記憶ノード104Sに問い合わせることによって行うことができる。
【0060】
スクリプトコードは、概略的に表現されることが多い(すなわち、正確な言語ではない)ことに注意する。例えば、[Checksig PA]を[ChecksigPA]=OP_DUPOP_HASH160<H(PA)>OP_EQUALVERIFYOP_CHECKSIGを意味するように記述し得る。「OP_....」は、スクリプト言語の特定のオペコードを表す。OP_CHECKSIG(「Checksig」とも呼ばれる)は、2つのインプット(署名と公開鍵)を取り込み、楕円曲線デジタル署名アルゴリズム(Elliptic Curve Digital Signature Algorithm (ECDSA))を使用して署名の妥当性を検証するスクリプトオペコードである。ランタイムでは、署名(「si」')の発生はすべてスクリプトから削除されるが、ハッシュパズルなどの追加要件は、「sig」インプットによって検証されるトランザクションに残る。別の例として、OP_RETURNは、トランザクション内にメタデータを格納することができ、それによってメタデータをブロックチェーン150に不変に記録することができるトランザクションの使用不可能アウトプットを生成するためのスクリプト言語のオペコードである。例えば、メタデータは、ブロックチェーンに格納することが望ましいドキュメントを含むことができる。
【0061】
署名PAは、デジタル署名である。実施形態において、これは楕円曲線secp256k1を使用するECDSAに基づく。デジタル署名は、特定のデータに署名する。実施形態では、所与のトランザクションについて、署名はトランザクションインプットの一部、及びトランザクションアウトプットの全部又は一部に署名する。署名するアウトプットの特定の部分はSIGHASHフラグに依存する。SIGHASHフラグは、署名の最後に含まれる4バイトのコードであり、どのアウトプットが署名されるかを選択する(従って、署名の時点で固定される)。
【0062】
ロックスクリプトは、それぞれのトランザクションがロックされているパーティの公開鍵を含んでいることを表す「scriptPubKey」と呼ばれることがある。アンロックスクリプトは、対応する署名を提供することを表す「scriptSig」と呼ばれることがある。しかし、より一般的には、UTXOが償還される条件が署名を認証することを含むことは、ブロックチェーン150のすべてのアプリケーションにおいて必須ではない。より一般的には、スクリプト言語は、1つ以上の条件を定義するために使用され得る。したがって、より一般的な用語「ロックスクリプト」及び「アンロックスクリプト」が好ましい。
【0063】
幾つかのブロックチェーンプロトコルは、2種類の要素:データ及びオペコードを含むスクリプト言語を使用する。スクリプト内のデータは、例えば、数値、公開鍵、署名、ハッシュ値、等であってよい。オペコードは、スクリプト内のデータに作用する関数である。スクリプト言語では、スクリプトは、端から端まで実行され(通常は左から右へ)、「スタック」と世慣れるデータ構造を利用する。データは、常に、スタックへとプッシュされる(つまり、それに置かれる)。オペコードは、スタックからデータを取り出し(ポップする)(つまり、スタックからデータを取り込む)、データに対して演算を実行し、次に任意的に、新しいデータをスタックに「プッシュする」。多数のブロックチェーンで一般的に使用されるスタックに基づくスクリプト言語は、単にScriptと呼ばれる。以下は、Script言語のオペコードの観点で説明される。
【0064】
スタックに基づくは、当業者によく知られている。以下の例は、例示的なスクリプト実装の方法を説明する。具体的には、例示的な検証及びアンロック処理は以下に示される。
【0065】
例示的なスクリプトは、<Bob’s signature><Bob’s public key>OP_DUP OP_HASH<Bob’s public address>OP_EQUALVERIFY OP_CHECKSIG。スクリプトは左から右へと演算される。
【0066】
ステップ1:<Bob’s signature>をスタックにプッシュする。
【表1】
【0067】
ステップ2:<Bob’s public key>をスタックにプッシュする(これは、今、スタックの一番上の要素である)。
【表2】
【0068】
ステップ3:OP_DUPオペコードは、スタックの一番上の要素に対して作用し、<Bob’s public key>を複製する。
【表3】
ステップ4:OP_HASHオペコードは、<Bob’s public key>をポップアウトし、それをハッシュアルゴリズムを通して(その後に1つ以上の任意的演算が続く)、<Bob’s public address>を得て、それをスタックに配置する。
【表4】
【0069】
ステップ5:<Bob’s public address>をスタックにプッシュする(これは、今、スタックの一番上の要素である)。
【表5】
【0070】
ステップ6:OP_EQUALVERIFYオペコードは、最後の2つの要素をスタックからポップオフし(<Bob’s public address>及び<Bob’s public address>)、2つのアドレスが同一か否かを知るためにチェックする。それらが同一ではない場合、実行は失敗したと考えられる。条件がTRUEである場合、次のコマンドが実行される。
【表6】
【0071】
ステップ7:OP_CHECKSIGオペコードは<Bob’s public key>及び<Bob’s signature>をポップアウトし、それらの有効性を知るためにチェックする。この処理が完了すると、Bobは、トランザクションをアンロックし、指定された量のデジタルアセットにアクセスできる。
【表7】
【0072】
インスクリプト関数
本発明の実施形態は、ブロックチェーントランザクションの中でインスクリプト合成関数を実施することを提供する。これは、OP_RETURNの関数を再定義する(又は代替として以下のOP_RETURNに起因する関数を実行するようオペコードを構成する)ことにより達成される。
【0073】
図3は、UTXO又はアウトプットに基づくモデルの例における、ブロックチェーンネットワーク106の各ノード104で実行され得るノードソフトウェア300の例を示す。ノードソフトウェア300は、他のコンポーネントの中でも特に、スクリプトエンジン301、スタック302、アプリケーションレベル決定エンジン303を含む。スクリプトエンジン301は、スクリプトの部分をデータ要素又は該データ要素に作用する関数として解釈し及び/又はスタック302からデータ要素をプッシュ又はリードすることによりスクリプトを実行するよう構成されるスクリプトインタープリタを含んでよい。代替として、スクリプトエンジン301は、ジャストインタイム(just-in-time (JIT))コンパイルのような、別の実行形式を利用し得る。通常、用語「実行する」は、本願明細書で、任意の方法でスクリプトを実行するその最も広い意味で使用される(コンパイルされた機械コード命令を実行するという狭い意味ではない)。従って、「実行する」は、現在の文脈で解釈することを含み得る。現在の文脈における「オペコード」は、個々の機械コード命令のオペコードを意味せず、むしろ、各ノード104においてスクリプトエンジン301によりそれぞれの所定の関数にマッピングされる、より上位レベルのコマンドを意味する。
【0074】
図示しないが、ノードソフトウェアは、プロトコルエンジンと、1つ以上のブロックチェーン関連機能モジュールのセットと、を更に含んでよい。任意の所与のノード104で、これらは、(ノードの1つ以上の役割に依存して)マイニングモジュール、転送モジュール、及び格納モジュール、のうちの任意の1、2、又は3個を含んでよい。プロトコルエンジンは、トランザクション152の異なるフィールドを認識し、それらをノードプロトコルに従い処理するよう構成される。トランザクション152m(Txm)が受信され、別の先行するトランザクション152m-1(Txm-1)のアウトプット(例えばUTXO)をポイントするインプットを有するとき、プロトコルエンジンは、アンロックスクリプトを識別し、それをスクリプトエンジン401に渡す。プロトコルエンジンは、更に、Txmのインプットの中のポインタに基づき、Txm-1を識別し検索する。それは、Txm-1が未だブロックチェーン150にない場合、それぞれのノード自身の保留中トランザクションのプール154から、又はTxm-1が既にブロックチェーン150にある場合、それぞれのノード若しくは別のノード104に格納されたブロックチェーン150内のブロック151のコピーから、Txm-1を検索してよい。いずれの方法も、プロトコルエンジンは、Txm-1のポイントされるアウトプットの中のロックスクリプトを識別し、これをスクリプトエンジン301に渡す。
【0075】
スクリプトエンジン301は、従って、Txm-1のロックスクリプト、及びTxmの対応するインプットからのアンロックスクリプトを有する。例えば、Tx及びTx図4に示されるが、それは、Tx及びTx1等のようなトランザクションの任意のペアに適用され得る。スクリプトエンジン301は、前述のように2つのスクリプトを一緒に実行し、これらは、使用されているスタックに基づくスクリプト言語(例えばScript)に従い、スタック302にデータを置くことと、データを検索することとを含む。
【0076】
図3に示すように、Txのロックスクリプトは、1つ以上のOCSオペコード(本例では2つ)及び少なくとも1つのOP_RETURNを含む。スクリプトエンジン301は、OP_RETURNを呼び出すとき、スタック402の一番上からデータ要素を消費し、該データ要素をTxのロックスクリプトに含まれるOCSオペコードのうちの1つへの参照として解釈するよう構成される。スクリプトエンジン301は、また、例えば、ロックスクリプトの未実行部分を参照されたOCSオペコードに続くロックスクリプトの部分で置き換えることにより、参照されたOCSオペコードに続くロックスクリプトの部分を実行するよう構成される。
【0077】
上述のように、トランザクションを実行するとき(例えば検証するとき)、トランザクションのロックスクリプトは、前のトランザクションのアンロックスクリプトと一緒に実行される。トランザクションは、1つより多くのロックスクリプトを含んでよい。それらのロックスクリプトのうちの少なくとも1つは、OP_RETURNと、OP_CODESEPARATOR(OCS)の1つ以上のインスタンスと、を含む。OCSの各インスタンスは、ロックスクリプトの部分を分ける。例えば、ロックスクリプトの3個の部分を分ける2個のOCSオペコードが存在してよい。文脈上特に必要がない限り、第1、第2、第3、等は、同じアイテムの異なるもの(例えば、OCS、OP_RETURN、部分、等)の間を区別するための単なるラベルである。
【0078】
トランザクションの検証の部分として、ロックスクリプトが実行され、それがOP_RETURNを含む場合、OP_RETURNが呼び出されると、データ要素はスタックのうちの1つ(例えば、メイン(Main)又はオルト(Alt)スタック)からリードされる。データ要素は、両方のスタックからリードされ、結合されて(例えば、加算されて)単一のデータ要素を形成してよい。データ要素は、ロックスクリプトの実行中に、例えばOP_RETURNが呼び出されるポイントまでに、生成される。データ要素は、数値又は他の種類の変数であってよく、該データ要素に対応するOCSから続くロックスクリプトの第1部分を出力するために使用される。言い換えると、データ要素は、特定のOCSのインデックス(又はアドレス)として解釈される。ここで、「ロックスクリプトの第1部分」は、必ずしも、ロックスクリプトの主要部分であることを意味しない。ここで、「第1」は、ロックスクリプトの部分を参照するラベルとして使用され、それはスタックからリードされたデータ要素に依存して主要部分であっても、そうでなくてもよい。例えば、3個のOCSオペコードがロックスクリプト内に存在する場合、それらは、番号1、2、3によりインデックス付けされてよい。データ要素がスクリプト内の第2OCSに対応する場合、第2OCSに続くロックスクリプトの部分が出力される。ロックスクリプトの部分は、例えば、スクリプトテンプレートに追加され、実行されるべき命令セットに追加され、及び/又は実行されてよい。
【0079】
ロックスクリプトの第1部分が次に実行されると、それがOP_RETURNのインスタンスを含む場合、OP_RETURNの該インスタンスが呼び出されると、データ要素がスタックからリードされ、OCSのアドレスとして使用されてよい。スタックからリードされるデータ要素に依存して、同じOCS又は異なるOCSが参照されてよい。参照されたOCSに続くロックスクリプトの部分(「第2部分」と呼ばれる)が出力される。上述の例を続けると、データ要素がスクリプト内の第1OCSに対応する場合、第1OCSに続くロックスクリプトの部分が出力される。代替として、データ要素は、第2又は第3OCSに対応してよく、この場合、出力されるロックスクリプトの部分は、それぞれ第2又は第3OCSに続くものである。ロックスクリプトの内容が相応して選択される場合、例えば、OCSオペコードの同じセットが繰り返し参照されることにより、無限ループが生成されることがある。
【0080】
幾つかの実施形態では、ロックスクリプト内では、各OP_RETURNの前にオペコードがあり、該オペコードは呼び出されると、スタックの一番上にデータ要素をプッシュする。例えば、OP_RETURNに先行するオペコードの各々は、OCSオペコードのうちの1つに対応するデータ要素をスタックにプッシュしてよい。
【0081】
トランザクションのスクリプトは、スクリプトエンジン(例えば、スクリプトインタープリタ)により、リードされ、実行され、解釈される等されてよい。ロックスクリプトを実行する前に、スクリプトエンジンは、OP_RETURNの任意のインスタンスについて、ロックスクリプトをスキャンしてよい。ロックスクリプトがOP_RETURNの少なくとも1つのインスタンスを含む場合、スクリプトエンジンは、ロックスクリプト内の主要OCSで開始しロックスクリプトの終わりに終了するサブスクリプトを生成してよい。このサブスクリプトは、メモリに格納されてよい。OP_RETURNが呼び出されると、スタックからのデータ要素、例えばメインスタックからの一番上の要素が消費される。データ要素が正整数ではない、及び/又はサブスクリプト内のOCSオペコードの総数より大きい場合、実行は終了してよい。データ要素が正整数であり、サブスクリプト内のOCSオペコードの総数より少ない又は等しい場合、データ要素に対応するOCSに続くロックスクリプトの部分が出力される。例えば、未実行スクリプト(つまり、OP_RETURNに続くロックスクリプトの部分)は、n番目のOCSに続くロックスクリプトの部分により置き換えられる。ここで、nはOP_RETURNにより消費されるデータ要素である。
【0082】
スクリプトを実行しているとき、メインスクリプト及びサブスクリプトはメモリに保存されてよい。メインスクリプトは、スタック上で実行されるべきスクリプトである。サブスクリプトは、静的であり、サブスクリプトの参照スクリプトとして使用され、サブスクリプトの部分はリードされコピーされる。サブスクリプトは、ロックスクリプト内で最初のOCSから続く、ロックスクリプトのうちの全部を含む。メインスクリプトは動的である。それは実行が進行するにつれて消費されるだけでなく、それは、実行中にOP_RETURNによりサブスクリプトの何らかの部分により上書きされることもある。例えば、OP_RETURNが呼び出される度に、メインスクリプトは、消費されるデータ要素に対応するOCSに続くサブスクリプトの部分(つまり、サブスクリプトの部分を形成する元のロックスクリプトの部分)により置き換えられる。
【0083】
<使用例>
図4は、例示的なインスクリプト関数の実行を示す。この例示的な関数は、ユークリッドアルゴリズムを実行する。ユークリッドアルゴリズムは、2つのインプット(a,b)を取り入れ、a及びbの最大公約数(greatest common divisor (GCD))を出力する。簡単のために、a>bとする。
【0084】
本例では、インプットa及びbは、それぞれ105及び28である。数値105は、スタックで数値28より下になる。出力はGCD(105,28)である。実行されるべきスクリプトは以下である:OCS OP_TUCK OP_MOD OP_DUP OP_IF OP_1 OP_RETURN OP_ENDIF OP_DROP。スクリプトが単一のOCS及び単一のOP_RETURNを含むことが分かる。OP_RETURNは、スタックに1の値をプッシュするOP_1の後に続く。OP_RETURNが呼び出されると、1の値がリードされ、対応するOCSに続くスクリプトの部分を実行するために使用される。ここで、OCSがスクリプトの中の主要オペコードであることから、これはスクリプトが繰り返されることと等価である。
【0085】
図4に示すように、出力は7であり、これは105と28とのGCDである。スクリプトは、実行されるとき、1回以上(本例では1回)ループされてよい。つまり、105と28の最大公約数を計算するために、18個のオペコードが呼び出される。しかしながら、スクリプトを構成するためには9個のオペコードしか必要ない。これの利点は、より大きな合成スクリプトが、トランザクションに含まれる、より小さなスクリプトから実施できることである。
【0086】
図5A~Cは、別の例示的なインスクリプト関数の実行を示す。この例示的な関数楕円曲線点乗算を実行する。関数への入力は(a,G)である。ここで、aはスカラーであり、Gは生成元(generation point)である。本例では、aは7である。関数からの出力はa・Gである。
【0087】
実行されるべきスクリプトは以下の通りである:
【数2】
このスクリプトには、OCSオペコードの3個のインスタンス(OCS_1,OCS_2,OCS_3)があり、それぞれスクリプトの異なる部分を分けている。OP_RETURNの4個のインスタンスがあり、それぞれの前にオペコードがあり、該オペコードはOCSオペコードのうちの1つに対応するデータ要素をスタックにプッシュする。本例では、各OP_RETURNは数値を表すオペコードに続く。いつOP_RETURNに遭遇しても、スタックの1番目の要素が消費され、オペコードの新しいセットが、実行されるべきスクリプトボードにコピーされる。図5は、データ要素を含むスタックの展開、及びOP_RETURNのインスタンスまでのオペコードを含むスクリプトボードを示す。
【0088】
例として、「OP_DUP [POINT_ADD] OP_2 OP_RETURN」が実行された場合、OP_RETURNは、スタックからデータ要素「2」を消費し、OCS_2に続くスクリプトを実行することに進む。
【0089】
スクリプトは以下のように動作する。
(1)ALTスタックに0をプッシュする。この0は、ALTスタックの一番下に達したときを識別するのに役立つ。
(2)2個の入力(a,G)がある。a>1かどうかをチェックする。
a. Yesの場合、点2倍算(point doubling)に進む。
b. Noの場合、点加算を開始する。
(3)点2倍算の場合、スタックに1をプッシュすることにより開始する。この1は、カウンタのように動作し、何回、点が2倍算されたかを記録する。カウンタはaと比較する。将来の使用のために、Gのコピーが生成される。
a. カウンタがaより大きい場合、カウンタは半分に減らされ、次にその値がaから減算される。これは、元の値より小さい、aの新しい値を生成する。
b. 一方で、2倍算の結果は、ALTスタックにプッシュされる。その後、1がALTスタックにプッシュされて、ALTスタックからフェッチすべき値があることを示す。
c. OP_RETURNは、次に、aの新しい値によりステップ2へ進むために使用される。
4)実行できる2倍算がもはや存在しないとき、a=1か、又はa=0かがチェックされる。
a. a=1の場合、スタックの一番下に達するまで、ALTスタック上の各要素は1つずつフェッチされ、点加算が実行される。
b. a=0の場合、先ずGをドロップし、次にALTスタックから1つの結果をフェッチし、そして上述のステップ「a.」に戻る。
【0090】
オペコードの大きなグループの略語のように、点加算は[POINT_ADD]により定義され、点2倍算はOP_DUP[POINT_ADD](又は[POINT_DOUBLE])により定義されることに留意する。[POINT_ADD]は、スタック上の最初の2つの要素P及びPを消費し、P及びPの点加算をスタックにプッシュする。[POINT_DOUBLE]は、スタック上の最初の要素Pを消費し、点2Pをスタックにプッシュする。
【0091】
上記の実施形態は、単なる例示として説明したものであることが理解されるであろう。明らかに、実施形態は、特定の「名称」を有するオペコードに限定されない。むしろ、実施形態は、特定の機能を有するオペコードに限定される。用語「OP_RETURN」及び「OP_CODESEPARATOR」は、簡単のために使用されている。
【0092】
本願明細書に開示される教示の第1のインスタンスによると、ブロックチェーンのトランザクションを実行する、コンピュータにより実施される方法であって、前記トランザクションは、ロックスクリプトを含む少なくとも1つのアウトプットを含み、前記ロックスクリプトは、第1オペコードのインスタンス、及び第2オペコードの1つ以上のインスタンスを含み、前記第2オペコードの各インスタンスは、前記ロックスクリプトの部分を分け、前記方法は、
前記第1オペコードのインスタンスを呼び出すと、少なくとも1つのスタックから第1データ要素をリードするステップであって、前記第1データ要素は、異なるトランザクションのアンロックスクリプトにより前記ロックスクリプトの実行の間に生成される、ステップと、
前記第1データ要素に対応する前記第2オペコードのインスタンスに続く、前記ロックスクリプトの第1部分を出力するステップと、
を含む方法が提供される。
【0093】
第1オペコードは、終了オペコードであってよい。第2オペコードは、分離オペコードであってよい。
【0094】
第2の、任意的なインスタンスによると、前記出力するステップが、前記ロックスクリプトの前記第1部分のうちの少なくとも一部を実行するステップを含んでよい、第1のインスタンスによる方法が提供されてよい。
【0095】
第3の、任意的なインスタンスによると、サブスクリプトを生成するステップであって、前記サブスクリプトは、前記インスタンスオペコードの第1インスタンスから開始し、前記第2オペコードの前記第1インスタンスの後に実行される前記ロックスクリプトの残りの部分が続き、前記ロックスクリプトの前記第1部分は前記サブスクリプトの第1部分である、ステップ、を含む第1又は第2のインスタンスによる方法が提供されてよい。
【0096】
第4の、任意的なインスタンスによると、前記ロックスクリプト及び前記サブスクリプトは、ノードのメモリに格納されてよく、前記出力するステップは、前記ロックスクリプトの未実行部分を前記メモリ内の前記サブスクリプトの前記第1部分により置き換えるステップを含んでよい、第3のインスタンスによる方法が提供されてよい。
【0097】
第5の、任意的なインスタンスによると、前記ロックスクリプトを実行する前に、前記第1オペコードのインスタンスについて前記ロックスクリプトをスキャンするステップと、
前記ロックスクリプトが前記オペコードのインスタンスを含む場合、前記サブスクリプトを生成するステップと、
を含む第3又は第4のインスタンスによる方法が提供されてよい。
【0098】
第6の、任意的なインスタンスによると、前記方法は、前記第1データ要素を前記第2オペコードのインスタンスのアドレスとして解釈するステップを含んでよい、第1~第5のインスタンスによる方法が提供されてよい。
【0099】
第7の、任意的なインスタンスによると、前記法補は、以下:
前記第1データ要素が正整数ではない、
前記第1データ要素が前記第2オペコードのインスタンスの合計数より多い、
のうちの少なくとも1つの場合に、前記ロックスクリプトの実行を終了するステップ、を含む、第1~第6のインスタンスのいずれかによる方法が提供されてよい。
【0100】
第8の、任意的なインスタンスによると、前記ロックスクリプトの前記第1部分は、前記第1オペコードの第2インスタンスを含み、前記方法は、
前記第1オペコードの前記第2インスタンスを呼び出すと、少なくとも1つのスタックから第2データ要素をリードするステップであって、前記第2データ要素は、前記ロックスクリプトの第1部分の実行中に生成される、ステップと、
前記第2データ要素に対応する前記第2オペコードのインスタンスに続く、前記ロックスクリプトの第2部分を出力するステップと、
を含んでよい、第1~第7のインスタンスのいずれかによる方法が提供されよい。
【0101】
第9の、任意的なインスタンスによると、前記ロックスクリプトの前記第2部分を出力する前記ステップが、前記ロックスクリプトの前記第2部分のうちの少なくとも一部を実行するステップを含んでよい、第8のインスタンスによる方法が提供されてよい。
【0102】
第10の、任意的なインスタンスによると、前記ロックスクリプトの前記第2部分は前記サブスクリプトの第2部分であってよく、前記方法は、前記ロックスクリプトの前記第1部分の未実行部分を前記メモリ内の前記サブスクリプトの前記第2部分により置き換えるステップを含んでよい、第4のインスタンスに従属する第1~第9のインスタンスのいずれかによる方法が提供されてよい。
【0103】
本願明細書に開示される教示の第11のインスタンスによると、コンピュータ可読記憶装置上に具現化され、ブロックチェーンネットワークのノード上で実行すると第1~第10のインスタンスのいずれかを実行するよう構成される、コンピュータプログラムが提供される。
【0104】
本願明細書に開示される教示の第12のインスタンスによると、コンピューティング機器であって、
1つ以上のメモリユニットを含むメモリと、
1つ以上の処理ユニットを含む処理機器と、
を含み、
前記メモリは、前記処理機器上で実行するよう構成されるコードを格納し、前記コードは第1~第10のインスタンスのいずれかを実行するよう構成される、コンピュータ機器が提供される。
【0105】
開示された技術の他の変形例又は使用事例は、本明細書で開示されると、当業者に明らかになり得る。本開示の範囲は、記載された実施形態によって限定されるものではなく、添付の特許請求の範囲によってのみ限定される。
図1
図2
図3
図4
図5A
図5B
図5C