Spedn – BCH上にスマートコントラクトを記述するスクリプト言語を紹介します

2018.11.05

BCHNews編集部

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

みなさんは、暗号通貨関連の記事に、”OP_***”という表記や”オペコード”という単語を見かけたことはありませんか?
11月のBitcoin Cash(BCH)のハードフォークでも、BitcoinABCの”OP_CHECKDATASIG”というオペコードの追加が話題ですね。

オペコードは、一般的には機械語の1つの操作・命令のことを指しています。

オペコード (operation code, opcode) とは、機械語の1個の命令の部分で、実行する操作 (operation) の種類を指定する部分のこと、およびそのコード(符号)のことである。数式における演算子に相当する。命令のもうひとつの主要部分は、操作される対象を指定するオペランド(被演算子)である。

引用元:Wikipedia

暗号通貨の文脈では、トランザクションの入出力を記述するスクリプトで使用される命令のことを指しています。
例えば、Bitcoin Wikiのスクリプトの項目には、スクリプトを記述するために、様々な種類のオペコードが存在していることが分かります。

暗号通貨のやりとりである”トランザクション”には、オペコードを様々組み合わせて作った”スクリプト”が含まれています。
本日は、BCHのスクリプトを記述するために新しく開発されたSpednという言語を、スクリプトの簡単な説明と併せてご紹介しようと思います。

暗号通貨のスクリプトとは?

上述のようにトランザクションの入出力について記述し、オペコードの組み合わせ次第で支払いの条件などを様々設定することができるのがスクリプトです。
プログラミング言語のForthのようなスタイルをとっており、逆ポーランド記法を使用して記述されます。

逆ポーランド記法は、たとえば 1 + 2をしたい時、

1 2 +

と記述する数式などの表記方法です。
(1 + 2)*(3 + 4)の場合は、

 1 2 + 3 4 + *

と記述されます。

スクリプトは、式中の情報を左からスタックに保存していくため、スタックベース言語とも呼ばれます。
オペコードを使用したスクリプトの簡単な例をあげます。

 2 3 OP_ADD 5 OP_EQUAL

この式は、「2+3は5ですか?」という質問と同じ意味です。
演算後、”TRUE”という値を得ることができます。

実際のトランザクションではもう少し複雑になりますが、支払いの情報を含んだスクリプト(Locking script)と、支払い先の情報を含んだスクリプト(Unlocking script)で、支払いを検証するためのスクリプトが組み上げられます。
検証スクリプトから、最終的に得られたスタックに”TRUE”のみがあった場合、トランザクションは有効となります。

上述のスクリプト、眺めて見てどうでしょう?
とても読みづらいとは感じませんか?

そこで、このスクリプトを記述するための高級な言語として開発されたのが本日ご紹介するSpednという言語です。
(機械語に近いプログラミング言語を”低級”として扱うことに対して、人間の言語に近く、より人間が読みやすいプログラミング言語を”高級”と言います。)
Spednの開発者であるTendo Pein氏はMediumで次のように発言しています。

Script is both brilliant and just hard to use. And I think I’m not the only one that is repelled from it because of that.

—中略—

Script is basically a low-level assembly language for Bitcoin Cash virtual machine bytecode and we need some high-level language that can be compiled to it.

引用元:https://medium.com/@tendo_pein_sama/introducing-spedn-a-smart-contract-language-for-bitcoin-cash-7b83b467de05

[意訳]
スクリプトは、素晴らしくそして使いづらい。したがって、スクリプトに撃退されたのは私だけではないと思います。

スクリプトは基本的にBCH仮想マシンバイトコードの低級アセンブリ言語であり、私たちにはそれをコンパイルできる高級言語が必要です。

より高級なスクリプトを記述するSpedn

このSpednは、C言語のような構文でBCHのスマートコントラクトを記述することができます。

引用元:https://medium.com/@tendo_pein_sama/introducing-spedn-a-smart-contract-language-for-bitcoin-cash-7b83b467de05

上記のコードは、Spednを使用して、トランザクションに賭けの要素を付与したChainBetプロトコルを記述したものです。
ChainBetプロトコルは簡単に言うと、AliceさんとBobさんが作成した秘密の値を合計し、結果が奇数か偶数かによってどちらかが賭け金を得ることができるプロトコルです。
ChainBetプロトコルの詳細は、こちらの投稿をご覧ください。

Spednは、次のように設計されています。

  • 静的な型指定:
    コンパイル時にエラーが探しやすい
  • 明示的な型指定:
    式の返り値の型を推測しなくても良い
  • 純粋で機能的:
    バグの原因となる副作用がない

Spednのドキュメントは、こちらに記載されており、Hasklel Tool Stackがインストールされていれば、クイックスタートガイドから簡単に初めてのスクリプトを記述することができます。
C言語のようにソースコードをコンパイルすることで、次のようなコントラクトのテンプレートを得ることができます。

   2 PICK TRUE EQUAL IF 3 PICK HASH160 OVER EQUALVERIFY (...) 

開発者のPein氏はSpednについて、「まだ開発の初期段階にあり、スマートコントラクト開発者にとってすぐに使えるものではない」と語っており、現在はSpednへのレビューや、構文アイデア、コードレビューやバグ報告などを募集しています。

一言

本日は、BCHのスマートコントラクトスクリプトを作成するための言語、Spednについてご紹介しました。
開発者の言う通り、Spednはこのまますぐ使えるものではないものである事は明らかだと思います。
ですが、これから様々なコントラクトをより簡単に作成するためのベースとなる言語が出来た、と言うのは喜ばしい事だと思います。

最新情報はこちら

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

BCHNews編集部

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

関連記事

BitcoinCash向けウォレットのMoney Buttonがローンチされる

2018.09.17

by BCHNews編集部

Bitcoin CashにおけるRabin Signatures

2018.09.25

by BCHNews編集部

Bitcoin Files Protocol(BFP) – BitcoinCashを利用したファイルストレージシステム

2018.10.17

by BCHNews編集部

BitcoinCashトランザクションの完全なデータベース、BitDB 2.0がリリースされる

2018.09.28

by BCHNews編集部