# Blockchain & Crypto Currencies

<details>

<summary><strong>从零开始学习AWS黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE（HackTricks AWS红队专家）</strong></a><strong>！</strong></summary>

支持HackTricks的其他方式：

* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**，请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family)，我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。

</details>

## 基本术语

* **智能合约**：智能合约简单地说就是**存储在区块链上的程序**，当满足预定条件时运行。它们通常用于自动化**协议的执行**，以便所有参与者可以立即确定结果，无需任何中介的参与或时间损失。（来源：[这里](https://www.ibm.com/topics/smart-contracts)）。
* 基本上，智能合约是一段**代码**，当人们访问并接受合约时将被执行。智能合约**在区块链上运行**（因此结果被存储为不可变），人们可以在接受之前阅读它们。
* **dApps**：**去中心化应用程序**是在**智能合约**之上实现的。它们通常具有用户可以与应用程序交互的前端，**后端**是公开的（因此可以进行审计）并且实现为**智能合约**。有时需要使用数据库，以太坊区块链为每个帐户分配一定的存储空间。
* **代币和硬币**：**硬币**是一种作为**数字货币**的加密货币，而**代币**是代表一些**价值**但不是硬币的东西。
* **实用性代币**：这些代币允许用户**稍后访问某些服务**（在特定环境中具有某些价值）。
* **安全性代币**：这些代表**所有权**或某些资产。
* **DeFi**：**去中心化金融**。
* **DEX：去中心化交易平台**。
* **DAOs**：**去中心化自治组织**。

## 共识机制

要使区块链交易得到承认，必须将其**附加**到**区块链**上。验证者（矿工）执行此附加操作；在大多数协议中，他们**为此获得奖励**。为了保持区块链的安全性，必须有一种机制来**防止恶意用户或组织接管大多数验证**。

工作量证明，另一种常用的共识机制，使用计算能力的验证来验证交易，要求潜在攻击者获取验证者网络大部分计算能力的大部分。

### 工作量证明（PoW）

这使用**计算能力验证**来验证交易，要求潜在攻击者获取验证者网络大部分计算能力的大部分。\
**矿工**将**选择几笔交易**，然后开始**计算工作量证明**。**具有最大计算资源的矿工**更有可能**更早完成**工作量证明并获得所有交易的费用。

### 权益证明（PoS）

PoS通过**要求验证者拥有一定数量的区块链代币**来实现这一点，要求**潜在攻击者获取区块链上大部分代币**以发动攻击。\
在这种共识机制中，矿工拥有的代币越多，矿工被要求创建下一个区块的可能性就越大。\
与PoW相比，这大大**减少了矿工消耗的能量**。

## 比特币

### 交易

简单的**交易**是从一个地址向另一个地址的**资金转移**。\
在比特币中，一个**地址**是**公钥**的哈希值，因此，为了从地址进行交易，某人需要知道与该公钥（地址）关联的私钥。\
然后，当执行**交易**时，它会使用地址的私钥进行**签名**，以显示交易的**合法性**。

在比特币中生成数字签名的第一部分可以用以下数学方式表示：\
\&#xNAN;***Sig*** = ***Fsig***(***Fhash***(***m***),***dA***)

其中：

* \_d\_A是签名**私钥**
* \_m\_是**交易**
* Fhash是哈希函数
* Fsig是签名算法
* Sig是生成的签名

签名函数（Fsig）生成一个包含两个值R和S的签名：

* Sig = (R, S)

一旦计算出R和S，它们将被序列化为一个字节流，然后使用称为Distinguished Encoding Rules（DER）的国际标准编码方案进行编码。为了验证签名的有效性，将使用签名验证算法。验证数字签名需要以下内容：

* 签名（R和S）
* 交易哈希
* 与用于创建交易签名的私钥对应的公钥

签名验证算法有效地意味着只有私钥的所有者（生成公钥的私钥）才能在交易上生成签名。如果签名有效，则签名验证算法将返回“TRUE”。

#### 多重签名交易

多重签名**地址**是与多个ECDSA私钥关联的地址。最简单的类型是m-of-n地址 - 它与n个私钥关联，并且从该地址发送比特币需要至少m个密钥的签名。多重签名**交易**是从多重签名地址发送资金的交易。

#### 交易字段

每个比特币交易都有几个字段：

* **输入**：**比特币**从哪个地址**转移**
* **输出**：转移到**每个**输出的地址和金额
* **费用**：支付给交易矿工的金额
* **Script\_sig**：交易的脚本签名
* **Script\_type**：交易类型

有**2种主要类型**的交易：

* **P2PKH：“支付到公钥哈希”**：这是交易的执行方式。您要求**发送方**提供有效的**签名**（来自私钥）和**公钥**。交易输出脚本将使用签名和公钥，并通过一些加密函数检查**是否与公钥哈希匹配**，如果匹配，则**资金**将是**可支配的**。这种方法将公钥以哈希形式隐藏，以提供额外的安全性。
* **P2SH：“支付到脚本哈希”**：交易的输出只是**脚本**（这意味着想要这笔钱的人发送一个脚本），如果**使用特定参数执行将导致布尔值为`true`或`false`**。如果矿工使用提供的参数运行输出脚本并结果为`true`，则**资金将发送到您想要的输出**。`P2SH`用于**多重签名**钱包，使输出脚本成为**在接受交易之前检查多个签名的逻辑**。`P2SH`也可用于允许任何人或没有人花费资金。如果P2SH交易的输出脚本只是`1`表示为true，则尝试在不提供参数的情况下花费输出将导致`1`，使尝试花费资金的任何人都可以花费。这也适用于返回`0`的脚本，使输出对任何人都不可花费。

### 闪电网络

该协议有助于**向通道执行多个交易**，并**仅**将**最终状态**发送到区块链以保存。\
这**提高了**比特币区块链的**速度**（每秒仅允许7笔支付），并允许创建**更难追踪的交易**，因为通道是通过比特币区块链的节点创建的：

![](https://615200056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F1DLBZdNLkY4FUHtMnjPr%2Fuploads%2Fgit-blob-a7091df83d34b7486055c0c06848b4964b0fccb8%2Fimage%20\(611\).png?alt=media)

闪电网络的正常使用包括通过向相关基础区块链（第1层）承诺资金交易来**打开支付通道**，然后进行**任意数量**的闪电网络**交易**，更新通道资金的暂定分配**而无需将其广播到区块链**，最后通过**广播**解决交易的**最终版本**来关闭支付通道以分配通道资金。

请注意，通道的任一成员都可以随时停止并将通道的最终状态发送到区块链。

## 比特币隐私攻击

### 共同输入

理论上，一笔交易的输入可以属于不同的用户，但实际上这是不常见的，因为这需要额外的步骤。因此，很多时候可以假定**同一笔交易中的2个输入地址属于同一所有者**。

### UTXO找零地址检测

**UTXO**表示**未花费的交易输出**（UTXOs）。在使用来自先前交易的输出作为输入的交易中，**整个输出需要被花费**（以避免双重花费攻击）。因此，如果意图是仅**发送**该输出的一部分资金到一个地址并**保留**另一部分资金，将会出现**2个不同的输出**：预期的输出和一个**随机新的找零地址**，剩余资金将保存在其中。

然后，观察者可以假设**生成的新找零地址属于UTXO的所有者**。

### 社交网络和论坛

一些人在互联网上的不同网站上提供有关他们比特币地址的数据。**这使得很容易识别地址的所有者**。

### 交易图

通过以图形方式表示交易，**有可能以一定概率知道账户资金的去向**。因此，可以了解与**区块链中相关的用户**的一些信息。

### **不必要的输入启发式**

也称为“最佳找零启发式”。考虑这笔比特币交易。它有两个价值分别为2 BTC和3 BTC的输入以及价值为4 BTC和1 BTC的两个输出。

```
2 btc --> 4 btc
3 btc     1 btc
```

假设其中一个输出是找零，另一个输出是支付。有两种解释：支付输出要么是4 BTC输出，要么是1 BTC输出。但如果1 BTC输出是支付金额，那么3 BTC输入就是不必要的，因为钱包本可以只花费2 BTC输入并支付更低的矿工费用。这表明真正的支付输出是4 BTC，而1 BTC是找零输出。

这对于具有多个输入的交易是一个问题。修复此泄漏的一种方法是添加更多输入，直到找零输出高于任何输入，例如：

```
2 btc --> 4 btc
3 btc     6 btc
5 btc
```

### 强制地址重用

**强制地址重用**或**激励地址重用**是指对已在区块链上使用过的地址支付（通常是小额）比特币的对手。对手希望用户或其钱包软件**将这些支付用作更大交易的输入，从而通过共同输入所有权**启发式揭示其他地址。这些支付可以被理解为一种迫使地址所有者无意中重用地址的方式。

这种攻击有时被错误地称为**尘埃攻击**。

钱包的正确行为是不要花费已经落入已使用空地址的硬币。

### 其他区块链分析

* **确切的支付金额**：为了避免带有找零的交易，支付需要等于UTXO（这是非常不寻常的）。因此，**没有找零地址的交易可能是同一用户之间的转账**。
* **整数金额**：在交易中，如果输出之一是“**整数金额**”，那么很可能这是**支付给将该“整数金额”作为价格的人**，因此另一部分必须是剩余部分。
* **钱包指纹识别**：仔细的分析师有时可以推断出哪个软件创建了某个交易，因为**许多不同的钱包软件并不总是以完全相同的方式创建交易**。钱包指纹识别可用于检测找零输出，因为找零输出是使用相同钱包指纹花费的输出。
* **金额和时间相关性**：如果执行交易的人**披露**了交易的**时间**和/或**金额**，那么这很容易**被发现**。

### 流量分析

一些组织**窃听您的流量**可能会看到您在比特币网络中通信。\
如果对手看到一个交易或区块**从您的节点发出而之前没有进入**，那么几乎可以确定**该交易是由您进行的或该区块是由您挖掘的**。由于涉及互联网连接，对手将能够**将IP地址与发现的比特币信息联系起来**。

无法窃听所有互联网流量但拥有**大量比特币节点**以便**更接近**源的攻击者可能能够知道宣布交易或区块的IP地址。\
此外，一些钱包定期重新广播其未确认的交易，以便更有可能通过网络广泛传播并被挖掘。

### 其他攻击以查找地址所有者信息

有关更多攻击，请阅读<https://en.bitcoin.it/wiki/Privacy>

## 匿名比特币

### 匿名获取比特币

* **现金交易**：使用现金购买比特币。
* **现金替代品**：购买礼品卡或类似物品，并在线交换它们为比特币。
* **挖矿**：挖矿是获取比特币最匿名的方式。这适用于独立挖矿，因为[挖矿池](https://en.bitcoin.it/wiki/Pooled_mining)通常知道哈希者的IP地址。
* **盗窃**：理论上，另一种获取匿名比特币的方式是窃取它们。

### 混币服务

用户会**将比特币发送到混币服务**，服务会**发送不同的比特币回给用户**，扣除一定费用。理论上，观察区块链的对手将**无法将**进入和离开的交易**联系起来**。

然而，用户需要信任混币服务将比特币退还，并且不会保存有关接收和发送资金之间关系的日志。\
还可以使用其他服务作为混币服务，例如比特币赌场，您可以在那里发送比特币，稍后取回。

### CoinJoin

**CoinJoin**将**不同用户的多个交易混合成一个**，以使观察者更难找出**哪个输入与哪个输出相关**。\
这提供了新的隐私级别，但是，**某些** **交易**，其中某些输入和输出金额相关或与其他输入和输出非常不同**仍然可以被外部观察者关联**。

比特币区块链上可能的CoinJoin交易ID示例为`402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a`和`85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`。

[**https://coinjoin.io/en**](https://coinjoin.io/en)\
**类似于CoinJoin但更好，对于以太坊，您可以使用** [**Tornado Cash**](https://tornado.cash) **（资金来自矿工，因此它只会出现在您的钱包中）。**

### PayJoin

在前一节讨论的CoinJoin类型可以通过检查具有相同价值的多个输出来轻松识别。

PayJoin（也称为支付到终点或P2EP）是两方之间的一种特殊类型的CoinJoin，其中一方支付另一方。然后，交易**没有具有相同价值的多个输出**，因此不会明显显示为具有相同输出的CoinJoin。考虑这个交易：

```
2 btc --> 3 btc
5 btc     4 btc
```

## 比特币隐私良好实践

### 钱包同步

比特币钱包必须以某种方式获取有关其余额和历史记录的信息。截至2018年底，最实用和私密的现有解决方案是使用**完整节点钱包**（最大程度上保护隐私）和**客户端端区块过滤**（非常好）。

* **完整节点：** 完整节点下载包含比特币上发生的每笔[交易](https://en.bitcoin.it/wiki/Transaction)的整个区块链。因此，监视用户的互联网连接的对手将无法了解用户感兴趣的交易或地址。
* **客户端端区块过滤：** 客户端端区块过滤通过创建包含每个区块中每笔交易的所有地址的**过滤器**来工作。这些过滤器可以测试一个**元素是否在集合中**；虽然可能存在误报，但不存在漏报。轻量级钱包会**下载**区块链中每个**区块**的所有过滤器，并检查其**自己的地址**是否匹配。包含匹配项的区块将从点对点网络中完整下载，并且这些区块将用于获取钱包的历史记录和当前余额。

### Tor

比特币网络使用点对点网络，这意味着其他节点可以了解您的IP地址。因此，建议您**每次与比特币网络交互时都通过Tor连接**。

### 避免地址重复使用

**地址被多次使用对隐私非常有害，因为它将更多的区块链交易链接在一起，并证明它们是由同一实体创建的**。使用比特币的最私密和安全的方式是向每个付款人发送一个全新的地址。收到的硬币花费后，该地址不应再次使用。此外，在发送比特币时应要求一个全新的比特币地址。所有良好的比特币钱包都有一个用户界面，以防止地址重复使用。

### 多笔交易

用**多笔链上交易**支付某人可以大大降低基于金额的隐私攻击的威力，例如金额相关性和整数金额。例如，如果用户想向某人支付5 BTC，并且不希望5 BTC的价值很容易被搜索到，那么他们可以发送两笔价值分别为2 BTC和3 BTC的交易，总共为5 BTC。

### 避免找零

避免找零是指仔细选择交易输入和输出，以完全不需要找零输出。**没有找零输出对隐私非常有利**，因为它破坏了找零检测启发式。

### 多个找零输出

如果避免找零不可行，则**创建多个找零输出可以提高隐私**。这也会破坏通常假定只有一个找零输出的找零检测启发式。由于此方法使用的区块空间比通常多，因此避免找零更可取。

## 门罗币

当门罗币开发时，它试图解决的迫切需求是**完全匿名**，在很大程度上，它填补了这一空白。

## 以太坊

### Gas

Gas指的是衡量以太坊网络上执行特定操作所需的**计算工作量**的单位。Gas是成功进行以太坊**交易**所需的**费用**。

Gas价格以**gwei**表示，gwei本身是ETH的一个单位 - 每个gwei等于**0.000000001 ETH**（10的-9次方ETH）。例如，您可以说您的gas费用为1 gwei，而不是说您的gas费用为0.000000001 ether。'gwei'这个词本身意味着'吉博-韦'，它等于**1,000,000,000 wei**。Wei本身是**ETH的最小单位**。

要计算交易将花费的gas，请阅读以下示例：

假设Jordan必须向Taylor支付1 ETH。在交易中，gas限制为21,000单位，基本费用为100 gwei。Jordan还包括10 gwei的小费。

使用上述公式，我们可以计算为`21,000 * (100 + 10) = 2,310,000 gwei`或0.00231 ETH。

当Jordan发送资金时，将从Jordan的账户中扣除1.00231 ETH。Taylor将收到1.0000 ETH。矿工将获得0.00021 ETH的小费。基本费用0.0021 ETH被销毁。

此外，Jordan还可以为交易设置一个最大费用（`maxFeePerGas`）。实际费用与最大费用之间的差额将退还给Jordan，即`refund = max fee - (base fee + priority fee)`。Jordan可以设置一个最大支付交易执行的金额，并在交易执行时不必担心支付超出基本费用的费用。

由于基本费用是根据对区块空间的需求由网络计算的，因此最后一个参数：maxFeePerGas有助于控制将支付的最大费用。

### 交易

请注意，在**以太坊**网络中，交易是在2个地址之间执行的，这些地址可以是**用户或智能合约地址**。\
**智能合约**通过**特殊**的**交易**存储在分布式分类账中。

改变EVM状态的交易需要广播到整个网络。任何节点都可以广播要求在EVM上执行交易；发生这种情况后，**矿工**将**执行**交易并将结果状态更改传播到网络的其余部分。\
交易需要**费用**，必须进行挖矿才能变得有效。

提交的交易包括以下信息：

* `recipient` – 接收地址（如果是外部拥有的账户，则交易将转移价值。如果是合同账户，则交易将执行合同代码）
* `signature` – 发件人的标识符。当发件人的私钥签署交易并确认发件人已授权此交易时，将生成此标识符
* `value` – 从发件人转移到接收方的ETH金额（以WEI为单位，是ETH的一个单位）
* `data` – 包含任意数据的可选字段
* `gasLimit` – 交易可以消耗的最大gas单位数量。gas单位代表计算步骤
* `maxPriorityFeePerGas` - 包含为矿工提供的小费的最大gas数量
* `maxFeePerGas` - 为交易愿意支付的最大gas数量（包括`baseFeePerGas`和`maxPriorityFeePerGas`）

请注意，没有任何字段用于原始地址，这是因为这可以从签名中推断出来。

### 参考资料

* <https://en.wikipedia.org/wiki/Proof_of_stake>
* <https://www.mycryptopedia.com/public-key-private-key-explained/>
* <https://bitcoin.stackexchange.com/questions/3718/what-are-multi-signature-transactions>
* <https://ethereum.org/en/developers/docs/transactions/>
* <https://ethereum.org/en/developers/docs/gas/>
* [https://en.bitcoin.it/wiki/Privacy](https://en.bitcoin.it/wiki/Privacy#Forced_address_reuse)
