今回は、BBc-1の最も重要な要素である「トランザクション」について概要を説明します。次回以降、具体例を交えて詳細を説明します。
BBc-1におけるトランザクションとは、任意の数のデジタル資産情報本体と他のトランザクションへのポインタに署名を付加して保存したものです。署名を付加することによって、各トランザクションはバラバラの情報ではなく、一体として取り扱うことができるようになります。
AさんがBさんにトークンを30支払って、動画コンテンツXを譲り受けるという例を考えます。このときのデジタル資産はトークンと動画コンテンツXです。動画コンテンツXの売買は、一般的なシステムではおそらく次のような処理手順で実行されます。
- 動画コンテンツの所有権がBさんにあることを確認する
- Aさんのトークンが30以上あることを確認し、Aさんのトークンを30減らす
- Bさんのトークンを30増やす
- 動画コンテンツの所有権をBさんからAさんに変更する
もし1~4の途中で、何かエラーが起こったり誰かが不正を働いたりした場合には、全体をなかったことにしなければなりません。データベースだとロールバックと呼ばれる処理です。1~4の処理内容を1つずつ別々に記録した場合、これらが一連の処理であることを別途管理しておかなければなりませんし、それぞれが改ざんされないように監視しなければなりません。
BBc-1のトランザクションは、2、3、4で発生するデジタル資産情報の変化の結果をひとかたまりのデータとして署名を付けて保存します。具体的にいうと「Aのトークンが30減る&Bのトークンが30増える&Xの所有権がBからAに変わる」という事項が記載されたトランザクションをAとBが確認して合意すれば、AとBがそれぞれ自分の秘密鍵で署名を付けます。この署名がついたトランザクションが、1つの契約内容とそれが成立したという事実を表します。
上記の1~4の手順には、あえて主語を書きませんでした。通常のシステムなら、おそらく主語は「サーバが」になります。しかしBBc-1の場合、主語を特定する必要がありません。誰が1~4の手順を実行しても構わないのです。大事なのは作成されたトランザクションをAさんとBさんが確認して、その内容が正しいことに合意することです。
アセットとアセットグループ
トランザクションの中に含まれる情報のうち、最も大事なものはデジタル資産情報、すなわちデジタルで表現された何らかの価値あるものです。BBc-1ではこれをアセット(asset)と呼びます。英語の意味そのままで、資産です。どんな情報をアセットと見なすかはアプリケーション次第ですが、BBc-1(およびいわゆるブロックチェーン全般)は、アセットを改ざんされないように保管するための仕組みです。
さらにBBc-1では、アセットの種別を区別して取り扱うことができます。前述のようなトークンで動画コンテンツを売買するようなアプリケーションだと、トークンという種別のアセットと、動画コンテンツという種別のアセットを取り扱います。このようなアセットの種別のことをアセットグループと呼び、識別子で区別できるようにします。
トランザクションへのポインタ
トランザクションの中に含まれる情報のもう1つが、トランザクションへのポインタです。端的にいうと、あるアセットについて、それと関係のあるトランザクションおよびアセットの識別子を書いておくだけです。そうすれば、アプリケーションがその識別子で指定されているトランザクションを取得して調べることができます。
例えば、直前のトークンの取引結果の情報を含むトランザクションの識別子を書いておけば、いつでも最新の残高を取り出せます。また直前の動画コンテンツの所有者移転のトランザクションの識別子を書いておけば、所有者の移転履歴をたどることができます。つまり、アセットとアセット、またはトランザクションとトランザクションの関係性は、アプリケーションが自由に定義し、解釈してもよいということです。
トランザクションの構造
トランザクションのデータ構造の大枠は次のようになっています。
トランザクションの中身はeventリスト、referenceリストなどいくつかのパーツに分かれています。これらのパーツは必ず含めなければならないわけではなく、不要なものは省略可能です(要不要はアプリケーションごとに決められます)。eventリスト、referenceリスト、relationリスト、signatureリストは、それぞれの中にBBcEvent、BBcReference、BBcRelation、BBcSignatureオブジェクトを何個でも入れることができます。デジタルアセット情報はBBcAssetというオブジェクトに記述されますが、このオブジェクトはBBcEventとBBcRelationの内部に格納されます(図には表記されていません)。
headerにはバージョンや作成時刻などの情報を記載します。eventリストとreferenceリストはUTXO(Unspent Transaction Output)を表現するために使い、BBcEventが出力、BBcReferenceが入力を表します。一方、relationリストに入るBBcRelationは、アセット本体と他のトランザクションへのポインタを保持するだけの役割を持つので、それをどう解釈するかはアプリケーションで自由に設計できます。また、BBcReferenceやBBcRelationに含まれるポインタは、改ざん耐性を強化する役割も持っています。万一トランザクションを単独で改ざんできたとしても、他のトランザクションとの辻褄が合わなくなるため、すべてのトランザクションを改ざんしなければならなくなってしまいます。
上述したように、BBcEventとBBcRelationにデジタルアセット情報であるBBcAssetが含まれるため、これらは特に重要な情報だといえます。
witnessには誰が署名(BBcSignature)を付与したかが記載されます。このwitnessも署名対象に含まれているため、その人がその人の意志で署名を付与したことを確かに証明できます。
cross_refeerenceには履歴交差の情報、すなわち外部ドメインで発生したトランザクションの識別子が書き込まれます。signatureリストのBBcSignatureは、ある1人分の署名を格納するオブジェクトで、楕円曲線暗号方式の公開鍵とトランザクションデータ本体(headerからcross_referenceまで)の署名を含みます。
BBc-1の識別子たち
BBc-1にはいろいろな識別子が出てきます。BBc-1のアプリケーションを作るときに気にしなければならないものを以下にまとめます。
名前 | 役割 |
transaction_id | トランザクションの識別子。トランザクションデータ本体(headerからcross_referenceまで)のSHA256ダイジェストをtransaction_idとする |
user_id | ユーザの識別子。アセットの所有者を表し、他のユーザと重複しないように好きなように決めればよい |
asset_id | アセットの識別子。実際にはBBcAsset内のアセットオブジェクトというデータのSHA256ダイジェストをasset_idとする |
asset_group_id | アセットの種別を表す識別子。他と重複しないように好きなように決めればよい |
domain_id | 運営主体の識別子。他のドメインと重複しないように好きなように決めればよい。transaction_id、user_id、asset_id、asset_group_idは、1つの運営主体(domain_id)の中でそれぞれユニークになるようにすること |
すべての識別子は256ビット(32バイト)のバイト列です。なお、次のバージョン(v1.1)で、domain_id以外の識別子を32バイト以下の任意の長さに圧縮できるようになる予定です。
まとめ
今回は、BBc-1におけるトランザクションの概要を説明しました。トランザクションの細かい中身については、次回以降に具体例を交えて解説していきます。