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での「トランザクション」は、以下のような内容になっています(一部省略)。

  1. # 自身の保持している「トランザクション」(デジタルアセット)の一覧を取得
  2. >>> b.get_owned_ids("Fa1bNjxoZc8q4S3yzQ55QAZiV2NTK8UhB984Pk3RDod9")
  3. [{'cid': 0, 'txid': 'fb7e7ad6696f2e8ec19f0e28674b325dd2cf3a71c4a6f2134209426df552e9ff'}, {'cid': 0, 'txid': '5445e6416f8c71b3a29a779686d2d96f558bee86c08a68d9e93b3eb920d2b9ea'}]
  4. # 「トランザクション」の詳細を取得
  5. >>> b.get_transaction('fb7e7ad6696f2e8ec19f0e28674b325dd2cf3a71c4a6f2134209426df552e9ff')
  6. >>> pp.pprint(b.get_transaction('5445e6416f8c71b3a29a779686d2d96f558bee86c08a68d9e93b3eb920d2b9ea'))
  7. {
  8. 'id': '5445e6416f8c71b3a29a779686d2d96f558bee86c08a68d9e93b3eb920d2b9ea',
  9. 'transaction': {
  10. 'conditions': [{
  11. 'cid': 0,
  12. 'condition': {
  13. 'details': {
  14. 'bitmask': 32,
  15. 'public_key': 'Fa1bNjxoZc8q4S3yzQ55QAZiV2NTK8UhB984Pk3RDod9',
  16. 'signature': None,
  17. 'type': 'fulfillment',
  18. 'type_id': 4
  19. },
  20. 'uri': 'cc:4:20:2Hh0LGBPOFRQ3jPy9cB4ll10z3cY3V-XkDQejACC4Ag:96'
  21. },
  22. 'new_owners': ['Fa1bNjxoZc8q4S3yzQ55QAZiV2NTK8UhB984Pk3RDod9']
  23. }],
  24. 'data': {
  25. 'payload': { # この部分が履歴書DBで利用する部分
  26. '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}'
  27. },
  28. 'uuid': 'ac603760-e44a-4e08-adb5-38f0a8712dd1'
  29. },
  30. 'fulfillments': [{
  31. 'current_owners': ['AQDZFqQFyKG4Cx37vTvzRirF8AcTCCD6MZziX1kdxsz8'],
  32. 'fid': 0,
  33. 'fulfillment': 'cf:4:i6u8-3J8mAQUeb9dNEDhPDszbj8AfAiVmzTpXeDaUrE6AHxv--mSPRO0ZNzw-HsNZiWySwGHAmAwIb5vAWHRtmJu5wVA3aQvf_1feXdM1_D4whnRcrRyR4T4bpEpvOYA',
  34. 'input': None
  35. }],
  36. 'operation': 'CREATE',
  37. 'timestamp': '1472622479'
  38. },
  39. 'version': 1
  40. }
デジタルアセットとしての「トランザクション」

 25~27行目のpayloadの部分に履歴書DBで利用するデータを入れています。内容がJSON文字列になっているのは、日本語をそのまま入れるとBigchainDBでエラーが出てしまうためです。ひとまずJSON文字列として入れておき、取り出す際に文字列データに戻すような形にしてあります。

 また、「トランザクション」には前述したデジタルアセット作成の他にも、所有権の移転の「トランザクション」も存在し、これは以下のような内容となります。

  1. >>> pp.pprint(b.get_transaction('fb7e7ad6696f2e8ec19f0e28674b325dd2cf3a71c4a6f2134209426df552e9ff'))
  2. {
  3. 'id': 'fb7e7ad6696f2e8ec19f0e28674b325dd2cf3a71c4a6f2134209426df552e9ff',
  4. 'transaction': {
  5. 'conditions': [{
  6. 'cid': 0,
  7. 'condition': {
  8. 'details': {
  9. 'bitmask': 32,
  10. 'public_key': 'Fa1bNjxoZc8q4S3yzQ55QAZiV2NTK8UhB984Pk3RDod9',
  11. 'signature': None,
  12. 'type': 'fulfillment',
  13. 'type_id': 4
  14. },
  15. 'uri': 'cc:4:20:2Hh0LGBPOFRQ3jPy9cB4ll10z3cY3V-XkDQejACC4Ag:96'
  16. },
  17. 'new_owners': ['Fa1bNjxoZc8q4S3yzQ55QAZiV2NTK8UhB984Pk3RDod9']
  18. }],
  19. 'data': {
  20. 'payload': None, # payloadには値が入っていない
  21. 'uuid': 'd5c39e64-d25e-4528-b5ee-ffdc83393052'
  22. },
  23. 'fulfillments': [{
  24. 'current_owners': ['5C5fHRuvzZKDVz2C3YTWJaXAPUP9YSvrApww3dDeFmXb'],
  25. 'fid': 0,
  26. 'fulfillment': 'cf:4:PkVn3xVsLVcGatR00uG6_O44GgQnYvYMN2RtVCYfWh70tAhr9rX1i76vDzV7IJG0P2PWPp0xIVSJN7NG9A_QOHrk7UO7jOe1dWxD7Qs-7pMLqXJZOrQk_zRzw1a7yE8F',
  27. 'input': { # ここのtxidを使って「トランザクション」の内容を取得すると、内容が参照できる
  28. 'cid': 0,
  29. 'txid': 'b03f09e4ccce2e241f6f5ed2e85643a0a47f4750e160cc8c591727b8de8d8fdf'
  30. }
  31. }],
  32. 'operation': 'TRANSFER',
  33. 'timestamp': '1472622967'
  34. },
  35. 'version': 1
  36. }
所有権の移転の「トランザクション」

 先のデジタルアセットとしての「トランザクション」とは異なり、payloadはデータを持っておらず(20行目)、「fulfillments[0]」→「input」→「txid」の値が移転されたデジタルアセットの「トランザクション」IDとなっています(29行目)。このため、内容を参照するにはこの「トランザクション」IDから、さらに「トランザクション」の内容を取得する処理が必要になります。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

Coding Edge 髫ェ蛟�スコ荵斟帷ケ晢スウ郢ァ�ュ郢晢スウ郢ァ�ー

隴幢スャ隴鯉ス・隴帷」ッ菫」

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

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

メールマガジン登録

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