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

20 KiB
Raw Blame History

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS红队专家

支持HackTricks的其他方式

基本术语

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

共识机制

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

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

工作量证明PoW

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

权益证明PoS

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

比特币

交易

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

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

其中:

  • _d_A是签名私钥
  • _m_是交易
  • Fhash是哈希函数
  • Fsig是签名算法
  • Sig是生成的签名

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

  • Sig = (R, S)

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

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

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

多重签名交易

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

交易字段

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

  • 输入比特币从哪个地址转移
  • 输出:转移到每个输出的地址和金额
  • 费用:支付给交易矿工的金额
  • Script_sig:交易的脚本签名
  • Script_type:交易类型

2种主要类型的交易:

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

闪电网络

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

闪电网络的正常使用包括通过向相关基础区块链第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

匿名比特币

匿名获取比特币

  • 现金交易:使用现金购买比特币。
  • 现金替代品:购买礼品卡或类似物品,并在线交换它们为比特币。
  • 挖矿:挖矿是获取比特币最匿名的方式。这适用于独立挖矿,因为挖矿池通常知道哈希者的IP地址。
  • 盗窃:理论上,另一种获取匿名比特币的方式是窃取它们。

混币服务

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

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

CoinJoin

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

比特币区块链上可能的CoinJoin交易ID示例为402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238

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

PayJoin

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

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

2 btc --> 3 btc
5 btc     4 btc

比特币隐私良好实践

钱包同步

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

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

Tor

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

避免地址重复使用

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

多笔交易

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

避免找零

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

多个找零输出

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

门罗币

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

以太坊

Gas

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

Gas价格以gwei表示gwei本身是ETH的一个单位 - 每个gwei等于0.000000001 ETH10的-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。实际费用与最大费用之间的差额将退还给Jordanrefund = 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数量包括baseFeePerGasmaxPriorityFeePerGas

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

参考资料