リクルートテクノロジーズの社内ラボで行っている、主に非金融領域に対するブロックチェーンの活用に向けたR&Dを紹介する連載。今回は、ブロックチェーンのデータ構造を、使いやすいデータベースの形にして提供しようとしているオープンソースソフトウェアを利用し、「履歴書データベース」として実装した課程と、その結果を紹介。
リクルートテクノロジーズの社内ラボ、ATL(Advanced Technology Lab)で行っている、主に非金融領域に対するブロックチェーンの活用に向けたR&Dを紹介する本連載「ブロックチェーンの検証現場で何が起きているのか」。
前回の『ブロックチェーンベースの著作権保護サービス「ascribe」は履歴書DBとして使えるのか』に引き続き、前回の問題点を解消すべく、「BigchainDB」というオープンソースソフトウェアを使って、履歴書DBの書き換えを行った検証の課程と、その結果を紹介します。
前回は、共同研究を行っているスタートアップ企業ascribeが提供する、デジタルアートの著作権を保護する仕組みを利用し、履歴書DBを作成しました。これにより、ビットコインのブロックチェーンに情報がうまく記録され、基本的に期待する通り動作するようになりましたが、依然として以下のような課題がありました。
今回は、本アプリのデータストアと証跡の保存先を、同じascribeが開発しているオープンソースソフトウェアの分散DB「BigchainDB」に変更することで、上記の問題点にどの程度対処できるかについて説明します。
BigchainDBは、「証跡が残らない形ではデータの書き換えができない」など基本的なブロックチェーンの特性を持ち、同じくオープンソースソフトウェアである「RethinkDB」をベースに、デジタルアセット操作(所有権のコントロール)をサポートしたデータストアです。
ブロックチェーンのデータ構造を、使いやすいデータベースの形にして提供しようとしています。
前回作成した履歴書DBでは、ascribeのAPIを経由することでブロックチェーン(Bitcoin Blockchain)への書き込みを行っていました。そのため、基本的にこちらの指定するデータを直接書き込むことはできず、ascribeのSPOOL準拠のデータしか書き込めませんでした。
しかし、BigchainDBを使用すれば、「トランザクション」を作成する際にこちらの任意のデータ(JSONのようなデータ)を直接そのチェーンに書き込めます。このため、履歴書DBで利用するデータは全て(BigchainDBの独自)チェーン上へ書き込むことにしました。
※なお、現時点のBigchainDBのインタフェースとしては、(RESTでの操作も徐々に追加されてはいるものの)準備されているのはPythonのドライバのみであるため、以下の説明もPythonベースとなります。
BigchainDBには一般的なRDB(Relational Database System)の「テーブル」のような概念はなく、「トランザクション」という単位(RDBでいう「レコード」のような単位)でデータを追加していきます。従って、ユーザーの情報や経歴の情報などは全て「トランザクション」で扱われます。この「トランザクション」には、こちらで指定したデータを入れることができるため、「デジタルアセット」という側面も持っています。
また、その「トランザクション」(デジタルアセット)の所有権を保持しているユーザーであれば「トランザクション」のIDを知ることができ、中身を参照できます。
実際のBigchainでの「トランザクション」は、以下のような内容になっています(一部省略)。
# 自身の保持している「トランザクション」(デジタルアセット)の一覧を取得 >>> b.get_owned_ids("Fa1bNjxoZc8q4S3yzQ55QAZiV2NTK8UhB984Pk3RDod9") [{'cid': 0, 'txid': 'fb7e7ad6696f2e8ec19f0e28674b325dd2cf3a71c4a6f2134209426df552e9ff'}, {'cid': 0, 'txid': '5445e6416f8c71b3a29a779686d2d96f558bee86c08a68d9e93b3eb920d2b9ea'}] # 「トランザクション」の詳細を取得 >>> b.get_transaction('fb7e7ad6696f2e8ec19f0e28674b325dd2cf3a71c4a6f2134209426df552e9ff') >>> pp.pprint(b.get_transaction('5445e6416f8c71b3a29a779686d2d96f558bee86c08a68d9e93b3eb920d2b9ea')) { 'id': '5445e6416f8c71b3a29a779686d2d96f558bee86c08a68d9e93b3eb920d2b9ea', 'transaction': { 'conditions': [{ 'cid': 0, 'condition': { 'details': { 'bitmask': 32, 'public_key': 'Fa1bNjxoZc8q4S3yzQ55QAZiV2NTK8UhB984Pk3RDod9', 'signature': None, 'type': 'fulfillment', 'type_id': 4 }, 'uri': 'cc:4:20:2Hh0LGBPOFRQ3jPy9cB4ll10z3cY3V-XkDQejACC4Ag:96' }, 'new_owners': ['Fa1bNjxoZc8q4S3yzQ55QAZiV2NTK8UhB984Pk3RDod9'] }], 'data': { 'payload': { # この部分が履歴書DBで利用する部分 'payload_str':'{"from_date":"20161001","to_date":"20161201","name":"\\u5352\\u696d","org_name":null,"user_pub":"Fa1bNjxoZc8q4S3yzQ55QAZiV2NTK8UhB984Pk3RDod9","user_tx_id":"6ece96d7fa3b115f8a5d58872855fe63b930fd785bde514074e6b06d311959ba","history_type":1,"tx_type":3}' }, 'uuid': 'ac603760-e44a-4e08-adb5-38f0a8712dd1' }, 'fulfillments': [{ 'current_owners': ['AQDZFqQFyKG4Cx37vTvzRirF8AcTCCD6MZziX1kdxsz8'], 'fid': 0, 'fulfillment': 'cf:4:i6u8-3J8mAQUeb9dNEDhPDszbj8AfAiVmzTpXeDaUrE6AHxv--mSPRO0ZNzw-HsNZiWySwGHAmAwIb5vAWHRtmJu5wVA3aQvf_1feXdM1_D4whnRcrRyR4T4bpEpvOYA', 'input': None }], 'operation': 'CREATE', 'timestamp': '1472622479' }, 'version': 1 }
25〜27行目のpayloadの部分に履歴書DBで利用するデータを入れています。内容がJSON文字列になっているのは、日本語をそのまま入れるとBigchainDBでエラーが出てしまうためです。ひとまずJSON文字列として入れておき、取り出す際に文字列データに戻すような形にしてあります。
また、「トランザクション」には前述したデジタルアセット作成の他にも、所有権の移転の「トランザクション」も存在し、これは以下のような内容となります。
>>> pp.pprint(b.get_transaction('fb7e7ad6696f2e8ec19f0e28674b325dd2cf3a71c4a6f2134209426df552e9ff')) { 'id': 'fb7e7ad6696f2e8ec19f0e28674b325dd2cf3a71c4a6f2134209426df552e9ff', 'transaction': { 'conditions': [{ 'cid': 0, 'condition': { 'details': { 'bitmask': 32, 'public_key': 'Fa1bNjxoZc8q4S3yzQ55QAZiV2NTK8UhB984Pk3RDod9', 'signature': None, 'type': 'fulfillment', 'type_id': 4 }, 'uri': 'cc:4:20:2Hh0LGBPOFRQ3jPy9cB4ll10z3cY3V-XkDQejACC4Ag:96' }, 'new_owners': ['Fa1bNjxoZc8q4S3yzQ55QAZiV2NTK8UhB984Pk3RDod9'] }], 'data': { 'payload': None, # payloadには値が入っていない 'uuid': 'd5c39e64-d25e-4528-b5ee-ffdc83393052' }, 'fulfillments': [{ 'current_owners': ['5C5fHRuvzZKDVz2C3YTWJaXAPUP9YSvrApww3dDeFmXb'], 'fid': 0, 'fulfillment': 'cf:4:PkVn3xVsLVcGatR00uG6_O44GgQnYvYMN2RtVCYfWh70tAhr9rX1i76vDzV7IJG0P2PWPp0xIVSJN7NG9A_QOHrk7UO7jOe1dWxD7Qs-7pMLqXJZOrQk_zRzw1a7yE8F', 'input': { # ここのtxidを使って「トランザクション」の内容を取得すると、内容が参照できる 'cid': 0, 'txid': 'b03f09e4ccce2e241f6f5ed2e85643a0a47f4750e160cc8c591727b8de8d8fdf' } }], 'operation': 'TRANSFER', 'timestamp': '1472622967' }, 'version': 1 }
先のデジタルアセットとしての「トランザクション」とは異なり、payloadはデータを持っておらず(20行目)、「fulfillments[0]」→「input」→「txid」の値が移転されたデジタルアセットの「トランザクション」IDとなっています(29行目)。このため、内容を参照するにはこの「トランザクション」IDから、さらに「トランザクション」の内容を取得する処理が必要になります。
Copyright © ITmedia, Inc. All Rights Reserved.