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

Java 区块链技术如何验证工作证明,java,blockchain,bitcoin,Java,Blockchain,Bitcoin,我正在通过一些在线示例学习区块链。 我有一个高级代码,我用前面的散列创建一个新的块,然后向其中添加一个事务,然后生成一个困难的块散列(有8个前导零) Block block1 = new Block(previousHash); block1.addTransaction(new SomeTransaction()); block1.mineBlock(difficulty); blockchain.add(block1); public void mineBlock(int dif

我正在通过一些在线示例学习区块链。 我有一个高级代码,我用前面的散列创建一个新的块,然后向其中添加一个事务,然后生成一个困难的块散列(有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);
}
这很有效。但我有一个问题,在向区块链添加区块之前,如何验证该工作证明

i、 e。 假设生成了一个包含8个前导零的散列

000000005ed2248f32d7f2509e6291a998a6119b96b1227d27fe03cf21b8c908

区块链如何确保该散列实际上是一个有效的散列,而不仅仅是一个具有8个前导零的随机字符序列?

基于上一个块和您发现的nonce计算散列非常容易。不需要循环,只需要一次哈希计算,速度很快。
因此,当您将新块添加到链中时,您也会发布nonce,而他们只会计算哈希值——这就是工作的证明。

简单回答-检查是否

  • 正在验证当前块的哈希计算是否正确
  • 块哈希的前缀为大于或等于难度的零

    // 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;
       }
    
  • 我已经在下面的文章中详细解释了它以及源代码。请看一看

    验证很容易

    这是一个一步过程,验证器获取矿工提供的块头,其中包含nonce-proof,并将其通过PoW谜题。它检查输出哈希是否与miner提供的相同,是否小于有效阈值

    在工作证明中,工作是矿工为计算尝试不同nonce值的散列而进行的计算。而证明是nonce值,它得到的有效哈希值小于难度阈值

    区块链如何确保该散列实际上是一个有效的散列,而不仅仅是8个前导零的随机字符序列


    这是很棘手的,因为在PoW中,nonce value是矿工所做计算工作的实际证明,而不是块散列。难度阈值是公开的,因此任何人都可以写下一个数学上小于此阈值的随机有效散列并发布它,但这不会起作用,因为验证过程仍然需要nonce来验证证据,并且必须由矿工提供。因此,矿工别无选择,只能在前面的哈希和nonce值的帮助下计算nonce。