Skip to content

Commit b57411f

Browse files
committed
feat(transaction): optimize transactions during the consensus phase
1 parent 1f0aa38 commit b57411f

File tree

7 files changed

+49
-13
lines changed

7 files changed

+49
-13
lines changed

chainbase/src/main/java/org/tron/core/ChainBaseManager.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,15 @@ public static synchronized void init(ChainBaseManager manager) {
380380
AssetUtil.setDynamicPropertiesStore(manager.getDynamicPropertiesStore());
381381
}
382382

383+
public long getNextBlockSlotTime() {
384+
long slotCount = 1;
385+
if (dynamicPropertiesStore.getStateFlag() == 1) {
386+
slotCount += dynamicPropertiesStore.getMaintenanceSkipSlots();
387+
}
388+
return dynamicPropertiesStore.getLatestBlockHeaderTimestamp()
389+
+ slotCount * BLOCK_PRODUCED_INTERVAL;
390+
}
391+
383392
@PostConstruct
384393
private void init() {
385394
this.lowestBlockNum = this.blockIndexStore.getLimitNumber(1, 1).stream()

chainbase/src/main/java/org/tron/core/db/BandwidthProcessor.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@ public void consume(TransactionCapsule trx, TransactionTrace trace)
9999
TooBigTransactionResultException, TooBigTransactionException {
100100
List<Contract> contracts = trx.getInstance().getRawData().getContractList();
101101
long resultSizeWithMaxContractRet = trx.getResultSizeWithMaxContractRet();
102-
if (!trx.isInBlock() && resultSizeWithMaxContractRet >
102+
boolean optimizeTxs = !trx.isInBlock() || chainBaseManager
103+
.getDynamicPropertiesStore().allowConsensusLogicOptimization();
104+
if (optimizeTxs && resultSizeWithMaxContractRet >
103105
Constant.MAX_RESULT_SIZE_IN_TX * contracts.size()) {
104106
throw new TooBigTransactionResultException(String.format(
105107
"Too big transaction result, TxId %s, the result size is %d bytes, maxResultSize %d",
@@ -135,7 +137,7 @@ public void consume(TransactionCapsule trx, TransactionTrace trace)
135137
}
136138
long now = chainBaseManager.getHeadSlot();
137139
if (contractCreateNewAccount(contract)) {
138-
if (!trx.isInBlock()) {
140+
if (optimizeTxs) {
139141
long maxCreateAccountTxSize = dynamicPropertiesStore.getMaxCreateAccountTxSize();
140142
int signatureCount = trx.getInstance().getSignatureCount();
141143
long createAccountBytesSize = trx.getInstance().toBuilder().clearRet()

framework/src/main/java/org/tron/core/Wallet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) {
549549
throw new ContractValidateException(ActuatorConstant.CONTRACT_NOT_EXIST);
550550
}
551551
TransactionMessage message = new TransactionMessage(trx.getInstance().toByteArray());
552-
trx.checkExpiration(tronNetDelegate.getNextBlockSlotTime());
552+
trx.checkExpiration(chainBaseManager.getNextBlockSlotTime());
553553
dbManager.pushTransaction(trx);
554554
int num = tronNetService.fastBroadcastTransaction(message);
555555
if (num == 0 && minEffectiveConnection != 0) {

framework/src/main/java/org/tron/core/db/Manager.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,9 @@ void validateTapos(TransactionCapsule transactionCapsule) throws TaposException
794794

795795
void validateCommon(TransactionCapsule transactionCapsule)
796796
throws TransactionExpirationException, TooBigTransactionException {
797-
if (!transactionCapsule.isInBlock()) {
797+
boolean optimizeTxs = !transactionCapsule.isInBlock() || chainBaseManager
798+
.getDynamicPropertiesStore().allowConsensusLogicOptimization();
799+
if (optimizeTxs) {
798800
transactionCapsule.removeRedundantRet();
799801
long generalBytesSize =
800802
transactionCapsule.getInstance().toBuilder().clearRet().build().getSerializedSize()
@@ -813,6 +815,10 @@ void validateCommon(TransactionCapsule transactionCapsule)
813815
}
814816
long transactionExpiration = transactionCapsule.getExpiration();
815817
long headBlockTime = chainBaseManager.getHeadBlockTimeStamp();
818+
if (transactionCapsule.isInBlock()
819+
&& chainBaseManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()) {
820+
transactionCapsule.checkExpiration(chainBaseManager.getNextBlockSlotTime());
821+
}
816822
if (transactionExpiration <= headBlockTime
817823
|| transactionExpiration > headBlockTime + Constant.MAXIMUM_TIME_UNTIL_EXPIRATION) {
818824
throw new TransactionExpirationException(

framework/src/main/java/org/tron/core/net/TronNetDelegate.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -380,12 +380,4 @@ public boolean isBlockUnsolidified() {
380380
return headNum - solidNum >= maxUnsolidifiedBlocks;
381381
}
382382

383-
public long getNextBlockSlotTime() {
384-
long slotCount = 1;
385-
if (chainBaseManager.getDynamicPropertiesStore().getStateFlag() == 1) {
386-
slotCount += chainBaseManager.getDynamicPropertiesStore().getMaintenanceSkipSlots();
387-
}
388-
return chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp()
389-
+ slotCount * BLOCK_PRODUCED_INTERVAL;
390-
}
391383
}

framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.springframework.beans.factory.annotation.Autowired;
1111
import org.springframework.stereotype.Component;
1212
import org.tron.common.es.ExecutorServiceManager;
13+
import org.tron.core.ChainBaseManager;
1314
import org.tron.core.config.args.Args;
1415
import org.tron.core.exception.P2pException;
1516
import org.tron.core.exception.P2pException.TypeEnum;
@@ -36,6 +37,8 @@ public class TransactionsMsgHandler implements TronMsgHandler {
3637
private TronNetDelegate tronNetDelegate;
3738
@Autowired
3839
private AdvService advService;
40+
@Autowired
41+
private ChainBaseManager chainBaseManager;
3942

4043
private BlockingQueue<TrxEvent> smartContractQueue = new LinkedBlockingQueue(MAX_TRX_SIZE);
4144

@@ -129,7 +132,7 @@ private void handleTransaction(PeerConnection peer, TransactionMessage trx) {
129132
}
130133

131134
try {
132-
trx.getTransactionCapsule().checkExpiration(tronNetDelegate.getNextBlockSlotTime());
135+
trx.getTransactionCapsule().checkExpiration(chainBaseManager.getNextBlockSlotTime());
133136
tronNetDelegate.pushTransaction(trx.getTransactionCapsule());
134137
advService.broadcast(trx);
135138
} catch (P2pException e) {

framework/src/test/java/org/tron/core/db/ManagerTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,30 @@ public void testTooBigTransaction() {
11581158

11591159
}
11601160

1161+
@Test
1162+
public void testExpiration() {
1163+
dbManager.getDynamicPropertiesStore().saveConsensusLogicOptimization(1);
1164+
TransferContract transferContract =
1165+
TransferContract.newBuilder()
1166+
.setAmount(10)
1167+
.setOwnerAddress(ByteString.copyFromUtf8("aaa"))
1168+
.setToAddress(ByteString.copyFromUtf8("bbb"))
1169+
.build();
1170+
StringBuilder sb = new StringBuilder();
1171+
for (int i = 0; i < 100; i++) {
1172+
sb.append("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
1173+
}
1174+
Transaction transaction = Transaction.newBuilder().setRawData(Transaction.raw.newBuilder()
1175+
.setData(ByteString.copyFrom(sb.toString().getBytes(StandardCharsets.UTF_8)))
1176+
.addContract(Transaction.Contract.newBuilder().setParameter(Any.pack(transferContract))
1177+
.setType(ContractType.TransferContract))).build();
1178+
TransactionCapsule trx = new TransactionCapsule(transaction);
1179+
trx.setInBlock(true);
1180+
1181+
assertThrows(TransactionExpirationException.class, () -> dbManager.validateCommon(trx));
1182+
1183+
}
1184+
11611185
@Test
11621186
public void blockTrigger() {
11631187
exit.expectSystemExitWithStatus(1);

0 commit comments

Comments
 (0)