Bitcoin Unlimitedの開発者、Bitcoinスクリプトの拡張を提案

2018.11.21

BCHNews編集部

こんにちは、BCHNews編集部のreiです。

Bitcoin Cash(BCH)が分裂してしまいましたね。
市場の変動でウォレットの残高が少し減って悲しい気持ちになりました。

暗号通貨のハードフォークが起きる原因は、互換性のないネットワークコンセンサスルールの変更です。コミュニティ内で合意が得られている変更の場合は、分裂がおこることはありません。今回のハードフォークも初めは単なるコンセンサスルールのアップグレードでしたが、コミュニティ内で合意が得られなかったため分裂することになりました。詳しくは過去記事をご覧ください。

【過去記事】
『11月のBitcoinCashのハードフォークについて 〜 Bitcoin SV 〜』
https://bchnews.jp/bitcoincashnews-e/2051

そんな中、BCHのクライアントを開発しているうちの一つであるBitcoin Unlimited(BU)の開発者であるAndrew Stone氏は、オペコードをフォークせずに組み込むことができるBitcoinスクリプトの拡張を提案しています。

そこで本日は、このStone氏が提案するEBS(Extended Bitcoin Script)についてご紹介しようと思います。

ハードフォークについてのおさらい

さて、EBSについて触れる前にまずハードフォークについて簡単におさらいしてみましょう。
前述したように、ハードフォークは互換性のないネットワークコンセンサスの変更から発生します。

ネットワークのノードは、決まったルールでブロックを処理し、ブロックチェーンを維持しています。
ルールは必要に応じて都度変更されていくのですが、ルール変更には”新しいルールで書かれたものが古いルールでも受け入れられる場合”・”古いルールでは受け入れられない場合”の2パターンが存在します。
ブロックチェーンの中に新旧のルールが混在する時、前者で発生するのがソフトフォーク、後者で発生するのがハードフォークです。

このルール変更の中には、ノードがトランザクションを処理するための言語であるスクリプトの変更も含まれます。
BCHのハードフォークにも盛り込まれている、オペコードの追加などがそうです。

スクリプトについては、以下の記事で簡単に解説しています。
詳細を知りたい方は、こちらのwikiを参考にしてください。

【過去記事】
『Spedn – BCH上にスマートコントラクトを記述するスクリプト言語を紹介します』
https://bchnews.jp/bitcoincashnews-sr/4397

EBSについて

前述したように、トランザクションを処理するために使用される言語がスクリプトです。
以下では、現状BCHで運用されているオリジナルのスクリプトをBitcoin Script(BS)と呼びます。

BSは、実行順序(フロー)を制御するために、他のプログラミング言語のようにIF文を使用することができます。
しかし、IF以外のループ(for文など)やジャンプ(go toなど)および関数呼び出しは、使用することはできません。

今回提案されたEBSは、BSを拡張した新しい言語であり、関数呼び出しや有限のループ処理などを可能にします。
提案者のStone氏は、この拡張には2つの理由があると語っています。

One reason for doing so is to keep the advantages of decidability while gaining the space efficiencies these language features allow. Another advantage is that function calls, finite loops, and new opcodes can be added to the language in practice without a hard fork.

[日本語訳]
そうすることの一つの理由は、言語の特徴が許容する空間効率を得つつ決定可能性の利点を維持すること。もう一つの利点は、関数の呼び出しや有限ループ、新しいオペコードを言語にハードフォークなしに追加できることです。

引用元:https://medium.com/@g.andrew.stone/forkless-inclusion-of-functions-loops-and-new-opcodes-in-bitcoin-script-6bd1155a9f5a

EBSノードは、EBSスクリプトを含むトランザクションを他のEBSノードに伝達します。EBSノードは、EBSスクリプトを直接評価することができますが、EBSをBSに変換し、必要に応じてBSノードにトランザクションを送信することもできます。

実際の提案について

提案はまず、ローカル関数についてから始まります。
以下のように関数を定義します。

OP_DEFFN <Name>
… <any code> 
OP_FNEND

関数は、スタックから引数を受け取り、結果をreturnしてスタックに積みます。

実行するためのオペコードは、次のように定義します。

OP_CALL <Name>

OP_CALLがあった場合に、関数の中の処理に置き換えられるようにすれば関数の呼び出しが実現できます。

 

次に、グローバル関数についてです。
関数定義からSHA256のダブルハッシュを取ることで、256ビットの暗号ハッシュを一意のグローバル識別子として使用できます。
このグローバル識別子を使用することで、全ての関数をグローバル関数として呼び出すことができます。

OP_CALL <Global Name>

このグローバル関数定義は、ノードがキャッシュとして保管することで、トランザクションの有効サイズを圧縮することができます。

ノードがどのようにグローバル関数定義を検出するかは様々です。当然、グローバル関数を含むスクリプトを提供するノードは、グローバル関数の定義も提供できなければなりません。一般的に使用される関数については、共通ライブラリとしてフルノード実装に含めておくことが提案されています。

最後にループ(繰り返し処理)についてです。
次のコードはN回のループを表しています。

OP_REPEAT<N>
  <code>
OP_REPEATEND

先ほどと同様に、BSに変換すると以下のようになります。

<code> <code> … (N times)… <code>

また、

OP_REPEAT_IF<N, {condition check code}> {looping code}

とすることでN以下の条件付きループを記述することもできます。

 

以上のように、関数やループ処理を既存のスクリプトの形に変換するような仕様にすることで、ハードフォークを伴わずにより柔軟なスクリプトを記述できるようにすることが提案されています。

ただし、この提案ではオペコードの最大数やスクリプト長の制限が問題になります。
ループなどを使用することを考えると、スクリプトの長さが増加することは明らかであり、おそらくこれらの制限を引き上げる必要があるとも述べられています。

一言

本日は、BUの開発者であるAndrew Stone氏が提案した既存スクリプトの拡張言語EBSについてご紹介しました。
ハードフォークをせずに柔軟なスクリプトを実装する提案ですが、よりポピュラーになった関数は、ハードフォークを行なって既存のオペコードに追加することも検討すべきとも述べられています。
BCHの分裂もオペコード絡みで意見が割れた経緯もあり、この提案もどうなるか難しいところですね。

最新情報はこちら

BCHNewsでは公式のTwitterアカウント(@bchnews_jp)を開設しました。
更新情報を配信しておりますので、よろしければフォローしていただけると嬉しいです。

BCHNews編集部

BCHNews編集部です。
日々更新される暗号通貨関連のニュースを読者の皆様にお届けします。

関連記事

Graphen – BitcoinCashのブロック伝搬速度を劇的に向上させる技術について解説します

2018.11.17

by BCHNews編集部

Bitcoin Unlimitedのリード開発者、ゼロ確認と二重支払いについて考察

2018.11.17

by BCHNews編集部

Bitcoin CashにおけるRabin Signatures

2018.09.25

by BCHNews編集部

bookchain – BCHのブロックチェーンを利用した書籍保存サービスを紹介します

2018.11.28

by BCHNews編集部