我了解到,挖掘块涉及到试图生成小于或等于所需困难指示的目标的散列。伊瑟姆·维基论伦理论:
def mine(full_size, dataset, header, difficulty):
# zero-pad target to compare with hash on the same digit
target = zpad(encode_int(2**256 // difficulty), 64)[::-1]
from random import randint
nonce = randint(0, 2**64)
while hashimoto_full(full_size, dataset, header, nonce) > target:
nonce = (nonce + 1) % 2**64
return nonce我还从这个SE主题中了解到,块哈希本身并不是针对目标进行检查的,而是通过Ethash(hash(block header), nonce) < TARGET来检查的,这就解释了为什么Ethereum块没有我们习惯于使用比特币的主导零。
为了计算难度,我们大概会将从困难中生成目标的操作反转到从Ethash生成困难吗?反演应用于Ethash(hash(block header), nonce)是块的困难,还是应用于target产生原来所需的困难?
如果是前者,我们不应该在不需要额外块的情况下立即恢复共识吗?因为协商一致链是总累积难度最大的,而多个叉子共享的概率实际上是零?
如果是后者,并且给出了这是对困难调整算法工作原理的出色解释。,并且给定了困难炸弹继续延期,我希望以太扫描上的连续块有规律地分担困难,例如,当块在其父块的10-20秒内被挖掘时。但这与我所看到的以太扫描最近几个街区的情况是相反的。
回到中心问题:我如何计算给定的Ethereum块的难度?
发布于 2022-03-09 03:09:48
您可以使用醚和提供程序调用JSON。eth_getBlockByNumber的结果包含一个称为困难的字段。
JS的外观大致如下:
import ethers;
async () => {
const provider = new ethers.providers.JsonRpcProvider(<YOUR JSONRPC URL>);
const block = await provider.getBlock(100004);
const difficulty = block.difficulty;
}发布于 2022-03-10 01:53:51
现有的困难调整算法可以在EIP-100、黄皮书(第7页,方程式45)中找到,也可以在geth 这里中实现。调整所需难度的算法也用于定义块的难度。也就是说,块的难度是由它的父块的难度、它和它的父块之间的时间戳的差异以及它的父块是否有叔父来定义的。然而,关键的是,它是独立于伦理输出的。因此,如果两个区块的父块具有相同的时间戳,它们可能有相同的困难:它们都需要在其共享的父块的9秒内被挖掘,或者两个块都在其共同的父块的9到18 (不包括端点)之间被挖掘。在拜占庭执行EIP-100后,叔父们确实需要完全的困难.
我在上面还建议,如果和只有在它的父块的9到18秒之间被布雷时,我就会期望一个区块和它的父块有同样的困难。我搞错了。即使是这样,一个区块的难度也比它的父块高,其差异来自于黄纸方程50中的epsilon项。即使这个术语很少变化,每100,000块,一个块的难度仍然增加了这个数量相对于它的父块。因此,虽然您通常会发现块的困难与其他块不同,但如果块n+1与块n在块n之后9到18秒之间挖掘块n+1,则块n+1与块n之间的困难之差等于块n与块n-1之间的差异,假设叔父包含没有插入差异。
https://ethereum.stackexchange.com/questions/123392
复制相似问题