Java 区块链技术如何验证工作证明
我正在通过一些在线示例学习区块链。 我有一个高级代码,我用前面的散列创建一个新的块,然后向其中添加一个事务,然后生成一个困难的块散列(有8个前导零)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
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;
}
这是很棘手的,因为在PoW中,nonce value是矿工所做计算工作的实际证明,而不是块散列。难度阈值是公开的,因此任何人都可以写下一个数学上小于此阈值的随机有效散列并发布它,但这不会起作用,因为验证过程仍然需要nonce来验证证据,并且必须由矿工提供。因此,矿工别无选择,只能在前面的哈希和nonce值的帮助下计算nonce。?