More Related Content
Similar to 51% 攻撃の原理とシミュレーション (20)
More from Yuto Takei (20)
51% 攻撃の原理とシミュレーション
- 1. 51% 攻撃の原理とシミュレーション
竹井 悠人 (@yutopio_ja)
ソフトウェア エンジニア
株式会社 bitFlyer
2018/11/19 blockchain.tokyo #14
https://blockchain-tokyo.connpass.com/event/105918/
- 3. 自己紹介
竹井 悠人
Yuto Takei C# 大好き一筋 17 年 / 筋トレ勢
いまさらポケモンにはまってます
大学生になりました
投げ銭いつでもウェルカム
Software Engineer / CISO
- 15. 誰を (合意形成の) 参加者とするかの違いで次に分類できる
● パブリック型
常に、不特定多数の人が、新たに参加したり、離脱したりできる
● それ以外 (プライベート型 / コンソーシアム型 etc.)
合意形成をはじめる段階で、参加者が特定されている
とはいえ、パブリック ブロックチェーンを閉じたネットワークに構築したり、
ブロックチェーン外の認証機構をつけたりすることで、「プライベート
ブロックチェーン」として運用することもしばしば ...
非機能要件のひとつ
● 参加者が一定のルールに従って書き込むことができる
の参加者って誰?
参加者の定義
- 20. ブロック内に Nonce と呼ばれる自由領域を用意し、ハッシュ値を調整できるようにした上で、ブロック
のダイジェストは先頭に0 が一定数続かなければいけないというルールを課した。ネットワークの計
算力に応じて、この数を調整することにした。(正確には difficulty パラメータによってダイジェスト値の最大値を指定)
ブロック作成者 (マイナー) は、上記のルールを満たすNonce を探さなければいけない。代わりに、
報酬をもらうことができる
専用ハードウェアにより現在は全世界で 1 秒間に 600 京回 (6×1018
) のダイジェスト計算が
行われている。10 分に一度の確率にするには 36 垓回に 1 回だけ成功するように調整
しなければいけない。これは先頭に 0 が 18 個続くのと同じ難易度
Nonce
1001
1002
1003
1004
1005
ブロック ダイジェスト
5b280ff64934df39…
4b33b9d69b6c53f1…
9fc09514d74d5d78…
f181b5ef17bdeaf2…
000000063f0d8704…
Proof of Work のおさらい
前ブロック …
日時 2009/1/3 …
Nonce ?????
トランザクション ID
… OK
前ブロック …
日時 2009/1/3 …
Nonce 1005
トランザクション ID
…
- 22. 51% 攻撃
Proof of Work の仕組みを利用して、支払いをなかったことにしてしまう攻撃
● 最長チェーンと信じられているチェーン (メイン チェーン) 上に投資されてきた計算
資源を上回る計算資源で、別の分岐したチェーンを作ってしまう
● 別のチェーンがネットワークにブロードキャストされるとチェーン再構成 (reorg) が
発生して、元のメイン チェーンは無効になる
● 取引所にコインを送金し、法定通貨に換金して引き出したあと、reorg させてコイン
を手元に残しつつ、同価値の法定通貨を手に入れる
- 24. 51% 攻撃の実例など
● Bitcoin Gold
● MONA コイン
取引所では、コインの入金トランザクションが十分に安定したとみなすまで、取引を保留
扱いとして、攻撃が行われるのを防いでいる
攻撃にかかるコストを確認できる Web サイトもある
https://crypto51.app/
- 26. MinChain について
教育用ブロックチェーンとして Bitcoin を参考に作成したブロックチェーン
https://github.com/yutopio/MinChain
● 約 2,000 行程度の C# で実装
● MessagePack によるブロックやトランザクションのシリアライズ
● Proof of Work によるコンセンサス アルゴリズム
● 簡単なマイニング アルゴリズムの実装
● MIT License に基づく再利用・頒布可
- 29. 鍵を生成する
ビルドしたバイナリがいるディレクトリに移動して実行
$ dotnet MinChain.dll genkey > key.json (自分のアドレス用の口座を作成する)
$ cat key.json
{
"pub": "WAAAAAEAAAAQAAAANAAAACAAAAAEj0MOwNeLA9b4gXYbURcyF5c8YPtZekJcliWafKduNy
AAAAACMFgRiBxSiu3wB3/g3biz9UN8zvNGI2n/HIg88EVn8A==",
"prv": "D4TuwVREhf5T3GTs4Y1psaUoHHKy3hb4gllunB2x5l8=",
"addr": "MDyDMxi1ynxe1206ANBRXWOjP7o/IeQHakRDilyYrtI="
}
- 30. Genesis ブロックを作る
$ dotnet MinChain.dll genesis key.json genesis.bin
Creating new genesis block.
{
"id": "00011702146098209132fa4990686f41f3e6b9859c607c1e5c93c0204ff9d8ec",
"prev": "0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": 2E-05,
"nonce": 2538555750346862341,
"timestamp": "2017-03-10T09:20:20.2375851Z",
"root": "DS5gHGHSJh0f5qmxgk2PDuI6a7J4LZ7pfy3K6JorH8U=",
"height": 0,
"txs": [
{
"id": "e44e859fe93bf48652b2dfc2386d987e544940f768379779da631fcd7206ac66",
"timestamp": "2017-03-10T09:20:19.5205851Z",
"in": [],
"out": [
{
"to": "303c833318b5ca7c5ed76d3a00d0515d63a33fba3f21e4076a44438a5c98aed2",
"val": 1000000
}
... (略)
key.json 記載のアドレスに
マイニング報酬を送るような
原始ブロックを作成し
genesis.bin に保存する
マイニングするので
少し時間かかる
- 31. config を作成する
$ dotnet MinChain.dll config > config.json
$ cat config.json
{
"listen": "0.0.0.0:9333",
"peers": [
"127.0.0.1:9333"
],
"keypair": "<YOUR OWN KEYPAIR>.json",
"genesis": "<GENESIS BLOCK>.bin"
}
前のステップで生成した
鍵ペアファイル (key.json) と
原始ブロック (genesis.bin) とに
それぞれ、ファイル名を変える
- 35. まとめ
● ブロックチェーンは、分散データベースである
○ 合意形成アルゴリズムが必要
○ 参加者の定義: 不特定多数か否か、によってパブリック型かどうかが変わる
○ ビザンチン耐性を備えた合意形成を用いるのが一般的
● 51% 攻撃
○ Proof of Work で可能な攻撃
○ 攻撃者が長いチェーンを作成し、一気に放出するだけ
○ 成功すると、意図的に取引をなかったことにできてしまう
● MinChain
○ https://github.com/yutopio/MinChain
○ Bitcoin タイプのブロックチェーンの簡単なモデル
○ attack ブランチに、攻撃のシミュレーションが入っている