我正在通过一些在线示例来学习区块链。 我有这个高级代码,我在其中使用先前的哈希创建一个新的Block,然后向其中添加事务,然后生成该块的困难哈希(带有8个前导零)
Block block1 = new Block(previousHash);
block1.addTransaction(new SomeTransaction());
block1.mineBlock(difficulty);
blockchain.add(block1);
public void mineBlock(int difficulty) {
String target = StringUtil.getDificultyString(difficulty); //Create a string with difficulty * "0"
while(!hash.substring( 0, difficulty).equals(target)) {
nonce ++;
hash = calculateHash();
}
System.out.println("Block Mined!!! : " + hash);
}
这很好。但是我有一个问题,在向区块链添加一个块之前如何验证这种工作证明。
即 假设已生成具有8个前导零的哈希值
000000005ed2248f32d7f2509e6291a998a6119b96b1227d27fe03cf21b8c908
区块链将如何确保此哈希实际上是有效哈希,而不仅仅是具有8个前导零的随机字符序列?
答案 0 :(得分:1)
根据上一个块和您发现的随机数来计算哈希值非常容易。不需要循环,只需要进行一次哈希计算即可,这很快。 因此,当您将新块添加到链中时,您还将发布随机数,并且它们只是计算哈希值-这就是工作量的证明。
答案 1 :(得分:0)
简单答案-检查
块哈希以大于或等于难度的零开头。
// Validating if hash is computed correctly for current block
String hash = currentBlock.calculateHash();
if(!currentBlock.hash.equals(hash)) {
System.out.println("hash is computed incorrectly");
return false;
}
// Validate if block is mined correctly
if(!currentBlock.hash.substring(0, difficulty).equals(hashTarget)) {
System.out.println("This block hasn't been mined");
return false;
}
我已经在下面的文章中详细解释了它以及源代码。请看看。
Create your first (very) basic blockchain with Proof of Work
答案 2 :(得分:0)
验证很容易。
这是一个一步的过程,验证者获取矿工提供的包含随机数证明的区块头,并通过PoW拼图。它检查输出的哈希值是否与矿工提供的相同并且小于有效阈值。
在工作量证明中,工作是矿工完成的计算,用于尝试不同的随机数值来计算哈希。而证明是随机数值,它的有效哈希值小于难度阈值。
<块引用>区块链将如何确保该散列实际上是有效的散列,而不仅仅是具有 8 个前导零的随机字符序列?
这很棘手,因为在 PoW 中 nonce 值是矿工完成的计算工作的实际证明,而不是块哈希。难度阈值是公开的,因此任何人都可以写下数学上小于该阈值的随机有效哈希并发布它,但这将不起作用,因为验证过程仍然需要随机数来验证证明,并且必须由矿工提供.因此,矿工别无选择,只能计算随机数。