我正在創建一個簡單的區塊鏈應用程式,我有一個挖掘新區塊的方法和一個可以提交采礦任務的方法。
下面是我使用ExecutorService#submit來提交新任務的方法:
public void executeCommand(int noOfStartingZero) throws ExecutionException, 中斷例外 {
for (int i = 0; i < NO_OF_BLOCKS; i ) {
executor.submit(() -> {
Block prevBlock = this.blockchain.getBlocks().peekLast()。
Block block = this.minerCommand.mine(prevBlock,noOfStartingZero)。
System.out.println("block: " block)。
String minedBy = Thread.currentThread().getName() 。
block.setMinedBy(minedBy)。
try {
this.blockchain.addNewBlock(block)。
} catch (InvalidBlockException e) {
e.printStackTrace()。
}
});
}
執行器.關閉()。
}
問題是,在這一行,它總是回傳同一個塊。 Block block = this.minerCommand.mine(prevBlock, noOfStartingZero);
這里是我的mine()。
這是我的mine()方法,每次它被呼叫時都會創建一個新的塊:
public Block mine(Block prevBlock, int noOfStartingZero){
if (prevBlock == null) {
return getGenesisBlock(noOfStartingZero)。
}
long startTime = System.currentTimeMillis()。
var block = new Block() 。
block.setId(prevBlock.id() 1) 。
block.setTimestamp(new Date().getTime())。
block.setPrevHash(prevBlock.hash())。
BlockHashContainer hashContainer = generateHash(block,noOfStartingZero)。
block.setMagicNumber(hashContainer.getMagicNumber())。
block.setHash(hashContainer.getHash())。
block.setTimeGenerated((new Date().getTime() - startTime) / 1000)。)
return塊。
}
我試著列印出每個迭代的區塊,這是我得到的結果,它總是回傳第一個區塊,沒有其他區塊被添加到區塊鏈中:
我試著列印出每個迭代的區塊,這是我得到的結果。
block。Block[id=1, timestamp=1632128365538, prevHash=0, hash=818b72956bdb163b5b51b848c2988378cb03bd58649511186ac9a5339d9e392c]
塊。block[id=1, timestamp=1632128365538, prevHash=0, hash=818b72956bdb163b5b51b848c2988378cb03bd58649511186ac9a5339d9e392c]
塊。block[id=1, timestamp=1632128365537, prevHash=0, hash=a840f8f7922fae5b974e1a4e286dbd7247ed19efb12629ba8b0533b117c9451d]
塊。block[id=1, timestamp=1632128365538, prevHash=0, hash=818b72956bdb163b5b51b848c2988378cb03bd58649511186ac9a5339d9e392c]
塊。Block[id=1, timestamp=1632128365516, prevHash=0, hash=336385001bb8a9f7b16800fd94e09347dac1a2566bd0edfd0ea6c941b722dd4d]
為什么會出現這樣的行為?如果有任何幫助,我們將不勝感激。
uj5u.com熱心網友回復:
使用ExecutorService來運行這個操作有可能會并發地運行每個迭代。這意味著他們都可以在任何任務有機會設定之前看到prevBlock為null。如果每個迭代都依賴于前一個操作的結果,那么根本就沒有理由使用ExecutorService。相反,在回圈中同步地運行每個采礦操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/325306.html
標籤:
