From 39a5c77e7703fa3690834c4768c885c976dea9a8 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Fri, 10 Aug 2018 17:48:33 +0800 Subject: [PATCH 01/23] Add the version to the statistics witness code upgrade;new contract is not packaged into block; --- .../org/tron/common/utils/ForkController.java | 75 +++++++++++++++++++ src/main/java/org/tron/core/Wallet.java | 4 +- .../org/tron/core/capsule/BlockCapsule.java | 5 +- .../java/org/tron/core/config/Parameter.java | 2 +- src/main/java/org/tron/core/db/Manager.java | 9 ++- .../org/tron/core/net/node/NodeDelegate.java | 2 + .../tron/core/net/node/NodeDelegateImpl.java | 5 ++ .../java/org/tron/core/net/node/NodeImpl.java | 3 +- src/main/protos/core/Tron.proto | 1 + 9 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/tron/common/utils/ForkController.java diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java new file mode 100644 index 00000000000..62e393851d4 --- /dev/null +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -0,0 +1,75 @@ +package org.tron.common.utils; + +import com.google.protobuf.ByteString; +import java.util.Arrays; +import java.util.List; +import javax.annotation.PostConstruct; +import lombok.Getter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.config.Parameter.ChainConstant; +import org.tron.core.db.Manager; +import org.tron.protos.Protocol.Transaction.Contract.ContractType; + +@Component +public class ForkController { + + public static final int DISCARD_SCOPE = ContractType.UpdateAssetContract.getNumber(); + + @Getter + private Manager manager; + private int[] slots; + private boolean fork = false; + + @PostConstruct + public void init() { + int size = manager.getWitnessController().getActiveWitnesses().size(); + slots = new int[size]; + } + + public synchronized boolean shouldBeForked() { + if (fork) { + return true; + } + + for (int version : slots) { + if (version != ChainConstant.version) { + return false; + } + } + + fork = true; + return true; + } + + public boolean dealOrNot(TransactionCapsule capsule) { + return shouldBeForked() + || capsule.getInstance().getRawData().getContractList().get(0).getType().getNumber() + <= DISCARD_SCOPE; + } + + public synchronized void updateState(BlockCapsule blockCapsule) { + List witnesses = manager.getWitnessController().getActiveWitnesses(); + if (witnesses.size() > slots.length) { + slots = Arrays.copyOf(slots, witnesses.size()); + } + + ByteString witness = blockCapsule.getWitnessAddress(); + int slot = 0; + for (ByteString scheduledWitness : witnesses) { + if (!scheduledWitness.equals(witness)) { + ++slot; + } + } + + slots[slot] = blockCapsule.getInstance().getBlockHeader().getRawData().getVersion(); + } + + @Autowired + public void setManager(Manager manager) { + this.manager = manager; + } + +} diff --git a/src/main/java/org/tron/core/Wallet.java b/src/main/java/org/tron/core/Wallet.java index 08df09eb304..6f13eab98fd 100755 --- a/src/main/java/org/tron/core/Wallet.java +++ b/src/main/java/org/tron/core/Wallet.java @@ -375,7 +375,9 @@ public GrpcAPI.Return broadcastTransaction(Transaction signaturedTransaction) { } dbManager.pushTransactions(trx); - p2pNode.broadcast(message); + if (dbManager.getForkController().dealOrNot(trx)) { + p2pNode.broadcast(message); + } return builder.setResult(true).setCode(response_code.SUCCESS).build(); } catch (ValidateSignatureException e) { logger.info(e.getMessage()); diff --git a/src/main/java/org/tron/core/capsule/BlockCapsule.java b/src/main/java/org/tron/core/capsule/BlockCapsule.java index 0a7ecf0b683..5e5346ebb62 100755 --- a/src/main/java/org/tron/core/capsule/BlockCapsule.java +++ b/src/main/java/org/tron/core/capsule/BlockCapsule.java @@ -33,6 +33,7 @@ import org.tron.common.utils.Sha256Hash; import org.tron.common.utils.Time; import org.tron.core.capsule.utils.MerkleTree; +import org.tron.core.config.Parameter.ChainConstant; import org.tron.core.exception.BadItemException; import org.tron.core.exception.ValidateSignatureException; import org.tron.protos.Protocol.Block; @@ -128,7 +129,9 @@ public BlockCapsule(long number, Sha256Hash hash, long when, ByteString witnessA .setNumber(number) .setParentHash(hash.getByteString()) .setTimestamp(when) - .setWitnessAddress(witnessAddress).build(); + .setVersion(ChainConstant.version) + .setWitnessAddress(witnessAddress) + .build(); // block header BlockHeader.Builder blockHeaderBuild = BlockHeader.newBuilder(); diff --git a/src/main/java/org/tron/core/config/Parameter.java b/src/main/java/org/tron/core/config/Parameter.java index ba844f71b78..1d123213993 100644 --- a/src/main/java/org/tron/core/config/Parameter.java +++ b/src/main/java/org/tron/core/config/Parameter.java @@ -23,7 +23,7 @@ interface ChainConstant { int BLOCK_FILLED_SLOTS_NUMBER = 128; int MAX_VOTE_NUMBER = 30; int MAX_FROZEN_NUMBER = 1; - + int version = 1; } interface NodeConstant { diff --git a/src/main/java/org/tron/core/db/Manager.java b/src/main/java/org/tron/core/db/Manager.java index 2df458163a7..326d6bfa020 100644 --- a/src/main/java/org/tron/core/db/Manager.java +++ b/src/main/java/org/tron/core/db/Manager.java @@ -40,6 +40,7 @@ import org.tron.common.runtime.vm.program.invoke.ProgramInvokeFactoryImpl; import org.tron.common.storage.DepositImpl; import org.tron.common.utils.ByteArray; +import org.tron.common.utils.ForkController; import org.tron.common.utils.SessionOptional; import org.tron.common.utils.Sha256Hash; import org.tron.common.utils.StringUtil; @@ -172,6 +173,10 @@ public class Manager { private Cache transactionIdCache = CacheBuilder .newBuilder().maximumSize(100_000).recordStats().build(); + @Getter + @Autowired + private ForkController forkController; + public WitnessStore getWitnessStore() { return this.witnessStore; } @@ -1079,7 +1084,9 @@ public synchronized BlockCapsule generateBlock( // trx.resetResult(); tmpSeesion.merge(); // push into block - blockCapsule.addTransaction(trx); + if (forkController.dealOrNot(trx)) { + blockCapsule.addTransaction(trx); + } iterator.remove(); } catch (ContractExeException e) { logger.info("contract not processed during execute"); diff --git a/src/main/java/org/tron/core/net/node/NodeDelegate.java b/src/main/java/org/tron/core/net/node/NodeDelegate.java index 2453c7dbe43..27832da7b8e 100644 --- a/src/main/java/org/tron/core/net/node/NodeDelegate.java +++ b/src/main/java/org/tron/core/net/node/NodeDelegate.java @@ -49,4 +49,6 @@ Deque getBlockChainSummary(BlockId beginBLockId, Deque blockId BlockCapsule getGenesisBlock(); boolean canChainRevoke(long num); + + boolean dealOrNot(TransactionCapsule transactionCapsule); } diff --git a/src/main/java/org/tron/core/net/node/NodeDelegateImpl.java b/src/main/java/org/tron/core/net/node/NodeDelegateImpl.java index 30e3b954f9c..98ed72866e0 100755 --- a/src/main/java/org/tron/core/net/node/NodeDelegateImpl.java +++ b/src/main/java/org/tron/core/net/node/NodeDelegateImpl.java @@ -383,4 +383,9 @@ public BlockCapsule getGenesisBlock() { public boolean canChainRevoke(long num) { return num >= dbManager.getSyncBeginNumber(); } + + @Override + public boolean dealOrNot(TransactionCapsule transactionCapsule) { + return dbManager.getForkController().dealOrNot(transactionCapsule); + } } diff --git a/src/main/java/org/tron/core/net/node/NodeImpl.java b/src/main/java/org/tron/core/net/node/NodeImpl.java index 57566d73812..567ae4f4f80 100644 --- a/src/main/java/org/tron/core/net/node/NodeImpl.java +++ b/src/main/java/org/tron/core/net/node/NodeImpl.java @@ -860,7 +860,8 @@ private void onHandleTransactionMessage(PeerConnection peer, TransactionMessage peer.getNode().getHost()); return; } - if(del.handleTransaction(trxMsg.getTransactionCapsule())){ + if (del.handleTransaction(trxMsg.getTransactionCapsule()) + && del.dealOrNot(trxMsg.getTransactionCapsule())) { broadcast(trxMsg); } } catch (TraitorPeerException e) { diff --git a/src/main/protos/core/Tron.proto b/src/main/protos/core/Tron.proto index 140a8977c6a..528e9d1743f 100644 --- a/src/main/protos/core/Tron.proto +++ b/src/main/protos/core/Tron.proto @@ -294,6 +294,7 @@ message BlockHeader { int64 number = 7; int64 witness_id = 8; bytes witness_address = 9; + int32 version = 10; } raw raw_data = 1; bytes witness_signature = 2; From 57f11bef137ec6bbc57c50d70cf58e26b07f9c27 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Fri, 10 Aug 2018 18:09:15 +0800 Subject: [PATCH 02/23] Add the version to the statistics witness code upgrade;new contract is not packaged into block; --- .../java/org/tron/common/utils/ForkController.java | 10 +++------- src/main/java/org/tron/core/db/Manager.java | 1 + 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 62e393851d4..782e76605b5 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -20,7 +20,7 @@ public class ForkController { @Getter private Manager manager; - private int[] slots; + private volatile int[] slots; private boolean fork = false; @PostConstruct @@ -50,14 +50,10 @@ public boolean dealOrNot(TransactionCapsule capsule) { <= DISCARD_SCOPE; } - public synchronized void updateState(BlockCapsule blockCapsule) { - List witnesses = manager.getWitnessController().getActiveWitnesses(); - if (witnesses.size() > slots.length) { - slots = Arrays.copyOf(slots, witnesses.size()); - } - + public synchronized void update(BlockCapsule blockCapsule) { ByteString witness = blockCapsule.getWitnessAddress(); int slot = 0; + List witnesses = manager.getWitnessController().getActiveWitnesses(); for (ByteString scheduledWitness : witnesses) { if (!scheduledWitness.equals(witness)) { ++slot; diff --git a/src/main/java/org/tron/core/db/Manager.java b/src/main/java/org/tron/core/db/Manager.java index 326d6bfa020..85a3d2bb307 100644 --- a/src/main/java/org/tron/core/db/Manager.java +++ b/src/main/java/org/tron/core/db/Manager.java @@ -636,6 +636,7 @@ private void applyBlock(BlockCapsule block) throws ContractValidateException, TransactionExpirationException, TooBigTransactionException, DupTransactionException, ReceiptException, TaposException, ValidateScheduleException, TransactionTraceException, OutOfSlotTimeException { processBlock(block); + forkController.update(block); this.blockStore.put(block.getBlockId().getBytes(), block); this.blockIndexStore.put(block.getBlockId()); } From cb1fdf7635d1c78a963c5e80f016e94476b919f7 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Fri, 10 Aug 2018 18:10:53 +0800 Subject: [PATCH 03/23] Add the version to the statistics witness code upgrade;new contract is not packaged into block; --- src/main/java/org/tron/common/utils/ForkController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 782e76605b5..ecdc5c4d416 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -1,7 +1,6 @@ package org.tron.common.utils; import com.google.protobuf.ByteString; -import java.util.Arrays; import java.util.List; import javax.annotation.PostConstruct; import lombok.Getter; From 51e59536f48068ea5a0f1c3337ed367903149cf6 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Mon, 13 Aug 2018 13:35:33 +0800 Subject: [PATCH 04/23] resolve circular references --- .../java/org/tron/common/utils/ForkController.java | 13 +++---------- src/main/java/org/tron/core/Wallet.java | 2 +- src/main/java/org/tron/core/db/Manager.java | 3 ++- .../java/org/tron/core/net/node/NodeDelegate.java | 2 +- .../org/tron/core/net/node/NodeDelegateImpl.java | 4 ++-- src/main/java/org/tron/core/net/node/NodeImpl.java | 2 +- 6 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index ecdc5c4d416..a1acc417d0e 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -2,9 +2,7 @@ import com.google.protobuf.ByteString; import java.util.List; -import javax.annotation.PostConstruct; import lombok.Getter; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; @@ -22,8 +20,8 @@ public class ForkController { private volatile int[] slots; private boolean fork = false; - @PostConstruct - public void init() { + public void init(Manager manager) { + this.manager = manager; int size = manager.getWitnessController().getActiveWitnesses().size(); slots = new int[size]; } @@ -43,7 +41,7 @@ public synchronized boolean shouldBeForked() { return true; } - public boolean dealOrNot(TransactionCapsule capsule) { + public boolean forkOrNot(TransactionCapsule capsule) { return shouldBeForked() || capsule.getInstance().getRawData().getContractList().get(0).getType().getNumber() <= DISCARD_SCOPE; @@ -62,9 +60,4 @@ public synchronized void update(BlockCapsule blockCapsule) { slots[slot] = blockCapsule.getInstance().getBlockHeader().getRawData().getVersion(); } - @Autowired - public void setManager(Manager manager) { - this.manager = manager; - } - } diff --git a/src/main/java/org/tron/core/Wallet.java b/src/main/java/org/tron/core/Wallet.java index 6f13eab98fd..c71bf165f01 100755 --- a/src/main/java/org/tron/core/Wallet.java +++ b/src/main/java/org/tron/core/Wallet.java @@ -375,7 +375,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signaturedTransaction) { } dbManager.pushTransactions(trx); - if (dbManager.getForkController().dealOrNot(trx)) { + if (dbManager.getForkController().forkOrNot(trx)) { p2pNode.broadcast(message); } return builder.setResult(true).setCode(response_code.SUCCESS).build(); diff --git a/src/main/java/org/tron/core/db/Manager.java b/src/main/java/org/tron/core/db/Manager.java index 85a3d2bb307..125d9fa9b87 100644 --- a/src/main/java/org/tron/core/db/Manager.java +++ b/src/main/java/org/tron/core/db/Manager.java @@ -334,6 +334,7 @@ public void init() { Args.getInstance().getOutputDirectory()); System.exit(1); } + forkController.init(this); revokingStore.enable(); // this.codeStore = CodeStore.create("code"); @@ -1085,7 +1086,7 @@ public synchronized BlockCapsule generateBlock( // trx.resetResult(); tmpSeesion.merge(); // push into block - if (forkController.dealOrNot(trx)) { + if (forkController.forkOrNot(trx)) { blockCapsule.addTransaction(trx); } iterator.remove(); diff --git a/src/main/java/org/tron/core/net/node/NodeDelegate.java b/src/main/java/org/tron/core/net/node/NodeDelegate.java index 27832da7b8e..f485e13317c 100644 --- a/src/main/java/org/tron/core/net/node/NodeDelegate.java +++ b/src/main/java/org/tron/core/net/node/NodeDelegate.java @@ -50,5 +50,5 @@ Deque getBlockChainSummary(BlockId beginBLockId, Deque blockId boolean canChainRevoke(long num); - boolean dealOrNot(TransactionCapsule transactionCapsule); + boolean forkOrNot(TransactionCapsule transactionCapsule); } diff --git a/src/main/java/org/tron/core/net/node/NodeDelegateImpl.java b/src/main/java/org/tron/core/net/node/NodeDelegateImpl.java index 98ed72866e0..10c346fc644 100755 --- a/src/main/java/org/tron/core/net/node/NodeDelegateImpl.java +++ b/src/main/java/org/tron/core/net/node/NodeDelegateImpl.java @@ -385,7 +385,7 @@ public boolean canChainRevoke(long num) { } @Override - public boolean dealOrNot(TransactionCapsule transactionCapsule) { - return dbManager.getForkController().dealOrNot(transactionCapsule); + public boolean forkOrNot(TransactionCapsule transactionCapsule) { + return dbManager.getForkController().forkOrNot(transactionCapsule); } } diff --git a/src/main/java/org/tron/core/net/node/NodeImpl.java b/src/main/java/org/tron/core/net/node/NodeImpl.java index 567ae4f4f80..a53136a0065 100644 --- a/src/main/java/org/tron/core/net/node/NodeImpl.java +++ b/src/main/java/org/tron/core/net/node/NodeImpl.java @@ -861,7 +861,7 @@ private void onHandleTransactionMessage(PeerConnection peer, TransactionMessage return; } if (del.handleTransaction(trxMsg.getTransactionCapsule()) - && del.dealOrNot(trxMsg.getTransactionCapsule())) { + && del.forkOrNot(trxMsg.getTransactionCapsule())) { broadcast(trxMsg); } } catch (TraitorPeerException e) { From 2fd52df5e925baef193455debfe532a0ae36a84b Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Mon, 13 Aug 2018 14:57:25 +0800 Subject: [PATCH 05/23] resolve unittest error --- .../java/org/tron/common/utils/ForkController.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index a1acc417d0e..3b14db9bc37 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -1,6 +1,7 @@ package org.tron.common.utils; import com.google.protobuf.ByteString; +import java.util.Arrays; import java.util.List; import lombok.Getter; import org.springframework.stereotype.Component; @@ -17,13 +18,11 @@ public class ForkController { @Getter private Manager manager; - private volatile int[] slots; + private volatile int[] slots = new int[0]; private boolean fork = false; public void init(Manager manager) { this.manager = manager; - int size = manager.getWitnessController().getActiveWitnesses().size(); - slots = new int[size]; } public synchronized boolean shouldBeForked() { @@ -41,16 +40,20 @@ public synchronized boolean shouldBeForked() { return true; } - public boolean forkOrNot(TransactionCapsule capsule) { + public synchronized boolean forkOrNot(TransactionCapsule capsule) { return shouldBeForked() || capsule.getInstance().getRawData().getContractList().get(0).getType().getNumber() <= DISCARD_SCOPE; } public synchronized void update(BlockCapsule blockCapsule) { + List witnesses = manager.getWitnessController().getActiveWitnesses(); + if (witnesses.size() > slots.length) { + slots = new int[witnesses.size()]; + } + ByteString witness = blockCapsule.getWitnessAddress(); int slot = 0; - List witnesses = manager.getWitnessController().getActiveWitnesses(); for (ByteString scheduledWitness : witnesses) { if (!scheduledWitness.equals(witness)) { ++slot; From 8ebf523ca7827316a6f84e42d33f023a72949e3b Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Mon, 13 Aug 2018 15:28:48 +0800 Subject: [PATCH 06/23] resolve unittest error --- src/main/java/org/tron/common/utils/ForkController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 3b14db9bc37..d71d22a4a96 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -1,7 +1,6 @@ package org.tron.common.utils; import com.google.protobuf.ByteString; -import java.util.Arrays; import java.util.List; import lombok.Getter; import org.springframework.stereotype.Component; @@ -48,7 +47,7 @@ public synchronized boolean forkOrNot(TransactionCapsule capsule) { public synchronized void update(BlockCapsule blockCapsule) { List witnesses = manager.getWitnessController().getActiveWitnesses(); - if (witnesses.size() > slots.length) { + if (witnesses.size() != slots.length) { slots = new int[witnesses.size()]; } From ba164064334c5093b6403c01f534e1edbb74745c Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Mon, 13 Aug 2018 16:28:42 +0800 Subject: [PATCH 07/23] store fork flag into dynamicpropertiesStore --- .../java/org/tron/common/utils/ForkController.java | 4 +++- .../org/tron/core/db/DynamicPropertiesStore.java | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index d71d22a4a96..940c7ffd83c 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -18,10 +18,11 @@ public class ForkController { @Getter private Manager manager; private volatile int[] slots = new int[0]; - private boolean fork = false; + private boolean fork; public void init(Manager manager) { this.manager = manager; + fork = manager.getDynamicPropertiesStore().getForkController(); } public synchronized boolean shouldBeForked() { @@ -36,6 +37,7 @@ public synchronized boolean shouldBeForked() { } fork = true; + manager.getDynamicPropertiesStore().setForkController(true); return true; } diff --git a/src/main/java/org/tron/core/db/DynamicPropertiesStore.java b/src/main/java/org/tron/core/db/DynamicPropertiesStore.java index ea8a04d4982..9930e816cd5 100755 --- a/src/main/java/org/tron/core/db/DynamicPropertiesStore.java +++ b/src/main/java/org/tron/core/db/DynamicPropertiesStore.java @@ -1,5 +1,6 @@ package org.tron.core.db; +import com.google.common.primitives.Booleans; import com.google.protobuf.ByteString; import java.util.Arrays; import java.util.Optional; @@ -11,6 +12,7 @@ import org.springframework.stereotype.Component; import org.tron.common.runtime.vm.PrecompiledContracts; import org.tron.common.utils.ByteArray; +import org.tron.common.utils.ForkController; import org.tron.common.utils.Sha256Hash; import org.tron.core.capsule.BytesCapsule; import org.tron.core.config.Parameter; @@ -105,6 +107,8 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking private static final byte[] STORAGE_EXCHANGE_TAX_RATE = "STORAGE_EXCHANGE_TAX_RATE".getBytes(); + private static final byte[] FORK_CONTROLLER = "FORK_CONTROLLER".getBytes(); + @Autowired private DynamicPropertiesStore(@Value("properties") String dbName) { super(dbName); @@ -988,4 +992,13 @@ public void addTotalTransactionCost(long fee) { long newValue = getTotalTransactionCost() + fee; saveTotalTransactionCost(newValue); } + + public void setForkController(boolean fork) { + put(FORK_CONTROLLER, new BytesCapsule(Boolean.toString(fork).getBytes())); + } + + public boolean getForkController() { + byte[] value = revokingDB.getUnchecked(FORK_CONTROLLER); + return value == null ? Boolean.FALSE : Boolean.valueOf(new String(value)); + } } From 7a36a38b94f46c8c6d4fae2115d11b3cdf00e4ee Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Mon, 13 Aug 2018 16:29:21 +0800 Subject: [PATCH 08/23] store fork flag into dynamicpropertiesStore --- src/main/java/org/tron/core/db/DynamicPropertiesStore.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/org/tron/core/db/DynamicPropertiesStore.java b/src/main/java/org/tron/core/db/DynamicPropertiesStore.java index 9930e816cd5..865370a91fa 100755 --- a/src/main/java/org/tron/core/db/DynamicPropertiesStore.java +++ b/src/main/java/org/tron/core/db/DynamicPropertiesStore.java @@ -1,6 +1,5 @@ package org.tron.core.db; -import com.google.common.primitives.Booleans; import com.google.protobuf.ByteString; import java.util.Arrays; import java.util.Optional; @@ -10,9 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import org.tron.common.runtime.vm.PrecompiledContracts; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.ForkController; import org.tron.common.utils.Sha256Hash; import org.tron.core.capsule.BytesCapsule; import org.tron.core.config.Parameter; From b9b66a71525b6d16af5920739d717c09102296ec Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Mon, 13 Aug 2018 16:44:40 +0800 Subject: [PATCH 09/23] merge develop --- src/main/java/org/tron/core/db/DynamicPropertiesStore.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/tron/core/db/DynamicPropertiesStore.java b/src/main/java/org/tron/core/db/DynamicPropertiesStore.java index 4daaa5a73c9..ae439bc9e45 100755 --- a/src/main/java/org/tron/core/db/DynamicPropertiesStore.java +++ b/src/main/java/org/tron/core/db/DynamicPropertiesStore.java @@ -107,7 +107,8 @@ public class DynamicPropertiesStore extends TronStoreWithRevoking private static final byte[] FORK_CONTROLLER = "FORK_CONTROLLER".getBytes(); //If the parameter is larger than 0, the contract is allowed to be created. - private static final byte[] ALLOW_CREATION_OF_CONTRACTS = "ALLOW_CREATION_OF_CONTRACTS".getBytes(); + private static final byte[] ALLOW_CREATION_OF_CONTRACTS = "ALLOW_CREATION_OF_CONTRACTS" + .getBytes(); @Autowired From 21bde3c0c411b8dff835dadb963f2e1866069ed1 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Tue, 14 Aug 2018 17:00:38 +0800 Subject: [PATCH 10/23] improve fork logic --- src/main/java/org/tron/common/utils/ForkController.java | 1 + src/main/java/org/tron/core/net/node/NodeImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 940c7ffd83c..cff0925a831 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -36,6 +36,7 @@ public synchronized boolean shouldBeForked() { } } + // todo add Maintenance or block number fork = true; manager.getDynamicPropertiesStore().setForkController(true); return true; diff --git a/src/main/java/org/tron/core/net/node/NodeImpl.java b/src/main/java/org/tron/core/net/node/NodeImpl.java index a53136a0065..7636a92a8b8 100644 --- a/src/main/java/org/tron/core/net/node/NodeImpl.java +++ b/src/main/java/org/tron/core/net/node/NodeImpl.java @@ -860,8 +860,8 @@ private void onHandleTransactionMessage(PeerConnection peer, TransactionMessage peer.getNode().getHost()); return; } - if (del.handleTransaction(trxMsg.getTransactionCapsule()) - && del.forkOrNot(trxMsg.getTransactionCapsule())) { + if (del.forkOrNot(trxMsg.getTransactionCapsule()) + && del.handleTransaction(trxMsg.getTransactionCapsule())) { broadcast(trxMsg); } } catch (TraitorPeerException e) { From a203c0655f19e479b4300fa6bf89616c24aa2246 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Wed, 15 Aug 2018 11:36:10 +0800 Subject: [PATCH 11/23] add debug log --- .../java/org/tron/common/utils/ForkController.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index cff0925a831..f5fe29199fc 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -1,8 +1,11 @@ package org.tron.common.utils; +import com.google.common.collect.ImmutableList; import com.google.protobuf.ByteString; +import java.util.Arrays; import java.util.List; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; @@ -10,6 +13,7 @@ import org.tron.core.db.Manager; import org.tron.protos.Protocol.Transaction.Contract.ContractType; +@Slf4j @Component public class ForkController { @@ -27,11 +31,13 @@ public void init(Manager manager) { public synchronized boolean shouldBeForked() { if (fork) { + logger.info("*****shouldBeForked:" + true); return true; } for (int version : slots) { if (version != ChainConstant.version) { + logger.info("*****shouldBeForked:" + false); return false; } } @@ -39,10 +45,14 @@ public synchronized boolean shouldBeForked() { // todo add Maintenance or block number fork = true; manager.getDynamicPropertiesStore().setForkController(true); + logger.info("*****shouldBeForked:" + true); return true; } public synchronized boolean forkOrNot(TransactionCapsule capsule) { + logger.info("*****forkOrNot:" + (shouldBeForked() + || capsule.getInstance().getRawData().getContractList().get(0).getType().getNumber() + <= DISCARD_SCOPE)); return shouldBeForked() || capsule.getInstance().getRawData().getContractList().get(0).getType().getNumber() <= DISCARD_SCOPE; @@ -62,6 +72,7 @@ public synchronized void update(BlockCapsule blockCapsule) { } } + logger.info("*******update:" + Arrays.toString(slots)); slots[slot] = blockCapsule.getInstance().getBlockHeader().getRawData().getVersion(); } From 8c9d2354dc70b572b4e4f28aeaa247cf8ed54200 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Wed, 15 Aug 2018 11:36:35 +0800 Subject: [PATCH 12/23] add debug log --- src/main/java/org/tron/common/utils/ForkController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index f5fe29199fc..90b8e5783db 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -1,6 +1,5 @@ package org.tron.common.utils; -import com.google.common.collect.ImmutableList; import com.google.protobuf.ByteString; import java.util.Arrays; import java.util.List; From 8eabb883b4a67d1157a238d3ed70ee2fe1898ad2 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Wed, 15 Aug 2018 12:04:35 +0800 Subject: [PATCH 13/23] :loud_sound:add debug log --- src/main/java/org/tron/common/utils/ForkController.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 90b8e5783db..6fe3ec59549 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -71,7 +71,14 @@ public synchronized void update(BlockCapsule blockCapsule) { } } - logger.info("*******update:" + Arrays.toString(slots)); + logger.info( + "*******update:" + Arrays.toString(slots) + + ",witness size:" + witnesses.size() + + "," + slots + + ",slot:" + slot + + ",version:" + blockCapsule.getInstance().getBlockHeader().getRawData().getVersion() + + ); slots[slot] = blockCapsule.getInstance().getBlockHeader().getRawData().getVersion(); } From 72474949fbebf0605298186d5c35fe22d76b9d68 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Wed, 15 Aug 2018 12:14:17 +0800 Subject: [PATCH 14/23] :loud_sound:add debug log --- src/main/java/org/tron/common/utils/ForkController.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 6fe3ec59549..8e2ac206ae6 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -3,6 +3,7 @@ import com.google.protobuf.ByteString; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -77,6 +78,9 @@ public synchronized void update(BlockCapsule blockCapsule) { + "," + slots + ",slot:" + slot + ",version:" + blockCapsule.getInstance().getBlockHeader().getRawData().getVersion() + + ",block witness:" + ByteUtil.toHexString(witness.toByteArray()) + + "witnesses:" + witnesses.stream().map(w -> ByteUtil.toHexString(w.toByteArray())) + .collect(Collectors.toList()) ); slots[slot] = blockCapsule.getInstance().getBlockHeader().getRawData().getVersion(); From e306e5e74cae3be4a2396635db3d7423f1191ef3 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Wed, 15 Aug 2018 12:23:56 +0800 Subject: [PATCH 15/23] :loud_sound:add debug log --- src/main/java/org/tron/common/utils/ForkController.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 8e2ac206ae6..4c04ba54021 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -79,8 +79,11 @@ public synchronized void update(BlockCapsule blockCapsule) { + ",slot:" + slot + ",version:" + blockCapsule.getInstance().getBlockHeader().getRawData().getVersion() + ",block witness:" + ByteUtil.toHexString(witness.toByteArray()) - + "witnesses:" + witnesses.stream().map(w -> ByteUtil.toHexString(w.toByteArray())) + + ",witnesses:" + witnesses.stream().map(w -> ByteUtil.toHexString(w.toByteArray())) .collect(Collectors.toList()) + + ", witness class:" + witness.getClass().getSimpleName() + + ", witnesses class:" + witnesses.stream().map(Object::getClass) + .map(Class::getSimpleName).collect(Collectors.toList()) ); slots[slot] = blockCapsule.getInstance().getBlockHeader().getRawData().getVersion(); From fc7a53ed71868ce50008c6024a5caaa07e08224f Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Wed, 15 Aug 2018 12:31:21 +0800 Subject: [PATCH 16/23] :loud_sound:add debug log --- src/main/java/org/tron/common/utils/ForkController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 4c04ba54021..87b363e7c5c 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -67,7 +67,7 @@ public synchronized void update(BlockCapsule blockCapsule) { ByteString witness = blockCapsule.getWitnessAddress(); int slot = 0; for (ByteString scheduledWitness : witnesses) { - if (!scheduledWitness.equals(witness)) { + if (Arrays.equals(scheduledWitness.toByteArray(), witness.toByteArray())) { ++slot; } } From 8a46fa89f4285d0d8abcf612ea6a80e693503c76 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Wed, 15 Aug 2018 12:31:44 +0800 Subject: [PATCH 17/23] :loud_sound:add debug log --- src/main/java/org/tron/common/utils/ForkController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 87b363e7c5c..d578cc77326 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -67,7 +67,7 @@ public synchronized void update(BlockCapsule blockCapsule) { ByteString witness = blockCapsule.getWitnessAddress(); int slot = 0; for (ByteString scheduledWitness : witnesses) { - if (Arrays.equals(scheduledWitness.toByteArray(), witness.toByteArray())) { + if (!Arrays.equals(scheduledWitness.toByteArray(), witness.toByteArray())) { ++slot; } } From 976ee4e057c4ad74f6d9850e232a65bd92bef0ca Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Wed, 15 Aug 2018 12:35:00 +0800 Subject: [PATCH 18/23] :loud_sound:add debug log --- src/main/java/org/tron/common/utils/ForkController.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index d578cc77326..58335c800b1 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -65,12 +65,7 @@ public synchronized void update(BlockCapsule blockCapsule) { } ByteString witness = blockCapsule.getWitnessAddress(); - int slot = 0; - for (ByteString scheduledWitness : witnesses) { - if (!Arrays.equals(scheduledWitness.toByteArray(), witness.toByteArray())) { - ++slot; - } - } + int slot = witnesses.indexOf(witness); logger.info( "*******update:" + Arrays.toString(slots) From 5b4b1645b9dd311a1f56c3e5af852abeeb27dd56 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Wed, 15 Aug 2018 12:46:44 +0800 Subject: [PATCH 19/23] :loud_sound:add debug log --- src/main/java/org/tron/common/utils/ForkController.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 58335c800b1..2734070f14f 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -66,6 +66,10 @@ public synchronized void update(BlockCapsule blockCapsule) { ByteString witness = blockCapsule.getWitnessAddress(); int slot = witnesses.indexOf(witness); + if (slot < 0) { + return; + } + slots[slot] = blockCapsule.getInstance().getBlockHeader().getRawData().getVersion(); logger.info( "*******update:" + Arrays.toString(slots) @@ -81,7 +85,6 @@ public synchronized void update(BlockCapsule blockCapsule) { .map(Class::getSimpleName).collect(Collectors.toList()) ); - slots[slot] = blockCapsule.getInstance().getBlockHeader().getRawData().getVersion(); } } From 01de1acf8d714110ffa884458c3e618627fa9142 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Wed, 15 Aug 2018 12:51:05 +0800 Subject: [PATCH 20/23] :loud_sound:add debug log --- src/main/java/org/tron/common/utils/ForkController.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 2734070f14f..2dd88756294 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -3,7 +3,6 @@ import com.google.protobuf.ByteString; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -77,13 +76,6 @@ public synchronized void update(BlockCapsule blockCapsule) { + "," + slots + ",slot:" + slot + ",version:" + blockCapsule.getInstance().getBlockHeader().getRawData().getVersion() - + ",block witness:" + ByteUtil.toHexString(witness.toByteArray()) - + ",witnesses:" + witnesses.stream().map(w -> ByteUtil.toHexString(w.toByteArray())) - .collect(Collectors.toList()) - + ", witness class:" + witness.getClass().getSimpleName() - + ", witnesses class:" + witnesses.stream().map(Object::getClass) - .map(Class::getSimpleName).collect(Collectors.toList()) - ); } From 5bf5501414ca7f2f6e5f36bd0de531b4b1927ec3 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Wed, 15 Aug 2018 20:55:28 +0800 Subject: [PATCH 21/23] before fork, not deal with any transaction --- src/main/java/org/tron/core/Wallet.java | 2 +- src/main/java/org/tron/core/db/Manager.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/tron/core/Wallet.java b/src/main/java/org/tron/core/Wallet.java index 67d1645af4b..0e57815059c 100755 --- a/src/main/java/org/tron/core/Wallet.java +++ b/src/main/java/org/tron/core/Wallet.java @@ -382,8 +382,8 @@ public GrpcAPI.Return broadcastTransaction(Transaction signaturedTransaction) { dbManager.getTransactionIdCache().put(trx.getTransactionId(), true); } - dbManager.pushTransactions(trx); if (dbManager.getForkController().forkOrNot(trx)) { + dbManager.pushTransactions(trx); p2pNode.broadcast(message); } return builder.setResult(true).setCode(response_code.SUCCESS).build(); diff --git a/src/main/java/org/tron/core/db/Manager.java b/src/main/java/org/tron/core/db/Manager.java index 1defee359ed..1b69a9c6047 100644 --- a/src/main/java/org/tron/core/db/Manager.java +++ b/src/main/java/org/tron/core/db/Manager.java @@ -1085,11 +1085,11 @@ public synchronized BlockCapsule generateBlock( } // apply transaction try (ISession tmpSeesion = revokingStore.buildSession()) { - processTransaction(trx, null); -// trx.resetResult(); - tmpSeesion.merge(); - // push into block if (forkController.forkOrNot(trx)) { + processTransaction(trx, null); +// trx.resetResult(); + tmpSeesion.merge(); + // push into block blockCapsule.addTransaction(trx); } iterator.remove(); From c6af6a1b244969347114232716bed8a95531c733 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Thu, 23 Aug 2018 17:35:25 +0800 Subject: [PATCH 22/23] reset forkController when maintenance --- src/main/java/org/tron/common/utils/ForkController.java | 4 ++++ src/main/java/org/tron/core/db/Manager.java | 1 + 2 files changed, 5 insertions(+) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 2dd88756294..38bc618ec4b 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -79,4 +79,8 @@ public synchronized void update(BlockCapsule blockCapsule) { ); } + public void reset() { + Arrays.fill(slots, 0); + } + } diff --git a/src/main/java/org/tron/core/db/Manager.java b/src/main/java/org/tron/core/db/Manager.java index 93610654b26..d78aa415d0d 100644 --- a/src/main/java/org/tron/core/db/Manager.java +++ b/src/main/java/org/tron/core/db/Manager.java @@ -1352,6 +1352,7 @@ private void processMaintenance(BlockCapsule block) { proposalController.processProposals(); witnessController.updateWitness(); this.dynamicPropertiesStore.updateNextMaintenanceTime(block.getTimeStamp()); + forkController.reset(); } /** From 32f9f744ec422d664c74652877606748e43d59e3 Mon Sep 17 00:00:00 2001 From: Matt Yue Date: Thu, 23 Aug 2018 19:23:57 +0800 Subject: [PATCH 23/23] Improve code readability --- .../java/org/tron/common/utils/ForkController.java | 14 +++++++++----- .../org/tron/core/db/DynamicPropertiesStore.java | 6 +++--- src/main/java/org/tron/core/db/Manager.java | 7 ++++++- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/tron/common/utils/ForkController.java b/src/main/java/org/tron/common/utils/ForkController.java index 38bc618ec4b..333b181c507 100644 --- a/src/main/java/org/tron/common/utils/ForkController.java +++ b/src/main/java/org/tron/common/utils/ForkController.java @@ -21,15 +21,15 @@ public class ForkController { @Getter private Manager manager; private volatile int[] slots = new int[0]; - private boolean fork; + private boolean forked; public void init(Manager manager) { this.manager = manager; - fork = manager.getDynamicPropertiesStore().getForkController(); + forked = manager.getDynamicPropertiesStore().getForked(); } public synchronized boolean shouldBeForked() { - if (fork) { + if (forked) { logger.info("*****shouldBeForked:" + true); return true; } @@ -42,8 +42,8 @@ public synchronized boolean shouldBeForked() { } // todo add Maintenance or block number - fork = true; - manager.getDynamicPropertiesStore().setForkController(true); + forked = true; + manager.getDynamicPropertiesStore().forked(); logger.info("*****shouldBeForked:" + true); return true; } @@ -58,6 +58,10 @@ public synchronized boolean forkOrNot(TransactionCapsule capsule) { } public synchronized void update(BlockCapsule blockCapsule) { + if (forked) { + return; + } + List witnesses = manager.getWitnessController().getActiveWitnesses(); if (witnesses.size() != slots.length) { slots = new int[witnesses.size()]; diff --git a/src/main/java/org/tron/core/db/DynamicPropertiesStore.java b/src/main/java/org/tron/core/db/DynamicPropertiesStore.java index 7dec6c07ccf..3d273c66b46 100755 --- a/src/main/java/org/tron/core/db/DynamicPropertiesStore.java +++ b/src/main/java/org/tron/core/db/DynamicPropertiesStore.java @@ -1126,11 +1126,11 @@ public void addTotalTransactionCost(long fee) { saveTotalTransactionCost(newValue); } - public void setForkController(boolean fork) { - put(FORK_CONTROLLER, new BytesCapsule(Boolean.toString(fork).getBytes())); + public void forked() { + put(FORK_CONTROLLER, new BytesCapsule(Boolean.toString(true).getBytes())); } - public boolean getForkController() { + public boolean getForked() { byte[] value = revokingDB.getUnchecked(FORK_CONTROLLER); return value == null ? Boolean.FALSE : Boolean.valueOf(new String(value)); } diff --git a/src/main/java/org/tron/core/db/Manager.java b/src/main/java/org/tron/core/db/Manager.java index d78aa415d0d..3d4429d9b65 100644 --- a/src/main/java/org/tron/core/db/Manager.java +++ b/src/main/java/org/tron/core/db/Manager.java @@ -690,7 +690,6 @@ private void applyBlock(BlockCapsule block) throws ContractValidateException, TaposException, ValidateScheduleException, TransactionTraceException, OutOfSlotTimeException, UnsupportVMException { processBlock(block); - forkController.update(block); this.blockStore.put(block.getBlockId().getBytes(), block); this.blockIndexStore.put(block.getBlockId()); } @@ -1318,6 +1317,12 @@ public void updateLatestSolidifiedBlock() { } getDynamicPropertiesStore().saveLatestSolidifiedBlockNum(latestSolidifiedBlockNum); logger.info("update solid block, num = {}", latestSolidifiedBlockNum); + try { + BlockCapsule solidifiedBlock = getBlockByNum(latestSolidifiedBlockNum); + forkController.update(solidifiedBlock); + } catch (ItemNotFoundException | BadItemException e) { + logger.error("solidified block not found"); + } } public long getSyncBeginNumber() {