区块链技术如何验证工作证明

时间:2018-08-06 06:18:51

标签: java blockchain bitcoin

我正在通过一些在线示例来学习区块链。 我有这个高级代码,我在其中使用先前的哈希创建一个新的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个前导零的随机字符序列?

3 个答案:

答案 0 :(得分:1)

根据上一个块和您发现的随机数来计算哈希值非常容易。不需要循环,只需要进行一次哈希计算即可,这很快。 因此,当您将新块添加到链中时,您还将发布随机数,并且它们只是计算哈希值-这就是工作量的证明。

答案 1 :(得分:0)

简单答案-检查

  1. 验证当前块的哈希计算是否正确
  2. 块哈希以大于或等于难度的零开头。

    // 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 值是矿工完成的计算工作的实际证明,而不是块哈希。难度阈值是公开的,因此任何人都可以写下数学上小于该阈值的随机有效哈希并发布它,但这将不起作用,因为验证过程仍然需要随机数来验证证明,并且必须由矿工提供.因此,矿工别无选择,只能计算随机数。