Skip to content

Commit 2ce580d

Browse files
Merge pull request #6172 from lxcmyf/feature/consensus_optimize_tx
feat(transaction): optimize transactions during the consensus phase
2 parents 0c27569 + 9c03624 commit 2ce580d

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
@@ -556,7 +556,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) {
556556
throw new ContractValidateException(ActuatorConstant.CONTRACT_NOT_EXIST);
557557
}
558558
TransactionMessage message = new TransactionMessage(trx.getInstance().toByteArray());
559-
trx.checkExpiration(tronNetDelegate.getNextBlockSlotTime());
559+
trx.checkExpiration(chainBaseManager.getNextBlockSlotTime());
560560
dbManager.pushTransaction(trx);
561561
int num = tronNetService.fastBroadcastTransaction(message);
562562
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
@@ -797,7 +797,9 @@ void validateTapos(TransactionCapsule transactionCapsule) throws TaposException
797797

798798
void validateCommon(TransactionCapsule transactionCapsule)
799799
throws TransactionExpirationException, TooBigTransactionException {
800-
if (!transactionCapsule.isInBlock()) {
800+
boolean optimizeTxs = !transactionCapsule.isInBlock() || chainBaseManager
801+
.getDynamicPropertiesStore().allowConsensusLogicOptimization();
802+
if (optimizeTxs) {
801803
transactionCapsule.removeRedundantRet();
802804
long generalBytesSize =
803805
transactionCapsule.getInstance().toBuilder().clearRet().build().getSerializedSize()
@@ -816,6 +818,10 @@ void validateCommon(TransactionCapsule transactionCapsule)
816818
}
817819
long transactionExpiration = transactionCapsule.getExpiration();
818820
long headBlockTime = chainBaseManager.getHeadBlockTimeStamp();
821+
if (transactionCapsule.isInBlock()
822+
&& chainBaseManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()) {
823+
transactionCapsule.checkExpiration(chainBaseManager.getNextBlockSlotTime());
824+
}
819825
if (transactionExpiration <= headBlockTime
820826
|| transactionExpiration > headBlockTime + Constant.MAXIMUM_TIME_UNTIL_EXPIRATION) {
821827
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
@@ -384,12 +384,4 @@ public boolean isBlockUnsolidified() {
384384
return headNum - solidNum >= maxUnsolidifiedBlocks;
385385
}
386386

387-
public long getNextBlockSlotTime() {
388-
long slotCount = 1;
389-
if (chainBaseManager.getDynamicPropertiesStore().getStateFlag() == 1) {
390-
slotCount += chainBaseManager.getDynamicPropertiesStore().getMaintenanceSkipSlots();
391-
}
392-
return chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp()
393-
+ slotCount * BLOCK_PRODUCED_INTERVAL;
394-
}
395387
}

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

@@ -133,7 +136,7 @@ private void handleTransaction(PeerConnection peer, TransactionMessage trx) {
133136
}
134137

135138
try {
136-
trx.getTransactionCapsule().checkExpiration(tronNetDelegate.getNextBlockSlotTime());
139+
trx.getTransactionCapsule().checkExpiration(chainBaseManager.getNextBlockSlotTime());
137140
tronNetDelegate.pushTransaction(trx.getTransactionCapsule());
138141
advService.broadcast(trx);
139142
} 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
@@ -1161,6 +1161,30 @@ public void testTooBigTransaction() {
11611161

11621162
}
11631163

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

0 commit comments

Comments
 (0)