@Override public Block createForkBlock(Block parent) { try { List<Transaction> txes = new ArrayList<>(); Map<ByteArrayWrapper, Long> nonces = new HashMap<>(); Repository repoSnapshot = getBlockchain().getRepository().getSnapshotTo(parent.getStateRoot()); for (PendingTx tx : submittedTxes) { ByteArrayWrapper senderW = new ByteArrayWrapper(tx.sender.getAddress()); Long nonce = nonces.get(senderW); if (nonce == null) { BigInteger bcNonce = repoSnapshot.getNonce(tx.sender.getAddress()); nonce = bcNonce.longValue(); } nonces.put(senderW, nonce + 1); byte[] toAddress = tx.targetContract != null ? tx.targetContract.getAddress() : tx.toAddress; Transaction transaction = new Transaction( ByteUtil.longToBytesNoLeadZeroes(nonce), ByteUtil.longToBytesNoLeadZeroes(gasPrice), ByteUtil.longToBytesNoLeadZeroes(gasLimit), toAddress, ByteUtil.bigIntegerToBytes(tx.value), tx.data); transaction.sign(tx.sender.getPrivKeyBytes()); if (tx.createdContract != null) { tx.createdContract.setAddress(transaction.getContractAddress()); } txes.add(transaction); } Block b = getBlockchain().createNewBlock(parent, txes, Collections.EMPTY_LIST); Ethash.getForBlock(b.getNumber()).mineLight(b).get(); ImportResult importResult = getBlockchain().tryToConnect(b); if (importResult != ImportResult.IMPORTED_BEST && importResult != ImportResult.IMPORTED_NOT_BEST) { throw new RuntimeException( "Invalid block import result " + importResult + " for block " + b); } submittedTxes.clear(); return b; } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } }
private void submitNewTx(PendingTx tx) { submittedTxes.add(tx); if (autoBlock) { createBlock(); } }