hacktricks/blockchain/blockchain-and-crypto-currencies/README.md

212 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<details>
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
HackTricksをサポートする他の方法
* **HackTricksで企業を宣伝する**または**HackTricksをPDFでダウンロードする**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASSHackTricksスワッグ**](https://peass.creator-spring.com)を入手する
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
* **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[Telegramグループ](https://t.me/peass)に参加するか、**Twitter**で**フォロー**する🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* **ハッキングトリックを共有するためにPRを提出して** [**HackTricks**](https://github.com/carlospolop/hacktricks) **と** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに**
</details>
# 基本用語
* **スマートコントラクト**: スマートコントラクトは、**特定の条件が満たされたときに実行されるブロックチェーン上のプログラム**です。通常、**合意**の**実行**を自動化するために使用され、すべての参加者が中間業者の関与や時間の損失なしに即座に結果を確認できます([ここから](https://www.ibm.com/topics/smart-contracts))。
* 基本的に、スマートコントラクトは、人々が契約にアクセスして受け入れるときに実行される**コード**です。スマートコントラクトは**ブロックチェーンで実行**され(その結果は不変に保存され)、人々がそれを受け入れる前に読むことができます。
* **dApps**: **分散型アプリケーション**は、**スマートコントラクト**の上に実装されます。通常、ユーザーがアプリとやり取りできるフロントエンドがあり、**バックエンド**は公開されています(したがって監査可能)し、**スマートコントラクト**として実装されています。場合によっては、データベースの使用が必要ですが、Ethereumブロックチェーンは各アカウントに一定のストレージを割り当てます。
* **トークン&コイン**: **コイン**は**デジタル通貨**として機能し、**トークン**は**何らかの価値を表す**ものですが、コインではありません。
* **ユーティリティトークン**: これらのトークンは、ユーザーが**後で特定のサービスにアクセス**できるようにします(特定の環境で価値を持つものです)。
* **セキュリティトークン**: これらは**所有権**またはある資産を表します。
* **DeFi**: **分散型ファイナンス**
* **DEX: 分散型取引所プラットフォーム**。
* **DAOs**: **分散型自治組織**
# コンセンサスメカニズム
ブロックチェーントランザクションが認識されるためには、それが**ブロックチェーンに追加**される必要があります。検証者(マイナー)がこれを行います。ほとんどのプロトコルでは、これを行うと**報酬を受け取ります**。ブロックチェーンが安全であるためには、**悪意のあるユーザーやグループが検証の大部分を占有するのを防ぐメカニズム**が必要です。
Proof of workは、よく使われるコンセンサスメカニズムで、トランザクションを検証するために計算能力の検証を使用し、潜在的な攻撃者が検証者ネットワークの計算能力の大部分を取得する必要があります。
## Proof Of WorkPoW
これは、トランザクションを検証するために**計算能力の検証**を使用し、潜在的な攻撃者が検証者ネットワークの計算能力の大部分を取得する必要があるメカニズムです。\
**マイナー**は**いくつかのトランザクションを選択**し、その後**Proof Of Workの計算を開始**します。**最も多くの計算リソースを持つマイナー**がProof of Workを**早く完了**し、すべてのトランザクションの手数料を受け取る可能性が高くなります。
## Proof Of StakePoS
PoSは、検証者が一定量のブロックチェーントークンを持っていることを要求することで、**潜在的な攻撃者が攻撃を行うためにはブロックチェーン上のトークンの大部分を取得する必要がある**ようにします。\
この種のコンセンサスでは、マイナーが持っているトークンが多いほど、そのマイナーが次のブロックを作成する可能性が高くなります。\
PoWと比較して、これによりマイナーが消費するエネルギーが大幅に**削減**されます。
# Bitcoin
## トランザクション
単純な**トランザクション**は、アドレスから別のアドレスへの**資金移動**です。\
Bitcoinの**アドレス**は**公開鍵**のハッシュであり、したがって、アドレスからトランザクションを行うためには、その公開鍵(アドレス)に関連付けられた秘密鍵を知っている必要があります。\
その後、**トランザクション**が実行されると、そのトランザクションはアドレスの秘密鍵で**署名**され、トランザクションが**正当であることを示します**。
Bitcoinでデジタル署名を生成する最初の部分は、次のように数学的に表現できます\
_**Sig**_ = _**Fsig**_(_**Fhash**_(_**m**_),_**dA**_)
ここで:
* \_d\_Aは署名**秘密鍵**です
* _m_は**トランザクション**です
* Fhashはハッシュ関数
* Fsigは署名アルゴリズム
* Sigは生成された署名
署名関数Fsigは、RとSの2つの値からなる署名Sigを生成します。
RとSが計算されたら、それらはDERDistinguished Encoding Rulesとして知られる国際標準エンコーディングスキームを使用してエンコードされたバイトストリームに直列化されます。署名が有効であることを検証するには、署名検証アルゴリズムが使用されます。デジタル署名の検証には、次のものが必要です
* 署名RとS
* トランザクションハッシュ
* 署名を作成するために使用された秘密鍵に対応する公開鍵
署名の検証は、トランザクションの所有者であるのは秘密鍵の所有者だけであり、トランザクションに対して署名を生成できるのはその秘密鍵の所有者だけであることを効果的に意味します。署名検証アルゴリズムは、署名が実際に有効である場合に「TRUE」を返します。
### マルチシグネチャトランザクション
マルチシグネチャ**アドレス**は、複数のECDSA秘密鍵に関連付けられたアドレスです。最も単純なタイプはm-of-nアドレスで、n個の秘密鍵に関連付けられており、このアドレスからビットコインを送信するには、少なくともm個の鍵からの署名が必要です。マルチシグネチャ**トランザクション**は、マルチシグネチャアドレスから資金を送信するトランザクションです。
### トランザクションフィールド
各ビットコイントランザクションにはいくつかのフィールドがあります:
* **Inputs**: **ビットコイン**が**送信元**の**金額**とアドレス
* **Outputs**: 各**出力**に**転送される**アドレスと金額
* **Fee:** トランザクションの**マイナーに支払われる**金額
* **Script\_sig**: トランザクションのスクリプト署名
* **Script\_type**: トランザクションのタイプ
**2つの主要なタイプ**のトランザクションがあります:
* **P2PKH: "公開鍵ハッシュへ支払う"**: これがトランザクションが行われる方法です。**送信者**に、有効な**署名**(秘密鍵から)と**公開鍵**を提供することを要求します。トランザクションの出力スクリプトは、署名と公開鍵を使用し、いくつかの暗号関数を介して**公開鍵ハッシュと一致するか**を確認し、一致する場合は**資金が使える**ようになります。この方法は、追加のセキュリティのために公開鍵をハッシュ形式で隠します。
* **P2SH: "スクリプトハッシュへ支払う"**: トランザクションの出力は、単に**スクリプト**(つまり、このお金を送りたい人がスクリプトを送信する)であり、特定のパラメータで実行されると`true`または`false`のブール値が結果として得られます。マイナーが提供されたパラメータで出力スクリプトを実行し、`true`になると、**お金は希望の出力に送信**されます。 `P2SH`は**マルチシグネチャ**ウォレットに使用され、トランザクションを受け入れる前に**複数の署名をチェックするロジック**を出力スクリプトに作成します。 `P2SH`は、誰でも、または誰もが資金を使えるようにするためにも使用できます。 P2SHトランザクションの出力スクリプトが単に`true`の場合、パラメータを提供せずに出力を使おうとすると、結果が`1`になり、誰でもが使えるようになります。これは、`0`を返すスクリプトにも適用され、出力が誰にも使えないようになります。
## Lightning Network
このプロトコルは、**チャネルに複数のトランザクションを実行**し、**最終状態**をブロックチェーンに保存するだけで**送信**します。\
これにより、Bitcoinブロックチェーンの**スピードが向上**し1秒あたり7回の支払いしか許可されない、Bitcoinブロックチェーンのードを介してチャネルが作成されるため、**追跡が難しいトランザクションを作成**できます:
![](<../../.gitbook/assets/image (611).png>)
Lightning Networkの通常の使用方法は、関連するベースブロックチェーンレイヤー1に資金トランザクションをコミットすることによって**支払いチャネルを開設**し、その後、ブロックチェーンに**ブロードキャストせずにチャネルの資金の仮分配を更新する**任意の数のLightning Network **トランザクション**を行い、最終的な**決済トランザクションの最終バージョンをブロードキャスト**してチャネルの資金を分配することによって**支払いチャネルを閉じる**ことです。
チャネルの両方のメンバーは、いつでも停止してチャネルの最終状態をブロックチェーンに送信できます。
# Bitcoinプライバシー攻撃
## 共通の入力
理論的には、1つのトランザクションの入力は異なるユーザーに属する可能性がありますが、実際には追加の手順が必要です。したがって、非常に頻繁に**同じトランザクション内の2つの入力アドレスは同じ所有者に属すると仮定**されることがあります。
## UTXOのおつりア
```
2 btc --> 4 btc
3 btc 1 btc
```
仮定されるのは、出力の1つがおつりであり、もう1つの出力が支払いであるとします。2つの解釈があります: 支払い出力は4 BTC出力または1 BTC出力のいずれかです。しかし、1 BTC出力が支払い金額である場合、3 BTC入力は不要です。なぜなら、ウォレットは2 BTC入力のみを使って支払いを行い、より低いマイナー手数料を支払うことができたからです。これは、実際の支払い出力が4 BTCであり、1 BTCがおつり出力であることを示しています。
これは、複数の入力を持つトランザクションに対する問題です。このリークを修正する方法の1つは、おつり出力がどの入力よりも高い値になるように、より多くの入力を追加することです。例えば:
```
2 btc --> 4 btc
3 btc 6 btc
5 btc
```
## 強制アドレス再利用
**強制アドレス再利用**または**インセンティブ付きアドレス再利用**は、敵対者がビットコインの少額を支払って、すでにブロックチェーンで使用されたアドレスに支払うことです。敵対者は、ユーザーまたは彼らのウォレットソフトウェアがこれらの支払いを大きな取引の入力として使用し、共通の入力所有ヒューリスティックを介して他のアドレスを明らかにすることを期待しています。これらの支払いは、アドレス所有者を意図しないアドレス再利用に強制する手段として理解できます。
この攻撃は、時々**ダスト攻撃**と誤って呼ばれます。
ウォレットの正しい振る舞いは、すでに使用された空のアドレスに着地したコインを使わないことです。
## その他のブロックチェーン分析
* **正確な支払額**: おつりのない取引を避けるためには、支払いはUTXOと等しくなければなりませんこれは非常に予期しないことです。したがって、**おつりのないアドレス間の取引はおそらく同じユーザーの2つのアドレス間の転送**である可能性が高いです。
* **丸められた数値**: 取引で、出力の1つが「**丸められた数値**」である場合、これはおそらくその「丸められた数値」の価格を設定した人への**支払い**であるため、もう一方は残りの部分である可能性が高いです。
* **ウォレットのフィンガープリント**: 慎重な分析者は、異なるウォレットソフトウェアが常にまったく同じ方法で取引を作成しないため、特定の取引を作成したソフトウェアを推測することがあります。ウォレットのフィンガープリントは、おつりの出力を検出するために使用できます。おつりの出力は、同じウォレットのフィンガープリントで使われるものです。
* **金額とタイミングの相関**: 取引を行った人が取引の**時間**や**金額**を開示すると、それは簡単に**発見**される可能性があります。
## トラフィック分析
いくつかの組織があなたのトラフィックを**スニッフィング**していると、ビットコインネットワークで通信しているのを見ることができます。\
敵対者が、以前に入力されていなかったトランザクションやブロックがあなたのードから出てくるのを見ると、そのトランザクションがあなたによって行われたか、ブロックがあなたによって採掘されたことをほぼ確実に知ることができます。インターネット接続が関係しているため、敵対者はIPアドレスを発見したビットコイン情報と関連付けることができます。
インターネットトラフィックをすべてスニッフィングすることができない攻撃者でも、**多くのビットコインノード**を持っていることで**ソースに近づく**ことができ、トランザクションやブロックを発表しているIPアドレスを知ることができるかもしれません。\
また、一部のウォレットは、未確認のトランザクションを定期的に再放送するため、ネットワーク全体に広まりやすくなり、採掘されやすくなります。
## アドレス所有者の情報を見つけるためのその他の攻撃
より多くの攻撃については、[https://en.bitcoin.it/wiki/Privacy](https://en.bitcoin.it/wiki/Privacy)を参照してください。
# 匿名ビットコイン
## 匿名でビットコインを入手する
* **現金取引**: 現金を使ってビットコインを購入します。
* **現金代替**: ギフトカードなどを購入し、オンラインでビットコインと交換します。
* **マイニング**: マイニングはビットコインを入手する最も匿名性の高い方法です。これは、[マイニングプール](https://en.bitcoin.it/wiki/Pooled\_mining)が一般的にハッシャーのIPアドレスを知っているため、ソロマイニングにも当てはまります。
* **窃盗**: 理論的には、匿名ビットコインを入手する別の方法は窃盗することです。
## ミキサー
ユーザーは**ビットコインをミキシングサービスに送信**し、サービスは**異なるビットコインをユーザーに返送**します(手数料を差し引いた状態)。理論的には、ブロックチェーンを観察している敵対者は、着信と送信のトランザクションを**リンク**することができません。
ただし、ユーザーはミキシングサービスがビットコインを返送し、また受け取ったお金と送金の関係についてのログを保存していないことを信頼する必要があります。\
Bitcoinカジなど、他のサービスもミキサーとして使用できます。
## CoinJoin
**CoinJoin**は、異なるユーザーの複数の取引を1つに混合して、外部の観察者が**どの入力がどの出力に関連しているか**を見つけにくくするためのものです。\
これは新しいプライバシーレベルを提供しますが、**一部の取引**では、一部の入力と出力の金額が相関しているか、他の入力と出力と非常に異なる場合は、**外部の観察者によって依然として相関付けられる**可能性があります。
ビットコインのブロックチェーン上でおそらくCoinJoinトランザクションIDの例は、`402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a`と`85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`です。
[**https://coinjoin.io/en**](https://coinjoin.io/en)\
**CoinJoinに類似したもので、イーサリアム向けには** [**Tornado Cash**](https://tornado.cash) **(お金はマイナーから提供されるため、ウォレットに表示されるだけです)。**
## PayJoin
前のセクションで議論されたCoinJoinのタイプは、同じ値を持つ複数の出力をチェックすることで簡単に特定できます。
PayJoinまたは支払先エンドポイントまたはP2EPとも呼ばれるは、2つの当事者間で行われる特別なCoinJoinであり、一方の当事者が他方に支払います。そのトランザクションには、**同じ値を持つ複数の出力がない**ため、平等な出力のCoinJoinとして明らかに見えません。このトランザクションを考慮してください。
```
2 btc --> 3 btc
5 btc 4 btc
```
# Bitcoinプライバシーの良い実践方法
## ウォレットの同期
Bitcoinウォレットは、自分の残高や履歴に関する情報をどこかから取得する必要があります。2018年末時点で、最も実用的でプライバシーが保護された既存の解決策は、**フルノードウォレット**(最大限にプライベート)と**クライアントサイドブロックフィルタリング**(非常に優れている)を使用することです。
- **フルノード:** フルノードは、ビットコインでこれまでに行われたすべてのオンチェーン[トランザクション](https://en.bitcoin.it/wiki/Transaction)を含むブロックチェーン全体をダウンロードします。したがって、ユーザーのインターネット接続を監視している敵対者は、ユーザーが関心を持っているトランザクションやアドレスを知ることができません。
- **クライアントサイドブロックフィルタリング:** クライアントサイドブロックフィルタリングは、ブロック内のすべてのトランザクションのアドレスを含む**フィルター**を作成することで機能します。フィルターは、要素がセット内にあるかどうかをテストできます。誤検知は可能ですが、誤検出はありません。軽量ウォレットは、**ブロックチェーン**内のすべての**ブロック**のフィルターをダウンロードし、自分自身の**アドレス**と一致するかどうかを確認します。一致するブロックはピアツーピアネットワークから完全にダウンロードされ、これらのブロックはウォレットの履歴と現在の残高を取得するために使用されます。
## Tor
Bitcoinネットワークはピアツーピアネットワークを使用しているため、他のピアはあなたのIPアドレスを知ることができます。これが、**ビットコインネットワークとやり取りする際に毎回Torを介して接続することをお勧めする理由**です。
## アドレス再利用の回避
**アドレスを複数回使用することは、プライバシーに非常に損害を与えます。なぜなら、それにより同じエンティティによって作成されたことの証拠とともに、より多くのブロックチェーントランザクションがリンクされるからです**。Bitcoinを最もプライベートで安全に使用する方法は、**支払いを行うたびに支払いを行う相手に新しいアドレスを送信する**ことです。受け取ったコインを使った後は、そのアドレスを二度と使用しないでください。また、Bitcoinを送信する際には新しいBitcoinアドレスを要求するべきです。すべての優れたBitcoinウォレットには、アドレス再利用を des discourages するユーザーインターフェースがあります。
## 複数のトランザクション
**1つのチェーン上のトランザクションを複数回行う**ことは、金額に基づくプライバシー攻撃金額の相関や丸められた数値などの影響を大幅に軽減することができます。たとえば、ユーザーが誰かに5 BTCを支払いたいが、5 BTCの価値が簡単に検索されたくない場合、2 BTCと3 BTCの2つのトランザクションを送信して、合計5 BTCにすることができます。
## おつりの回避
おつりの回避とは、トランザクションのインプットとアウトプットが慎重に選択され、全くおつりが必要ないようにすることです。**おつりのアウトプットがないことは、プライバシーにとって優れています**。これはおつりの検出ヒューリスティックを破るためです。
## 複数のおつりのアウトプット
おつりの回避が選択肢でない場合、**1つ以上のおつりのアウトプットを作成することでプライバシーを向上させる**ことができます。これは通常のより多くのブロックスペースを使用するため、おつりの回避が望ましいです。