
著者: ジェイムソン・ロップ
関連書籍:
元のリンク:
https://blog.lopp.net/bitcoins-security-model-a-deep-dive/
関連書籍:最初のレベルのタイトル
セキュリティモデルの誤解
さらに、すべてのブロックチェーン システムは、ジェネシス ブロックをノード ソフトウェアにハードコードします。 「共有履歴」(台帳など)を一種の社会契約と考えるかもしれません。ブロックが十分に古いものになると、ネットワーク内のすべての参加者の間で、そのブロックは決してロールバックされないという合意が形成されます。開発者が以前にマイニングされたブロックを取得し、それを使用してチェックポイントを作成する場合、それは歴史の客観的な説明というよりも、受け入れられた健全性チェックになります。
チェックポイント設定に加えて、ノードがセルフブートをどのように実装するかも問題です。現在、ビットコイン ノードのブートストラップ プロセスでは、ノードが以前にピアから学習したデータをローカルに保存しているかどうかを確認します。そうでない場合、ノードはソフトウェアにハードコードされている一連の「DNS シード」を照会します。これらのシードは、適切に接続されたビットコイン ノードのリストを維持し、このリストをノードに返す役割を果たします。
コードからわかるように、Bitcoin Core 0.13 は現在、Pieter Wuille、Matt Corallo、Luke Dashjr、Christian Decker、Jeff Garzik、Jonas Schnelli によって運営されている DNS シードを使用しています。 Pieter Wuille の Bitcoin シード生成ソフトウェアまたは Matt Corallo のソフトウェアを使用すれば、誰でも DNS シードを実行できます。ただし、完全なノード実装の開発者を説得して、自社の DNS シード ホストを相手のソフトウェアに追加する必要があります。
新しいノードのブートストラップ プロセスは 6 つの DNS シードのみに依存していますが、これも非常に集中化された単一点の問題であると思われます。ただし、ビットコインのセキュリティ モデルでは、誠実なピア ノードに接続することだけが必要であり、Sybil 攻撃に十分抵抗できることを忘れないでください。
したがって、新しいノードは、誠実なノードの IP アドレスを返す、侵害されていない DNS シードに接続できれば十分です。ただし、何らかの理由ですべての DNS ノードに到達できなくなった場合には、フォールバックが行われます。これは、ソフトウェアにハードコーディングされ、新しいリリースごとに更新される信頼できるノードの IP アドレスのリストです。
最初のレベルのタイトル
絶対的な安全性はない
より深いレベルで言えば、フルノードを実行すると、実行しているハードウェアとソフトウェアをある程度信頼することになります。
写真
最初のレベルのタイトル
ビットコインの分散型チェックアンドバランス
ビットコイン システム内のさまざまな関係者間の関係を調べ始めると、霧の中にいることに気づくかもしれません。
フルノードを実行する目的は、財務主権を保護することです。これが意味するのは、特定のバージョンのソフトウェアをインストールして実行すると、そのソフトウェアおよび他のすべてのネットワーク参加者と契約を結ぶことになります。ソフトウェアのルールに従うだけでなく、他のネットワーク参加者もこれらのルールに従う必要があります。続いて。
したがって、ソフトウェアのルールに下位互換性のない変更を加えたい場合は、新しいバージョンのソフトウェアを実行して、それらのルールの変更に対する明示的な同意を表明する必要があります。一方、下位互換性のあるルール変更の場合は、同意しない場合でもネットワーク内で強制することができます。
写真
ビットコインガバナンスの 3 つの主な部門:
フルノード (マイナーと開発者を拒否できます)
マイナー(開発者に拒否権を与えることができる)
開発者 (他の人が特定の拒否権を回避できるように支援できます)
フルノード ソフトウェアは自動的に更新されないことに注意してください。これは仕様です。自動更新は力のバランスを開発者に有利に傾け、開発者がノードやマイナーの許可なしにルール変更を強制できるようにします。
残念なことに、ルールの変更は技術レベルでは下位互換性があるかもしれませんが、長年の経験から、十分に創造的なソフトフォークは古いバージョンのルールに違反する変更も実装できることがわかっています。たとえば、ヴィタリック・ブテリン氏はかつてこのようなアイデアについて言及しました。ソフトフォークによってビットコインのブロック時間が 10 分から 2 分に短縮され、必然的にビットコインの発行がスピードアップします。
不利なソフト フォークに直面した場合、フル ノードには切り札があります。それは、ハード フォークを使用して、ソフト フォークをサポートする他のマイナーと明確な一線を引くことです。これは(仕様上)強制するのが難しく、コンセンサスを測定し、経済的重要性の高いノードを見つける方法について多くの疑問が生じます。
技術的には、このようなハード フォークは、マイニング アルゴリズムをダブル SHA256 から別のハッシュ関数に変更することで実現できます。成功すると、すべての SHA256 ASIC マイナーはビットコインをマイニングできなくなります。したがって、ノードオペレーターはビットコインエコシステムの変化に常に注意を払い、マイナーに権限を超えた場合に交代されるリスクを思い出させる必要があります。
最初のレベルのタイトル
SPVセキュリティ
ビットコイン ユーザーの多くは、強力なセキュリティを提供しながら消費するリソースがはるかに少ないため、フル ノードではなく軽量クライアントを使用してネットワークにアクセスします。
写真
サトシ・ナカモト氏はホワイトペーパーの中で、SPVクライアントは「トランザクション自体を検証することはできないが、トランザクションをブロックチェーンに関連付けることによって、ネットワーク内のノードがトランザクションを受け入れたことを確認できる。ブロックがブロックされている場合、ますます多くの地区がそのトランザクションを受け入れたことを確認できる」と述べている。チェーン上では、ネットワークがトランザクションを受け入れたことをさらに確認します。」 SPV は、X ブロックの確認後の取引の改ざんには多大なコストがかかると想定しています。
SPV はフル ノードと同じくらい安全であるように見えますが、追加の前提条件が導入されています。つまり、ブロック ヘッダーとプルーフ オブ ワークが有効である限り、それに含まれるすべてのトランザクションも有効です。 SPV クライアントは、このペーパーのセクション 1 で説明したすべてのコンセンサス ルールを検証するわけではないため、トランザクション クエリ リクエストに応答するノードがコンセンサス ルールをすでに検証していると想定します。
もう 1 つの小さなセキュリティ上の違いは、ピアがユーザーからの情報を差し控える可能性があることです。フルノードを実行すると、ピアは未確認のトランザクションとブロックをあなたから隠すことができます。ただし、ピアからブロックを取得すると、誰もそのブロック内のトランザクションをあなたから隠すことはできなくなります。一方、SPV クライアントを実行している場合は、ピアがブロック ヘッダーを提供し、対応するブロック内のトランザクションを保留する可能性があります。
SPV クライアントは、アドレスの関連トランザクションをクエリできます。ピアが偽のトランザクションで SPV クライアントを騙すのはコストがかかりますが (十分な PoW でブロックをマイニングする必要がある)、ピアは、SPV クライアントがトランザクションのクエリに使用するブルーム フィルター (ブルーム フィルター) に結果がなかったと嘘をつくことができます。もう 1 つの注意すべき点は、SPV はブルーム フィルターの欠陥により重大なプライバシー侵害に悩まされていることです。
BitcoinJ には、SPV のセキュリティ モデルに関する優れた記事があります。未確認の取引については、次のように述べています。
SPV モードでは、接続しているノードがトランザクションを転送している限り、トランザクションが有効であると信じることしかできません。攻撃者が、あなたが接続しているノードがすべて自分のものであることを確認できれば、完全に無効なトランザクション (存在しないお金を使う) をあなたに送信することができ、あなたはこのトランザクションが有効であることを受け入れることになります。
最初のレベルのタイトル
ビットコインネットワークには127.0.0.1がありません
フルノードを実行していない場合 (実際にトランザクションの検証にノードを使用している場合)、少なくともある程度はサードパーティを信頼していることになり、セキュリティ モデルに違いが生じます。これは、すべてのユーザーと企業が Bitcoin Core の RPC API 上にソフトウェアを直接構築することを必要とするわけではないことに注意してください。
代替インフラストラクチャ構成には次のものがありますが、これらに限定されません。
写真
2) SPV ノード ライブラリ (BitcoinJ など) 上にアプリケーションを構築し、これらのアプリケーションが独自のフル ノードにのみ接続するように設定します。 BitcoinJ では、独自の SeedPeer を定義し、初期化中にそれを PeerGroup に渡すことでこれを実現できます。 libbitcoin を使用すると、この例を使用して特定のノードへのネットワーク接続を定義できます。
フルノード: 自由のために
フルノード: 自由のために
明らかに、独自のフル ノードを実行するのが最も安全なオプションであり、必要な前提条件は最小限です。信頼性の高いフル ノードを実行できるコンピュータを構築するには、わずか数百ドルしかかかりません。自分の経済主権を守るためにお金を払う価値があるかどうかを計算して判断したほうがよいでしょう。
この記事に対するレビューとフィードバックを提供してくれた Kristov Atlas、Eric Martindale、Andrew Miller、Kiara Roble に感謝します。