リクルートテクノロジーズの社内ラボで行っている、主に非金融領域に対するブロックチェーンの活用に向けた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.
Coding Edge 髫ェ蛟�スコ荵斟帷ケ晢スウ郢ァ�ュ郢晢スウ郢ァ�ー