BBc−1 version1.0っていうのをリリースしました（１）

先日、BBc-1 (Beyond Blockchain-1)という次世代ブロックチェーンプラットフォームのversion 1.0というのをリリースしました([githubのリポジトリ](https://github.com/beyond-blockchain/bbc1))。

一応リポジトリ内のdocs/にそれなりの資料は入れていますが、きっとこれだけでは伝わりきらないと思うので、紹介記事を何回かに分けて書いていきたいと思います。まず初回は、BBc-1の背景というか、設計ポリシーみたいなところを説明してみようと思います。具体的な使い方とかコーディングの方法については、次回以降に書く予定です。

なお、分散台帳という言葉とブロックチェーンという言葉があり、それぞれ色々な定義があるようですが、ここでは特に区別せずに使うことにさせてください。

# BBc-1は何を目指しているか

BBc-1は、**「ブロックチェーンが実現したかったこと」**は**「実はブロックチェーンを使わなくてもできるのではないか？」**という問いが、その根本にあります。もうちょっと違う言い方をすると、「端的にホントにやりたいことを達成するなら、どんな形になるべきか？」というのを考えた結果としてできたものです。なんだか回りくどいですが。

これを考える上で、まず前提を置く必要があります。

**BBc-1はプライベート（またはコンソーシアム）型のブロックチェーンの仲間です。**つまり、BitcoinやEthereumなどの様な誰が参加してくるかわからないという前提ではなく、ある決まった範囲で参加者が定義できるような状況で利用します。それが大前提になります。

## 達成したいこと

ちょっとわかりにくい表現になるかもしれませんが、次のようなことを達成するのがBBc-1の目的です。

* 情報（デジタル資産）そのものや、その取引に関して合意した情報を保存したい
* 一度保存された情報は誰にも（当事者にも）改ざんされないようにしたい
* 改ざんされていないという事実を参加者なら誰でも確認できるようにしたい

このレベルで書くと、BBc-1特有の話ではなく、おそらくどのブロックチェーンプラットフォームも同じことを目指していると思います。ある決まった範囲の参加者が定義できるような状況で利用するプラットフォームは、どんな特徴・機能を備えればよいかを、既存の考え方に縛られずに考えた結果がBBc-1です。

# 何ではないか

まずはじめに、他の色々なブロックチェーンプラットフォームを使ったシステムでは*できないことができる*、、、わけではありません。ブロックチェーンプラットフォーム単体でサービスを作ることはほぼなくて、他の様々な機能、サービスと組み合わせて最終成果物が出来上がります。そういう意味でいうと、BBc-1を使っても、他のプラットフォームを使っても、開発可能な最終成果物にはあまり違いがないと思われます。

つぎに、BBc-1には*ブロックのチェーンはありません*。なので狭義にはブロックチェーンではないのかもしれませんが、目指すものは先にも述べたように同じなので、仲間だと言わせてください。(だから分散台帳っていう言葉があるんですかね？)

後もう一つ付け加えるとすると、必ずしも分散である必要すらないと思っています。これはちょっと誤解を招くかもしれませんが、次のような意味です。サーバやストレージの障害等々の対策としての冗長化は、サービスの可用性・堅牢性を上げるために必須だと思います。また、万一に備えて、例えば磁気テープなどにハードなバックアップをとっておくというのも必要だと思います。しかし、このように冗長化されているシステムを分散システムとは言わない（ことのほうが多い）と思います。いわゆる分散システムであってもなくてもどっちでもいい、というスタンスです。

### 何と似ているか
多分、[Corda](https://github.com/corda/corda)、[IOTA](https://www.iota.org)あたりと似た要素を持っているのではないかと思っています。*実は他のプラットフォームのことをそれほど深く理解していないので、ご指摘あればお願いします。*


# BBc-1の大事なポイント

これを外したら、もはやBBc-1ではなくなるだろうな、という点のうち、私が重要だと思うポイントを2つ上げておきます（差別化できるポイントは他にもあるのですが）。

### 「合意」の考え方
BBc-1にはマイニングはありません。また、コンセンサスアルゴリズムも搭載しません（必要ならBBc-1のアプリケーションの中で実装すればいいという考え方）。BBc-1における合意は、非常に単純かつ直感的で、**「BBc-1に保存しようとする情報（トランザクションと呼びます）について、それに関係する人たちがその内容を承認すること」**を合意とし、それを電子署名で表現します。実生活、実ビジネスでいう合意とほとんど同じ意味で、合意の証を電子署名で表します（実社会では、ハンコやサインですね）。BBc-1では、この承認（電子署名の付与）という手続きが、トランザクションを登録する手順の中に明示的にプロトコルとして含まれます。

もし2者間の取引なら、その取引内容についてはその2者で合意していれば、他の人を巻き込む必要は本来ないはずです。そこに監督官庁の認可が必要であれば、2者間の合意ではなく3者間の合意と考えればいいです。

概念的には他のブロックチェーンプラットフォームもそんなに違いはないと思いますが、スマートコントラクトという概念の中に隠蔽されてしまっていて、実際誰と誰が何に合意するのかがわかりにくくなっていたり、スマートコントラクトを実行するための特別なノードが必要だったり、または契約の当事者とは関係のないノード（例えば全部のノード）で確認作業を行ったり、そういうことはBBc-1にはありません。

BBc-1システムは、coreノードというものしかいないのですが、coreノード自体は合意そのものにはかかわらず、単に必要な人（クライアントアプリ）に合意プロセスに必要なメッセージを配送するだけです。もし、クライアントアプリケーションがビザンチン障害を想定するなら、アプリケーションが例えばPBFTを動かせばいいです（そういうライブラリも作ろうか、という話もあります）

適切な強度の暗号鍵を使って署名されていれば、それを辻褄が合うように改ざんするのはほとんど不可能と言えます。つまり、取引の当事者全員の署名がついていれば、誰か（当事者でも第三者でも）が不正に改ざんするのはまず無理です。BBc-1ではトランザクションがそのまま保存され、ブロック化されることもないので、ブロック確定までの待ち時間も不要です。したがってBBc-1内部のDBやストレージに情報が書き込まれればそれで十分であり、coreノードたちが分散で何かを実行する必要性がありません。そのため、前節で「必ずしも分散である必要がない」と言った次第です。

### トランザクションの記述力（表現力）
BBc-1に登録されるひとかたまりの情報をトランザクションと呼んでいます。トランザクションにどんな情報を書けるかは、アプリケーションを設計する上で非常に重要です。BBc-1のトランザクションは、Bitcoinなどで用いられるUTXO (Unspent Transaction Output)の構造も、Ethereumのようなアカウント型の構造も、どちらも表現できます。具体的なデータ構造についての詳細は次回の記事に書くつもりですが、ここでは概要だけを説明します。

トランザクションには、任意の数のデジタル資産情報本体、他のトランザクションへのポインタ、電子署名を含めることができます。一つのトランザクションは、一つの契約を表します。複数のデジタル資産情報が一つのトランザクションに含まれているということは、それらのデジタル資産について何らかの操作や所有権移転を行った、しかもその操作は不可分（アトミック）であることを表します。リレーショナルデータベースでいうトランザクションと同じような意味です。さらに、他のトランザクションへのポインタによって、その契約に含まれるデジタル資産がどういう出自、経緯でやってきたのかを表すことができます。

そういうわけで、トランザクション群のデータ構造はグラフ構造をもちます。なので、もしかするとトランザクションは[GraphDB](https://en.wikipedia.org/wiki/Graph_database)に格納したほうがいいんじゃないかと思っていたりします（今はそうしていませんが）。

# まとめ

BBc-1は、プライベート/コンソーシアム利用に向いたプラットフォームで、シンプルで直感的な合意の考え方やグラフ構造をもつトランザクションが記述可能な、次世代型ブロックチェーンプラットフォーム、だと思っています。

字ばっかりになってしまいました。。

次は、トランザクションのデータ構造について書こうと思います。

### 余談（マイニング）
Bitcoinなどのパブリック型ブロックチェーンシステムは、

A. 誰が運営者としてノードを接続してくるかわからない（つまり悪さをするサーバプログラムを動かす輩がいるかもしれない）

という前提に立ったシステムです。そんな状況で、次のようなことを達成しようとしています。

B. コインの2重利用を防ぎたい（2重利用しているトランザクションを却下したい）
C. 確定したトランザクションは、改ざんできないようにしたい
D. 誰でもこれらの情報を確認・検証できるようにしたい

A,B,C,Dすべてを満たすために、マイニングというプロセスが発明されました。マイニングは、2重利用してないか（正しくコインがやり取りされているか）をチェックし、Nonceを計算し（Proof of Work）、一番にNonceを見つけた人がシステムからインセンティブをもらえる、という仕組みです。

「すべてを満たす」というところがとても大事で、特にAの前提が違えば、そもそもあるべきシステムはぜんぜん違うものになるはずです。

### 関連記事
[BBc−1のアプリケーションプログラミング](https://qiita.com/quvox/items/ee14b019b3ba38fd1ab5)
[BBc−1 version1.0っていうのをリリースしました（５）](https://qiita.com/quvox/items/aaf3229b34a2010821cc)
[BBc−1 version1.0っていうのをリリースしました（４）](https://qiita.com/quvox/items/c51688b686e15aedd04a)
[BBc−1 version1.0っていうのをリリースしました（３）](https://qiita.com/quvox/items/87132694c0b74338d674)
[BBc−1 version1.0っていうのをリリースしました（２）](https://qiita.com/quvox/items/4a8271c46b3a73a16a33)