akiyoko blog

akiyoko の IT技術系ブログです

仮想通貨税金計算サービス「BITCOINTAX」をリリースしました

アカウント登録不要、完全無料で利用できる税金計算サービス「BITCOINTAX」をリリースしました


もっと手軽に仮想通貨取引の税金計算を!
ドラッグ&ドロップだけで使える税金計算サービスが登場


f:id:akiyoko:20180213212659p:plain



【 サービスURL 】
 BITCOINTAX : https://bitcointax.jp/


 

背景

「ビットコイン」「NEM」「仮想通貨」などといったキーワードが連日のようにニュースを賑わせるようになり、ビットコインを始めとする仮想通貨が国内で広く認知されるようになってきました。仮想通貨を売買できる取引所も金融庁に仮想通貨交換業者として登録された業者を中心に競い合うように次々と設立され、スマホで手軽に仮想通貨の取引ができるようになった一方で、仮想通貨取引にかかる税金計算は複雑で、専門知識のない人にとっては非常にストレスフルな作業になってしまいがちです。


昨年12月に国税庁から「仮想通貨に関する所得の計算方法等について」という資料が公表されましたが、特に仮想通貨同士の売買については取引当時の時価を計算する必要があるなど計算は煩雑です。国内の取引所ならまだしも、国外の取引所で売買した場合の日本円での時価は容易には算出できず、国税庁の方針に従って税金計算をするには困難を極めます。


2月16日より平成29年分の所得税等の確定申告受付が開始されるにあたり、これから仮想通貨の税金計算をしようとする人がその煩わしさに途方もない時間を奪われてしまう人が多く出てしてしまうことが懸念されます。最近になって仮想通貨の税金計算サービスがいくつかリリースされ始めてきましたが、いずれのサービスもアカウント登録が必要であったりと手軽に使えるものがありませんでした。


そこで「BITCOINTAX」は、

  • アカウント登録不要
  • 取引所の取引履歴ファイルをドラッグ&ドロップするだけ
  • 無料で全ての機能が利用可能

という特徴を備え、誰でも簡単に使える税金計算サービスとしてリリースいたしました。

なお、現在の対応取引所は、bitFlyer*1)、CoincheckZaif*2)、bitbankBITPointPoloniexBittrexBinanceHitBTCCryptoBridge の計10種類となっておりますが、要望次第で随時対応を予定しています。


【お知らせ】
  • Bittrex 対応済み(2018年2月15日更新)
  • ご指摘を受けて一部計算の誤りを修正しました。お手数ですが、16日以前に利用された方は再度計算し直してください(2018年2月16日更新)
  • BITPoint 対応済み(2018年2月17日更新)
  • Zaif 対応済み(2018年2月18日更新)
  • Binance 対応済み(2018年2月18日更新)
  • CryptoBridge 対応済み(2018年2月19日更新)
  • HitBTC 対応済み(2018年2月21日更新)
  • bitbank 対応済み(2018年2月23日更新)


なお、他の取引所への対応やバグの修正依頼は、admin@bitcointax.jp 宛にご連絡ください(取引履歴ファイルを添付していただけると助かります)。




日本における仮想通貨のさらなる発展と、仮想通貨に携わる方々のストレスが少しでも解消されることを願っています。




【 サービスURL 】
 BITCOINTAX : https://bitcointax.jp/


 

使い方

BITCOINTAX にアクセスし、各取引所でダウンロードした CSV形式(取引所によっては Excel形式)の取引履歴のファイルをドラッグ&ドロップするだけで利用可能です。


f:id:akiyoko:20180213214829g:plain


アカウント登録などの面倒な作業無しに、すぐに使うことができます。



【 サービスURL 】
 BITCOINTAX : https://bitcointax.jp/


 

その他の特徴

  • 複数ファイルをまとめてドラッグ&ドロップすることも可能です(最大5ファイル・1MBまで)
  • 計算結果が表示された後に、続けて別の取引所のファイルをアップロードできます(計算が全てやり直されます)
  • 計算結果が表示された後に、計算結果を CSV形式でダウンロードできます(ダウンロードした CSVファイルを再びアップロードすることもできます)
  • アップロードされたファイルはサーバで保持していません

 

計算方法

  • 時価計算方法は移動平均法による *3
  • 時価計算には以下のデータを使用
    • bitFlyer の各通貨の時価については、Cryptowatch API が提供している1〜6時間足データを使用
    • Coincheck の各通貨の時価については、Coincheck が提供している日足データを使用
    • Zaif の各通貨の時価については、Zaif が提供している日足データを使用
    • bitbank のビットコインの時価については、bitbank.cc API が提供している時間足データを使用
    • Binance の各通貨の時価については、Binance API が提供している日足データを使用
    • CryptoBridge の各通貨の時価については、CoinMarketCap が提供している日足データを使用(ただし、120通貨中 63通貨のみ。2018年2月19日現在)
    • 上記以外の海外取引所の各通貨の時価については、Kraken(BTC/USD) Poloniex API が提供している時間足データを使用(2018年2月20日更新)
    • 海外取引所の場合の USD/JPY については、ドル円為替の時間足データを使用
    • 2016年1月以降のデータを使用しているため、2015年12月以前の取引がある場合には対応できない場合があります

 

免責

  • 本サービスは予告なく停止、終了、仕様が変更されることがあります
  • 本サービスの利用によって生じたいかなる損失または損害については一切の責任を負いません

 


【 サービスURL 】
 BITCOINTAX : https://bitcointax.jp/


 

問い合わせ先

パブリックな問い合わせは GitHub Issue、プライベートな問い合わせは admin@bitcointax.jp または Twitter にお願いします

*1:現物取引のみ。bitFlyer Lightning(ビットコイン現物・FX・先物取引、イーサリアム現物の取引)には未対応です。

*2:現物取引のみ。信用取引・AirFX取引・先物取引には未対応です。

*3:参考:「移動平均法(棚卸資産の評価方法)の仕訳・会計処理 | 仕訳NET

2017年に読んだ本のリスト

akiyoko です。

2017年の読書歴を振り返ってみたのですが、技術系の本や雑誌を除いて38冊読んでいました。つまり、約10日に1冊以上読んだことになります。昨年は「多読」を心掛けていたのですが、私自身としては十分過ぎる結果だったと感じています(ちなみに一昨年は11冊)。


《過去記事》
akiyoko.hatenablog.jp


なお私の読書スタイルは、気になった本はポチポチと買っておいて、ヒマが出来たときにそのときの気分に合わせて読むというのが基本です。それ以外にも、学習したいテーマに沿って次々と連鎖的に読んでいくパターンや本の中で紹介されていたものを読んでいくパターンもあります。


今回は、昨年読んだ38冊のうち19冊を紹介します。


上記以外にも、ビットコイン・仮想通貨・ブロックチェーンの勉強のために読んだ本が11冊、投資やチャートの勉強のために読んだ本が8冊ありますが、後者はまた別途紹介するかもしれません。


《過去記事》
akiyoko.hatenablog.jp


来年も自分のペースを守りながら、できるだけ多くの本を読んでいきたいと考えています。


 

マネジメント系

一昨年の年末から年頭にかけて、自身のマネジメント力の欠如が顕になってきたとひしひしと実感したので、新たに知識を投入した上で実践していきたいと考えていました。

 

1.新1分間マネジャー

オススメ度:★★★☆☆


「新1分間マネジャー」はケン・ブランチャードとスペンサー・ジョンソンの共著で古典的なベストセラー「1分間マネジャー」の新版ですが、現代風にアレンジが施されているそうです。なおスペンサー・ジョンソンは「チーズはどこへ消えた?」の著者としても有名です。


「1分間」シリーズを全部読んだという shiba_yu36 さんのブログ記事を読んで、まずはこの本を読んでみようと思い立ちました。

「1分間顧客サービス」を読んだ - $shibayu36->blog;


本自体は薄く、ストーリー形式で描かれているので、すぐに読み終えられます。

この本の核となる 1分間マネジメントの「3つの秘訣」は、「新1分間マネジャーのゲームプラン」という図で完結にまとめられています。

  • 「1分間目標」
    • (共同で)明確な目標を立てる
    • 正しい行動とはどのようなものか見せる
    • 目標を1ページに1項目ずつ書き出す
    • 素早く頻繁に目標を読み返す
    • 自分の行動を振り返り、目標と一致しているかを確認するよう奨励する
    • 一致しない場合、行動を切り替えて成功を達成できるよう促す
  • (目標または一部の目標を達成したら)「1分間賞賛」
    • 行動をほめる
    • すぐほめる。具体的にほめる
    • どれほどうれしく感じているかを伝える
    • 少し間を置いて、部下にも満足感を味わわせる
    • さらによい仕事を続けるように励ます
  • (目標を達成できなければ)「1分間修正」
    • 協力して目標を明確化する
    • 事実関係を確認する
    • ミスをすぐに検証する
    • どれほど懸念しているかを伝える
    • 少し間を置いて、部下にも不安を味わわせる
    • ミスは取り返せること、人間として評価していることを伝える
    • いつまでも引きずらない


少し前にバズった記事「GEとAdobe、人事評価制度やめたってよ。目的のためには手段はどんどん変えていく」では、今までの人事評価ではフィードバックまでのサイクルが長すぎるという問題に対して、年次評価制度を撤廃して「頻繁にフィードバックを与える」という新しい仕組みを導入したと書かれていますが、新1分マネジャーで説明されている3つの秘訣「1分間目標」「1分間賞賛」「1分間修正」も目的は同じなのではないかと感じます。短く端的なフィードバックを頻繁に与えていくことで、社員や組織を変化の激しい現代に対応できるように変えていく、そんな新しいタイプのマネジャーが望まれているということなのでしょう。


 

2.1分間マネジャーの時間管理

オススメ度:★★★★☆


ケン・ブランチャードの「1分間」シリーズは数多く出版されていますが、著者自らが管理職の参考書として薦める五作として、

を挙げています。本作「1分間マネジャーの時間管理」は、サルの世話に追われて本職のマネジメントに掛ける時間が無いと悩む中間管理職に向けて贈られた「救いの書」となっています。なお、1分間シリーズには〈1分間マネジャー〉がメンターとしてストーリー中に登場するようなので、「新1分間マネジャー」は真っ先に読んでおいた方がよさそうです。


さて、本書の核として登場する「サル」は部下の肩から飛び乗ってくる「プロジェクトやトラブルに伴う『次の対応』」を指していますが、単に「次の対応」と書かずに「サル」に見立てて書くことで、インパクト絶大で忘れられない「アイコン」になっています。

ついつい部下の肩から飛び乗ったサルの世話をしてしまうと、余計な世話を焼くダメマネジャーになってしまうというのがストーリー仕立てで語られています。そしてサルを管理するには、何を、誰が、いつまでに、どのように実行するのかを確定することが重要と説きます。また、「何のためにこれをやっているのか」を自問し、はっきりした答えが出ない場合は、サルを抹殺した方が良いとも指南しています。


いつもながらストーリー仕立てになっているのがややダラダラした感じもしますが、本自体が薄くてすぐに読み終えられるので、半日ほど空き時間があるときに一気に読んでしまうのがよいかと思います。




 

3.人を動かす

オススメ度:★★★★★


人を動かすって本当に難しいですよね。「動かす」というより「動いてもらう」にはどうすればよいか? と悩むことが多いです。そんなときの薬になる、古典中の古典。これまで読んだことが無かったので、一念発起。なお、後で紹介する「SOFT SKILLS ソフトウェア開発者の人生マニュアル」の著者ジョン・ソンメズも最も推薦する必読書として挙げています(ただし、自助・自己啓発の本として)。

内容が分かりやすくて腹落ちすることも多く、各章のラストに簡潔なまとめが書かれているのも有難いです。ということで各章のまとめを列挙してみました(多少アレンジしていますが)。

  • 人を動かす3原則
    • 批判も避難もしない。苦情も言わない
    • 素直で、誠実な評価を与える
    • 強い欲求を起こさせる


上記の「人を動かす原則だけ」でなく、「人に好かれる原則」「人を説得する原則」「人を変える原則」についても書かれていますが、いずれにしても、まずは相手を立て、誠意を持って相手の身になり、相手に重要感を与えるようにすることが大事であると説いています。つまり、尊厳欲求・承認欲求などの高次の欲求に訴えかけることが重要であるということでしょう。

  • 人に好かれる6原則
    • 誠実な関心を寄せる
    • 笑顔で接する
    • 名前を覚える
    • 聞き手に回る
    • 相手の関心を見抜いて話題にする
    • 心からほめる(重要感を与える、誠意を込めて)
  • 人を説得する12原則
    • 議論を避ける
    • 相手の意見に経緯を払い、誤りを指摘しない
    • 自分の誤りを直ちに快く認める
    • 穏やかに話す
    • 相手が即座に「イエス」と答える問題を選ぶ
    • 相手にしゃべらせる
    • 相手に思いつかせる
    • 人の身になる
    • 相手の考えや希望に対して同上を寄せる
    • 人の美しい心情に呼びかける
    • 演出を考える
    • 対抗意識を刺激する
  • 人を変える9原則
    • まずほめる
    • 遠回しに注意を与える
    • まず自分の誤りを話したあと相手に注意する
    • 命令をせず、意見を求める
    • 顔を立てる
    • わずかなことでも惜しみなく心からほめる
    • 期待をかける
    • 激励して、能力に自信を持たせる
    • 喜んで協力させる


これらは部下や組織のマネジメントとは別枠ではありますが、「心掛け」として普段から実践しやすいのは嬉しいところです。



 

4.韓非子 ― 強者の人間学

オススメ度:★★★★☆


教養系(?)なのかもしれませんが、以前から読んでみたいと思っていた韓非子です。韓非子の解説本は何冊かありますが、以前受講していた「gacco」の「中国古典に見る指導者の条件」の講義をしていた SBI大学院大学の守谷 洋教授の本をチョイスしました。


韓非子は中国戦国時代末期の法家である韓非の書で、乱世を生き抜くために君主の権力を法によって強固にすることで国を統治しようと訴える組織管理論であるとも言えます。

韓非の統治理論は、「法」(法律)、「術」(部下をコントロールするためにリーダーが身に着けるべき操縦術)、「勢」(権限)の三つを中核としています。「術」については、

  • 1.臣下の言い分を互いに照合して事実を確かめること
  • 2.法を犯した者は必ず罰して威信を確立すること
  • 3.功績を立てた者には必ず賞を与えて、やる気を起こさせること
  • 4.臣下のことばに注意し、発言に責任をもたせること
  • 5.わざと疑わしい命令を出し、思いもよらぬことをたずねてみること
  • 6.知っているのに知らないふりをしてたずねてみること
  • 7.白を黒と言い、無いことをあったことにして相手を試してみること

の7つを挙げており、トップは権力の要(賞罰の権限)を押さえ、黙って睨みを利かすのが最良だと説いています。

『韓非子』全篇を貫いているのは、徹底した人間不信の哲学である。人間を動かしている動機は、何か。愛情でもない、思いやりでもない、義理でも人情でもない、ただひとつ利益である。人間は利益によって動く動物である、というのが『韓非子』の認識であった。

といったようなフレーズが書中に何度も出てきますが、「利用者が利己的な行動をしてもそれがシステム全体としての利益に繋がる」というブロックチェーンの設計思想にも繋がる最新の考え方なのでは?と思ってしまいます。勝手な妄想ですが。。

全般的に面白い本なのですが、構成にやや疑問が残る(章の前後の関連性・繋がりに違和感がある)ので ★マイナス1としました。



 

5.これからのマネジャーの教科書

オススメ度:★☆☆☆☆


「ミドルマネジャーのための本」という触れ込みで、なかなか良さげな出だしの本だったのですが、買って損したとは言いませんが全く腹落ちしなかった本です。

グロービス経営大学院の院生へのインタビューからの実例分析なのでしょうが、主観的な分析に終始しているような印象を受けました。どこかで聞いたことのあるようなノウハウを言い回しを変えて並べただけの焼き回し本というイメージです。残念ながら私には響きませんでした。



 

教養・教育系

6.あらためて教養とは

オススメ度:★★★★☆


一昨年、教養とは何か?というのをふと考えて二冊ほど本を読んでみたのですが、釈然とせずに残っていたモヤモヤがこの本を読んで霧消しました。


当時読んだのは以下の二冊です。
① 「おとなの教養」(池上 彰)
② 「ビジネスに効く最強の「読書」 本当の教養が身につく108冊」(出口 治明)

①では、教養とは「進歩の速い世の中にあっても陳腐化しないスキル」であり、「すぐに役に立つことは、世の中に出て、すぐ役に立たなくなる。すぐには役に立たないことが、実は長い目で見ると、役に立つ」と書かれています。つまり、「長い人生を生きていく上で、自分を支える基盤になるもの」というのが教養、という理論です。

②では、教養については「人間が賢くなる方法は、人に会い、本を読み、世界を旅すること以外にない」と書かれていて、読書については「読書は知識を得るためではなく、自分の頭で考える材料を得るためにある」と書かれています。読書で考え方の幅を広げる訓練をすることで教養が磨かれるということでしょうか。

「学問、知識などによって養われた品位」という国語辞典的な意味をなぞっているだけで、何だかモヤモヤが残りますよね。


そして「あらためて教養とは」では、「自らを立てるために必要なのが教養」と書かれており、「自らを立てる」とは「揺るがない自分を創り上げる。自分に対して則(規矩)を課し、その則の下で行動できるだけの力をつける」と説明しています。なお「規矩」については、「自分独りに課したものでありながら、自分の生きる社会との関係の中で、自らと社会の協調関係の中で、見出し、自分に課していくべきもの」としています。また教養は、ドイツ語での「Buildung」が意味的に近いとし、がっちりとした基礎の上に自分という人間をきちんと創り上げていくことだと述べています。

また、「分別」というキーワードが本書に何度も登場しますが、以下の説明が分かりやすかったです。

分別(ふんべつ)のある人というのは具体的にどんな人のことをいうので... - Yahoo!知恵袋


ここで、私の「教養」に対する理解を図式化したものが以下になります。

f:id:akiyoko:20180104040316p:plain


ハイ、全然分かりませんよね(笑)。少し説明すると、本書にも書かれている通り、教養の最低限のベースは「人間としてのモラル」です。自分をきちんと律した上で、そこに幅広い知識や経験を乗せ、それを自分なりに咀嚼・吸収して分別を育てていき、いずれ揺るがない自分を自立させていくといった構図になっています。知識や経験は「栄養」、育てていくべき分別が「幹」というイメージです。自分の中では非常にスッキリしたのですが、全然スッキリしないという方は是非本書を読んでみてください。



 

7.自分を成長させる 最強の学び方

オススメ度:★☆☆☆☆


表紙だけ見ると脳科学者の茂木健一郎さんの本に見えますが(笑)違います。オンライン学習サービス「gacco」の前社長の本です。

学びの真の目的は「自分のアイデンティティを確立すること」であり、学び続けるためには、

  • 費用負担が軽くて
  • 距離・時間の自由が効き
  • モチベーションが維持できる

という学び方を選択するのがよいとの前置きがあり、それら全てを満たしている「gacco」(「モチベーションの維持」はディスカッションボード上の「学び合い教え合う」コミュニティ)で学びましょう、という宣伝本です。


学びとは「社会を知り、自分を知って、社会に自分の力がどう活かせるかを見つけ出すこと」という意見には同意ですが、結局、タイトルの「最強の学び方」って一体何?という疑問符が残ります。個人的には、学びには3つ目の「モチベーションの維持」が非常に重要だと考えていますが、「学び合い教え合う」だけでモチベーションが湧いてくるようなそんな簡単なものではないんじゃないかなと思います。勉強そのものが「楽しい」と思える人は少ないと思いますし、だからこそ、「学びの先に何があるか?(学ぶことで何が得られるのか?)」が想像できないとモチベーションの維持は難しいと考えています。「学習とは、入力(感覚)と出力(行動)が結びつくこと」というのは、まさにそういう意味だと思います。


あと細かい感想としては、

  • 目新しいことが書いていない(どこかで聞いたことがあるような話が多い)
  • データが示されてないので信憑性、根拠が乏しい

という感じでした。




 

データ分析系

データ分析系としては、昨年は「PythonユーザのためのJupyter実践入門」などの技術系の本も読みましたが、一般の読み物としては以下の一冊のみです。

 

8.「原因と結果」の経済学 ――― データから真実を見抜く思考法

オススメ度:★★★★★


因果推論の入門の入門書。ビッグデータ時代を生き抜くためのスキルとして、データ分析だけでなく、「データ分析の結果を解釈するスキル」を身に付ける必要があるとし、その一つとして、因果関係と相関関係の違いを理解し、原因と結果に本当に因果関係があるかを考えるトレーニングをすることで、思い込みや通説にとらわれない正しい判断が出来るようになると説いています。


共著者の中室牧子氏は二年前に読んだ「「学力」の経済学」を執筆していますが、その本が面白かったということもあってこの本を読み始めました。

akiyoko.hatenablog.jp


前著と同じく読みやすく、取り扱っているテーマも非常に面白いです。
経済学者で「とくダネ!」にも出演している安田洋祐氏のブログの書評でも、

データ分析に欠かせないこの因果推論を驚くほど分かりやすく解説・紹介した、現代の新教養の画期的な入門書


『「原因と結果」の経済学』が分かりやすい3つの理由 : ECONO斬り!!

と書かれている通り、取っ付きにくい因果推論に特化した本でありながら、読者が挫折しないようにいわゆる教科書的な込み入った説明や小難しい数式を使わずに、データ分析の現場での最先端の手法を紹介しています。

経済学では特に、因果関係を示唆する根拠のことを「エビデンス(科学的根拠)」と言い、「回帰分析」や「自然実験」「疑似実験」よりもエビデンスレベルが高い因果推論の理想形として「ランダム化比較実験(RCT:Randomized Controlled Trial)」が存在し、複数のランダム化比較実験を統合した「メタアナリシス」がエビデンス・ピラミッドの頂点に位置しているという構図は、日本ではまだ馴染みがないでしょう。


最後に、因果関係を読み解くための因果推論の5つのステップは以下のようになっています。

  • 1.「原因」は何か?
  • 2.「結果」は何か?
  • 3.3つのチェックポイントを確認
    • まったくの偶然ではないか
    • 交絡因子(第三の変数)が存在しないか
    • 逆の因果関係は存在しないか
  • 4.反事実を作り出す(「もっともらしい値」で置き換える)
  • 5.比較可能になるように調整



 

自己啓発系

自己啓発本は最近はあまり読まないようにしていたのですが、タイトルが気になったりしてついつい読んでしまいます。

 

9.SOFT SKILLS ソフトウェア開発者の人生マニュアル

オススメ度:★★★★☆


この本は、「ソフトウェア開発者の人生マニュアル」という副題の通り、ソフトウェア開発者の生活を豊かにするための指南書です。

「キャリア」「自分自身のマーケティング」「学び方」「生産性を上げる方法」「お金(に働かせるという考え方)」「健康をハックする方法」といった幅広い分野について具体的な実践方法を紹介しています。ソフトウェア開発者のために特化した本というよりは、著者のキャリアがソフトウェア開発者だったということで、著者自身の経験から「これは人に勧められる」と考えた方法を惜しみなく紹介しています。実践方法が具体的なので今すぐ始めようという気持ちになれますし、実際すぐに始められることが多いです。私もスクワットから始めてみました(笑)。

前半は他のソフトウェア開発本にもよくある感じであまり響かなかったのですが、後半のお金の話や健康ハックの章はグイグイ引き込まれました。開発者向けの本としてはあまり出てこない新鮮なテーマだったからでしょうか。

意識高い系のおっさんが読んでも面白いですが、学生や20代のプログラマ、SEが読むと非常に有益かと思います。



 

10.やりたいことをやれ

オススメ度:★★★☆☆


本田技研工業(ホンダ)の創業者、本田宗一郎氏の本。家の近くに工場があったのと、タイトルに釣られて何となく手に取りました。パナソニック創業者の松下幸之助氏の「道をひらく」が好きで何度も読み返していて、それと同じように人生の教訓が読めるのかと勝手に想像していたのですが、全く違いました(笑)。この本はエッセイ集で、タイトルもその中の特徴的なものを単にチョイスしただけのようで、本全体を貫くテーマでは無かったようです。うーん、紛らわしい。。

ところで本田宗一郎氏は、「頭に閃いたアイデアを実証せずにはいられない」という根っからの技術者のようです。物作りに対しては、創意、工夫、失敗を恐れない勇気が必要で、中でも特に重要なのが弾力性のある見方、物の考え方であり、アイデアであると説く一方、人間関係については、「礼儀は人間の基本」「結局は人柄」「他の人の立場、気持ちを考える」など人間愛に溢れる考え方を持っています。

また、

人を動かすことのできる人は、他人の気持ちになれる人である。そのかわり、他人の気持ちになれる人というのは自分が悩む。自分が悩んだことのない人は、まず人を動かすことはできない。

こちらが望んでいること、こうやりたいと欲していることをスムーズに受け入れてもらうためには、まず、先方の心を知らねばならない。相手の気持ちを知って、相手が理解しやすいようにもっていかなければ、心からの協力は求められないからである。

人間にとって大事なことは、学歴とかそんなものではない。やはり他人から愛され、喜んで協力してもらえるような、徳を積むことである。そしてそういう人間を育てようとする精神なのではないだろうか。

いうまでもなく、人間関係を支えるものは相互の愛であり、信頼であり、尊敬である。私はこれをひっくるめて一言でいえば、秘密を守ることだと思う。なぜかといえば、(中略)秘密を守るという行為の中に、その人の人格の要素となっているさまざまな精神的なものがにじみ出ていると思うからである。お互いに秘密を持ち、守りあう量で、人間関係の質が判断できると思う。

などといった一節は、デール・カーネギーの「人を動かす」にも通ずるものがあって面白いなと感じました。



 

11.エッセンシャル思考 最少の時間で成果を最大にする

オススメ度:★★★☆☆


エッセンシャル志向とは何か?を簡潔に表した模式図が以下になります。「より少なく、しかしより良く」を追求するために、努力の方向を絞ったのが右側の図です。

f:id:akiyoko:20180104113356p:plain:w500

「全部手に入れよう」「全部やろう」とすると本質を見失ってしまう、自分で選べない人は他人の言いなりになる、だから自分で優先順位を決めなければいけない、というのは耳の痛い言葉です。

中途半端なイエスをやめて、「絶対やりたい!」か「やらない」かの二択にしよう

は、大胆ですが本質を突いた究極の判断基準になるでしょう。

全体的に分かりやすく書かれていて、内容に特に違和感は無いのですが、もっと手短に書かれていてもいいかな(冗長すぎる)と感じたので、★をマイナス1しました。



 

投資系

SOFT SKILLS ソフトウェア開発者の人生マニュアル」で投資について書かれていたのを機に人生で初めて手を伸ばしてみた分野です。全然分からない分野なので、気になった本を手当たり次第読んでみたというのが実情です。

 

12.株で富を築くバフェットの法則 ――― 不透明なマーケットで40年以上勝ち続ける投資法

オススメ度:★★★★☆


株式投資で巨万の富を築いた伝説の投資家、ウォーレン・バフェットの半生を描いた一冊。投資の神様と言えば「バフェット」というのは聞いたことがあったので、投資の勉強をするならバフェットの本を何か一冊読んでみようと考えて辿り着いた本です。

バフェットの投資哲学は一貫していて、「簡単に理解できる事業を行っており、5年・10年・20年先にきっと今より大きな利益を上げていると思われる企業の株式を納得できる価格で買うことが投資家の目標」と本人がレポートに書いた通り長期投資をメインとし、景気や企業業績が不調のときに買うことを最良としています。ちなみにバフェットが経営するバークシャー・ハサウェイの業績は、過去50年間(1965~2014年)の平均年利(複利)で約20%という驚異的な数字を上げているとのこと。初年度に100ドル投資していれば、50年後に7万5000ドルを超えるリターンが得られる計算になります。
ウォーレン・バフェットの驚くべき収益成果 | 先進国インデックス投資が最強だと証明する岩崎ブログ


バフェットの投資手法と言えば「バリュー投資」(実際の価値よりも割安に放置されている株を購入して本来の価値で売却する)で有名ですが、その手法に大きく影響を与えたのが、「安全なマージン」という銘柄選別法を提唱したベンジャミン・グレアム、「収益性と優れた経営者が大事」とし「理解できるものに絞り込んで投資する」というフィリップ・フィッシャー、割安でなくても良質な企業を買うチャーリー・マンガーだといいます。それについて、

グレアム、フィッシャー、マンガーへのバフェットの思い入れはよく理解できる。グレアムがバフェットに「安全なマージン」という投資の基礎を与え、感情のコントロールを教えた。フィッシャーによって、バフェットの手法は洗練され、長期投資のよい対象を見極めて集中的に投資する方法が与えられた。マンガーは、優れた事業を保有することで大きな利益がもたらされることや、投資判断で陥りがちな心理的な失敗について教えてくれた。バフェットの投資判断について、その意図をどう解釈するかでしばしば混乱が起きるが、3人の教えの組み合わせがバフェットだと考えると、その誤解は解けるだろう。

と著者は書いています。


そのほか、バフェットの考え方や人となりを知る上で非常によくまとまった本になっていると思います。バリュー投資、長期投資を戦略にしている人であれば鉄板本ではないでしょうか。なお、よく耳にするバフェット語録をまとめて読みたければ、下に挙げた「1分間バフェット」などがオススメです。



 

13.1分間バフェット お金の本質を解き明かす88の原則

オススメ度:★★★★☆


投資の神様とも称されるウォーレン・バフェットのいわゆる金言集。
「価格とは、買う時に支払うもの。価値とは、買う時に手に入れるもの」
「投資で重要なのは、自分でルールを考えることと、それを破らないこと」
「リスクとは、自分が何をやっているかよくわからない時に起こるもの」
「他人が貪欲になっている時は恐る恐る、まわりが怖がっている時は貪欲に」
などなど、シンプルでありながら深いフレーズを88個集めた一冊です。

バフェットがどんな人でどんな投資手法を取ってきたかを知った上で読むと有益と思われますので、先に紹介した「株で富を築くバフェットの法則」を合わせて読むことをオススメします。合わせて読む前提で ★★★ からプラス1で。



 

14.生涯投資家

オススメ度:★★★★☆


ニッポン放送株のインサイダー取引(村上ファンド事件)で世間を騒がせた、いわゆる「もの言う株主」村上世彰氏の波瀾万丈な半生を描いた自叙伝です。阪神電鉄の買収劇や 2006年の逮捕は一体何だったのか? が語られています。

その他、子供の頃のエピソードや氏の投資信念なども書かれていて、それだけでも読む価値があります。

企業とその経営者にとって、上場には二つのメリットがある。ひとつは、株式の流動性が上がること。すなわち、株式が換金しやすくなることだ。もうひとつは、資金調達がしやすくなることだ。逆に言えば、この二つが必要ない場合には上場する必要もない、と私は考えている。

私の投資は徹底したバリュー投資であり、保有している資産に比して時価総額が低い企業に投資する、という極めてシンプルなものだ。

投資家として大事なことは、失敗したと気が付いた時いかに素早く思い切った損切りができるか。下がり始めたら売る決断をいかに速やかにできるか、ということだ。それによって、失敗による損失を最小限に止めることができる。

期待値一・〇を超えないと、金銭的には投資する意味がない。この「期待値」を的確に判断できることが、投資家に重要な資質だと私は考えている。

「期待値」のほか、私が投資判断を行なうにあたって重要視している指標がIRR(内部収益率、InternalRateofReturn)だ。手堅く見積もっても、IRRの数字が一五%以上であることが基準となる。

投資につきものであるリスクを査定する際には、定量的な分析よりも定性的な分析が重要なポイントとなる。数字や指標の判断よりも、経営者やビジネスパートナーの性格や特徴を摑むことだ。


事件の真相については、この自伝があくまで村上氏側の主張になっているので果たして真実が何だったのかは私には判断できませんが、当時のメディアから受けたイメージは一変しました。しかしながら、全ては「コーポレート・ガバナンスとその浸透による資金循環の促進こそが経済成長を促す」という想いから、というのはあまりにも良く書かれ過ぎているんじゃないか感も否めません。氏の締め括りのフレーズをどう感じるかは、読者次第です。

私は多くの批判を受けてきた。その原因として、自分の信念を信じ、その信念に自信を持ちすぎて、早急に物事を進めすぎた場面があったことも、今になって振り返ると否定できない。しかし、その方法論や私の言動に賛否はあっても、私が目指してきたことは常に「コーポレート・ガバナンスの浸透と徹底」であり、それによる日本経済の継続的な発展である。


現在は半リタイアしてシンガポールに在住しているという村上氏ですが、Yahoo!ニュースの特集記事に氏の近影が載っていました。あの頃からだいぶ老けたなぁ、という印象です。

「日本郵政は外資が買えばいい」―― 再始動の村上世彰氏が語る - Yahoo!ニュース



 

15.お金の流れでわかる世界の歴史 富、経済、権力・・・はこう「動いた」

オススメ度:★★★★☆


意外というか(笑)予想以上に面白かった一冊。一気に読み終えました。
知っている人からすれば当り前のことなのかもしれませんが、歴史に疎い私としてはいつかもう一度読み直したい本です。


お金が歴史を大きく動かしていた、そして歴史は繰り返す、というのは示唆的で興味深いです。

国の盛衰というものには、一定のパターンがある。強い国は、財政システム、徴税システムなどが、しっかりと整っている。そして国が傾くのは、富裕層が特権をつくって税金を逃れ、中間層以下にそのしわ寄せがいくときなのである。だから国を長く栄えさせようと思えば、税金を逃れる「特権階級をつくらないこと」だといえる。
現在、タックスヘイブンなどにより、世界的規模で特権階級が生じている。ということは、世界的な規模での「国家崩壊」が近づいているのかもしれない。


 

その他

 

16.予想どおりに不合理: 行動経済学が明かす「あなたがそれを選ぶわけ」

オススメ度:★★★★★


この本は昨年読んだ本の中で一番面白かったです。
一昨年読んだ「フリー」の中にも登場していましたし、経済学者で東大名誉教授の伊藤元重先生の「ビジネスエコノミクス」の反転授業に参加したときにも話題に上っていたので結構有名な本なのかなと思ったら、ニューヨーク・タイムズのベストセラーリストに載ったほどの本だとか。著者のダン・アリエリーは現在デューク大学で心理学と行動経済学の教授職を務めており、過去には TED で何度かプレゼンテーションをしたこともあるようです。 *1


ひと言でこの本を説明すると、

わたしたち人間は、従来の経済学の見方からすると、ちっとも合理的でない行動ばかりとっているらしい。本書でも、人間の行動や決断がいかに不合理かを示す興味深い実験がいくつも紹介されている。けれども、著者がこの本全体を通じて主張しているのは、その不合理さには規則性があって予想することができ、だから解決策もある、ということだ。

という訳者あとがきの通りなのですが、行動経済学の入門書として、自ら行った実験結果や多彩なエピソードを交えて、楽しく分かりやすく解説してくれています。またその解決策としては、著者の言うように、我々の行動に規則性のある予想できる形で影響を及ぼす力(感情、相対性、社会規範など)を過小評価したり無視したりせず、我々の脳がそれらに何らかの影響を受けていると認識することで失敗を回避できるとしています。

「本当に求めているものではないのに『無料!』となると不合理に飛びつきたくなるのはなぜ?」など、日常生活でよく見かけるテーマが散りばめられていて面白く、「へえ」と頷くことしきりの一冊です。




 

17.1日ひとつだけ、強くなる。世界一プロ・ゲーマーの勝ち続ける64の流儀

オススメ度:★★★★☆


面白かったです。5年ほど前に「勝ち続ける意思力」を昔読んだのですが、より一層密度が増したように感じました。

「勝ち続ける意思力」を読んだ - akiyoko blog


まずは、「排水の逆転劇」と呼ばれる Evolution 2004 決勝戦の動画を見てください。

この派手な逆転劇に、日々の弛まぬ努力、追い詰められても焦らず判断力を乱されない心の鍛錬、卓越した大局観が凝縮されています。


たかが格闘ゲームと言えどトップの世界で勝ち続ける人の言葉は、ビジネスや人生にも通じる教訓として捉えることもできますが、世の中全体の競争が一段と激しくなりつつある中でこれらの言葉がさらに輝きを増しているようにも感じます。梅原氏も格闘ゲームのプロは真面目にさえやっていれば生きていける世界ではない、自ら積極的に成長していける人だけが勝ち残れると語っていますが、我々のビジネスにもこういった思考力や精神力がますます必要になってくるのでしょう。

もし勝ちたいのであれば、自分ではどうにもならないことに感情を動かされないよう努力したほうがいい。

勝負において自分の戦い方を崩してしまうのは、最も避けるべきことのひとつだ。僕が大切にしているのは、同じ負けにしても感情的にならずに、自分の戦い方のまま負けるということ。感情に呑まれず、自分のやるべきことをしっかりやることが最優先だ。勝ち負けはその結果でしかない。自分の戦い方を保ってさえいれば、ミスがミスを呼ぶことがない。逆転につながる可能性も出てくる。


また、リスクや投資についても鋭い考え方も持っています。リスクを恐れず前に進むには、大局観が必要とのこと。

弱い人というのは目先の損が我慢できない。状況を考えず感情で前に出てしまい、自分のリズムを崩すきっかけを作ってしまう。当然、結果も出ない。

行動力のない人には、共通点がある。特徴のひとつは、「リスク」と捉えるものが多すぎること。「あれも損」「これも損」と考えている。目先の少し損、他人の目、ちょっとした手間なんかが気になって、行動に移せないのだ。

どういうコンセプトで臨むかによって、思考の流れは変わってくる。大局観を持っていれば、ここまでは失敗できる、という線がだいたい見えてくる。大きな目で見れば、少しの失敗がリスクでもなんでもないことが分かってくる。自然と、行動力が出るようになるものだ。

大局観があれば、大きく行動できるようになる。別に正しい視点を持とうとしなくて構わない。大切なのは「仮にこういう視点はどうだろう」と考えて、その視点に沿って行動すること。自分の自由を広げることだ。

投資として、動くことのポジティブな面を考えるのが強いプレイヤー。リスクとして、動くことをネガティブに考えるのが弱いプレイヤー。


「大局観」と言えば、最近、国民栄誉賞の受賞が決定した羽生善治竜王の本「大局観 自分と闘って負けない心」を4年ほど前に読んだことを思い出しました。(現在は47歳ですが)40歳を過ぎてもさらに積極的にリスクに向き合えるようになったという変化は、大局観の賜物ということになるのでしょうか。勝負の世界に生きる最前線の人たちが同じような境地に辿り着いているというのは大変興味深いです。

《過去記事》
akiyoko.hatenablog.jp


私も大局観を意識して持つようにし、日々の変化をチャンスと思えるようにしていきたいです。




 

18.キャッチコピー力の基本 ひと言で気持ちをとらえて、離さない77のテクニック

オススメ度:★★☆☆☆


どこかで見たことのあるようなキャッチコピーのノウハウをまとめたもの。すぐに使えるようなテクニックもあり、まとめてあるので読みやすいのですが、薄いカルピスを飲んでいる感じが否めません。

コピーやライティングに関する本であれば、以前に読んだ「究極のセールスレター」の方が面白かったです。




19.雑談のトリセツ: 会話が楽しくなる!

オススメ度:★★☆☆☆


雑談がとにかく下手なので、読んでみた一冊。
ちょっとした時間に気軽に読み終えられるくらいに薄い本です。

内容については、一瞬「こんなの当り前」と思ってしまうのですが、こういう当り前が出来ていないから雑談が下手なのでしょうね。

以下、気になったところを抜粋。

  • 原則1:「話す内容を思いつきやすい」内容を喋る
  • 原則2:「思いついた内容を話しやすい」環境を作る
    • 相槌を打ち、質問をする
    • 相手が話し手のときは自分は聞き手に回る
    • 話の中に自分のことを交える
    • お互いによく知っている話題を選ぶ
    • 適度に感情が動いた話題を探す(楽しかったこと、ほっとしたこと、恥ずかしかったこと、嬉しかったこと)
    • 相手を不安な気持ちにさせない(落ち着いた態度、相手の話に興味を持っているような態度)
    • 相手に好かれるようにする(挨拶、話を聞くときには目を見る、相手の名前を会話に混ぜる、ねぎらいや感謝の言葉を掛ける、相手の話した内容を覚えておく)

2017年の akiyoko blog 振り返り

明けましておめでとうございます。
勝手に恒例にしていますが、昨年(2017年)の akiyoko blog を振り返っておきたいと思います。

f:id:akiyoko:20180102031254p:plain


ちなみに 2016年の振り返りはこんな感じでした。

<過去記事>
akiyoko.hatenablog.jp



2017年の akiyoko blog 振り返り

昨年一年間にアップした記事の本数は 37本でした。約10日に一本のペースです。

2014年をピークに 77本(2014年)→ 59本(2015年) → 44本(2016年) → 37本(2017年)と記事数が少しずつ減っていますが、アウトプットをサボっている訳ではなく、年々忙しくなっているというのもありますし(面倒なので正確な数字は測っていませんが)一記事あたりのボリュームが増えてきているようにも感じています。


全 37本中、Python 関連の記事が 14本で全体の約4割というのは前回とほぼ変わらず。しかしながら、13本と多かった Django 関連の記事は 2本に減り、代わりに pandasScrapyJupyter などのデータ分析関連の記事が増えました。


大きな変化と言えば、ブロックチェーン仮想通貨 関連の記事が増えたことでしょうか。昨年は社外の勉強会に20回参加し、その内 18本(*1)を記事としてアップしたのですが、その半数ほどがブロックチェーン、仮想通貨関連の勉強会でした。「fin-py もくもく会」には4回、「ビットコインとか勉強会」には5回も参加していました。特に fin-py は自分のやりたいことをいろいろ試せるので、来年も積極的に出ていきたいです。


ブログ記事ごとのアクセス数ランキング(akiyoko blog 2017年)

記事ごとのアクセス数ランキングです。2017年内のアクセス数(*2)ランキング上位 30本をリストアップしています。

なお昨年中に書いた記事 37本中、30位以内に入ったのは 9本でした。 *3


# 昨年比 タイトル 作成日 ポイント
1 まだ CSV の文字化けで消耗してるの?(Excel で直接開いても文字化けしない CSVファイルを Python3 で作成するスマートな方法) - akiyoko blog 2017/12/09 507.2
2 「プロジェクトマネージャ試験」に一発合格するための三か条 - akiyoko blog 2014/10/26 152.0
3 Git で コミットを無かったことにする方法 (git revert の使い方) - akiyoko blog 2014/08/21 71.9
4 IPA「情報セキュリティマネジメント試験」に一夜漬けで合格するためのたった二つの勉強法 - akiyoko blog 2016/11/17 66.6
5 あなたのパンダ(pandas)止まってませんか? 〜 Bokeh と ipywidgets でインタラクティブ Jupyter のススメ - akiyoko blog 2017/12/22 63.8
6 Python でリストのソートまとめ - akiyoko blog 2014/09/26 59.7
7 AppStore 登録前の iOSアプリを Ad-Hoc で配布してインストールする方法 - akiyoko blog 2014/08/23 48.8
8 Video.js を使って HLS形式の動画をストリーミング再生する - akiyoko blog 2015/08/11 46.4
9 pandas.DataFrame の列の抽出(射影)および行の抽出(選択)方法まとめ - akiyoko blog 2017/04/03 44.1
10 「一対一」「一対多」「多対多」のリレーションを分かりやすく説明する - akiyoko blog 2016/07/31 40.7
11 Open BroadCaster Software (OBS) で YouTube ライブストリーミングを使った動画配信をする方法 - akiyoko blog 2016/01/26 38.3
12 PyCharm のオレオレ最強設定 - akiyoko blog 2017/03/10 30.4
13 Python で Selenium WebDriver を使ったブラウザテストをする方法 - akiyoko blog 2014/04/29 25.9
14 iMovie の設定あれこれ - akiyoko blog 2016/02/01 24.5
15 Windows で R(統計解析ツール)を使う - akiyoko blog 2014/11/07 18.9
16 「Python 3 エンジニア認定基礎試験」に合格しました! - akiyoko blog 2016/12/21 18.1
17 Apple Developer Program の有効期限が切れてしまったときの対処方法 - akiyoko blog 2015/11/13 17.6
18 Mac の MySQL クライアントに「Sequel Pro」を使っているなら PostgreSQL クライアントは「PSequel」がオススメ - akiyoko blog 2016/07/29 14.6
19 Pythonのself - akiyoko blog 2012/06/27 14.1
20 見よ!これが Python製の WordPress風フルスタックCMSフレームワーク「Mezzanine(メザニン)」だ! - akiyoko blog 2015/12/23 14.0
21 初心者がプルリクまでに覚えるべきたった 9つの厳選 Gitコマンド - akiyoko blog 2014/12/02 13.7
22 まだ Moodle で消耗してるの? オープンソースの Python製 LMS「RELATE」が圧倒的にカスタマイズしやくてヤバイぞ! - akiyoko blog 2017/12/19 13.1
23 jQuery で Ajax を使ってみる - akiyoko blog 2014/07/21 12.7
24 ビットコイン・仮想通貨・ブロックチェーンの本を合計10冊読んだのでオススメ本を紹介 - akiyoko blog 2017/12/18 12.6
25 Python, Django 界隈の単体テスト事情(unittest / nose / django-nose) - akiyoko blog 2015/01/01 12.3
26 Open BroadCaster Software (OBS) の設定あれこれ - akiyoko blog 2016/01/23 12.2
27 matplotlib のグラフに日本語を表示する方法(文字化け対応) - akiyoko blog 2017/04/11 12.1
28 Pythonで単回帰直線 - akiyoko blog 2013/06/16 12.0
29 Pandas の DataFrame の基本的な使い方 - akiyoko blog 2017/03/27 11.9
30 pandas.DataFrame で時系列データの手習い - akiyoko blog 2017/04/10 11.5



#1 の「まだ CSV の文字化けで消耗してるの?(Excel で直接開いても文字化けしない CSVファイルを Python3 で作成するスマートな方法) - akiyoko blog」は、「python Advent Calendar 2017 - Qiita」の一記事として書いたものですが、公開して丸一日以上経ってから はてなのホットエントリー(テクノロジー) に出始め、そこからアクセスが瞬間的に伸びたのが要因です。結局、400 以上ブックマークされました。「文字化け」がプログラマを悩ま続ける共通のテーマだったからというよりも、「悪循環画像ジェネレータ」で作った図がウケたんじゃないかなと勘繰っています。


f:id:akiyoko:20180101182840p:plain:w400



全体的に Python 系の記事がアップしているのは、機械学習やデータ分析を扱うための中心的言語になっているなど、Python への注目度が上がっている表れなのかもしれません。特に、30位までに4記事がランクインした「pandas」、12位にランクインした「PyCharm」など、こんなニッチな記事が本人の予想を大きく超えて読まれていることに驚きを隠せません。


akiyoko.hatenablog.jp




浮かばれなかった記事

前回も書きましたが、頑張って書いたのにアクセスが全然だった「浮かばれなかった記事」は以下になります。


オープンソースのブロックチェーン「Hyperledger Sawtooth」の調査記事。ほぼ 3万字の超大作ですが、何のインパクトも残せませんでした。。

akiyoko.hatenablog.jp


お手軽データ分析シリーズの三部作。3記事で 1万5000字超えです。
ちなみに個人的には Scrapy は結構使えるなと感じています。うまくデータが抜き出せた時の楽チン度は半端ないです。

akiyoko.hatenablog.jp
akiyoko.hatenablog.jp
akiyoko.hatenablog.jp




今年の目標

記事数の目標は特にありません。

今年は何かプロダクトを作っていこうと考えていますので、それに沿った記事をメモ代わりにアウトプットできればと考えています。

*1:某ECサイトの勉強会と FinTech LT大会&忘年会 については記事を書いていません。

*2:純粋な PV数ではなく、作成日からの日数で割ったポイントで算出しています。

*3:作成日のところを黄色く塗っています。

あなたのパンダ(pandas)止まってませんか? 〜 Bokeh と ipywidgets でインタラクティブ Jupyter のススメ

この投稿は 「Jupyter Advent Calendar 2017 - Qiita」 の 22日目の記事です。


こんにちは、パンダ好きの akiyoko です。

f:id:akiyoko:20171222151740p:plain:w250

上野動物園の赤ちゃんパンダ、シャンシャン可愛いですよね〜。
Ueno Panda Live.jp というサイトで、開園日なら毎日(ただし開園時間のみ)パンダのライブ映像が見れる(オススメは3カメ!)のは皆さんもうご存知ですよね。しかしながら、たまに小一時間ほどパンタ達がじーーーっと動かないことがあるんですね。ただ寝てるだけという。こっちはあのモフモフが愛くるしく動く姿が見たいのに!! 見たいだけなのにぃ!!!!

f:id:akiyoko:20171222124515p:plain:w400
(親子水入らずで全く動かない様子。キャプチャ元:Ueno Panda Live.jp


ハァハァ。少々取り乱してしまいましたが、ところで、あなたのパンダ(pandas)も止まってしまっていませんか? というのが今回のテーマです。 *1


最近、この本を少しずつ読んでいます。

Python 界隈で大注目のデータ分析ツール「Jupyter Notebook」を中心に、1次元・2次元データを便利に扱うための「pandas」、2次元データからグラフを描画するための「Matplotlib」、インタラクティブなグラフを描画するための「Bokeh」などについて 400ページを超える大容量ボリュームで書かれており、動的・対話的なグラフを Jupyter Notebook 上に描くことが一つのゴールとなっています。


また、fin-py にも何度か参加させていただいているのですが、LT でたまに見かける、Jupyter Notebook 上でグリングリン動かせるインタラクティブなチャートに憧れを抱いていたのは私ではないはず。


いろいろ調べたり聞いたりしたところ、動的にチャートを動かす部分は Bokeh、ウィジェットの部分は ipywidgets がよさげということが分かりました。 *2

上記 Jupyter本の共著者で fin-py 主催の driller さんも昨年の「jupyter notebook Advent Calendar 2016 - Qiita」で「ipywidgetsとBokeh使ってインタラクティブな可視化をする - Qiita」というズバリそのままの記事をアップしていたりします。



一周遅れになった感はありますが、今回は「Bokeh と ipywidgets でインタラクティブ Jupyter のススメ」と称して、Bokeh と ipywidgets を使って Jupyter Notebook 上の pandas のチャートをグリングリン動かしてみたい と思います。

チャートに使うデータは、CoinMarketCap から取得した今年1月からの仮想通貨の価格、および米 Yahoo Finance から取得したドル円為替を使います。



 

Bokeh, ipywidgets のインストール

現在のローカル環境は以下の通りです。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G1114

$ python -V
Python 3.5.2 :: Anaconda custom (64-bit)

 

Bokeh

Anaconda をインストールしていれば、Bokeh は標準で入っていると思います。

(参考)Anaconda package lists | Anaconda: Documentation


 

ipywidgets

一方の ipywidgets のインストール方法は、「Jupyter 本」の付録「A-1 ipywidgets の使い方」に詳しく書かれているのですが、私の環境ではそのままではうまく動きませんでした。

$ conda install -conda-forge ipywidgets

として、

from ipywidgets import interact

@interact(n=5)
def f(n):
    return n

を実行してもウィジェットが起動せず。実行するたびに、Jupyter Notebook のログに

[IPKernelApp] WARNING | Widget Javascript not detected.  It may not be installed or enabled properly.

というワーニングが出ている状態。
結局、ipywidgets が利用している widgetsnbextension のバージョンが「3.0.0」だとダメっぽいと判断。一旦、2系に戻しました。

$ conda install 'widgetsnbextension<3'

とし、

$ jupyter notebook

を止めて、再度立ち上げ直せば動くようになりました。

f:id:akiyoko:20171222140001p:plain

$ pip list | grep bokeh
bokeh (0.12.2)

$ pip list | grep widgets
ipywidgets (6.0.0)
widgetsnbextension (2.0.0)

 

データ収集

仮想通貨の日足チャート

Scrapy という Python 製のクローリング・スクレイピングツールを使って CoinMarketCap から 1月からの日足チャートを取得し、ローカルに CSVファイルとして保存しました。


《過去記事》
akiyoko.hatenablog.jp


なお、Scrapy を使った今回のスクレイピング実行コードは
github.com
に置いてあります。
実行環境は Python 3.5 です。


取得したデータはこのような形式で保存されています。


BTC.csv

symbol,date,open,high,low,close,volume,market_cap
BTC,"Dec 20, 2017",17760.30,17934.70,16077.70,16624.60,"22,149,700,000","297,526,000,000"
BTC,"Dec 19, 2017",19118.30,19177.80,17275.40,17776.70,"16,894,500,000","320,242,000,000"
BTC,"Dec 18, 2017",19106.40,19371.00,18355.90,19114.20,"14,839,500,000","320,000,000,000"
  ...
BTC,"Jan 03, 2017",1021.60,1044.08,1021.60,1043.84,"185,168,000","16,426,600,000"
BTC,"Jan 02, 2017",998.62,1031.39,996.70,1021.75,"222,185,000","16,055,100,000"
BTC,"Jan 01, 2017",963.66,1003.08,958.70,998.33,"147,775,000","15,491,200,000"

ETH.csv

symbol,date,open,high,low,close,volume,market_cap
ETH,"Dec 20, 2017",827.52,845.06,756.00,819.09,"3,969,940,000","79,810,600,000"
ETH,"Dec 19, 2017",793.90,881.94,785.34,826.82,"4,096,550,000","76,552,200,000"
ETH,"Dec 18, 2017",721.73,803.93,689.23,794.64,"3,249,230,000","69,578,400,000"
  ...
ETH,"Jan 03, 2017",8.37,10.00,8.32,9.73,"33,625,200","732,988,000"
ETH,"Jan 02, 2017",8.17,8.44,8.05,8.38,"14,579,600","714,900,000"
ETH,"Jan 01, 2017",7.98,8.47,7.98,8.17,"14,731,700","698,149,000"



ローカルに保存した仮想通貨の日足チャートの CSVファイルを全て読み込みます。1ファイルごとに 1通貨のチャートが入っているので、とりあえず行方向に連結しておきます。

import glob
import pandas as pd

pd.options.display.max_rows = 10

df_all = pd.DataFrame()
paths = glob.glob('/Users/akiyoko/PycharmProjects/ccspider/downloads/*.csv')
for path in paths:
    df = pd.read_csv(path, index_col='date', parse_dates=True)
    df = df.sort_index()
    df_all = df_all.append(df)

df_all

f:id:akiyoko:20171222141316p:plain:w400


例えば、BTC のチャートを取り出すときは以下のようにすればよいでしょう。

df_all[df_all.symbol == 'BTC']

f:id:akiyoko:20171222144226p:plain:w400


pandas.DataFrame の条件による切り出しについては、過去記事に詳しい説明があります。

《過去記事》
akiyoko.hatenablog.jp


 

ドル円為替の日足チャート

ドル円為替は、pandas-datareader というライブラリを使って、米 Yahoo Finance から日足チャートデータを取得しました。

import pandas_datareader.data as DataReader

df_usdjpy = DataReader.get_data_yahoo('JPY=X', start='2017-01-01', end='2017-12-31')
df_usdjpy

f:id:akiyoko:20171222143621p:plain:w400


pandasで為替データUSD/JPYの取得 - はしくれエンジニアもどきのメモ」を参考にさせていただきました。


それにしても、pandas-datareader スゴイ!
たった一行で為替チャートが取ってこれるのですね。他にも株価や世界人口、GDP のデータも簡単に取れるようです。

(参考)pandas-datareaderで株価や人口のデータを取得 | Python / note.nkmk.me


 

実践

移動平均線

まず、n日移動平均のチャートをハンドルで動かせるようにしてみます。ここまではほぼ「Jupyter 本」のパクリです。

from bokeh.io import output_notebook, push_notebook, show
from bokeh.plotting import figure
from ipywidgets import interact

output_notebook()
plot = figure(plot_width=600, plot_height=300, x_axis_type='datetime')
df = df_all[df_all.symbol == 'BTC']
close = plot.line(df.index, df['close'])
ma = plot.line(df.index, df['close'].rolling(10).mean(), color='red')
handle = show(plot, notebook_handle=True)

@interact(n=(0, 30))
def redraw(n=10):
    ma.data_source.data = {'x': df.index, 'y': df['close'].rolling(n).mean()}
    push_notebook(handle=handle)

f:id:akiyoko:20171223171743g:plain:w500


ハンドルを動かすと、赤色の移動平均線がグリグリ動きます。気持ちいいです。


 

ドロップダウンで通貨を入れ替え

次に、pandas.DataFrame の条件による切り出しを使って、ドロップダウンの条件によって通貨を入れ替えられるようにしてみました。

from bokeh.io import output_notebook, push_notebook, show
from bokeh.plotting import figure
from ipywidgets import interact

output_notebook()
plot = figure(plot_width=600, plot_height=300, x_axis_type='datetime')
df = df_all[df_all.symbol == 'BTC']
close = plot.line(df.index, df['close'])
ma = plot.line(df.index, df['close'].rolling(10).mean(), color='red')
handle = show(plot, notebook_handle=True)

@interact(symbol=['BTC', 'ETH', 'BCH', 'XRP', 'LTC', 'MIOTA', 'ADA', 'DASH', 'XEM', 'BTG'], n=(0, 30))
def redraw(symbol='BTC', n=10):
    df = df_all[df_all.symbol == symbol]
    close.data_source.data = {'x': df.index, 'y': df['close']}
    ma.data_source.data = {'x': df.index, 'y': df['close'].rolling(n).mean()}
    push_notebook(handle=handle)

f:id:akiyoko:20171223174020g:plain:w500


Market Cap の上位10通貨を切り替えられるようにしてみましたが、なかなか面白いです。



 

USD ⇔ JPY の切り替え

最後に、USD と JPY の価格表示が切り替えられるようなチェックボックスを付けてみました。

df に「close_jpy」列を追加し、通貨の終値(USD)とドル円為替の終値(1USD あたりの JPY)を掛けた値を入れています。なお、為替は相場が休みの日はデータが取れない(N/Aになる)ため、「fillna(method='ffill')」を使って前日のデータで補完しています。

from bokeh.io import output_notebook, push_notebook, show
from bokeh.plotting import figure
from ipywidgets import interact

output_notebook()
plot = figure(plot_width=600, plot_height=300, x_axis_type='datetime')
df = df_all[df_all.symbol == 'BTC']
close = plot.line(df.index, df['close'])
ma = plot.line(df.index, df['close'].rolling(10).mean(), color='red')
handle = show(plot, notebook_handle=True)

@interact(symbol=['BTC', 'ETH', 'BCH', 'XRP', 'LTC', 'MIOTA', 'ADA', 'DASH', 'XEM', 'BTG'], n=(0, 30), jpy=False)
def redraw(symbol='BTC', n=10, jpy=False):
    df = df_all[df_all.symbol == symbol]
    # interpolate() causes ValueError: Out of range float values are not JSON compliant... why?
    #df = df.assign(close_jpy=(df['close'] * df_usdjpy['Close']).interpolate())
    df = df.assign(close_jpy=(df['close'] * df_usdjpy['Close']).fillna(method='ffill'))
    y = df['close_jpy'] if jpy else df['close']
    close.data_source.data = {'x': df.index, 'y': y}
    ma.data_source.data = {'x': df.index, 'y': y.rolling(n).mean()}
    push_notebook(handle=handle)

f:id:akiyoko:20171223173442g:plain:w500


全体的に 5月、12月に何があったの??という感じのチャートになっています。


 

まとめ

pandas.DataFrame は時系列データを保持したりチャートを描いたりするのに非常に便利に使えますが、Bokeh と ipywidgets でインタラクティブにチャートを描画できるようにすれば、見栄えもよくもっと強力なツールになります。


そんな Bokeh や ipywidgets についてもしっかり書かれている「Jupyter 本」はスゲエなってことを今回再認識しました。つまり、買えってことです(笑)。


ちなみに今回の Advent Calendar では当初、pandas.DataFrame の resample を使ってインタラクティブに5分足 ⇔ 1時間足 ⇔ 日足といったようにチャートを書き換えられるようにしたかったのですが、うまく動かすことができませんでした。figure の X軸を書き換えるのは難しいのかもしれませんね。。


明日は、u1and0 さんの「Jupyter Advent Calendar 2017 - Qiita」 23日目の記事です。よろしくお願いします。




 

おまけ

今回の件とは直接関係ありませんが、notebook 保存時に以下のエラーが出てファイルを保存できなくなって困ってしまいました。

f:id:akiyoko:20171222150328p:plain

結局、
python - plotly plots in jupyter notebooks: Validation fails when saving - Stack Overflow
に書かれているように、

$ conda update nbformat

を更新してから、

$ jupyter notebook

を止めて再度立ち上げ直せば、保存できるようになりました。

原因は不明ですが、急に動かなくなると焦りますよね。

*1:なお、pandas の名前の由来は「panel data」らしいです。 pandasで使われるデータ構造 ~1次元、2次元、3次元のデータの扱い方~ - 今日も窓辺でプログラム

*2:ipywidgets については「Jupyter 本」にも説明があります。

まだ Moodle で消耗してるの? オープンソースの Python製 LMS「RELATE」が圧倒的にカスタマイズしやくてヤバイぞ!

この投稿は 「Django Advent Calendar 2017 - Qiita」 の 19日目の記事です。


こんにちは、akiyoko です。

「Django Advent Calendar」は 2年連続 4度目の参加になります。昨年は最後まで枠が空いていたので、調子に乗って3日分も担当してしまいました。 *1, *2, *3


あと、2年前に Python製 CMS「Mezzanine」を紹介したときの流れで、煽りタイトルを付けてしまいました。重ね重ね申し訳ございません。

《過去記事》
akiyoko.hatenablog.jp



 

はじめに

オープンソースの LMS(学習管理システム)と言えば、

などがまず真っ先に挙げられますが、今回紹介するのは、Python 製で Webフレームワークの代表格「Django」をベースに開発されたオープンソースの LMS、その名も「RELATE」です。 *4


例えば、Pythonista なあなたが LMS を開発することになったとしましょう。
良さげな候補が Moodle しか見つからず、「仕方ない、Moodle をカスタマイズするか。はぁ、PHP か・・」というのは精神衛生上よろしくないですよね?(すいません、個人の意見です。)

そんなとき、Moodle じゃない Python製の LMS があればワクワクしてきませんか? ・・しませんか、そうですか。


あとよく聞くのは、Moodle は要らない機能が多すぎるという問題。ちょっとしたテキストと動画、小テスト(クイズ)が受講できる講座をオンラインで実施したいだけなら、もっとシンプルなものが求められるケースもありますよね。


しかも、Moodle は GPLライセンス のため、Moodle をカスタマイズしてオンライン学習サービスをリリースした場合にはソースコードの公開が求められることになります。

Moodleはコピー・利用・修正してかまいませんが,条件として,ソースコードを公開し,元のライセンスや著作権表示を修正したり削除したりせず,同じライセンスをMoodleから派生したソフトにも与えなければなりません。


Moodleとは - MoodleDocs


そのため、BtoB 向けに Moodle をカスタマイズして提供するというのはライセンス上どうしても困難な面があるかと思います。その点、RELATE は MITライセンス なのでソースコードの公開義務はありません。機能追加し放題、思う存分カスタマイズすることができます。



 

RELATE の特徴

まず、RELATE には、

  • Python 製、Django ベース
  • コースコンテンツを Markdown 形式で記述(プログラマ向け!)
  • コースコンテンツは1講座ごとに Git 管理(管理画面でバージョンの切り替えも可能)
  • VideoJS による動画埋め込みを標準サポート
  • 日本語にも翻訳可能 *5

といった特徴があります。中でも、コースコンテンツを Markdown で書くという特徴はオンリーワンじゃないでしょうか(私の知る限りで)。


画面はトップ画面、テキスト(動画)画面、クイズ画面、成績画面、管理側画面などで構成され、LMS としてひと通りの機能が揃っています。機能はさほど多くないですが、実用的でしっかりと作り込まれており、Moodle や Canvas の2000オーバーには及びませんが、GitHub スターは現時点で120ほど付いています。また、Python 3、Django 1.11 にも対応しています。


ところで Django 1.11 なら、この「Two Scoops of Django」シリーズの最新版が絶対オススメです。英語ですが(と言っても難しい感じの本ではないです)、現場で役立つこと間違いなしのナンバーワン Django本です。


GitHub の履歴を覗いてみると、2014年5月から inducer がコツコツとプロトタイプを作り始め、dzhuang が途中で加わり、現在は主に二人で開発を続けていますが、最近も頻繁にコミットがされています(今日も何件かコミットされていました)。

inducler(Andreas Klöckner)はプロフィールを公開していて、ドイツ出身で現在はイリノイ州立大学のコンピュータサイエンスの助教授をしているとのこと。自身(?)の オンラインクラス にこの RELATE を使っているようです。なので、ちゃんと Python や Django のバージョンアップに追随しているのですね。

全部を一個人が作ったのではなく(一応)複数人が開発していて、Issue や PR をオープンに受け入れているのでサポートもある程度期待できそうです。何よりも、ベースが Django なのでコードが理解しやすくカスタマイズしやすいのが嬉しいところです。


これで SPA だったら最高なのになぁ、と思ったあなた。・・そんなあなたのために、「Web Expedition」(webexp)という「Django + Angular」なイケてる LMS を見つけておきました(*6)。一応オープンソースなのですが開発者が最新版のソースコードを push してないのか、昔触ったときにうまく動かなかった記憶がありますのでご注意を。





 

Ubuntu 16.04 on Docker for Mac で構築してみる

Ubuntu 16.04 on Docker for Mac 上に RELATE のサイトを構築してみます。
もちろん、以下の構築手順は本番向けではありませんのでくれぐれもご注意を。

環境

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G1114

$ docker --version
Docker version 17.09.1-ce, build 19e2cf6


 

Docker コンテナを起動

$ docker run -it -p 80:8000 --name relate ubuntu:16.04

# cat /etc/issue
Ubuntu 16.04.3 LTS \n \l

# apt-get update
# apt-get install -y python3-dev python3-pip
# pip3 install -U pip
# apt-get install -y vim git curl

# python3 -V
Python 3.5.2
# pip3 -V
pip 9.0.1 from /usr/local/lib/python3.5/dist-packages (python 3.5)

### Bower をインストール
# apt-get install -y nodejs npm
# nodejs -v
v4.2.6
# npm -v
3.5.2
# npm install -g bower



以降は、Installation — RELATE 2015.1 documentation を参考にして RELATE のインストールを進めていきます。

なお、検証時の RELATE のバージョンは、66d3d38 です(2017/12/19 時点の最新版)。

# cd /opt/
# git clone https://github.com/inducer/relate.git

### 事前にコースコンテンツも配置しておく
# git clone https://github.com/inducer/relate-sample.git
# cd relate
# pip3 install -r requirements.txt

ここで、

Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-uh2f9ekj/django-select2/

というエラーが出る場合がありますが、「django-select2」6.0.0 のバグの可能性があります。

diff --git a/requirements.txt b/requirements.txt
index 3a5dbd3..e39372f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -94,7 +94,7 @@ git+https://github.com/celery/django-celery.git@6232c79557517afa74967fcb980c0db2
 # }}}

 # For searchable select widgets
-django_select2>=5.5.0
+django_select2<6

 # To sanitize HTML generated by user code
 bleach>=2.0,<3

と修正して

# pip3 install -r requirements.txt

をやり直せば、うまくインストールできました。

# cp local_settings.example.py local_settings.py
# vi local_settings.py

で、

ALLOWED_HOSTS = ["*"]

に変更。

# python3 manage.py migrate
# python3 manage.py createsuperuser
### (admin/admin@example.com/pass)

# python3 manage.py bower_install --allow-root

ここで、Ubuntu 16 は "node" ではなくて "nodejs" として認識するため、ここで以下のようなエラーが出てしまう場合があります。

/usr/bin/env: 'node': No such file or directory

この場合は、以下のコマンドを実行すれば OK です。

# ln -s /usr/bin/nodejs /usr/bin/node

改めて、

# python3 manage.py bower_install --allow-root

を実行。

最後に、runserver を起動します。

# python3 manage.py runserver 0.0.0.0:8000

ブラウザで、
http://localhost/login/
にアクセスします。

f:id:akiyoko:20171219230405p:plain


 

コースコンテンツの登録

「Sign in」のリンクを辿り、superuser でログインします。

f:id:akiyoko:20171219230421p:plain

ログインできたら、「Set up new course」ボタンをクリックします。

f:id:akiyoko:20171219230508p:plain


以下のようにサンプル講座の設定をおこない、「Validate and create」ボタンを押下。

Course identifier: t-001
Course name: Test Course
Number: T001
Time period: March 2018
Start date:
End date:
Only visible to course staff: チェック
Listed on main page: チェック
Accepts enrollment: チェック
Git source: /opt/relate-sample
SSH private key: 
Course root in repository: 
Course file: course.yml(デフォルト)
Events file: events.yml(デフォルト)
Enrollment approval required: 
Enrollment required email suffix: 
From emai: admin@example.com
Notify email: admin@example.com

f:id:akiyoko:20171219230813p:plain:w300


サンプル講座のトップ画面が表示されます。

f:id:akiyoko:20171219233802p:plain


講座を受講してみる

本来は受講者を作成してログインし直すべきですが(成りすましモードもあります)、このまま進めていきます。

トップ画面から以下のリンクをクリックするか、「http://localhost/course/t-001/flow/001-linalg-recap/start/」にアクセスすると、テキストページのフローに進むことができます。

f:id:akiyoko:20171219233606p:plain

ここに動画やテキストを配置します。ページ移動は上部のナビゲーションから可能です。

f:id:akiyoko:20171219233129p:plain



次に、クイズ(小テスト)です。


トップ画面から、「sample quiz」というリンクをクリックするか、「http://localhost/course/t-001/flow/quiz-test/start/」にアクセスします。

f:id:akiyoko:20171219233629p:plain

クイズが横に並んでいます。

f:id:akiyoko:20171219231934p:plain

いろんな形式のクイズを出すことができます。

f:id:akiyoko:20171219232041p:plain

クイズの形式はこの他にも多数用意されています。

f:id:akiyoko:20171219232011p:plain

クイズを提出する場合は、右側のボタンをクリック。

f:id:akiyoko:20171219232146p:plain

確認画面が表示されます。

f:id:akiyoko:20171219232604p:plain

結果画面も用意されています。

f:id:akiyoko:20171219232639p:plain

完了したクイズは、後で振り返りをすることもできます。

f:id:akiyoko:20171219232748p:plain


管理者側の画面で成績の一覧をチェックすることも可能です。

f:id:akiyoko:20171219232906p:plain



 

まとめ

2年前に Python製で Django ベースの CMS「Mezzanine」を紹介しましたが、今回は同じく Python 製で Django ベースの LMS「RELATE」を紹介してみました。


Django ベースで開発されているため、Django に慣れている Pythonista であれば容易にカスタマイズができますし、既存の様々なライブラリを利用することができるため、思うがままの LMS を創り上げることができます。

これを機にオリジナルのオンライン学習サービスをリリースしてみてはいかがでしょうか。



明日は、kzkamago0721 さんの「Django Advent Calendar 2017 - Qiita」 20日目の記事です。よろしくお願いします。

*1:昨年は最後まで枠が空いていたので、調子に乗って3日分も担当してしまいました。《過去記事》akiyoko.hatenablog.jp

*2:《過去記事》akiyoko.hatenablog.jp

*3:《過去記事》akiyoko.hatenablog.jp

*4:検索に引っかかりにくい名前つけやがって、こんちくしょう!!

*5:ただし、コースコンテンツの翻訳は難しいかも。

*6:Quiz Web App with Django + Angular and deployment on pythonanywhere | Bhargav Patel

ビットコイン・仮想通貨・ブロックチェーンの本を合計10冊読んだのでオススメ本を紹介

この投稿は 「暗号通貨 Advent Calendar 2017 - Qiita」 の 18日目の記事です。

こんにちは、akiyoko です。

 

はじめに

ビットコインが 100万円を突破した 11月後半あたりから「ビットコイン」「仮想通貨」「ブロックチェーン」などのキーワードがものすごい勢いで急激にトレンドを上げています。


f:id:akiyoko:20171218015754p:plain
(2017/12/18時点。今現在のトレンドはまとめの下に掲載)


それに合わせて関連本の出版も急増していて、Amazon でも「ビットコイン」「仮想通貨」「ブロックチェーン」等で検索すると、合わせて 400冊以上も本が見つかる状況となっていて、こちらもちょっとしたお祭り状態になっています。

ビットコインをはじめとする仮想通貨やブロックチェーンの情報ならインターネットにいろいろと転がっているとは思いますが、ある程度整理された知識をまとめて押さえるのには本が一番と考えている人も多く、私も(もちろんインターネットの情報もチェックしますが)体系的な知識を入れるために本から入ることも少なくありません。


今年は仮想通貨やブロックチェーン関連の本を合計10冊ほど読んだのですが、今回はその中から(特に技術者目線で)有用だと感じた度合いを「オススメ度」という形で示しながら紹介していきたいと思います。また、技術者ではない人にも読めるかどうか判断できるように「難易度」の目安(★ が多いほど難しい)も付けてみました。ぜひ参考にしてください。



先に結論を書くと、技術者であれば、①〜③のいずれか一冊かインターネットの情報でざっと概要を頭に入れた後、「⑥ いちばんやさしいブロックチェーンの教本」で周辺の情報も含めて技術的なところを押さえておけばまずは大丈夫です。

技術者でなければ、「③ いまさら聞けない ビットコインとブロックチェーン」が分かりやすくてイチ推しです。

プラスアルファとして何か読むのであれば、読み物としての「④ デジタル・ゴールド」が非常に面白いです。将来の金融業界にブロックチェーンがどんな衝撃を与えるか興味がある方は「⑧ アフター・ビットコイン」は必読です。


さあ、行ってみましょう!


 

ビットコイン関連

ビットコインに特化した本。まずはここから入る人も多いと思います。私もそうでした。

① ビットコイン解説本

オススメ度:★☆☆☆☆
難易度:★☆☆☆☆


「ビットコインって何?」という状態から最初に読んだ本。

ビットコインは「お金」なのか?という疑問に、ポイントサービス(Tポイント・楽天ポイント 等)や電子マネー(楽天Edy・Suica 等)、クレジットカードとの比較をしながらその特徴を説明していきます。お金の歴史やビットコイン誕生の歴史についても少し触れられており、ビットコインの概要を知るための本と言えます。気軽に読めるページ量(75ページ程度)なので、てっとり早く概要を知りたいという人や最初に読む本としてはいい と思います。逆に、技術的に詳しく知りたいという人には全然物足りないでしょう。

2014年発刊ということで少し古臭さは否めませんが、概要を知るというだけなら特に問題ないと思います。


 

② ビットコインはどのようにして動いているのか? ビザンチン将軍問題、ハッシュ関数、ブロックチェーン、PoWプロトコル

オススメ度:★☆☆☆☆
難易度:★★☆☆☆

11月の SegWit2x ハードフォーク回避 を見事予言的中したフルタイムビットコイナー、大石 哲之さんの本。

私の予想では、マイナーが経済的に合理的あれば、決してSegwit2xのフォークを行わないと考えている。マイナーは、価値の低い2xコインを採掘せず、1xコインを採掘し続けるだろう。その結果、11/16日には、実際は何もおこらないだろう。


Segwit2xのフォークについて | ビットコイン研究所」より


ビットコインの核心(そして革新)部分である「ビザンチン将軍問題」にフォーカスを当てた仕組み解説本 ですが、何か事情があって急いで出したのでしょうか、内容に物足りなさを感じます(実際 66ページと薄い)。技術的な内容は少しだけしか触れられていません。というか、ほぼビザンチン将軍問題の説明だけに終始しています。しかしながら、説明や比喩が多少回りくどく感じられ、余計にモヤモヤするかもしれません(あくまで私の感想ですが)。

全般的に図が一切無いからでしょうか、内容がスッキリと頭に入ってこない印象です。出版された2014年当時としては数少ない日本語の情報だったかもしれませんが、今となってはインターネットに転がっているレベルと言えば言い過ぎでしょうか。


 

③ いまさら聞けない ビットコインとブロックチェーン

オススメ度:★★★★☆
難易度:★★☆☆☆


国内大手の仮想通貨取引所 coincheck の COO 大塚 雄介 氏の著書。 *1

現金やクレジットカードとの違いやビットコインのメリットなどの初歩の初歩から始まり、ビットコインの簡単な仕組みやセキュリティに至るまで、なるべく誰でも理解できるように技術的な説明が必要な部分をうまく掻い潜りながら工夫して説明されているのがよく分かります。仮想通貨ビギナーでも何の問題もなく読み進められると思います。その割に、SegWit(セグウィット)やクラウドマイニングなどについても説明があり、周辺知識もしっかり押さえられています。

また、国内最多のアルトコインを販売している coincheck に所属しているということもあってか、ビットコインだけでなく、Ethereum(イーサリアム)や Augur(オーガー) などのいくつかのアルトコインについての説明もされています。ということで、技術的なことは苦手だけどビットコイン周辺のいろいろな情報を押さえたいという人にはピッタリ の内容でしょう。


文春オンラインの記事「ビットコインの仕組みを文系の人にわかりやすく伝えるには? | 文春オンライン」で

「類書は多いですが、文系の人でも簡単に、大づかみにこの分野を理解できるのはこの本だけと思います」(担当編集者の千葉正幸さん)

と書かれている通り、技術的な話は一切出てこないので、「文系なのでちょっと・・」という方にもバッチリ理解できるような本になっていると思います。



ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin
ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin



 

④ デジタル・ゴールド ── ビットコイン、その知られざる物語

オススメ度:★★★★★
難易度:★★☆☆☆


2009年のビットコイン誕生から2014年までの黎明期の歴史を、ビットコインに熱狂した人たちの物語を中心に、実際にあった出来事をベースに仔細に描いた人間ドラマ。 仮想通貨の「王様」とまで呼ばれるまでになった今とは全く違う、ビットコインの若かりし頃の裏の顔を垣間見ることができます。これが事実だとすると(著者はニューヨーク・タイムズ紙の記者で緻密な取材をおこなったとのことなので事実無根なことは書いていないと思いますが)、ビットコインが現在このように多くの人を魅了するほどに大きくなっているのはまさに奇跡だと感じてしまいます(それこそがビットコインの持つ「力」が本物だと証明していると考えることもできますね)。いずれにせよ読み物として最高の面白さです。

サトシ・ナカモトの人物像(私の想像と全く違いました)、違法サイト「シルクロード」で人気を維持していたダークサイドな時期、2014年2月の「Mt.GOX」事件の詳細など、私のような新参者が知らない歴史がこの一冊に詰まっています。「Mt.GOX」がアレの頭文字だったとか知ったときはショックで唖然としました(笑)。

技術的な要素は「補足」として巻末に書かれていますが、何も知らなくても全く問題なく読み進められます。しかしながら技術的な内容が少しでも分かっていれば、この物語をより一層楽しめるでしょう。

若干気になったのは、最後のあっけない終わり方。紆余曲折ありながらも物語はまだまだ続いているのになと思ったのですが、数年後に続編が出るのを期待しましょう。


 

⑤ ビットコインとブロックチェーン : 暗号通貨を支える技術

オススメ度:★★★★★
難易度:★★★★★


原題は「Mastering Bitcoin」。世界的にも有名な一冊で、もはやビットコイン技術者のバイブルとも言われている本です。あるいは、卒業証書と言っていいかもしれません。これが読めたら、ビットコインの仕組みはひと通りは理解できているという証になるでしょう。完全に技術者向け。 読む前にある程度の知識は入れておいたほうが良いと思います。何の知識もなくこの本を最初に読むと、十中八九挫折します。他の本で曖昧に説明されていたことが事細かに書かれていて、(細かい部分までは理解できなくても)「なるほどこういう仕組みで作られているのか」とスッキリできるようになります。

後半に、初期の頃のアルトコインの情報もあり、こちらもなかなか有益な内容になっています。


 

ブロックチェーン関連

こちらは、取り扱うテーマをビットコインだけに絞らず、幅広くブロックチェーンまでを解説した本です。

⑥ いちばんやさしいブロックチェーンの教本 ― 人気講師が教えるビットコインを支える仕組み

オススメ度:★★★★★
難易度:★★★☆☆


タイトルに「いちばんやさしい」とありますが、詳しめな技術要素の説明もあって、対象読者は明らかに「技術者」です。ビットコインやブロックチェーンの概要をある程度知っていて、もう少し深掘りして勉強したい技術者にはピッタリです。 全体的によくまとまっていて、個人的には一番のオススメ本です。

技術的な部分をなるべく詳しく説明しながら、且つ分かりやすく説明されています。他の本では解説していない細かな部分もちゃんと説明をしているなという印象で、これ一冊でほとんどの基礎的な要素をしっかりと網羅することができると思います。ブロックチェーン以外にも、ウォレットやスマートコントラクト、などの周辺情報も幅広く説明しており、まさにこれ一冊で OK というイメージです。

先に述べた通り難易度が少し高いのですが(そういうものなんだと読み流すことはできますが)、ITパスポートレベルの基礎知識があれば何とか理解はできるのではないかと思います。


 

⑦ ブロックチェーン・レボリューション ―― ビットコインを支える技術はどのようにビジネスと経済、そして世界を変えるのか

オススメ度:★★★☆☆
難易度:★☆☆☆☆


ブロックチェーンという技術がビジネス、経済、世界をどのように変えるのかといった「ブロックチェーン革命」について書かれた本です。従来の「情報のインターネット」に対して、ブロックチェーンは「価値とお金のインターネット」と言われる所以について、ブロックチェーン革命の要となる7つのポイントについて、「信頼」「非中央集権」「インセンティブの設計」「不正ができない」「個人情報のブラックボックス化」「スマートコントラクト」「格差を解消するデザイン」という点が挙げられると言います。ハッとしたのは、「これからは、いいことをすると得をして、悪いことをすると損になるようなインターネットが実現する」という点。私がブロックチェーンを画期的だと思うのは、利用者が利己的な行動をしてもそれがシステム全体としての利益に繋がるという設計の妙なのですが、そのあたりの話が技術的な説明一切無しに書かれているのは面白いところです。インターネットは世の中を良くしたと言われますが、格差を広げただけという指摘もあります。そんな中、インターネットがスポットライトを当てなかった人たちにもブロックチェーンが光を照らす。そんな新しい未来がブロックチェーンによって来るかもしれない。夢と希望と可能性を感じられる、面白い本ではないでしょうか。

ただし、少し分厚いのが唯一の難点でしょうか。


中村 伊知哉氏のブログでも書評がありますね。
ブロックチェーンは革命なのか? ~ Ichiya Nakamura / 中村伊知哉


 

⑧ アフター・ビットコイン : 仮想通貨とブロックチェーンの次なる覇者

オススメ度:★★★★☆
難易度:★★☆☆☆


ビットコイン(いわゆる「ブロックチェーン 1.0」)はバブル、オワコン。これからは、金融の世界を根本的に変革するポテンシャルを秘めている「ブロックチェーン 2.0」(決済・送金、証券決済など)、「ブロックチェーン 3.0」(登記、資産管理、投票など)に利用されるであろう「分散型台帳技術」の時代だよ、という内容の本です。
話の流れ上、どうしてもビットコインはバブルにしてしまいたい駆け足気味の前半部分には少し違和感を覚えましたが、後半の金融分野への深い造詣はさすが日本銀行で「電子現金プロジェクト」に携わり、決済機構局でデジタル通貨を研究、国際決済銀行(BIS)でグローバルな活躍をしてきた経歴を持つ著者の得意分野、まさに独壇場という感じの内容でした。

パブリックなチェーンであるビットコインと比較して、金融界で導入されるであろうプライベートチェーンの利点、ネックとなる承認速度やファイナリティの問題、個人的に一番の謎だった「プライベートチェーンをマイニングするインセンティブって?」という(ビットコインの仕組みをベースに考えると理解しにくい)モヤモヤや疑問が解消します。また、Linux Foundation が推進する「HyperLedger Fabric(ハイパーレッジャー・ファブリック)」、R3 コンソーシアムの「Corda(コルダ)」、Ripple の「ILP(インターレッジャー・プロトコル)」などのプライベートチェーンについての解説や、中央銀行が狙う当座預金のデジタル化(決済コイン型デジタル通貨)、証券決済などの話題が盛り沢山で、ビットコインブームを脇においてこれだけしっかりとブロックチェーンの金融分野への展開を論じている本は少ないのではないかと思います。

⑦がぼやっとしたブロックチェーンがもたらす夢の未来を書いているとすれば、こちらは具体的な近未来像を描いています。プライベートチェーンについての多彩な情報は他の本には無いオンリーワンな内容かと思います。金融業界に今後何が起こるかを知りたい人、ビットコインじゃないブロックチェーンの可能性について詳しく知りたいという人にはピッタリ な内容です。


著者の中島氏はこんな人です。
「ビットコイン」の終わりから「ブロックチェーン」の時代へ:中島真志 | 記事 | 新潮社 Foresight(フォーサイト) | 会員制国際情報サイト

ビットコイン界隈で有名な DEG さんの書評も見つけました。
【迫るラストデイ】アフター・ビットコインを読みました - 仮想通貨のあるとこ


 

Ethereum ・スマートコントラクト関連


Ethereum の本は何冊か出ていますが、まずは一冊だけ読んでみました。

⑨ スマートコントラクト本格入門 ― FinTechとブロックチェーンが作り出す近未来がわかる

オススメ度:★★★★☆
難易度:★★★★☆


数少ないスマートコントラクトの実践入門書。

序盤は FinTech やブロックチェーンの超概要、中盤はスマートコントラクトについて書かれています。中でも、ブロックチェーンやスマートコントラクトに関わる法律・規制の話は他の本にはなかなか無いので貴重です。後半はガラッと変わって開発者向けの話になり、SolidityTruffleGeth を使った Ethererum ベースのスマートコントラクト開発の具体的な手順について述べられており、実際に手を動かしてみようといった感じになっています。ということで、Ethererum を使ったスマートコントラクトの開発をしてみたい人には入門書として非常に有益 な内容になっていると思います。


Ethereumはどのように動いているのか - The Coffee Times」と合わせて読むとよいかと思います。なお、ERC20トークン については書かれていませんので悪しからず。


 

アルトコイン関連

意外にと言うか、アルトコイン(ビットコイン以外の仮想通貨)についての本はあまり見当たりません。成長のスピードが早過ぎて情報がすぐに陳腐化してしまうからでしょうか。今のところ次の一冊くらいしかないのですが、読んでみました。

 

⑩ 一冊でまるわかり 暗号通貨 2016〜2017

オススメ度:★★☆☆☆
難易度:★☆☆☆☆


タイトルから適当に書いたかと思いきや(笑)、意外としっかり調べている印象です。しかしながら、取り上げているアルトコインの種類が少なくて中途半端な印象も。実際、役に立ったかと言えば微妙でコスパは多少悪いかなと感じました。続編(あるのかな?)に期待です。

ある程度まとまったコインの情報が日本語で書かれたものが他に無いため、今改めて見返すと有用な部分も多いです。Twitter やブログでの特定のアルトコイン推しのポジトークに辟易していて、第三者視点からの情報が欲しいという人にはマッチする かもしれません。

ちなみにこの本に取り上げられているアルトコインは以下の24種類です。

 

まとめ

今年、「ビットコイン」「仮想通貨」「ブロックチェーン」関連の本を合計10冊読んだので、「難易度」と「オススメ度」を付けてそれらを一冊ずつ紹介してみました。

ただし、★ の数はあくまで個人の感想ですのでご注意ください。書籍をご購入の際は、ご自身の目的に合ったものを用法用量を守って正しくお選びください。




明日は、ohac さんの「暗号通貨 Advent Calendar 2017 - Qiita」 19日目の記事です。よろしくお願いします。



 

おまけ

本はもう何冊か読んでいたのですが、10冊の枠から外れたものをおまけで紹介。

⑪ 1時間でわかるビットコイン投資入門

オススメ度:★☆☆☆☆
難易度:★☆☆☆☆


薄くて(144ページ程度)対話形式でテンポよく読めるなので、数時間で読み切ることができます。内容はだいぶ薄め。

ポートフォリオ、指値注文と成行注文、時間分散(ドルコスト平均法)、アービトラージ、証拠金取引など、仮想通貨「投資」についてのまさに基本が書かれている本。知っておいて損はないとは思いますが、まあ皆さん大体知ってますよね、といった内容。

この本は 5月に出版(寄稿は4月)された比較的新しめの本なのですが、

私は2018年末までに1BTC=30万円近辺もあり得るとみているため

などと書かれているあたり(実際には 2017年5月25日に 30万円達成 *25)、ビットコイン・仮想通貨の流れは早いな(早過ぎて怖いな)と感じてしまいます。


 

参考

現在の「ビットコイン」「仮想通貨」「暗号通貨」「ブロックチェーン」のトレンドです。


たった5分でデモが動かせる! Hyperledger Sawtooth(ハイパーレッジャー・ソウトゥース)でブロックチェーンを手軽に体験してみよう

この投稿は 「ブロックチェーン Advent Calendar 2017 - Qiita」 の 17日目の記事です。

こんにちは akiyoko です。

はじめに

仮想通貨やブロックチェーンの昨今の盛り上がりにより、ブロックチェーンの情報が本やインターネットで簡単に手に入るようになってきました。


そろそろ、
「ブロックチェーンの理論は大体分かった。次のステップとして、

面倒な設定なしに、5分ほどで簡単にデモが動かせる、そんなお手軽なブロックチェーンがあればいいのになぁ。。

と考えている技術者の方が増えてきているのではないでしょうか。

f:id:akiyoko:20171217035811p:plain:w300


ハイ、あるんです!

今回は、たった5分で簡単にデモが動かせる分散型台帳フレームワーク、その名も「Hyperledger Sawtooth」を紹介したいと思います。


ちなみに「Sawtooth」は「ノコギリ」ですが、何故このネーミングになったのかについては調べてもよく分かりませんでした。 *1

f:id:akiyoko:20171217202359p:plain:w200


 

Hyperledger Sawtooth とは

Hyperledger(ハイパーレッジャー)とは

Hyperledger は Linux Foundation が 2015年12月に発足したプロジェクトで、様々なビジネス領域で実際に使えるエンタープライズ向けのブロックチェーン技術の標準化を目指しており、現在 180を超える企業(*2)が協力して分散型台帳フレームワークのオープンソース開発や実証実験、コミュニティの構築や教育によるエコシステムの拡大に取り組んでいます。

Hyperledger is an open source collaborative effort created to advance cross-industry blockchain technologies. It is a global collaboration, hosted by The Linux Foundation, including leaders in finance, banking, Internet of Things, supply chains, manufacturing and Technology.


About – Hyperledger

Hyperledger incubates and promotes a range of business blockchain technologies, including distributed ledger frameworks, smart contract engines, client libraries, graphical interfaces, utility libraries and sample applications.


Hyperledger Projects – Hyperledger


Hyperledger のフレームワークと言えば何よりもまず、IBM が初期の開発をリードし現在では大手IT企業が多数参加している「Hyperledger Fabric」がその代名詞として挙げられることが多いですが(*3)、他にも

といったプロダクトがオープンソースとしてプロジェクトにホストされており(*5)、特徴や採用している技術、ユースケースがそれぞれ異なります。


Hyperledger のフレームワーク全体に共通したゴールとしては、スループットやファイナリティなどの問題を解決し、エンタープライズ用途に耐えうるレベルのプロダクトを提供しようとしていることが挙げられます。またビジネスで利用するためには、クローズドで開発されたプロダクトよりもオープンソースで開発されているプロダクトの方が評価しやすく、情報の透明性もあり、コミュニティが充実しているプロダクトだと採用されやすいというケースもあります。この Hyperledger プロジェクトにより、分散型台帳やブロックチェーン技術が実ビジネス領域に広く浸透していくことが期待されています。



 

Hyperledger Sawtooth(ソウトゥース)とは

Hyperledger Sawtooth は、オープンソースの分散型台帳(DLT)であり、スマートコントラクトエンジン(Smart Contract Engine)です。米 Intel 社が開発していたものが、2016年5月に Hyperledger プロジェクトにオープンソースとして提供されました。


Hyperledger Fabric と同様に、モジュラー型アーキテクチャ(Modular Architecture)を念頭に設計されており、コンポーネントがそれぞれ部品化されていてプラガブル(置き換え可能)になっているのが特徴です。

面白いのがコンセンサスアルゴリズムさえもプラガブルになっている点で、今のところ、Sawtooth 独自の「PoET(Proof of Elapsed Time)」と開発・検証用の「Dev Mode」が用意されています。

PoET は、Enclave(trusted function *6)によって決められた待ち時間が一番短いノードがリーダーになる、という抽選アルゴリズムです。PoW のようにハッシュキャッシュに対する計算コストを掛ける必要がなく、Intel社が言うには数千台のノードが参加してもスケールするとのことです。ただし PoET は、Intel製 SGXチップ搭載ノードによる 「Trusted Execution Environment(TEE)」をベースにすることで安全にランダムなリーダーを選出する仕組みを取っているため、

独自のコンセンサスアルゴリズムPoETを持つが、これは本来intelが提供するハードウェアを利用して行われるため完全版ではなく、オープンソース版ではシミュレータが用意されている。


さまざまなブロックチェーン技術 - Qiita

といった制限もあるようです。


なお、公式ドキュメント によると、パブリックな Validator(ノード)ネットワークを構成することもできるが、チェーン内通貨などのインセンティブの設計が必要でそれは Sawtooth のスコープ範囲外とのこと。なので実質、コンソーシアム型かプライベート型のどちらかで利用されることが多いと思われます。



GitHub を見ると、現時点でソースコード全体の7割ほどが Python で書かれています(*7)。モデルに相当する「Transaction Family」やスマートコントラクトに相当する「Transaction Processor」を開発者が任意に実装することができ、SDK も用意されています。SDK は Python の他、C++, Go, Java, Javascript など複数の言語で開発ができるようにパッケージが個別に提供されています。




 

全体像

だらだらと解説をしてきましたが、文章だけでは全体像がよく分からないと思いますので、私の理解した範囲で Hyperledger Sawtooth の利用イメージの全体図を描いてみました。今回動かす「intkey」と呼ばれる “out of the box” なサンプルデモを Docker 上で動かす場合の構成図を示しています。公式ドキュメント の図をもう少し詳しくした感じのイメージです。


f:id:akiyoko:20171216193555p:plain



Hyperledger's Sawtooth Lake Bets on Modular Blockchains and Elapsed-Time Consensus - Cloud Foundry Live | Altoros」の図はかなり細かい部分まで書かれていてすごく良いのですが、説明が少なくてここから正確に理解するはなかなか難しいと思います。


登場人物

用語の定義は ここ に書かれています。

 

Transaction Family

モデルに相当する構造体です。State を変更するためのフィールドや Transaction Processor を呼び出す際のアクションなどを任意に定義できます。上の図には描いていませんが、Client で Transaction を作成する際に利用しています。

A transaction family is a set containing: a transaction payload format, a model for storing information in global state, and a procedure for validating a transaction and updating state based on the transaction payload.


参考:IntkeyMessageFactory クラス

 

Transaction

State を更新するための情報、ヘッダ、署名を含んだデータで、「intkey」デモでは、「キーに対応する数値を登録する」「登録済みのキーに対応する数値を増やす」「登録済みのキーに対応する数値を減らす」といった一つ一つの処理に対応するトランザクションを表します。

A transaction is a protobuf object containing a payload, header, and signature. The signature is generated by the transaction signer by signing the transaction header with the transaction signer’s private key.

 

Batch

Transaction を複数含んでおり、ある程度まとまった処理を表現できます。Transaction に依存関係がある場合などにうまく活用できそうです。Batch はシステムが扱う最小単位で、最終的に全ての変更が反映されるか全く反映されないかのいずれかになります。

a batch is the atomic unit of change in the system. If a batch has been applied, all transactions will have been applied in the order contained within the batch. If a batch has not been applied (maybe because one of the transactions is invalid), then none of the transactions will be applied.


https://sawtooth.hyperledger.org/docs/core/releases/latest/architecture/transactions_and_batches.html#why-batches

 
ということで、ブロックチェーン上のブロックとバッチ(Batch)とトランザクション(Transaction)の関係は以下の図のようになります。つまり、ブロックの中に複数のバッチが含まれ、バッチの中に複数のトランザクションが含まれることになります。

f:id:akiyoko:20171217234733p:plain:w400

 

State

ブロックチェーンとは別に管理されるグローバルな状態を表します。Ethereum で言うところの「world state」に相当します。

Radix Merkle Tree 形式で管理されており、Transaction 実行後のそれぞれの状態がネームスペース付きの70桁のアドレスを割り当てられて保管されています。なお、Radix アドレスの先頭6桁は Transaction Family 固有のネームスペースを表す領域になっています。 *8

 

Validator

Hyperledger Sawtooth の中心的な役割を担います。トランザクションのバッチを処理して、ブロックを作成するまでのサイクルを実行します。ビットコインのブロックチェーンで言うところの「フルノード」が近いかもしれません。

非常に紛らわしいのですが、下にも書かれている通り「Validator」がデータのチェックをおこなっているわけではなく、実際にはトランザクションやバッチのデータ検証は「Transaction Processor」などに移譲していることが多いようです(「intkey」でもそのような作りになっています)。

A validator is the component ultimately responsible for validating batches of transactions, combining them into blocks, maintaining consensus with the network, and coordinating communication between clients, other validators, and transaction processors. Much of the actual validation is delegated to other components, such as transaction processors and the active consensus module.

 

Transaction Executor

しかるべきタイミングで Transaction Processor と呼ばれるプログラム(Ethereum で言うところのスマートコントラクトか)にトランザクションのデータを渡す役割を担っています。

The Executor is responsible for the execution of transactions by sending them to transaction processors. The overall flow for each transaction is:

  • The Executor obtains the next transaction and initial context from the scheduler
  • The Executor obtains a new context for the transaction from the Context Manager by providing the initial context (contexts are chained together)
  • The Executor sends the transaction and a context reference to the transaction processor
  • The transaction processor updates the context’s state via context manager calls
  • The transaction processor notifies the Executor that the transaction is complete
  • The Executor updates the scheduler with the transaction’s result with the updated context


https://sawtooth.hyperledger.org/docs/core/releases/latest/architecture/scheduling.html

 

Transaction Processor

トランザクションを検証し、処理をおこなってグローバルな State を書き換えることができます。開発者が事前に任意のプログラムを書くことができます。

A transaction processor validates transactions and updates state based on the rules defined by a given transaction family.

いわゆるスマートコントラクトです。

An intkey transaction processor implemented as a smart contract

TransactionHandler は Transaction Processor の一つで、よりビジネスロジック(アプリケーション)寄りとのこと。

参考:IntkeyTransactionHandler


 

デモを動かしてみよう

さて、いよいよデモを動かすときが来ました。(ここまで長かった。。)

今回動かすのは、Sawtooth のサンプルで一番簡単な「intkey」というデモになります。クライアントから REST API を通して数字を登録したり増減させたりすることができるシステムで、ある程度まとまった処理がブロックとしてチェーンに次々に繋がっていくのが体験できます。Docker イメージの中にすでに組み込まれているので、Docker コンテナを起動するだけでデモを実行できる環境が整います。


 
以降、macOS の Docker 上で Hyperledger Sawtooth の「intkey」デモを動かしていきます。


ちなみに私のローカル環境は以下の通りです。

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G1114

$ docker --version
Docker version 17.09.1-ce, build 19e2cf6


 

0.Docker for Mac をインストール

こちらは事前に済ませておいてください。

ここは「5分」に加えちゃだめですよ。


 

1.Hyperledger の最新版 sawtooth-core をダウンロード

まず、Hyperledger の sawtooth-core の GitHub から、以下の手順で「sawtooth-core-1.0.0rc5.zip」をダウンロードします。なお現時点での最新版は「v1.0.0rc5」となっていました。

f:id:akiyoko:20171216234020p:plain
f:id:akiyoko:20171216234035p:plain


まだ 1分しか経っていませんよね?



 

2.コンテナを起動

zipファイルを解凍し、以下のコマンドを実行してコンテナを起動します。

$ docker-compose -f ~/Downloads/sawtooth-core-1.0.0rc5/docker/compose/sawtooth-default.yaml up

しばらくすると、各種コンテナが起動します。遅くても 2〜3分くらいで全て起動し終わるでしょうか。


「docker ps」コマンドを叩いて、コンテナのステータスを確認しましょう。

$ docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED              STATUS              PORTS                              NAMES
fbb42c0ae927        hyperledger/sawtooth-all:1.0                "bash -c 'sawtooth..."   About a minute ago   Up About a minute   4004/tcp, 8008/tcp                 sawtooth-shell-default
94c6768b9c5f        hyperledger/sawtooth-xo-tp-python:1.0       "xo-tp-python -vv ..."   About a minute ago   Up About a minute   4004/tcp                           sawtooth-xo-tp-python-default
e008347a256d        hyperledger/sawtooth-intkey-tp-python:1.0   "intkey-tp-python ..."   About a minute ago   Up About a minute   4004/tcp                           sawtooth-intkey-tp-python-default
7e194e70fda1        hyperledger/sawtooth-settings-tp:1.0        "settings-tp -vv -..."   About a minute ago   Up About a minute   4004/tcp                           sawtooth-settings-tp-default
f51e20d2ce48        hyperledger/sawtooth-rest-api:1.0           "sawtooth-rest-api..."   About a minute ago   Up About a minute   4004/tcp, 0.0.0.0:8008->8008/tcp   sawtooth-rest-api-default
b8e2627fe1cd        hyperledger/sawtooth-validator:1.0          "bash -c 'sawadm k..."   About a minute ago   Up About a minute   0.0.0.0:4004->4004/tcp             sawtooth-validator-default


起動に3分掛かったとして、今のところ計4分ですね。


 

3.クライアント上でコマンドを実行

次に、ターミナル上で

$ docker exec -it sawtooth-shell-default bash

と実行し、起動したクライアント(図の「Client」)のコンテナにログインします。



ハイ、準備は終了です。
4分30秒くらいでセッティングが完了したと思います。



以降は、sawtooth コマンドを利用して intkey の処理を実行していきます。なおその際、「Using Sawtooth with Docker — Sawtooth v0.8.13 documentation」を見ながら進めてもいいのですが、現時点でドキュメントが少し古くて(ドキュメントの対象バージョンが「v0.8.13」になっているため)、ポート番号が間違っている箇所があります。REST API の「8080」ポートは最新版では「8008」が正しいので、適宜「8008」に読み替えて進めてください。



 

genesis ブロックを確認
# sawtooth block list --url http://rest-api:8008
NUM  BLOCK_ID                                                                                                                          BATS  TXNS  SIGNER
0    d16b15f03ff35031f094f5dadf4211ee7bb41c4bb707f0e7d0e015b70b85b8164a326dec294ff02e2aefcf1aa6cdbe3be8eb70d5d63cf322a269feda12b78534  1     1     02850b3d81f14c7c1b9f2aee1274e2...

コンテナ起動直後にブロックを確認すると、genesis ブロックが 1つ作成されているのが確認できます。

ちなみに、以下のように実行すると、REST API が返す JSON を見ることができます。

# curl http://rest-api:8008/blocks


 

State を確認
# sawtooth state list --url http://rest-api:8008
ADDRESS                                                                 SIZE  DATA
000000a87cb5eafdcca6a8cde0fb0dec1400c5ab274474a6aa82c12840f169a04216b7  110   b'\nl\n&sawtooth.settings.vote.authorized_keys\x12B039f7586349ccf1490127db60acd6ac6c00cdebf5ea67ccc...
HEAD BLOCK: "d16b15f03ff35031f094f5dadf4211ee7bb41c4bb707f0e7d0e015b70b85b8164a326dec294ff02e2aefcf1aa6cdbe3be8eb70d5d63cf322a269feda12b78534"

初期状態のステータスを確認することができます。Radix Merkle Tree 形式で格納されています。

なお、「DATA」には dict オブジェクトを cbor でシリアライズした文字列が格納されていて、誰でも簡単に復元可能です。また「HEAD BLOCK」には、ブロックチェーンに書き込まれた最後のブロックの「BLOCK_ID」が表示されています。つまり、State にはブロックチェーンの最後のブロックが何であるかが保持されているということが分かります。


ちなみに、ターミナルの横幅の関係で「...」と切れてしまっているのを表示する場合は、「sawtooth state show」コマンドで詳細を見ることができます。

# sawtooth state show 000000a87cb5eafdcca6a8cde0fb0dec1400c5ab274474a6aa82c12840f169a04216b7 --url http://rest-api:8008
DATA: "b'\nl\n&sawtooth.settings.vote.authorized_keys\x12B039f7586349ccf1490127db60acd6ac6c00cdebf5ea67cccc6453a9f5b295c1777'"
HEAD: "d16b15f03ff35031f094f5dadf4211ee7bb41c4bb707f0e7d0e015b70b85b8164a326dec294ff02e2aefcf1aa6cdbe3be8eb70d5d63cf322a269feda12b78534"


 

バッチを作成
# intkey create_batch --key-count 3 --count 2
Writing to batches.intkey...

このコマンドは、複数のトランザクションを含むバッチをいくつか作成し、ローカルに「batches.intkey」というファイルとして書き出してくれます。この時点では、トランザクションやバッチはブロックチェーンには書き込まれません。ローカルファイルにデータを書き込むだけです。


このコマンドが具体的に何をやっているかと言うと、6桁のランダムな文字列を key_count 個分作成してそれぞれに対応するランダムなデフォルト値(9000〜100000)を設定し、作成したキーの値を 1〜10 のうちのランダムな値で足したり引いたりするトランザクションを作成しています。

前半部分では、ランダムな文字列とそのデフォルト値を新規作成する処理を 1トランザクションとし、key_count 個分のトランザクションをまとめて 1バッチとしています。後半部分では、値を増減させるトランザクションをランダム回数分繰り返したものを含んだバッチを、count 個数分作成しています。


例えば、key_count = 3, count = 2 の場合だと、

"transactions": [
    {"Verb": "set", "Name": "vJKChA", "Value": 9223},
    {"Verb": "set", "Name": "NcEktd", "Value": 9459},
    {"Verb": "set", "Name": "wVgqYd", "Value": 9011},
]

といったトランザクションを含むバッチを1個だけ新規作成し、次に、

"transactions": [
    {"Verb": "inc", "Name": "wVgqYd", "Value": 3},
    {"Verb": "dec", "Name": "vJKChA", "Value": 9},
    {"Verb": "inc", "Name": "NcEktd", "Value": 4},
]
"transactions": [
    {"Verb": "inc", "Name": "NcEktd", "Value": 2},
    {"Verb": "dec", "Name": "wVgqYd", "Value": 1},
    {"Verb": "inc", "Name": "NcEktd", "Value": 3},
    {"Verb": "dec", "Name": "vJKChA", "Value": 1},
    {"Verb": "inc", "Name": "wVgqYd", "Value": 6},
    {"Verb": "inc", "Name": "NcEktd", "Value": 4},
    {"Verb": "dec", "Name": "vJKChA", "Value": 1},
    {"Verb": "dec", "Name": "NcEktd", "Value": 9},
]

という値を更新するためのトランザクションをそれぞれランダム個含むバッチを2個作成することになります(分かりやすく模式化して書いたので実際のものとは多少異なります)。


 

バッチを Validator ネットワークに送信
# sawtooth batch submit -f batches.intkey --url http://rest-api:8008
batches: 3,  batch/sec: 44.84783422259765

先ほど作成したファイルを読み込んで、バッチを一斉にネットワークに送信します。

「batches: 3」とログが出ているので、バッチを3つ(新規作成1つ+更新2つ)送信したことが分かります。Validator ネットワーク側では 1〜3台のノードが個別にトランザクションを受け取って処理を実行することが予想されます。もちろん順序が逆にならないようにスケジューリングされて実行されるはずなので、ご安心を。


 

ブロックを確認
# sawtooth block list --url http://rest-api:8008
NUM  BLOCK_ID                                                                                                                          BATS  TXNS  SIGNER
2    2ba9acebbe53f32909c1b341ace92d7d6d467dfd8a7de4deeed7d719f4794eff01a4c258ce3798fa8742f4deba214e11c6a73255acdf4f48205c15c17d3bcbf6  2     8     02850b3d81f14c7c1b9f2aee1274e2...
1    a275a1f80ec4e89f38e5f06f598891e24997bd1d29c2e471682f4d82b6a36ecc070beb7b3b483598a23552fbe0dae7588a7efb031bcbde6b62acbf73946655d4  1     3     02850b3d81f14c7c1b9f2aee1274e2...
0    d16b15f03ff35031f094f5dadf4211ee7bb41c4bb707f0e7d0e015b70b85b8164a326dec294ff02e2aefcf1aa6cdbe3be8eb70d5d63cf322a269feda12b78534  1     1     02850b3d81f14c7c1b9f2aee1274e2...

「NUM」が「1」「2」のブロックが合計2つ増えています。クライアントからバッチを3個一斉に送信したのに、最終的には別々のブロックとしてチェーンに固定化されているのがミソと言えばミソでしょう。Sawtooth ではチェーン内部にタイマーがあり、一定時間ごとにブロックが承認されるようになっているようなのでこのようなことが起こり得るのです。

また、NUMが「1」のブロックの「BATS」が「1」、「TXNS」が「3」となっているのは、ブロックの中にバッチが1個、トランザクションが3個入っていることを示しています。同じように、NUMが「2」のブロックの「BATS」が「2」、「TXNS」が「8」となっているので、ブロックの中にバッチが2個、トランザクションが8個入っていることが推測されます。

実際に最後のブロックの中身を以下のコマンドで確認すると、「batches」直下に「(バッチの)header」が2つあるのでバッチが2個、1つ目のバッチの「transactions」直下に「(トランザクションの)header」が1つ、2つ目のバッチの「transactions」直下に「header」が7つあるので合計8個のトランザクションが含まれていることが確認できます。

# sawtooth block show 2ba9acebbe53f32909c1b341ace92d7d6d467dfd8a7de4deeed7d719f4794eff01a4c258ce3798fa8742f4deba214e11c6a73255acdf4f48205c15c17d3bcbf6 --url http://rest-api:8008
batches:
- header:
    signer_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
    transaction_ids:
    - d9069e5d4d254faf9d42dcf66ca468edfef1a0bc7370465e90c48a9b46061bf63bdf92a76fbaa846e6ca802e0f5003ed02e4561e3e516f783177b2be1c82a450
  header_signature: 69e787f67dbdfac18799e799d344c4fe3f70f99de58993241a249f63789ad2c549560fc874b3bb1c78d52d33f7882b24290240bc1f9142b5e9db1b49c52002f7
  trace: false
  transactions:
  - header:
      batcher_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
      dependencies:
      - 18b1b2e26d6bcf605c601d118fe27a84108c8abf1110c15a8fb9e84b283681176758235e622d963f930f26876ffaff72637492fb296da23f4ff559d226c372ab
      family_name: intkey
      family_version: '1.0'
      inputs:
      - 1cf1265008cef7e8135dc4a2f0a8d94f75fa526a1f7d383cc82fd5e3c384744de2c1c9
      nonce: 0x1.68d516ec2ccfdp+30
      outputs:
      - 1cf1265008cef7e8135dc4a2f0a8d94f75fa526a1f7d383cc82fd5e3c384744de2c1c9
      payload_sha512: f1c7d99b8c5fea748e2ed97e3c61dcfb1edd8a32415945a0a1c80e39b71c9a7e1128f852b315c0478d62a6b9026e1c5247f9d60d63c062b9d1a102df4381d4bc
      signer_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
    header_signature: d9069e5d4d254faf9d42dcf66ca468edfef1a0bc7370465e90c48a9b46061bf63bdf92a76fbaa846e6ca802e0f5003ed02e4561e3e516f783177b2be1c82a450
    payload: o2ROYW1lZnp3bVNCSWVWYWx1ZQJkVmVyYmNpbmM=
- header:
    signer_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
    transaction_ids:
    - ae4c9d201f108f2e1f7f89e00032c6176d518415dcfc0fb4584f32a3ddaae8e8644c3028357ae34d08eebf95a9a0d65e31402a2c0e6cf4f67d35d3b3ec5c28d4
    - 87f681c683075bbd9e85c0c754ea797f8d407bfb6d9e3b0d669bec068ea3e1d7752b2b5136718c87dfb95ec3cfe4e810ba591d6b93dd2e69f202f0fd0a58c210
    - 582073cb877d06086500303ad8e5736d7aad7d7575e41f42b1ba4324e52bfd7e457effbc151842d04208a56a90a4b86a0d48167d365a1e46e3845823488460ed
    - b119f313f8cd778d06b311dcc613d6e4e12db8822f7e76bdbe8adfb234072cdc3d449e04d0711cf22bd34179d5677b9d83ee7604b62c5d43646118d2153be4b3
    - 47442f8dd34c17cc1ac1dc38f043fcd45e87d1a7a584a15c614b290abdaaea2771f968c156776107582dc39bc9a2f0c5f242348bf790a00c14e1c207a3bd4992
    - f54356ec854c54fb2abe0f6fd767d1207b461ba82f563c296f611c3b4fc1962b615e124d1649460e5ddca64d28f2f7477302a145189c44a664b8fd61d0e605c8
    - 07b1eb851b952778c928d380d1ea6121949f64cbedb16f41e1d9334000815b69207e4d51373c2a77b0dcd609c295577c10b17a00c765bfad565fda2fc9bebc68
  header_signature: 9a6e057f190e10d7a5d52a0892fc724f58106cc78d9db32cf7da1aedd93f0c9e170c5db853899bbb6b4f1cd1838ab5145d5e568ccde6b777119b5c29305b3083
  trace: false
  transactions:
  - header:
      batcher_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
      dependencies:
      - 67a02d58c36134362b63a2043fb95e0f4f1830293227fc1a859d4fd979d9679e3c2d450a3279b582a02248d66514334af70d9198cc05049740d1bdac9daac32d
      family_name: intkey
      family_version: '1.0'
      inputs:
      - 1cf126c0efc8717958cef02cc3131b80479462b9c90dc6aa0fe7e09229504bf4a62d27
      nonce: 0x1.68d516ec2d0c1p+30
      outputs:
      - 1cf126c0efc8717958cef02cc3131b80479462b9c90dc6aa0fe7e09229504bf4a62d27
      payload_sha512: b339df5cfa78060d82790be2b9f7d0db8064fb89a3c42ab8f3c1246bc3247bd9d86c4860324584fd8ef58bd948997bb417f0a093fb6355ccc776b346d51e9bc3
      signer_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
    header_signature: ae4c9d201f108f2e1f7f89e00032c6176d518415dcfc0fb4584f32a3ddaae8e8644c3028357ae34d08eebf95a9a0d65e31402a2c0e6cf4f67d35d3b3ec5c28d4
    payload: o2ROYW1lZm54QmtodWVWYWx1ZQZkVmVyYmNkZWM=
  - header:
      batcher_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
      dependencies:
      - 67a02d58c36134362b63a2043fb95e0f4f1830293227fc1a859d4fd979d9679e3c2d450a3279b582a02248d66514334af70d9198cc05049740d1bdac9daac32d
      family_name: intkey
      family_version: '1.0'
      inputs:
      - 1cf126c0efc8717958cef02cc3131b80479462b9c90dc6aa0fe7e09229504bf4a62d27
      nonce: 0x1.68d516ec2d2d3p+30
      outputs:
      - 1cf126c0efc8717958cef02cc3131b80479462b9c90dc6aa0fe7e09229504bf4a62d27
      payload_sha512: 16bb60a1f4f07335a1aa2417e758d41945ea64cc6743dce71871a291ecbd5b25964272207c05ca03be8eb6c4a9b914d15bebf0e8e41769dfeb3564926f37f142
      signer_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
    header_signature: 87f681c683075bbd9e85c0c754ea797f8d407bfb6d9e3b0d669bec068ea3e1d7752b2b5136718c87dfb95ec3cfe4e810ba591d6b93dd2e69f202f0fd0a58c210
    payload: o2ROYW1lZm54QmtodWVWYWx1ZQlkVmVyYmNpbmM=
  - header:
      batcher_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
      dependencies:
      - 67a02d58c36134362b63a2043fb95e0f4f1830293227fc1a859d4fd979d9679e3c2d450a3279b582a02248d66514334af70d9198cc05049740d1bdac9daac32d
      family_name: intkey
      family_version: '1.0'
      inputs:
      - 1cf126c0efc8717958cef02cc3131b80479462b9c90dc6aa0fe7e09229504bf4a62d27
      nonce: 0x1.68d516ec2d4ddp+30
      outputs:
      - 1cf126c0efc8717958cef02cc3131b80479462b9c90dc6aa0fe7e09229504bf4a62d27
      payload_sha512: c8056631e8a3096891b7b6c2ab1e4f7275f697ce806762dcad037bcf25502a617b2d6fcd6b3d5dca71fb9427f2ab46d99261b0eee939d88c07483fdcb99673bc
      signer_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
    header_signature: 582073cb877d06086500303ad8e5736d7aad7d7575e41f42b1ba4324e52bfd7e457effbc151842d04208a56a90a4b86a0d48167d365a1e46e3845823488460ed
    payload: o2ROYW1lZm54QmtodWVWYWx1ZQJkVmVyYmNkZWM=
  - header:
      batcher_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
      dependencies:
      - 67a02d58c36134362b63a2043fb95e0f4f1830293227fc1a859d4fd979d9679e3c2d450a3279b582a02248d66514334af70d9198cc05049740d1bdac9daac32d
      family_name: intkey
      family_version: '1.0'
      inputs:
      - 1cf126c0efc8717958cef02cc3131b80479462b9c90dc6aa0fe7e09229504bf4a62d27
      nonce: 0x1.68d516ec2d6f2p+30
      outputs:
      - 1cf126c0efc8717958cef02cc3131b80479462b9c90dc6aa0fe7e09229504bf4a62d27
      payload_sha512: 6c07331ddb97af0db05aa9fb64afe7ac52a7e0229992ca487a812e296ff9adedebaba2fcd4e0c7cec71d5505df942e84b6031baeb025e2841545092c1a154985
      signer_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
    header_signature: b119f313f8cd778d06b311dcc613d6e4e12db8822f7e76bdbe8adfb234072cdc3d449e04d0711cf22bd34179d5677b9d83ee7604b62c5d43646118d2153be4b3
    payload: o2ROYW1lZm54QmtodWVWYWx1ZQNkVmVyYmNkZWM=
  - header:
      batcher_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
      dependencies:
      - 9c6e0588503d407a662a416d2d551d1e65998ddfefd5d377f3175a2a24a0cee47ee0692a033a0f52d9155ba036ff57b73a26faf4ad3f6a60e4a27068ddfe4323
      family_name: intkey
      family_version: '1.0'
      inputs:
      - 1cf12656d2b508c206f56463d26e9045aad7d42527de7899f4acfc93d1e9f7b9c8c2c8
      nonce: 0x1.68d516ec2d8f3p+30
      outputs:
      - 1cf12656d2b508c206f56463d26e9045aad7d42527de7899f4acfc93d1e9f7b9c8c2c8
      payload_sha512: d27adf0758adac89fde1bd1ec866a86ea63073ff811323b3ddec639a625c87af4edf45ed94d6fbef2e4a65bb98055b0a2e2eb1894e1f169ff10059b7dc1bd9de
      signer_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
    header_signature: 47442f8dd34c17cc1ac1dc38f043fcd45e87d1a7a584a15c614b290abdaaea2771f968c156776107582dc39bc9a2f0c5f242348bf790a00c14e1c207a3bd4992
    payload: o2ROYW1lZndWZ3FZZGVWYWx1ZQlkVmVyYmNkZWM=
  - header:
      batcher_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
      dependencies:
      - 67a02d58c36134362b63a2043fb95e0f4f1830293227fc1a859d4fd979d9679e3c2d450a3279b582a02248d66514334af70d9198cc05049740d1bdac9daac32d
      family_name: intkey
      family_version: '1.0'
      inputs:
      - 1cf126c0efc8717958cef02cc3131b80479462b9c90dc6aa0fe7e09229504bf4a62d27
      nonce: 0x1.68d516ec2db21p+30
      outputs:
      - 1cf126c0efc8717958cef02cc3131b80479462b9c90dc6aa0fe7e09229504bf4a62d27
      payload_sha512: bd4e037e91ebd277a2e03821aa01fc821be97d27aeb69edd008d6453fde1f846a6fe564dccafec9061bd07f903f50ddc95bdfbebbb74e13251fb9539c13f673f
      signer_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
    header_signature: f54356ec854c54fb2abe0f6fd767d1207b461ba82f563c296f611c3b4fc1962b615e124d1649460e5ddca64d28f2f7477302a145189c44a664b8fd61d0e605c8
    payload: o2ROYW1lZm54QmtodWVWYWx1ZQVkVmVyYmNpbmM=
  - header:
      batcher_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
      dependencies:
      - 9c6e0588503d407a662a416d2d551d1e65998ddfefd5d377f3175a2a24a0cee47ee0692a033a0f52d9155ba036ff57b73a26faf4ad3f6a60e4a27068ddfe4323
      family_name: intkey
      family_version: '1.0'
      inputs:
      - 1cf12656d2b508c206f56463d26e9045aad7d42527de7899f4acfc93d1e9f7b9c8c2c8
      nonce: 0x1.68d516ec2de3ap+30
      outputs:
      - 1cf12656d2b508c206f56463d26e9045aad7d42527de7899f4acfc93d1e9f7b9c8c2c8
      payload_sha512: 08e0a3f2ff71ed2a5ba635cd528e7a7606135cd116d16bc471f86889a1ad51bc378ac9381c77a965c15935e505680a05007badaf561ab8773fc533df791673ec
      signer_public_key: 02991e34411f9282a0a057d4adf0b00f44605d0da25bf8141e1e7b2875486083ac
    header_signature: 07b1eb851b952778c928d380d1ea6121949f64cbedb16f41e1d9334000815b69207e4d51373c2a77b0dcd609c295577c10b17a00c765bfad565fda2fc9bebc68
    payload: o2ROYW1lZndWZ3FZZGVWYWx1ZQRkVmVyYmNpbmM=
header:
  batch_ids:
  - 69e787f67dbdfac18799e799d344c4fe3f70f99de58993241a249f63789ad2c549560fc874b3bb1c78d52d33f7882b24290240bc1f9142b5e9db1b49c52002f7
  - 9a6e057f190e10d7a5d52a0892fc724f58106cc78d9db32cf7da1aedd93f0c9e170c5db853899bbb6b4f1cd1838ab5145d5e568ccde6b777119b5c29305b3083
  block_num: '2'
  consensus: RGV2bW9kZQ==
  previous_block_id: a275a1f80ec4e89f38e5f06f598891e24997bd1d29c2e471682f4d82b6a36ecc070beb7b3b483598a23552fbe0dae7588a7efb031bcbde6b62acbf73946655d4
  signer_public_key: 02850b3d81f14c7c1b9f2aee1274e2862d0e707dbe57136602ec5437dab774b431
  state_root_hash: 3370c09db54b81f7ddf5fcd4b2d38f18c8f0cd8dbebf90a8eb30b23eb9c92325
header_signature: 2ba9acebbe53f32909c1b341ace92d7d6d467dfd8a7de4deeed7d719f4794eff01a4c258ce3798fa8742f4deba214e11c6a73255acdf4f48205c15c17d3bcbf6

なお、「inputs」や「outputs」は State のアドレスを表しており、それぞれのトランザクションの処理結果の格納先を指し示しています。



 

最終的な State を確認

最後に State の値がどうなったかを確認してみます。

# sawtooth state list --url http://rest-api:8008
ADDRESS                                                                 SIZE  DATA
000000a87cb5eafdcca6a8cde0fb0dec1400c5ab274474a6aa82c12840f169a04216b7  110   b'\nl\n&sawtooth.settings.vote.authorized_keys\x12B039f7586349ccf1490127db60acd6ac6c00cdebf5ea67ccc...
1cf1265008cef7e8135dc4a2f0a8d94f75fa526a1f7d383cc82fd5e3c384744de2c1c9  11    b'\xa1fzwmSBI\x19\xe9\xe6'                                                                         ...
1cf12656d2b508c206f56463d26e9045aad7d42527de7899f4acfc93d1e9f7b9c8c2c8  11    b"\xa1fwVgqYd\x191'"                                                                               ...
1cf126c0efc8717958cef02cc3131b80479462b9c90dc6aa0fe7e09229504bf4a62d27  13    b'\xa1fnxBkhu\x1a\x00\x01I\xd9'                                                                    ...
HEAD BLOCK: "2ba9acebbe53f32909c1b341ace92d7d6d467dfd8a7de4deeed7d719f4794eff01a4c258ce3798fa8742f4deba214e11c6a73255acdf4f48205c15c17d3bcbf6"

アドレスが「1cf1265008ce...」「1cf12656d2b5...」「1cf126c0efc8...」のレコードが増えています(先頭6桁が同じになっている理由はお分かりですよね)。最後に処理されたトランザクションの「outputs」の値が「1cf12656d2b508c206f56463d26e9045aad7d42527de7899f4acfc93d1e9f7b9c8c2c8」で、それに合致するアドレスの「DATA」が、最新の Status の値になっているはずです。


cbor でシリアライズされた値をデコードしてみます。

>>> import cbor
>>> cbor.loads(b"\xa1fwVgqYd\x191'")
{'wVgqYd': 12583}

確認することができました。
結構増えてますね。



 

まとめ

5分ほどでデモを動かせるところまで簡単にセットアップができてしまう、お手軽なブロックチェーン「Hyperledger Sawtooth」を紹介しました。


11月末に参加した勉強会「「bitFlyer Drink Meetup! #9」に参加してきました - akiyoko blog」でこのプロダクトを知り、プロダクト自体が Python で書かれていて、Python でスマートコントラクトを自由に書けるというところにグッと来たのが、この記事を書こうと思ったきっかけです。

軽い気持ちで「ブロックチェーン」の Advent Calendar に登録してしまった今日までの二週間ほどで急ごしらえで勉強した内容を書き殴ったので、間違っているところがいろいろあるかと思います。もし間違いがありましたら、温かい目で見ると同時に優しく教えていただけるとありがたいです。



明日は、m0t0k1ch1 さんの「ブロックチェーン Advent Calendar 2017 - Qiita」 18日目の記事です。
よろしくお願いします。


 

おまけ

最近読んだ本ですが、金融分野において、今回紹介した Hyperledger Sawtooth の兄貴分である「Hyperledger Fabric」や R3コンソーシアムが開発した「Corda」、Ripple 社が推進する「ILP」などのコンソーシアム型あるいはプライベート型の分散型台帳フレームワークを利用した大規模な実証実験が進められており、そう遠くない将来にブロックチェーン技術が金融業界に革命を起こす、という衝撃の内容です。

ビットコインじゃないブロックチェーンについて知りたい方は是非。金融業界の方で「これから何が起こるのか知りたい!」という方はマストだと思います。

*1:Intel のチップだから「ノコギリ波」なのかな。。

*2:https://hyperledger.org/members

*3:有名すぎるため、単に「Hyperledger」と書かれているものが実際には「Hyperledger Fabric」を差していることが多いので注意が必要です。Hyperledger あるある

*4:https://www.boj.or.jp/announcements/release_2017/data/rel170227a7.pdf

*5:Hyperledger Projects – Hyperledger

*6:このあたりが何を意味しているかがよく分かってません。。

*7:ちなみに、Fabric は Go、Iroha は C++ で書かれているそうです。 https://www.boj.or.jp/announcements/release_2017/data/rel170227a7.pdf

*8:https://sawtooth.hyperledger.org/docs/core/releases/latest/architecture/global_state.html?highlight=merkle#radix-addresses