hacktricks/blockchain/blockchain-and-crypto-currencies/README.md
2023-08-03 19:12:22 +00:00

22 KiB
Raw Blame History

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

基本术语

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

共识机制

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

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

工作量证明PoW

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

权益证明PoS

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

比特币

交易

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

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

其中:

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

签名函数Fsig生成一个由R和S组成的签名Sig

  • Sig = (R, S)

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

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

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

多重签名交易

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

交易字段

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

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

有两种主要类型的交易:

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

闪电网络

该协议有助于在通道上执行多个交易,并仅将最终状态发送到区块链以保存。

这提高了比特币区块链的速度每秒只允许7笔付款并且允许创建更难以追踪的交易因为通道是通过比特币区块链的节点创建的

闪电网络的正常使用包括通过提交资金交易到相关的基础区块链(第一层)来打开支付通道,然后进行任意数量的闪电网络交易,更新通道资金的临时分配,而无需将其广播到区块链,最后通过广播结算交易的最终版本来关闭支付通道,以分配通道资金。

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

比特币隐私攻击

共同输入

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

UTXO更改地址检测

UTXO表示未使用的交易输出UTXO。在使用来自先前交易的输出作为输入的交易中整个输出需要被花费以避免双重支付攻击。因此如果意图只是从该输出中发送部分资金到一个地址并保留其他部分则会出现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

强制地址重用

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

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

钱包的正确行为是不花费已经落在已使用的空地址上的比特币。

其他区块链分析

  • 确切的支付金额:为了避免带有找零的交易,支付金额需要等于未使用交易输出(这是非常不寻常的)。因此,没有找零地址的交易可能是同一用户之间的转账
  • 整数金额:在交易中,如果其中一个输出是一个“整数金额”,那么很有可能这是一个支付给人类的,他们设定了这个“整数金额”作为价格,所以另一部分必须是剩余的。
  • 钱包指纹识别:仔细的分析师有时可以推断出哪个软件创建了某个交易,因为不同的钱包软件并不总是以完全相同的方式创建交易。钱包指纹识别可以用于检测找零输出,因为找零输出是使用相同钱包指纹花费的输出。
  • 金额和时间的相关性:如果执行交易的人公开了交易的时间和/或金额,那么这些信息很容易被发现

流量分析

一些组织嗅探您的流量可以看到您在比特币网络中的通信。
如果对手看到一个从您的节点发出的交易或区块,而该交易或区块之前没有进入,那么它几乎可以确定该交易是由您进行的或该区块是由您挖掘的。由于涉及到互联网连接,对手将能够将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

这可以被解释为一个简单的交易支付到某个地方并留下零钱暂时忽略哪个输出是支付哪个是零钱的问题。另一种解释这个交易的方式是2 BTC的输入是商家拥有的5 BTC是他们的客户拥有的这个交易涉及客户向商家支付1 BTC。无法确定这两种解释中哪一种是正确的。结果是一个混币交易打破了常见的输入所有权启发式并提高了隐私性但也是无法检测和与任何常规比特币交易区分开来

如果支付联合交易变得稍微常用,那么在实践中,常见的输入所有权启发式将完全失效。由于无法检测我们甚至不知道它们是否正在使用。由于交易监视公司主要依赖于这种启发式因此在2019年对支付联合理念非常兴奋。

比特币隐私良好实践

钱包同步

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

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

Tor

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

避免地址重用

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

多个交易

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

避免找零

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

多个找零输出

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

Monero

当开发Monero时填补完全匿名的巨大需求是它所追求的目标,并且在很大程度上填补了这个空白。

以太坊

Gas

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

Gas价格以gwei表示它本身是ETH的一种单位 - 每个gwei等于0.000000001 ETH10-9 ETH。例如您可以说您的gas费用为1 gwei而不是说您的gas费用为0.000000001 ether。'gwei'这个词本身意味着'giga-wei',它等于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为单位WEI是ETH的一种单位
  • data - 包含任意数据的可选字段
  • gasLimit - 交易可以消耗的最大气体单位数量。气体单位表示计算步骤
  • maxPriorityFeePerGas - 包含作为小费提供给矿工的最大气体数量
  • maxFeePerGas - 愿意为交易支付的最大气体数量(包括baseFeePerGasmaxPriorityFeePerGas

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

参考资料

☁️ HackTricks 云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥