FC2ブログ

Geth環境のじゅんび

どうも、ぺろりんです。

前回に引き続き、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門」でのお勉強のつづきをやっていきます。

今回は、テスト環境の構築です。

教科書にしている上記の本がUbuntu(Linux)だったので、普段Windowsな私の場合、VMwareの仮想環境で仮想マシンを作成してゲストOSとしてUbuntuを入れることにしました。
というわけで、手順としては
 VMware Player導入→仮想マシン作成&Ubuntuインストール→Gethインストール
と進みます。




VMware Player導入

VMware Playerのダウンロードページからダウンロードしてインストール…なんですが、以前入れたときに手順残してなかったので、ここは参考サイトを挙げるにとどめさせていただきます。。
いくつか挙げておきますので、参考にされる方はご自分がわかりやすいと思うのをご参照ください。

(参考)
VMware Workstation Player ダウンロードとインストール方法(ネットワークエンジニアとして)
仮想マシン構築ソフト「VMware Player」のインストール方法(寝ログ)
【ゼロからわかる】VMwareのインストール方法と使い方(エンジニアの入り口)


仮想マシン作成&Ubuntuインストール

まずはUbuntuをダウンロードしておきましょう。


[日本語 Remix イメージのダウンロード]かisoファイルを落とします。


導入しておいたVMware Playerを立ち上げて、[新規仮想マシンの作成]。


[インストーラ ディスク イメージ ファイル]で先ほど落としてきたUbuntuのisoファイルを[参照]させます。


[フルネーム]とかユーザー名やパスワードなど適当に設定しておきます。


テスト環境作りたいだけなので、基本的にデフォルトで進行。



ここは一応、[ハードウェアをカスタマイズ]しておきます。


これの設定は、「ブロックチェーン 仕組みと理論 サンプルで学ぶFinTechのコア技術」でEthereumの章に記載されているスペックを参考にしています。たぶんこんなもんで大丈夫でしょう。。


こーいうのはとりあえず気にせず[OK]にしときます。


インストールできたらこんな感じになるので、先ほど設定したパスワードを入力してログインします。



なんか出てきても気にしない。[キャンセル]でいきます。


デフォルトだと画面ちっちゃいので、これを解消しましょう。

左にあるギアを開き、[ディスプレイ]を選択。



解像度を大きくします。こんなもんかな?



で、こんな感じになりました。


次に、root(Linuxの管理者ユーザー)の設定を一応しておきましょう。
普通のユーザーでGethをインストールしようとしたらうまくいかなかったので、本の通りすすんでみてうまいかない方がいたら参考にしてみてください。

左上のアイコンを選んで「te」くらいを入力すると出てくる端末(terminal)を選びます。これがWindowsのコマンドプロンプトに対応するやつで、コマンド入れるときは毎回これを使います。



端末を開くとこんな画面になります。(上の文はあまり気にしないでください)


「sudo passwd root」と入力してやると、こんな感じで今入っているユーザーのパスワードを入力させられ、そのあとにrootユーザーのパスワードの変更ができます。忘れないようにしましょう。


終わったら、「su -」(「-」はオプションなのでなくても良い)と打ってパスワードを入力するとrootユーザーとしてログインできることを確認します。「$」から「#」になったらOKです。


これで仮想マシンまでの準備が終わりました。


Gethインストール

さてここまではOSのおはなしでしたが、ここからEthereumの環境づくりをしましょう。

ここからは基本、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門」に忠実にすすみたい…!

私はGitとかLinuxは慣れてないので、環境づくりはひとまず「おまじない」と思って内容はあまり気にせずすすみます。
あとになって戻れたら戻ります。さしあたりスマートコントラクトのお勉強がしたいので。

本のとおり、以下のコマンドで必要なものをインストールします。
root@ubuntu:~# sudo apt-get install -y build-essential libgmp3-dev golang git tree


参考までに、コマンドたたいたらこんな感じになりました。
.../tree_1.7.0-3_amd64.deb を展開する準備をしています ...
tree (1.7.0-3) を展開しています...
以前に未選択のパッケージ golang-1.6-race-detector-runtime を選択しています。
.../golang-1.6-race-detector-runtime_0.0+svn252922-0ubuntu1_amd64.deb を展開する準備をしています ...
golang-1.6-race-detector-runtime (0.0+svn252922-0ubuntu1) を展開しています...
以前に未選択のパッケージ golang-race-detector-runtime を選択しています。
.../golang-race-detector-runtime_2%3a1.6-1ubuntu4_amd64.deb を展開する準備をしています ...
golang-race-detector-runtime (2:1.6-1ubuntu4) を展開しています...
man-db (2.7.5-1) のトリガを処理しています ...
libc-bin (2.23-0ubuntu3) のトリガを処理しています ...
liberror-perl (0.17-1.2) を設定しています ...
git-man (1:2.7.4-0ubuntu1.3) を設定しています ...
git (1:2.7.4-0ubuntu1.3) を設定しています ...
golang-1.6-src (1.6.2-0ubuntu5~16.04.4) を設定しています ...
golang-1.6-go (1.6.2-0ubuntu5~16.04.4) を設定しています ...
golang-1.6-doc (1.6.2-0ubuntu5~16.04.4) を設定しています ...
golang-1.6 (1.6.2-0ubuntu5~16.04.4) を設定しています ...
golang-src (2:1.6-1ubuntu4) を設定しています ...
golang-go (2:1.6-1ubuntu4) を設定しています ...
golang-doc (2:1.6-1ubuntu4) を設定しています ...
golang (2:1.6-1ubuntu4) を設定しています ...
libgmpxx4ldbl:amd64 (2:6.1.0+dfsg-2) を設定しています ...
libgmp-dev:amd64 (2:6.1.0+dfsg-2) を設定しています ...
libgmp3-dev (2:6.1.0+dfsg-2) を設定しています ...
tree (1.7.0-3) を設定しています ...
golang-1.6-race-detector-runtime (0.0+svn252922-0ubuntu1) を設定しています ...
golang-race-detector-runtime (2:1.6-1ubuntu4) を設定しています ...
libc-bin (2.23-0ubuntu3) のトリガを処理しています ...


次はソースをクローンだそうです。
root@ubuntu:~# cd
root@ubuntu:~# git clone https://github.com/ethereum/go-ethereum.git


参考までに。
Cloning into 'go-ethereum'...
remote: Counting objects: 68949, done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 68949 (delta 9), reused 14 (delta 5), pack-reused 68913
Receiving objects: 100% (68949/68949), 95.09 MiB | 275.00 KiB/s, done.
Resolving deltas: 100% (45835/45835), done.
Checking connectivity... done.


バージョンの切り替え。
root@ubuntu:~# cd go-ethereum/
root@ubuntu:~/go-ethereum# git checkout refs/tags/v1.5.5


参考。
Note: checking out 'refs/tags/v1.5.5'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b

HEAD is now at ff07d54... Merge pull request #3440 from karalabe/release-1.5.5


ビルド。
root@ubuntu:~/go-ethereum# make geth


参考。
build/env.sh go run build/ci.go install ./cmd/geth
>>> /usr/lib/go-1.6/bin/go install -ldflags -X main.gitCommit=ff07d54843ea7ed9997c420d216b4c007f9c80c3 -v ./cmd/geth
github.com/ethereum/go-ethereum/common/hexutil
github.com/ethereum/go-ethereum/common
github.com/ethereum/go-ethereum/crypto/randentropy
github.com/ethereum/go-ethereum/crypto/secp256k1
github.com/ethereum/go-ethereum/crypto/ecies
github.com/ethereum/go-ethereum/crypto/sha3
github.com/ethereum/go-ethereum/rlp
github.com/ethereum/go-ethereum/vendor/golang.org/x/crypto/ripemd160
github.com/ethereum/go-ethereum/crypto
github.com/ethereum/go-ethereum/logger
github.com/ethereum/go-ethereum/logger/glog
github.com/ethereum/go-ethereum/common/math
github.com/ethereum/go-ethereum/vendor/github.com/huin/goupnp/httpu
github.com/ethereum/go-ethereum/vendor/github.com/huin/goupnp/scpd
github.com/ethereum/go-ethereum/vendor/github.com/huin/goupnp/soap
github.com/ethereum/go-ethereum/vendor/github.com/huin/goupnp/ssdp
github.com/ethereum/go-ethereum/vendor/golang.org/x/net/html/atom
github.com/ethereum/go-ethereum/vendor/golang.org/x/net/html
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/encoding/internal/identifier
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/transform
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/encoding
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/encoding/internal
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/encoding/charmap
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/encoding/japanese
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/encoding/korean
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/encoding/simplifiedchinese
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/encoding/traditionalchinese
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/internal/utf8internal
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/runes
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/encoding/unicode
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/internal/tag
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/language
github.com/ethereum/go-ethereum/vendor/golang.org/x/text/encoding/htmlindex
github.com/ethereum/go-ethereum/vendor/golang.org/x/net/html/charset
github.com/ethereum/go-ethereum/vendor/github.com/huin/goupnp
github.com/ethereum/go-ethereum/vendor/github.com/huin/goupnp/dcps/internetgateway1
github.com/ethereum/go-ethereum/vendor/github.com/huin/goupnp/dcps/internetgateway2
github.com/ethereum/go-ethereum/vendor/github.com/jackpal/go-nat-pmp
github.com/ethereum/go-ethereum/p2p/nat
github.com/ethereum/go-ethereum/p2p/netutil
github.com/ethereum/go-ethereum/vendor/github.com/syndtr/goleveldb/leveldb/util
github.com/ethereum/go-ethereum/vendor/github.com/syndtr/goleveldb/leveldb/cache
github.com/ethereum/go-ethereum/vendor/github.com/syndtr/goleveldb/leveldb/comparer
github.com/ethereum/go-ethereum/vendor/github.com/syndtr/goleveldb/leveldb/storage
github.com/ethereum/go-ethereum/vendor/github.com/syndtr/goleveldb/leveldb/errors
github.com/ethereum/go-ethereum/vendor/github.com/syndtr/goleveldb/leveldb/filter
github.com/ethereum/go-ethereum/vendor/github.com/syndtr/goleveldb/leveldb/iterator
github.com/ethereum/go-ethereum/vendor/github.com/syndtr/goleveldb/leveldb/journal
github.com/ethereum/go-ethereum/vendor/github.com/syndtr/goleveldb/leveldb/memdb
github.com/ethereum/go-ethereum/vendor/github.com/syndtr/goleveldb/leveldb/opt
github.com/ethereum/go-ethereum/vendor/github.com/golang/snappy
github.com/ethereum/go-ethereum/vendor/github.com/syndtr/goleveldb/leveldb/table
github.com/ethereum/go-ethereum/vendor/github.com/syndtr/goleveldb/leveldb
github.com/ethereum/go-ethereum/p2p/discover
github.com/ethereum/go-ethereum/vendor/github.com/aristanetworks/goarista/monotime
github.com/ethereum/go-ethereum/common/mclock
github.com/ethereum/go-ethereum/p2p/discv5
github.com/ethereum/go-ethereum/params
github.com/ethereum/go-ethereum/vendor/github.com/hashicorp/golang-lru/simplelru
github.com/ethereum/go-ethereum/vendor/github.com/hashicorp/golang-lru
github.com/ethereum/go-ethereum/core/vm
github.com/ethereum/go-ethereum/vendor/github.com/rcrowley/go-metrics
github.com/ethereum/go-ethereum/vendor/github.com/rcrowley/go-metrics/exp
github.com/ethereum/go-ethereum/metrics
github.com/ethereum/go-ethereum/ethdb
github.com/ethereum/go-ethereum/vendor/gopkg.in/karalabe/cookiejar.v2/collections/prque
github.com/ethereum/go-ethereum/trie
github.com/ethereum/go-ethereum/core/types
github.com/ethereum/go-ethereum/pow
github.com/ethereum/go-ethereum/vendor/github.com/ethereum/ethash
github.com/ethereum/go-ethereum/vendor/github.com/pborman/uuid
github.com/ethereum/go-ethereum/vendor/github.com/rjeczalik/notify
github.com/ethereum/go-ethereum/vendor/golang.org/x/crypto/pbkdf2
github.com/ethereum/go-ethereum/vendor/golang.org/x/crypto/scrypt
github.com/ethereum/go-ethereum/accounts
github.com/ethereum/go-ethereum/core/state
github.com/ethereum/go-ethereum/event
github.com/ethereum/go-ethereum/vendor/gopkg.in/fatih/set.v0
github.com/ethereum/go-ethereum/core
golang.org/x/net/context
github.com/ethereum/go-ethereum
github.com/ethereum/go-ethereum/vendor/github.com/rs/xhandler
github.com/ethereum/go-ethereum/vendor/github.com/rs/cors
github.com/ethereum/go-ethereum/vendor/golang.org/x/net/websocket
github.com/ethereum/go-ethereum/rpc
github.com/ethereum/go-ethereum/eth/downloader
github.com/ethereum/go-ethereum/eth/fetcher
github.com/ethereum/go-ethereum/eth/filters
github.com/ethereum/go-ethereum/common/compiler
github.com/ethereum/go-ethereum/p2p
github.com/ethereum/go-ethereum/vendor/gopkg.in/sourcemap.v1/base64vlq
github.com/ethereum/go-ethereum/vendor/gopkg.in/sourcemap.v1
github.com/ethereum/go-ethereum/vendor/github.com/robertkrimen/otto/file
github.com/ethereum/go-ethereum/vendor/github.com/robertkrimen/otto/token
github.com/ethereum/go-ethereum/vendor/github.com/robertkrimen/otto/ast
github.com/ethereum/go-ethereum/vendor/github.com/robertkrimen/otto/dbg
github.com/ethereum/go-ethereum/vendor/github.com/robertkrimen/otto/parser
github.com/ethereum/go-ethereum/vendor/github.com/robertkrimen/otto/registry
github.com/ethereum/go-ethereum/vendor/github.com/robertkrimen/otto
github.com/ethereum/go-ethereum/internal/ethapi
github.com/ethereum/go-ethereum/eth/gasprice
github.com/ethereum/go-ethereum/miner
github.com/ethereum/go-ethereum/vendor/gopkg.in/urfave/cli.v1
github.com/ethereum/go-ethereum/internal/debug
github.com/ethereum/go-ethereum/node
github.com/ethereum/go-ethereum/eth
github.com/ethereum/go-ethereum/les/flowcontrol
github.com/ethereum/go-ethereum/light
github.com/ethereum/go-ethereum/les
github.com/ethereum/go-ethereum/ethstats
github.com/ethereum/go-ethereum/event/filter
github.com/ethereum/go-ethereum/whisper/whisperv2
github.com/ethereum/go-ethereum/cmd/utils
github.com/ethereum/go-ethereum/vendor/github.com/mattn/go-colorable
github.com/ethereum/go-ethereum/vendor/github.com/mattn/go-isatty
github.com/ethereum/go-ethereum/vendor/github.com/fatih/color
github.com/ethereum/go-ethereum/internal/jsre
github.com/ethereum/go-ethereum/internal/web3ext
github.com/ethereum/go-ethereum/vendor/github.com/peterh/liner
github.com/ethereum/go-ethereum/console
github.com/ethereum/go-ethereum/accounts/abi
github.com/ethereum/go-ethereum/vendor/golang.org/x/tools/go/ast/astutil
github.com/ethereum/go-ethereum/vendor/golang.org/x/tools/imports
github.com/ethereum/go-ethereum/accounts/abi/bind
github.com/ethereum/go-ethereum/contracts/release
github.com/ethereum/go-ethereum/vendor/github.com/mattn/go-runewidth
github.com/ethereum/go-ethereum/vendor/github.com/mitchellh/go-wordwrap
github.com/ethereum/go-ethereum/vendor/github.com/nsf/termbox-go
github.com/ethereum/go-ethereum/vendor/github.com/gizak/termui
github.com/ethereum/go-ethereum/cmd/geth
Done building.
Run "build/bin/geth" to launch geth.


バージョンは問題なさそうです。
root@ubuntu:~/go-ethereum# ./build/bin/geth version
Geth
Version: 1.5.5-stable
Git Commit: ff07d54843ea7ed9997c420d216b4c007f9c80c3
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.6.2
OS: linux
GOPATH=
GOROOT=/usr/lib/go-1.6


gethを/usr/local/binにコピー。
root@ubuntu:~/go-ethereum# sudo cp build/bin/geth /usr/local/bin/


一応コピーできたか確認。
root@ubuntu:~/go-ethereum# ls /usr/local/bin/
geth


これはPathの確認だそうです。
root@ubuntu:~/go-ethereum# which geth
/usr/local/bin/get


これでGethのインストールが終わったみたいです。(まだあんまわかってない)


まとめ

今回は、勉強環境を作りました。
VMwareで仮想マシンを作成してUbuntuをインストールし、そこにGethをインストールしました。

次回はテストネットワークでGethの起動です。


※ちなみに、このページのコード部分はSyntaxhighlighter(v3.0.83)を使っております。…ハイライトがうまくいかねぇ。。
導入はここここの手順を参考にさせていただきました。
Git慣れてないので、とくに2つ目のサイトの人、かゆいところに手が届く内容でマジGJです。
fc2にファイルをうpするときは、フォルダじゃなくてファイル自体を上げないと、上記のサイトで書いてくれていたHTMLの内容を使えないので注意。まぁフォルダうpできないんでしょうが。。

Ethereumのお勉強はじめました

どうも、ぺろりんです。

Ethereum(ETH)でスマートコントラクトのお勉強をはじめました。
教科書は 「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門」を使っています。
途中で詰まったら別のにするかも。

というわけで、勉強した内容をこのブログでメモとしてまとめていきます。
さぁて、まったりとやっていきますよ。


Ethereumの概要


Ethereumってなに?

Ethereum(イーサリアム)は、ブロックチェーン上で、任意に決めたルールで自動的にデジタルアセット[注1]を移動(=スマートコントラクト)するための基盤システム。


スマートコントラクトの方法は?

任意の状態遷移関数[注2]をコード化した「コントラクト」を作成して、これを実行することでスマートコントラクトを実現する。
実際には、Goなどのプログラミング言語で書いたコードをEthereumのブロックチェーン上に格納し、実行する。


単位

Ethereumにも通貨(仮想通貨、暗号通貨)が実装されており、この単位は「ether(イーサ)」。通貨単位として記載されるときは「ETH」。
補助単位で「wei(ウェイ)」(=10-18 ether)、「szabo(ザボー)」(=10-6 ether)、「finney(フィニー)」(=10-3 ether)というのもある。


手数料

コントラクトの実行のために、手数料が必要で、このときに支払うetherのことを「Gas(ガス)」という。燃料的な意味でこんな名前なんですかね。
これはマイナーが持つコンピュータのリソースを使わせてもらう対価として支払う。

「Gas Fee(ガス・フィー)」は、コントラクトの内容(Ethereumに要求するリソースの量や複雑さ)で決まる手数料が何Gasか、というの。

「Gas Price(ガス・プライス)」は、Gasの値段で 1 Gas = ??? wei の???のところ。(なので単位は「wei/Gas」)
Gas Priceが高い送金トランザクションから実行されるというのが重要ですね。
相場はここでわかるみたいです。

「Gas Limit(ガス・リミット)」は、支払い可能なGasの最大値。
1つ1つのトランザクション実行にはGasが必要だけど、実行できるのは支払うGasの総量がGas Limitとなるまで。
・(すべてのトランザクションによるGas総量)< Gas Limit
  → すべてのトランザクションが実行され、差額は戻ってくる。
・(すべてのトランザクションによるGas総量)= Gas Limit
  → すべてのトランザクションが実行され、Gas Limit分支払う。
・(すべてのトランザクションによるGas総量)> Gas Limit
  → Gas Limit分までのトランザクションが実行され、それ以上は実行されない。


ツール

この本ではGeth(ゲス)ことgo-ethereumという、Ethereumを操作するためのコマンドラインインターフェースを使う。

(参考)
Gethをインストールする。(Ethereum入門)
Ethereum Gethをインストールして開発環境を整える (1) (@takeoworks)



資料

この本で資料が紹介されていたのでリンクをメモっておきます。
Ethereumのホワイトペーパー日本語訳を見つけたのでこれもリンクを貼っておきます)
Ethereumの仕様書


まとめ

今回からしばらく(?)、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門」を使ってEthereumのお勉強をはじめてみます。

Ethereumは仮想通貨というよりは「ブロックチェーン上でプログラムを動かすための環境」です。
自分のPCのリソースではなく、基本は「マイナー」が持つハイスペックなコンピュータで計算してもらい、ブロックチェーン上でのトランザクションを実行します。
マイナーにお願いするために、報酬として彼らに「Gas」を支払うわけですね。

さて、次回はまず勉強環境をつくるところを書き残すことにします。
ではおたのしみに。


[注1] アセット…資産、財産、資源、有価物、有用なもの、利点、長所、などの意味を持つ英単語。(IT用語辞典
[注2] 状態遷移関数…Ethereumでの具体的な内容はよくわからないですが、オートマトンとか状態遷移とかこういう考え方があるので、ここの意味での状態遷移を実現する関数のことでしょう。

目次

どうも、ぺろりんです。

どこに何があるかわかりにくいので目次を作っておきます。
クリックしたら項目が開きます。

ここのを使わせていただいたんですが、レイアウトがうまくいかない。。気が向いたら直します。


目次





 


Legger nano S がとどいたよ!(後編)

どうも、ぺろりんです。

前回前々回から続く Ledger NanoS セットアップのご紹介もようやく最後になりました。

今回はアプリのインストールと、ペアリングの手順をご紹介したいと思います。

(各記事へのリンク)
Legger nano S がとどいたよ!(前編)
Legger nano S がとどいたよ!(中編)
Legger nano S がとどいたよ!(後編) ←今ココ


アプリのインストール

ここで必要なのは、
(1)Ledger Managerでのアプリインストール
(2)ウォレットアプリのインストール
の2つです。

(1)は、 Ledger NanoS 本体の液晶画面に各通貨へ接続するためのアイコンを表示させるために必要です。

(2)は、実際に仮想通貨を管理するためのアプリをPCに用意します。


(1)Ledger Managerでのアプリインストール

前提となるLedger Managerの導入は前回やりましたので、そちらをご参照ください。

まずはGoogle Chromeを開き、アドレスバーに「chrome://apps」と入力してEnter。


するとGoogle Chromeのアプリ一覧を開けられます。


まずはRipple(リップル)でも入れてみましょう。

次の画面で、「Ripple」の横にある[↓]マークをクリックします。


しばらく待つと、Ledger NanoS 本体の液晶画面に「Ripple」アイコンが追加されます。



同じことを、Ethereum(イーサリアム)→Bitroin(ビットコイン)→Bitcoin Cash(ビットコインキャッシュ)の順にやってみました。順番にアイコンが増えてきます。




ここで導入したアプリは、1つのLedger NanoS あたり4つくらいしか入れられないようです。
ただし、このアプリの追加/削除はLedger Managerからいつでもできますし、こちらのアプリを削除してもウォレットの内容が消えたりはしないようです。
よく使う仮想通貨のアプリを入れておくとよさそうですね。

ここまでで
(1)Ledger Managerでのアプリインストール
は終了です。
これで、Ledger NanoS からRipple、Ethereum、Bitroin、Bitcoin Cashに接続できる準備が整いました。


(2)ウォレットアプリのインストール

さて、続いて仮想通貨を実際に管理するためのウォレットアプリを導入してみましょう。
ここでもまたRippleからやってみましょう。

まずは先ほど使っていたLedger Managerは閉じておきましょう。
Ledger Managerはウォレットアプリと競合するようで、これを開いたままだとうまくウォレットに接続できません。

公式の[Apps]ページへ行き、下の方にある[Ledger Wallet Ripple]をクリック。



飛ばされた先で[GET THE APP]→[DOWNLOAD]と進んで行きます。



しばらくするとダウンロードが終わるので、左下の「^」をクリックして[開く]を選択します。「コンピュータへの変更を許可しますか」的なことを聞かれたら[はい]で。




インストール場所はこだわりがなければデフォルトで[Next]。


デスクトップにショートカットを作りたかったら[Create a desktop shortcut]にチェックを入れます。で、[Next]。


[Install]をクリックしてしばらくするとインストールが完了します。



チェックをつけたまま[Finish]すると、ウォレットアプリが立ち上がってきます。



これでインストール完了。
ちゃんと接続できるか確認しておきましょう。

左右のボタンを使ってLedger NanoS の[Ripple]アイコンを選択し、両方のボタンを同時押しします。


このセクションのはじめにLedger Managerを閉じましたが、開いたままだとたぶんこのへんで失敗します。
失敗した場合、Ledger Managerを閉じてからRippleのウォレットアプリを再起動してみてください。

うまく接続できると、Use wallet to view accounts(ウォレットを使ってアカウントを見てね)と表示され、PC上ではRippleのウォレットが開かれます。



ちなみに送金ページはこんな感じ。Fee(手数料)は0.00001XRP!


ウォレットを閉じるには、Ledger NanoS で左右のボタンから[Quit app]を選択し、両方のボタンを押します。


すると、PC上では接続前の状態に戻ります。


これで、ウォレットアプリのインストールが終わりました。


他の仮想通貨のウォレットアプリ

BitcoinとEthereumの方も入れてみたのでそちらも載せておきます。

まずはBitcoinの方。公式の[Apps]ページへ行き、下の方にある[Ledger Wallet Bitcoin & Altcoins]をクリック。


次のページから、[GET THE APPS]→[INSTALL]→[CHROME に追加]→[アプリを追加]とすすんでいきます。「コンピュータへの変更を許可しますか」的なことを聞かれたら[はい]で。





すると、Google Chromeのアプリ一覧に「Ledger Wallet Bit...」というのが追加されます。


このアプリを選ぶと、ウォレットへ接続するための画面が開かれます。


これはBitcoin以外の仮想通貨にも対応しているので、ここではBitcoin Cashのウォレットを開いてみましょう。

Ledger NanoS から「Bitcoin Cash」のアイコンを選択し、両方のボタンを押して決定すると、ウォレットに接続できます。


先ほどのページで[Bitcoin Cash]を選択し、次の画面で[SPLIT]を選択します。ここはSPLITの方がよさそうです


しばらく待つと接続できます。接続できない場合は、Ledger Managerか他のウォレットを閉じてから、Bitcoinのウォレットを再起動してやり直してみてください。ウォレットアプリは競合するようで1つしか開けないみたいです。



中はこんな感じ。



次にEthereumをやってみます。公式の[Apps]ページへ行き、下の方にある[Ledger Wallet Ethereum]をクリック。


次のページから、[GET THE APP]→[INSTALL]→[CHROME に追加]→[アプリを追加]とすすみます。「コンピュータへの変更を許可しますか」的なことを聞かれたら[はい]で。





Google Chromeのアプリ一覧で[Ledger Wallet Eth...]が追加されます。


これを選択すると、接続するためのページが開かれます。


Ledger NanoS から「Ethereum」のアイコンを選択し、両方のボタンを押してウォレットに接続します。

今回は[ETH Ethereum]を選択してみましょう。



しばらくすると接続できます。中身はこんな感じ。接続できない場合は、Ledger Managerか他のウォレットを閉じてから、Ethereumのウォレットを再起動してやり直してみてください。ウォレットアプリは競合するようで1つしか開けないみたいです。



途中にも何度か書きましたが、うまく接続できない場合はLedger Managerか他のウォレット(もしくはウォレット以外のChromeアプリ)を閉じてから、接続したウォレットアプリを再起動して接続をやり直してみてください。

それでもうまくいかない場合、以下(1)→(2)の順に試してみるのが良いかと思います。
(1)Google Chromeのアプリとウォレットアプリをすべて閉じてから、Ledger Managerのアプリを消して入れなおす。
(2)Google Chromeのアプリとウォレットアプリをすべて閉じてから、ウォレットアプリを消して入れなおす。

(参考)
Ledger Nano S のセットアップ(Ledger日本正規代理店Hardwarewallet.jp-ハードウェアウォレット)
Ledger Nano Sに仮想通貨を保管(Ledger日本正規代理店Hardwarewallet.jp-ハードウェアウォレット)
Ledgerへビットコインキャッシュ送受金(Ledger日本正規代理店Hardwarewallet.jp-ハードウェアウォレット)
アプリのインストール&ファームウエアの更新(株式会社 Earth Ship)
Ledger Nano S 設定ガイド(株式会社 Earth Ship)
「Ledger Nano S」の使い方と初期に理解できずにハマったこと。アルトコインのウォレットや通貨上限数などについて解説します(しきしまにっき)
Ledger Nano S(レジャーナノS)の使い方とRipple XRP(リップル)保管(投資をテコに、人生ハードモードからの脱却!)


ペアリング

最後にLedger NanoS のペアリングをやってみましょう。

これをやるには、Ledger NanoS が2台(以上)必要です。
私は今回、故障などのバックアップ用に2台用意しておきました。
ペアリングによってLedger NanoS 本体が壊れたとき用のバックアップを作成しておけます。
ペアリングしてやると2つとも同じ内容を見れるようになります。

では設定していきましょう。
ペアリングする2台目のLedger NanoS と、パスフレーズのシートを用意しておいてください。

まずは新品の2台目をPCにつなぎます。


Pres both buttons to begin(はじめるには両方のボタンを押してね)とあるので両方のボタンを押します。


Configure as new device?(新しいデバイスとして構成する?)で×とある左側のボタンを押します。


Restore congiguration?(リストアの構成?)でチェックマークのある右側のボタンを押します。このペアリングという方法は、新しいデバイスにリストアしてやることで、1台目と同じ内容を見せます。


1. Choose a PIN code(PINコードを選んでね)でPINコードを設定します。1台目と同じものにする必要はありません。セキュリティ的にはむしろ違うPINコードにした方が良いでしょう。


2. Confirm your PIN code(あなたのPINコードを確認してね)で、前のページで入力したPINコードをもう一度入力して確認します。


3. Enter your recovery phrase(リカバリーフレーズを入れてね)では両方のボタンを押してページを送ります。


Select the number of words to restore(リストアするための単語数を選んでね)の次のページで、リカバリーフレーズの数(今回は24)を選びます。



Enter first letters of word #1(1番目の単語の1つ目の文字を入れてね)の次のページで、言われた通り1つ目のリカバリーフレーズの1文字目を選びます。すると、次のページで2文字目かいくつかの単語の候補が出てきますので、自分のリカバリーフレーズの単語を選択します。



これを繰り返してリストア終了です。


Your device is now ready(あなたのデバイスの準備ができたよ)


これで、ペアリングも終了しました。

(参考)
Ledger Nano S のペアリング(Ledger日本正規代理店Hardwarewallet.jp-ハードウェアウォレット)


まとめ

長々と書いてしまいましたが、ここまで読んでくださってありがとうございました。

やったことは、
 開封→初期設定→ファームウェア更新→アプリインストール→ペアリング
でした。

慣れると難しくないですが、はじめてだと2時間くらいは見といた方が良いかなと思います。

Legger nano S がとどいたよ!(中編)

どうも、ぺろりんです。

前回に引き続き、先日届いたLedger NanoS のセットアップの様子をご紹介してきます。
載せる画像が多くて、2分割では足りず3分割になりました。。

今回はファームウェアアップデートというのをやっていきます。

(各記事へのリンク)
Legger nano S がとどいたよ!(前編)
Legger nano S がとどいたよ!(中編) ←今ココ
Legger nano S がとどいたよ!(後編)


ファームウェアのアップデート

2018年3月7日、公式からファームウェアアップデートのお知らせがありました。

ファームウェアというのは、ハードウェアウォレットを動かすためのOSみたいなものです。
セキュリティを保っておくため、最新のものにアップデートしておく必要があります。

アプリインストールのくだりでも同じことをするのですが、今回の目的はファームウェアアップデートということでウォレットアプリの導入については別項目としておきます。

順番としては、
 Google Chromeのインストール→Ledger Managerのインストール→ファームウェアアップデート
という風にすすんでいきます。


Google Chromeのインストール

まずは、Ledger NanoS で使うアプリ導入に必要なブラウザ、Google Chromeを導入しておきます。

まずはGoogle Chromeのダウンロードページへ行き、[Chrome をダウンロード]をクリック。


出てくる利用規約を読んで、同意できたら[同意してインストール]をクリック。チェックボックスのチェックはお好みで。


[ファイルを保存]します。


私が普段使っているFirefoxの場合、ブラウザの右上らへんに[↓]アイコンがあるので、青くなってたらこれをクリック。


ChromeSetup.exeをクリックしてやると、インストール用の実行ファイルが実行されます。
(「PCに変更を加えることを許可しますか」的なことをきかれたら[はい]で)


しばらく放置。




その内なんか出てくるので、下の方の[続行]をクリック。



無事インストールできました。



Ledger Managerのインストール

次に、Ledger NanoSの管理用アプリである Ledger Manager をインストールします。

こいつはGoogle Chrome上のアプリなので、まずはGoogle Chromeを開いておきます。

Google Chromeで公式サイトへ行き、[Apps]ページを選択します。


[Apps]ページでスクロールしていくと見つかる[Ledger Manager]をクリック。



[GET THE APP]をクリック。


飛ばされた先で[INSTALL]をクリック。


[CHROME に追加]してやります。


[アプリを追加]。


この前後くらいで待ち時間がありますが、しばらくすると無事に追加されます。


これでLedger Managerを導入できました!

ちなみに、最後のアプリ一覧ページにはGoogle Chromeを開いてURLに「chrome://apps/」と入れれば行けます。



ファームウェアアップデート

このパート、画像撮っといてあとでまとめようと思ったら、ところどころ記憶があいまいなので細かいところは多少飛ばしたりしてるかもしれません。。
そのへんは他のページも参考にまとめておきますので、基本はこの手順で大丈夫かと思います。

Ledger NanoS はPCにつなげた状態で出発します。


先ほどインストールしたLedger ManagerをGoogle Chromeで起動します。


しばらくすると、アプリ一覧が出てきます。



このままファームウェアのインストールをするとうまくいかなかったので、まずすでに入っているアプリを消してやります。

どのへんを消したらいいのかわからなかったので、とりあえずLedger NanoS の画面にある通貨のアプリをすべて消します。消してもあとで入れなおせるので問題ありません。


アプリ一覧の画面で、各通貨の右の方にあるごみ箱マークをクリックしてやります。


すこし待つと、Ledger NanoS の画面から、ごみ箱マークを押した通貨のマークが消えます。


アプリをすべて消したら、アプリ一覧で[FIRMWARES]を選択します。



次のページで、右上の[INSTALL]をクリックします。


待ち状態の画面の下にある[IDENTIFIER]を確認します。


本体の液晶の「IDENTIFIER」を確認できたら、チェックマークがある右側のボタンを押します。


PINコードを要求されるので、入力してやります。



Update firmware(ファームウェアをアップデートする)の画面で、チェックマークがある右側のボタンを押します。


バージョンを確認し、、チェックマークがある右側のボタンを押します。


MCU firmware is outdated (MCUファームウェアが古いよ)


ここからしばらく、両方のボタン同時押しでページ送りします。

The device MCU must be updated using the Ledger Manager app.(デバイスMCUはLedger Managerアプリを使ってアップデートしないといけないよ)
Press and hold 5 secs the button close to the USB when you plug in.(プラグを抜き差しするときにUSBに近い方のボタンを5秒間押し続けてね)




Update is mandatory. (アップデートは必須だよ)
Press buttons to restart.(もう一度やるなら両方のボタンを押してね)


アップデートするために、言われた通りUSB側(左側)のボタンを押しながら抜き差し。
5秒のカウントがよくわからなかったので、しばらく押しっぱなしでやりました。。

うまくいったっぽい・・・?



再起動してまたPINコードを求められたので入力します。



うまくいったみたいです。



これで、無事にファームウェアのアップデートができました!


補足

途中でアプリの削除をしましたが、これをしないとファームウェアで[INSTALL]を押した後にエラーになります。


調べてみると、アプリを消す必要があるみたいでした。
ただ、どのアプリを消すのが正解かわからなかったです。
なので今回は全部消す方針でやりましたが、とりあえずうまくいきました。

(参考)
How to update my Ledger Nano S with the firmware 1.4(Ledger)
【Ledger Nano S(レジャーナノS)】ファームウェアアップデートの方法(Sales Technology Lab)
アプリのインストール&ファームウエアの更新(株式会社 Earth Ship)

Legger nano S がとどいたよ!(前編)

どうも、ぺろりんです。

しばらく放置していたのですが、注文していたハードウェアウォレット Ledger NanoS が先日届いたのでセットアップしていこうかと思います。

各項目で参考にしたサイトを列挙しておきますので、わかりやすいと思うところをご参考ください。

やることは、
 初期セットアップ→ファームウェアアップデート→アプリインストール→ペアリング
です。
アプリインストールまでで普通に使えるようになりますが、バックアップ用に2つ目も一緒に購入したのでペアリングってのもしておきます。

写真を載せまくっていたら結構長くなってしまったので、内容を分割してアップすることにしました。
今回の前編では、開封初期セットアップの様子をご紹介します。

(各記事へのリンク)
Legger nano S がとどいたよ!(前編) ←今ココ
Legger nano S がとどいたよ!(中編)
Legger nano S がとどいたよ!(後編)


開封の儀

さっそく開けていきましょう!

まず、箱はこんな感じです。


フタを開けると…きれいに収まってますね。


一つずつ開けていきます。


説明書的なのが出てきました。なぜか反対向き。


説明書的なののうち、1つはリカバリーフレーズを書くためのシートでした。


付属品はケーブル、紐、ストラップとリング。


これにて開封終了。
全体的にiPhone的スマートさを感じました。


初期セットアップ

さて、開封できたのでまずは初期セットアップをやっていきましょう。

Ledger NanoS自体は通電しないと動かないので、こんな感じでUSBケーブルをさしてPCにつなげて通電させます。


ボタンは赤丸をつけたこの2つのみ。


操作としては
(1)左を押す
(2)右を押す
(3)両方押す
という3択です。選択とか以外のただのメッセージを次にすすめるときは (3)両方押す ってのでOKです。

通電するとこんな感じでWelcomeとか言われます。


Press both buttons to begin.(はじめるには両方のボタンを押してね)


To begin configuration, press both buttons.(構成をはじめるには、両方のボタンを押してね)


With Ledger Nano S, side buttons are used to interact and control the user interface.(Legger nano Sでは、側面のぼたんはユーザーインターフェースとの対話や制御に使うよ)



Use left/right buttons to change values and navigate through multiple-choice lists.(左右のボタンは、押して値を変えたり選択肢のリストを操作するのに使うよ)




Press both buttons when you wish to confirm/continue or open an application.(確認や続行したいとき、もしくはアプリを開くときに両方のボタンを押すよ)



Configure as new device?(新しいデバイスとして構成する?)


YESならチェックマークのある右側のボタン、NOなら×マークのある左ボタンを押します。
今回は初期セットアップで、新しいデバイスを構成したいので右のボタンを押します。
ちなみに、左を押すとリストアのメニューへ進みます。(こちらはペアリングのときに使います)

1.Choose a PIN code(PINコードを選んでね)


両方のボタンを押してやると、自分で決めたPINコードを入力する次の画面にすすめます。
ここでは左のボタンを押すと数が減り、右のボタンを押すと数が増えます。
左右のボタンで数を選んだら、両方のボタンを同時押しで決定。。というのを繰り返して最低4桁のPINコードを設定します。


2.Confirm your PIN code(PINコードを確認してね)


次の画面でもう一度PINコードを入力して、正しいか確認します。
この画面は飛ばしてその次。。

3.Write down your recovery phrase(リカバリーフレーズを書き留めてね)


次の画面から24個のリカバリーフレーズが出てくるので、すべての単語を付属のシートに記入していきます。
このリカバリーフレーズはリカバリに使うとっても重要なものなので、失くさないように大事においておきましょう!

4.Confirm your recovery phrase(リカバリーフレーズを確認してね)


次の画面で、〇〇番目のリカバリーフレーズは?って感じで質問されるので、記入したシートをもとに回答します。
で、その問題に合格できたら終了です。

Your device is now ready(あなたのデバイスは準備完了です)


ページを送ると、こんな感じで仮想通貨のマークが出てきます。


これで、無事に初期セットアップができました!

(参考)
Ledger Nano S のセットアップ(Ledger日本正規代理店Hardwarewallet.jp-ハードウェアウォレット)
Ledger nano Sの初期設定(株式会社 Earth Ship)

ブロックチェーンの本質ってなんだろう?

どうも、ぺろりんです。

ブロックチェーンの本質的なことってなんでしょうか?
あたらしく出現した概念ですが、より本質的な特徴を残して抽象化しておくことは今後応用するにあたって非常に重要だと考えています。

ブロックチェーンの起源がBitcoinという仮想通貨(暗号通貨)であったことから、すぐに思いつく類題として種々の通貨という応用がなされてきました。
今はまだまだ黎明期ですが、ちょくちょく通貨以外のものにも応用されていたりします。

応用するにしても、どんな応用先なら「ブロックチェーンであること」が活きるのでしょうか?
「ブロックチェーンだからこそ」できること、「ブロックチェーンでないと」できないことってなんでしょうか?

ブロックチェーンの応用についての考えとして、イケダハヤトさん
「『価値のある何か』の価値を可視化し、売買できるようにする。」
ということについて解説しておられ、これもなるほどなと思いました。

このようにブロックチェーンの応用を考えるうえで、「ブロックチェーン」という概念をより抽象化して特徴づけておくことが助けになったりします。
今回はこれについて考えてみようと思います。


ブロックチェーンの特徴づけ

以下のようなデータの集合を「ブロックチェーン」と呼ぶ。
(1)分散型ネットワークの中で
(2)データに順序がつけられていて、
(3)その順序はネットワーク参加者のみによって保証されている。

というのが、しばらく考えてみてわたしが至った結論です。

実はブロックチェーンの定義は、日本ブロックチェーン協会(JBA)という団体によって提案されています。
ここでは以下のように定義しています。
1)「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ。」
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

この定義ではデータ構造の他にも、合意が覆る可能性の収束性だったりいくつかのポイントを含めつつビザンチン障害やハッシュだとか具体的な言葉もいくつか入れられています。

個人的にはこれはまだ不満がありまして、できる限り少ない要素に言及することで本質的な部分を明らかにし、より応用範囲を広げるようなブロックチェーンのとらえ方をしたいところです。

この考えのもと要素を削ってみた結果として上記を提案したいわけです。
いくつかのHPだったり本だったりを参考に考えてみましたが、やはり
(1)分散型ネットワーク
(2)データの順序付け
(3)合意
というポイントははずせないかな、と感じました。

ただし上に挙げたわたしの考えでは、データが順序付けられている必要はありますが、それが時系列である必要はないですし(何の順番でもいい)、並べ方はハッシュを必ずしも使う必要はないと考えています。
データもべつに取引のようなやり取りのトランザクションである必要もないと考えています。

これくらい情報を落として抽象化しておくと、もっといろんな応用先が見つかるんじゃないかなと考えています。

あとはこのような特徴があるものは何か、このような特徴のデータを使う/使えるものは何か、ブロックチェーン技術により実装できるか、という観点から考えることで応用を考えていきたいところです。

(参考)
「ブロックチェーンの定義」を公開しました(JBA)
「ブロックチェーン 仕組みと理論 サンプルで学ぶFinTechのコア技術」
なんでもかんでもブロックチェーン?何をもってブロックチェーン?ブロックチェーンの用語の混乱を整理してみる(議論たたき台)(ビットコイン研究所ブログ)


ブロックチェーンの数学的な定式化

個人的には先ほどの議論をさらにすすめて、数学的な定式化をしておきたいと考えています。

現状わたしがたどり着いているのは以下のような内容です。
「データの集合Dと順序Hから成る全順序集合(D,H)をブロックチェーンと呼び、全順序Hにより順序を構成する手続きをコンセンサス・アルゴリズムと呼ぶ。」

このへんがブロックチェーンの数学的定式化になるのではないかなぁ、という感じです。
まだ不満はあって、分散型ネットワークの参加者により合意される(第三者を必要としない)ことをなんとか取り入れたい。。

ブロックチェーンにより改ざんが難しいことの数学的根拠なんかはググると出てくるんですが、ブロックチェーンを集合論的に、ちゃんと数学的に定義している議論がなかなか見つからない!
これを読んでいる方(が居るかわかりませんが)で、数学的な定義や定式化を見つけた方、ご存知の方がいらっしゃればぜひとも教えていただけると歓喜します。

ちなみに、数学的に定式化できると何がいいか?
もしブロックチェーンをきちんと数学的に定義できてこの定義が既知の定義に当てはまるものであれば、それはこれまで数学の研究の中で得られた(この定義から導かれる)既知の一見非自明な定理がすべて適用できるわけです。
これはブロックチェーンを応用する強力な助けになるはずです。

数学というのは考えの枠組みを作っているわけで、例えるなら、チャートシートを作っているわけです。
このチャートシートを使えば、
 「あなたのいう〇〇は、定義Aにあてはまりますか?」→yes/no
みたいなことを続けることで、最終的に
 「ではあなたのいう〇〇は、定理X、Y、Zという性質があります」
ということが一瞬でわかってしまいます。

このようなことから、わたしとしてはより応用範囲を広げられるような数学的なとらえ方をしておくことが重要だと考えています。
これができれば非自明な応用先が瞬時にわかるかも知れません。


まとめ

応用範囲を広げるために、ブロックチェーンをより抽象化してとらえ、
(1)分散型ネットワークの中で
(2)データに順序がつけられていて、
(3)その順序はネットワーク参加者のみによって保証されている
ようなデータの集合、というくらいに考えるのがよいのではとわたしは考えています。

さらに進めて、数学という武器を使うためにもブロックチェーンという概念を数学的に定式化しておきたくて以下のように考えてみました。
「データの集合Dと順序Hから成る全順序集合(D,H)をブロックチェーンと呼び、全順序Hにより順序を構成する手続きをコンセンサス・アルゴリズムと呼ぶ。」

が、まだこの定義では不満が残る。。

というおはなしでした。

ブロックチェーンってどんなもの?

どうも、ぺろりんです。

本でまったりとブロックチェーンのお勉強をしていこうかなと思います。
まず手初めに、今回は以前読んだ「ブロックチェーン 仕組みと理論 サンプルで学ぶFinTechのコア技術」から得た知識を自分なりにまとめてここにメモしておきます。


ブロックチェーンって何?

ブロックチェーンは、「ハッシュ関数を用いた、分散ネットワークにおける合意形成の仕組み」です。

以下ではこの内容をご説明していきます。


ブロックチェーンのはじまり

2008年11月、有名な仮想通貨ビットコインに関する一報の論文が、正体不明の人物(または団体)サトシ・ナカモトにより暗号技術のメーリングリストで発表されました。ここに含まれていたのが、ブロックチェーンの概念でした。
そして、2009年1月には、上記の論文をもとにしたビットコインのソフトウェアが配布され、運用がはじまりました。

ブロックチェーンのはじまりは仮想通貨ビットコインを可能とする技術の一要素でした。しかし理解がすすむにつれ、仮想通貨(もしくは暗号通貨)以外にも「ブロックチェーン」という技術が有用であることがわかり、「ブロックチェーン」そのものが研究されるようになりました。


そもそもの問題意識

分散ネットワークでの合意形成ってどうすればうまくいくだろう?という疑問への一つの回答がブロックチェーンという考え方です。

分散ネットワークでは、ネットワークに参加する全員が同じデータを持っていて同期します。
たとえばAさんからBさんにXというデータを送ると、この情報がネットワークの参加者全員に共有(同期)されます。

でもこれ、同じデータを持っているはずのCさんとDさんで、先ほどのデータ転送の情報が違っていたらどうでしょう?
 Cさんの持つ情報:AさんからBさんにXというデータを送りました。
 Dさんの持つ情報:AさんからBさんにYというデータを送りました。
これではどちらが正しいかわからなくて困ってしまいます。

こういうことは、ネットワーク内で同期するときに失敗したり、誰かが情報を改ざんすることで起こり得ることです。

このように同期すべき情報の食い違いが起きたとき、どの情報が正しいかを合意するにはどうすれば良いでしょうか?

これに対し、ブロックチェーンという技術ではハッシュ関数というものを用いて解決します。


ハッシュ関数

関数というのは、何かしらの入力を一定のルールに基づいて加工して出力するための、「一定のルール」の部分のことを言います。

ハッシュ関数がどんなルールかというと、以下の条件を満たすようなルールです。
(このような条件を満たせば、具体的なルールは何でも良いです)
(1)入力に対し、ランダムな(ランダムっぽい)値を出力する。
(2)入力aと入力bが少しでも異なると、出力の値は大きく異なるものになる。
(3)入力がどんなものでも、出力は一定の長さのデータ列になる。
(4)入力と出力が1対1対応する。
  (入力aの出力cと入力bの出力dがあったとき、どんなa,bに対してもc≠dとなる)

ただし(4)については、現実的には“概ね”1対1となる関数が採用されています。
(入力a,bに対して出力c=dとなる確率が非常に小さいものが使われています)

実用されているハッシュ関数はいくつかありますが、たとえばSHA-1というものでやると、こんな感じになります。
今回は、「perorin」と書いたテキストファイルを入力として、この「テキストファイル」に対してSHA-1という規格のルールで加工した出力(ハッシュ値)を見てみます。

入力データ(テキストファイル)に対して、



「7b64a8408882dc4c5c54de8e8d9d2a86e1347e58」という値が出力として生成されました。


Windowsの標準機能でできますので、ご興味のある方は参考に挙げておいたリンク先あたりを参照しながらお試しあれ。
やることは、
 ファイル作成→コマンドプロンプトを開く→certutil -hashfile [ファイルフルパス] [ハッシュアルゴリズム] を実行
というだけです。

(参考)
ハッシュ関数(Wikipedia)
原理から学ぶネットワーク・セキュリティ 第4回 ハッシュ関数(日経 xTECH)
windows標準でMD5などのハッシュ値を出力(Qiita)


ブロックチェーンによる問題の解決

さて、問題にもどると、ブロックチェーンでは「同期すべき情報はどれが正しいか?」という合意形成のために、先ほどご説明したハッシュ関数を使用します。

ブロックチェーンによる合意形成の仕組みを理解するためには、「ブロックチェーン」と「コンセンサス・アルゴリズム」を理解する必要があります。
この書き方だと紛らわしいのですが、一般的に「ブロックチェーン」と言ったときにはその技術に付随する「コンセンサス・アルゴリズム」まで含めて「ブロックチェーン」と呼んでいる気がしますが、次にご説明する(狭義の)「ブロックチェーン」が本来のブロックチェーンという理解で良いはず。
狭義のブロックチェーンのことを「ブロックチェーン」、コンセンサス・アルゴリズムまで含めた広義のブロックチェーンのことを「ブロックチェーン技術」と呼ぶ方が良いのかな…?


(狭義の)ブロックチェーン

ハッシュ関数による出力は、入力が少しでも異なると大きく異なるというものでした。
これを利用すると、データの改ざんが検知できます。
もしAさんからBさんへ送ったデータXが途中で改ざんされた場合、AさんがXから作成したハッシュ値とBさんが受け取ったX'から作成したハッシュ値はまったく違う値となり、XとX'を比較することでBさんは間違ったデータを受け取ったことがわかります。

ブロックチェーンではこのことを利用します。

(1)AさんからBさんにXというデータを送ったあとに、(2)AさんからBさんにYというデータを送ることを考えましょう。
ネットワークの参加者は「(1)のあとに(2)があった」ということを合意して、この情報を同期する必要があります。

「AさんからBさんにXを送りました」という情報が記載されたデータ(たとえばテキストファイル)のハッシュ値を計算し、これを次の「AさんからBさんにYを送りました」という情報が記載されたデータに一緒に記載しておきます。


すると、もし(1)の情報がXからX'に改ざんされていたとすると、(2)の情報と一緒に記載されたハッシュ値は、まったく違う値になっています。
このように、「(1)のあとに(2)があった」=「(2)の前は(1)だった」という事実は、「(2)の情報+(1)のハッシュ値」という組を考えることで、(1)のハッシュ値によって正誤が判断できます。

同じことを続けて、いくつかのデータ転送を記載したデータをひとまとまりとして扱い、各まとまりには1つ前のまとまりのハッシュ値も一緒に記載していきます。
こうすることで、過去のある時点で改ざんがあれば、ハッシュ値の違いによりそれは不正なデータであることが判断できます。


このひとまとまりのことを「ブロック」と呼び、ブロックがハッシュ値によって鎖(チェーン)のように連なることから、このブロックの連なったデータ群のことを(狭義の)「ブロックチェーン」と呼びます。

過去のある時点でブロックの内容を改ざんすると、そのあとに続くブロックに記載された(すでに正しいと合意された)ハッシュ値が、そしてその次のブロックに記載された(すでに正しいと合意された)ハッシュ値が、…とどんどんハッシュ値が変わっていきます。
ですので、もしどこかの時点でブロックの内容を改ざんするとすれば、そのあとのすべてのブロックを改ざんする必要が出てきます。

ブロックの生成が簡単であればこのような改ざんも可能なのですが、そうは問屋がおろさないというのが次の「コンセンサス・アルゴリズム」です。


コンセンサス・アルゴリズム

実用されている(狭義の)ブロックチェーンを使った合意形成の仕組み(コンセンサス・アルゴリズム)はいくつかありますが、今回はBitcoinで採用されているPoW(Proof of Work:計算量による証明)がどんなものか見ていきましょう。

生成されたブロックが正しいかどうか、ネットワーク参加者が計算により判断するというのがPoWというコンセンサス・アルゴリズムです。

もう少し具体的には次のような流れで、あるブロックの次のブロック生成が承認されます。
(1)ネットワーク内のマイナー(採掘者)と呼ばれる参加者が、ブロックに記載されたハッシュ値から、次ブロック生成のための条件を満たすパラメータ(「ナンス」という)を計算で見つけ出す。
(2)マイナーは見つけたナンスを含む新しいブロックを、ネットワークの参加者全員に知らせる。
(3)新しいブロックを受け取った各ネットワーク参加者は、自分の持つブロックに記載された情報から受け取った新ブロックに含まれるナンスが正当か判断する。
(4)各ネットワーク参加者は、(3)のナンスが正当であれば自分のローカルディスクにあるブロックチェーンに、受け取った新ブロックを追加する。

このように、条件を満たす計算問題を解き、その結果の正誤によってネットワーク参加者が合意形成します。

ブロック生成の条件は、計算に一定時間(たとえば10分間)かかるように動的に調整されています。
このことにより、「過去のある時点でブロック内容を改ざんするために、それ以降のブロックすべてを改ざんする」というのは膨大な時間がかかり現実的にはほぼ不可能となります。

この計算(マイニング)には膨大なCPUパワーが必要となるので、ブロックを生成すると報酬(仮想通貨ならその通貨のコイン)をマイナーに与える仕組みになっています。
ただ働きだとこんな計算は誰もしませんが、この報酬制度によりマイナーがちゃんと存在するように考えられています。

(参考)
Bitcoinの仕組み(Bitcoinの仕組み)
ブロックチェーンの仕組み 〜初心者のためのわかりやすい解説〜(Blockchain Biz)
プルーフオブワーク(PoW)の仕組みを知らずにビットコインは語れない(ZOOM)
分散ネットワークでの合意を可能にしたコンセンサスアルゴリズム「プルーフ・オブ・ワーク」(Blockchain Biz)


まとめ

ブロックチェーンが何ものかというのをまとめると、分散ネットワークにおける合意形成の仕組みのひとつで、
(1)ひとまとまりのデータ集合である「ブロック」がハッシュ値によりつながったものを(狭義の)「ブロックチェーン」と呼ぶ。
(2)ハッシュ値のチェーンでつながる次ブロックは、PoWなどの「コンセンサス・アルゴリズム」により合意されたものが採用される。

こんな感じですね。
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
メールフォーム

名前:
メール:
件名:
本文: