[社内勉強会 レポート] ブロックチェーン勉強会 #Bitcoin #Ethereum

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Guten Abend!ベルリンから伊藤です。

先日、しがひによるブロックチェーンの社内勉強会が行われました。
こちらはベルリンオフィスからリモートで、Hangout on Airで配信されている様子。
(録画配信されておりますので、社内でご興味ある方はぜひご視聴ください!)

今回はそこで説明された内容を抜粋して紹介し、またその後のブロックチェーン用マシン組み立ての模様をお届けします。

ブロックチェーンとは

ブロックチェーンの概要

ブロックチェーンとは「データベース」であり、分散された台帳記録です。

  • 仮想通貨を入出金した時の処理(トランザクション)は、全てのノードによって全てのデータが保持される
  • トランザクションデータは全ノードにブロードキャストされる(例えば、User Aの送金データは、一番近いMiner Aのノードに送られ、そこからリレー形式で全ノードにブロードキャストされる。)
  • このように互いに受発信している世界なので、「あちら側」(クライアント側/サーバ側)がない
  • マイナーと呼ばれる参加者ノードのうち、たった1ノードがブロックと呼ばれるトランザクションを収容できる容器を生成できる
  • 生成されたブロックは、ゴシッププロトコルでそのブロックを持っていないノードに手当たり次第に伝播され、ノードにより整合性を検証・承認されてからチェーンとして接続される

各用語の詳細はこの後少しずつ説明します。

ちなみに、マイナーは「minor/少数派」ではなく、「miner/採掘者」です。

どのくらい分散しているのか?

Bitcoinのノードの所在を確認できるサイトがいくつかあり、例えばこちらのサイトを参照すれば、各ノードのIPアドレスも調べられます。現時点で、1万台くらいで分散されているということになります。

「USER AGENTS」で「Satoshi〜」というのがBitcoinのエージェントです。
(うちの社長ではなく、ビットコインの考案者がサトシ・ナカモトとされるため)

「NETWORKS」(上の画面)からAmazonが全体の6%程度を占めていることが分かります。
BitcoinはAWS上、EthereumはAzure上で構築されていることが多いそうです。ちなみにEthereumでAzureが多いのは、MicrosoftがEthereumのファウンデーションに関わっている背景があるとのことです。

ブロックチェーンになるまでの流れ

  1. トランザクションのブロードキャスト
  2. ブロックへのトランザクションの取り込み
    →このとき、ブロック生成のためにはProof of Workと呼ばれる膨大な暗号の計算が必要で、この計算競争(マイニング)に勝ったマイナーだけがブロックを作成できます。
  3. ブロックのブロードキャスト
  4. チェーンへの接続
    →全ノードが検算し、前のブロックとの整合性が取れているものだけをチェーンへ接続し、不正なものは接続されません。
  5. ブロックチェーンの定着
    →最も長いチェーンを信用するものとされており、時間の経過とともに分岐したチェーンの中で長い枝がチェーンとして定着していきます。

マイニングについて

このマイニングでブロックを生成することによってマイナーはお金を稼ぐわけですが、この膨大な計算競争は消費電力が問題になる程に莫大で、通常のPCではできません。
マイニングは通常は10分程度かかり、マイナーたちのノード性能が上がった場合などでも平均計算時間が10分となるように暗号の難易度が調整されています。

ビットコインにおける記帳方法

ビットコインの記帳方法は、銀行口座のように「xx円入金し、xx円出金した結果、そこにxxxx円の残高がある」といったものではなく、複式簿記の借方と貸方のように「インプット」と「アウトプット」があり、それぞれの総額が必ず一致することになっています。
インプットに使っていない「未使用のアウトプット」の事をUTXOと呼び、トランザクションの履歴を逆算した時にUTXOの総額がそれぞれの残高、所持金ということになります。

簡単な例で説明しますと

例えば、以下のような送金があったとします。

  • 太郎が花子に10ビットコイン送金
     →花子が10ビットコインの残高
  • 花子がマリッサに3ビットコイン、ジョージに4ビットコイン送金
     →花子は3ビットコイン、マリッサは3ビットコイン、ジョージは4ビットコインの残高

すると、トランザクションの記帳(インプットとアウトプット)は次のようなイメージとなります。

行った処理の内容 Input Output 各時点でのUTXO
太郎から花子へ10btc 太郎 10btc 花子 10btc 花子 10btc
花子からマリッサへ3btc 花子 10btc マリッサ 3btc
花子 7btc
マリッサ 3btc
花子 7btc
花子からジョージへ4btc 花子 7btc ジョージ 4btc
花子 3btc
マリッサ:3btc(アドレスC)
ジョージ 4btc
花子 3btc

「花子のUTXOが10btcから7btcとなる」というより、「"花子 10btc"というUTXOが使用済みとなり、"花子 7btc"というUTXOができる」という感覚です。

実際のトランザクションデータには「現時点でのUTXO」のようなデータは含まれず、未使用のアウトプットがアドレス(人)に一つとは限らないため、各自の残高を確認するにはUTXOを逆算して割り出すということになります。

マイナーの報酬

上記の記帳は、厳密には各トランザクションはInput>Outputとなっており、その差額が「手数料」となります。この手数料は、後述の「コインベース」に加えてマイナーに支払われます。

上図は実際の1トランザクションデータの内容です。
このように、インプットとアウトプットは少し差額があり、これは手数料となっています。

手数料の最低額は決まっていますが、送金者はこの金額を多めに設定することで、マイナーに対してより優先的にトランザクションを取り込んでもらうことができます。

トランザクションとブロックとチェーンの関係

  • トランザクション(TX)=「インプット」と「アウトプット」
  • ブロック=ブロックヘッダコインベース+TX+TX+TX...
  • チェーン=ブロック+ブロック+ブロック+...

ブロックを構成する、ブロッグヘッダとコインベースについて解説します。

ブロックヘッダー(図の青枠内)は各ブロックに付くもので、下記により構成されます。

  • ブロック高(ブロックの番号のようなもの)
  • 直前のブロックヘッダから取り込んだブロックハッシュ
  • Proof of Work(マイニング結果の答え)
  • ブロック自身のトランザクションのハッシュ

コインベース(図の赤枠内の先頭2行)はマイナーへの採掘報酬で、今は12.5btc(現時点で2000万円程度)です。
これはInputの入金元がなくOutputが12.5btcということになるので、通貨発行の役割にもなっています。
すなわち、世界各地でブロック生成が約10分ごとにされるたびに2,000万円程度がマイナーへ支払われ、その分だけインフレしているということになります。

なぜこの仕組みで不正ができないのか?

送金者とマイナーが同一人物であったり、結託することにより、不正なトランザクションデータをブロックに取り込むことは可能です。

例えば、アドレスAが以下のように、共にOutputが10btcというトランザクションをほぼ同時に行います。
 (1)アドレスBへ10btcを送金 →トランザクションをブロードキャスト
 (2)アドレスA自身へ10btcを送金 →(1)の代わりにトランザクションとして含めたブロックを生成
こうして(1)を含む他ノードに作成されるブロックとは矛盾する、(2)を含む不正なブロックを作成して、前のブロックに接続させて不正なブロックチェーンの分岐ができてしまいます。

またこのような意図的な不正でなくとも、ほぼ同時刻に同じブロックが作成され、ネットワークの遅延などによりブロックが複数存在することはあります。

しかし、いずれの場合でもブロックは全ノードにより検証されるので、他ノードによる後続のブロックがチェーンとして接続されないと正当なチェーンとして定着されることはありません。

不正なブロックをチェーンとして定着させられるほど、毎回ブロックを作成することができれば可能ということになりますが、現実には不可能なため、不正はできないということです。

おまけ

Ethereumについて

ブロックチェーンといえばビットコインと思われがちですが、技術者としてはこちらに注目です。

特徴

  • トランザクション指向のBitcoinと異なり、アカウント指向のため実装が単純
  • 1ブロック生成にかかる時間は、15-20秒程度
  • ブロックサイズは可変で、上下制限なし
  • Bitcoinと異なり通貨発行の上限がないため、インフレ傾向が強い
  • トランザクションだけでなく、コントラクトコードを含めることができる
  • カスタムトークンによる通貨発行が初めから想定されている
    こちらの記事で実際に「めそコイン」を作ってみてます
  • ベルリンが本場(開発者コミュニティ)

コントラクトコードについては下記をご参照ください。

コントラクト・コードに様々な動作をプログラムすることで、そのContractにより名前管理やトークン管理のようなアプリケーションが実現できます。コントラクト・コードの実行は採掘者によって行われ、実行結果は公開元帳であるブロックチェーンに書き込まれていき、特定の中央機関なくアプリケーションが動作していきます。

参照元:Contractを作成する · Ethereum入門

Ethereum開発

開発におけるアーキテクチャは以下のようになります。(青部分がアプリケーション層)

  • Go言語のクライアント「Geth」が標準
  • 多くは「Mist」というソフトウェアをブラウザ(ウォレット)として使う
  • Parity」はブロックチェーンの同期の早いクライアントで、同時にブラウザ(ウォレット)の役割もある
    →Parity使用の様子はこちらの記事
  • 「MEW」はJavascriptで書かれており、「myetherwallet.com」からアクセスでき、軽い

終盤は、実際の画面を元に説明がありましたが、訳が分かりませんでした(汗
この辺はご自分で触って勉強して、「ブロックチェーンエンジニア」になってください。

ベルリンオフィスの取り組み

しがひ「新たにWindowsマシンを立てて、第8の社員として仕事させよう。」
私「はぁ、おもしろそうですね(この人は何を言っているんだろう...」

ということで、Windowsマシンを組み立てました。構成要素はこちらの通り。

組み立て

オフィスに来るとデスクを占領する巨大な箱たち、どれから箱を開ければいいやら分かりません。有識者Tranさんに指導頂きながら組み立てていきました。

1. マザーボード(ASUS)

これに、CPU、メモリ、SSD、ファンなんかを取り付けるので、基本的にこの説明書を確認します。

2. CPU(AMD Ryzen Threadripper)

とにかく箱がかっこいい。巷では「スリッパ」と呼ぶらしいです。スリッパの取り付けはこの動画を参考にしました。

3. CPUクーラー(Noctua)

これの説明書に従い、先で取り付けたCPUの上に大層なファンを装着します。

4. メモリ(HyperX Predator)、SSD(Intel)

マザーボードの説明書に従って取り付けます。

ここまでで一旦マザーボード上の作業は終わり。

5. 本体ケース(Thermaltake)

この説明書と取り付けるもの(マザーボード、電源ユニットetc)の説明書を見比べながら、取り付けていきます。

6. 電源ユニット(Corsair)

ファンの風が外に向くよう、本体ケースに取り付けます。線はまだ。

マザーボードも取り付けます。慎重に。

7. グラフィックボード(Sapphire)

これも取り付けます。

最後に

配線して、蓋して終わりです。配線はマザーボード、電源ユニット、本体ケースの説明書を熟読。

ちなみに、USB3.0のケーブルを差す箇所に「USB31G1_910」と「USB31G1_1112」があり、違いが分からずハマりました。"USB31G1"というのは「USB 3.1 Gen1」を意味し、3.0でも問題ないのですが、"910"と"1112"は何かのバージョンかと必死に調べました。結果、表側にUSBポートが8個あったので、ただの9番10番、11番12番ということだったようです。(なので910が正解)

終わりに

ということで(途中だいぶ省きましたが)、ベルリンオフィスでは第8の社員が絶賛マイニングしてくれています。

あなたも、第9の社員になりませんか?


クラスメソッドでは、日本、バンクーバー、ベルリンで一緒に働く仲間を募集しています!
採用情報 | クラスメソッド株式会社

関連記事