我正在通过一些在线示例学习区块链。我有一个高级代码,其中我正在使用先前的散列创建一个新的块,然后向其添加一个事务,然后生成该块的一个困难的散列(具有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个前导零的随机字符序列?
发布于 2018-08-06 15:50:07
根据之前的块和您发现的nonce计算哈希值非常容易。不需要循环,只需要一次哈希计算,这是很快的。因此,当您将新的块添加到链中时,您还发布了随机数,他们只计算散列--这就是工作的证明。
发布于 2019-05-08 14:09:17
Simple Answer -检查是否
//验证当前块字符串hash计算是否正确hash = currentBlock.calculateHash();if(!currentBlock.hash.equals(hash)) { System.out.println("hash计算错误“);return false;} //验证是否正确挖掘块如果(!currentBlock.hash.substring(0,难度).equals(HashTarget)){System.out.println(”此块未被挖掘“);返回false;}
我已经在下面的文章和源代码中详细解释了它。请看一下。
Create your first (very) basic blockchain with Proof of Work
发布于 2021-03-09 13:12:01
验证很容易。
这是一个单步过程,验证器获取挖掘器提供的块头,其中包含随机数证明,并将其通过PoW拼图。它检查输出散列是否与挖掘器提供的相同,并且小于有效阈值。
在工作证明中,工作是由挖掘器进行的计算,用于计算尝试不同值的随机数的散列。并且证明是现时值,对于该值,它获得了小于难度阈值的有效散列。
区块链将如何确保此哈希实际上是有效的哈希,而不仅仅是具有8个前导零的随机字符序列?
这很棘手,因为在PoW中,随机数值是由挖掘器完成的计算工作的实际证明,而不是块散列。难度阈值是公开的,所以任何人都可以写下一个数学上小于这个阈值的随机有效散列并发布它,但这不会起作用,因为验证过程仍然需要nonce来验证证据,并且必须由挖掘器提供。因此,矿工别无选择,只能计算随机数。
https://stackoverflow.com/questions/51701579
复制相似问题