Pythonで操作するブロックチェーンベースのデータストアBigchainDBとはブロックチェーンの検証現場で何が起きているのか(3)(1/2 ページ)

リクルートテクノロジーズの社内ラボで行っている、主に非金融領域に対するブロックチェーンの活用に向けたR&Dを紹介する連載。今回は、ブロックチェーンのデータ構造を、使いやすいデータベースの形にして提供しようとしているオープンソースソフトウェアを利用し、「履歴書データベース」として実装した課程と、その結果を紹介。

» 2016年11月09日 05時00分 公開
[中野猛, 中鉢洋介リクルートテクノロジーズ]

 リクルートテクノロジーズの社内ラボ、ATL(Advanced Technology Lab)で行っている、主に非金融領域に対するブロックチェーンの活用に向けたR&Dを紹介する本連載「ブロックチェーンの検証現場で何が起きているのか」。

 前回の『ブロックチェーンベースの著作権保護サービス「ascribe」は履歴書DBとして使えるのか』に引き続き、前回の問題点を解消すべく、「BigchainDB」というオープンソースソフトウェアを使って、履歴書DBの書き換えを行った検証の課程と、その結果を紹介します。

前回の問題点

 前回は、共同研究を行っているスタートアップ企業ascribeが提供する、デジタルアートの著作権を保護する仕組みを利用し、履歴書DBを作成しました。これにより、ビットコインのブロックチェーンに情報がうまく記録され、基本的に期待する通り動作するようになりましたが、依然として以下のような課題がありました。

  • 求職者、企業のユーザーデータや、卒業証明書などの画像データなどはascribeやAmazon S3に依存しており、ascribeのサーバがダウンしたり、サービスが廃止されてしまうと、履歴書DBが利用できなくなる
  • ascribeに保存されたデータや本アプリが連携して使っているDBが改ざんされた場合、第三者による“なりすまし”などが行われる可能性がある

 今回は、本アプリのデータストアと証跡の保存先を、同じascribeが開発しているオープンソースソフトウェアの分散DB「BigchainDB」に変更することで、上記の問題点にどの程度対処できるかについて説明します。

BigchainDBとは

 BigchainDBは、「証跡が残らない形ではデータの書き換えができない」など基本的なブロックチェーンの特性を持ち、同じくオープンソースソフトウェアである「RethinkDB」をベースに、デジタルアセット操作(所有権のコントロール)をサポートしたデータストアです。

 ブロックチェーンのデータ構造を、使いやすいデータベースの形にして提供しようとしています。

“ascribeのAPI+RDB”からBigchainDBへの移行

 前回作成した履歴書DBでは、ascribeのAPIを経由することでブロックチェーン(Bitcoin Blockchain)への書き込みを行っていました。そのため、基本的にこちらの指定するデータを直接書き込むことはできず、ascribeのSPOOL準拠のデータしか書き込めませんでした。

 しかし、BigchainDBを使用すれば、「トランザクション」を作成する際にこちらの任意のデータ(JSONのようなデータ)を直接そのチェーンに書き込めます。このため、履歴書DBで利用するデータは全て(BigchainDBの独自)チェーン上へ書き込むことにしました。

※なお、現時点のBigchainDBのインタフェースとしては、(RESTでの操作も徐々に追加されてはいるものの)準備されているのはPythonのドライバのみであるため、以下の説明もPythonベースとなります。

BigchainDBの「トランザクション」とは

 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から、さらに「トランザクション」の内容を取得する処理が必要になります。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。