ビットコインスマートコントラクトの紹介

sCrypt
6 min readJun 20, 2020

ビットコインスマートコントラクトの紹介

一般的な考えに反して、ビットコインには誕生以来、完全なスマートコントラクト機能が搭載されています。ここでは、ビットコインのスマートコントラクトの基本を紹介し、例を挙げてデモを行います。

UTXOモデル

各ビットコインのトランザクションは、複数の入力と出力で構成されています。出力が含まれています。

  • 含まれるビットコインの数。
  • コンピュータコード(ロックスクリプト)。

一方、入力には次のものが含まれています。

  • 前のトランザクションの出力への参照。
  • コンピュータコード(ロック解除スクリプト)。

AがBにビットコインを送信すると、チェーンにトランザクションTX_1が記録されます。その最初の出力TX_1_OUT_1には、Bの秘密鍵によってのみ動かすことができるビットコインがあります。Bだけが知っているので、他の誰もビットコインを使うことができません。

BがビットコインをCに送るとき、Bは新しいトランザクションTX_2を作成します。その入力には、前のトランザクションの出力TX_1_OUT_1への参照と、その秘密鍵で署名された「鍵」(すなわち、アンロックスクリプト)が含まれる。その出力は、ビットコインと、Cだけが開けることができる新しい「ロック」(すなわち、新しいロックスクリプト)を含みます。TX_2はビットコインネットワークに送信され、マイナーが含まれているスクリプトを検証した場合にのみチェーンに記録されます。これが一般的なビットコイン転送の仕組みです。

出力TX_1_OUT_1は、TX_2で消費されたので、ネットワークによって消費されたものとしてマークされます。他のトランザクションが再びそれを参照した場合、それは二重消費とみなされ、ネットワークによって拒否されます。TX_2_OUT_1は、まだどのトランザクションでも消費されていないので、このように未消費トランザクション出力(UTXO)と呼ばれます。

要約すると、入力は前のトランザクションの出力を指し、その中でビットコインを消費します。トランザクションは出力から出力へビットコインを移動させる。入力に前の出力の「ロック」と一致する「キー」が含まれている場合のみ、出力に含まれているビットコインを新しい出力に移動させることができます。

ビットコイン仮想マシン(Bitcoin Vitual Machine, BVM)

これらのコンピュータコードの理解の核心は、ビットコイン仮想マシンにあります。

各ビットコインノードには仮想マシン(VM)があり、これをBVMと呼んでいます。BVMは、スタック内で計算を行う命令を実行します。各命令は、演算子/オペコードとそのオペランドで構成されています。各オペコードの後には、ゼロ、1、または2つのオペランドが続きます。

ここでは、いくつかのオペコードの例を示します。BVMオペコードの完全なリストはこちらを参照ください。

ビットコインでは、これらの命令をスクリプトと呼びます。前項で説明したコンピュータコードはスクリプトです。トランザクションを検証する際には、出力されたスクリプト(ビットコインをロックアップするのでロックスクリプトと呼ばれます)が、それを参照する入力のスクリプト(アンロックスクリプトと呼ばれます)に追加されます。ジョイントスクリプトはBVMにフィードされ、評価されます。完了時にスタックの先頭が真の値(すなわち、ゼロ以外の値)であれば、スクリプトは成功し、ビットコインの使用が許可されます。そうでない場合は拒否されます。

具体例

1つのトランザクションで、いくつかのビットコインがロックアップされ、以下のスクリプトで出力されます。

OP_1 OP_2 OP_ADD OP_EQUAL

別のトランザクションでは、以下のスクリプトを使用して出力を消費します。

OP_3.

支出がどのように認可されているかを確認するために、スクリプトの評価を歩いてみましょう。

まず、2つのスクリプトを結合します。

OP_3 OP_1 OP_2 OP_ADD OP_EQUAL

次に、BVMは最初からスクリプトの評価を開始します。以下に各ステップを列挙します。

完了すると、スタックの先頭に true が表示され、スクリプトは成功します。アンロックスクリプトで 3 以外の数値がプッシュされていた場合、スクリプトは false と評価されていたでしょう。

ビットコインのスマートコントラクト

例からわかるように、与えられたロックスクリプトでは、特定のロック解除スクリプトのみがジョイントスクリプトを真に評価することができます。この意味で、任意のビットコインの支出は契約を形成します。一方の当事者はビットコインで資金を提供し、契約の条件を規定し、他方の当事者は、契約の条件を満たす場合にのみ、資金を償還することができます。

従来の契約とは異なり、ビットコインネットワーク内のマイナーによって自動的に執行されるという意味で、スマートな契約といえます。

ビットコイン上のスマートコントラクトは、BVMによって実行されるScriptのコンピュータコードに過ぎません。ビットコインスクリプトの汎用性と表現力のおかげで、ビットコイン上で任意の複雑なスマートコントラクトを実行することができます。これらについては今後の記事で様々なデモを紹介していきます。

--

--

sCrypt

sCrypt (https://scrypt.io) is a full-stack smart contract and token development platform for Bitcoin