Skip to content

Commit b089ca0

Browse files
authored
Merge pull request #5838 from zeusoo001/feature/limit_big_transaction_size
feat(validate): limit big transaction size
2 parents fd3d8f6 + 7e99a00 commit b089ca0

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.tron.core.db;
22

33
import static org.tron.common.utils.Commons.adjustBalance;
4+
import static org.tron.core.Constant.TRANSACTION_MAX_BYTE_SIZE;
45
import static org.tron.core.exception.BadBlockException.TypeEnum.CALC_MERKLE_ROOT_FAILED;
56
import static org.tron.protos.Protocol.Transaction.Contract.ContractType.TransferContract;
67
import static org.tron.protos.Protocol.Transaction.Result.contractResult.SUCCESS;
@@ -793,9 +794,22 @@ void validateTapos(TransactionCapsule transactionCapsule) throws TaposException
793794

794795
void validateCommon(TransactionCapsule transactionCapsule)
795796
throws TransactionExpirationException, TooBigTransactionException {
797+
if (!transactionCapsule.isInBlock()) {
798+
long generalBytesSize =
799+
transactionCapsule.getInstance().toBuilder().clearRet().build().getSerializedSize()
800+
+ Constant.MAX_RESULT_SIZE_IN_TX + Constant.MAX_RESULT_SIZE_IN_TX;
801+
if (generalBytesSize > TRANSACTION_MAX_BYTE_SIZE) {
802+
throw new TooBigTransactionException(String.format(
803+
"Too big transaction with result, TxId %s, the size is %d bytes, maxTxSize %d",
804+
transactionCapsule.getTransactionId(), generalBytesSize, TRANSACTION_MAX_BYTE_SIZE));
805+
}
806+
}
807+
796808
if (transactionCapsule.getData().length > Constant.TRANSACTION_MAX_BYTE_SIZE) {
797809
throw new TooBigTransactionException(String.format(
798-
"Too big transaction, the size is %d bytes", transactionCapsule.getData().length));
810+
"Too big transaction, TxId %s, the size is %d bytes, maxTxSize %d",
811+
transactionCapsule.getTransactionId(), transactionCapsule.getData().length,
812+
TRANSACTION_MAX_BYTE_SIZE));
799813
}
800814
long transactionExpiration = transactionCapsule.getExpiration();
801815
long headBlockTime = chainBaseManager.getHeadBlockTimeStamp();

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.tron.core.db;
22

3+
import static org.junit.Assert.assertThrows;
34
import static org.tron.common.utils.Commons.adjustAssetBalanceV2;
45
import static org.tron.common.utils.Commons.adjustBalance;
56
import static org.tron.common.utils.Commons.adjustTotalShieldedPoolValue;
@@ -8,8 +9,10 @@
89

910
import com.google.common.collect.Maps;
1011
import com.google.common.collect.Sets;
12+
import com.google.protobuf.Any;
1113
import com.google.protobuf.ByteString;
1214
import java.io.IOException;
15+
import java.nio.charset.StandardCharsets;
1316
import java.util.ArrayList;
1417
import java.util.Arrays;
1518
import java.util.List;
@@ -85,6 +88,7 @@
8588
import org.tron.protos.Protocol.Block;
8689
import org.tron.protos.Protocol.Transaction;
8790
import org.tron.protos.Protocol.Transaction.Contract.ContractType;
91+
import org.tron.protos.Protocol.Transaction.raw;
8892
import org.tron.protos.contract.AccountContract;
8993
import org.tron.protos.contract.AssetIssueContractOuterClass;
9094
import org.tron.protos.contract.BalanceContract.TransferContract;
@@ -1114,4 +1118,37 @@ public void testExpireTransaction() {
11141118
Assert.fail();
11151119
}
11161120
}
1121+
1122+
@Test
1123+
public void testTooBigTransaction() {
1124+
TransferContract transferContract =
1125+
TransferContract.newBuilder()
1126+
.setAmount(10)
1127+
.setOwnerAddress(ByteString.copyFromUtf8("aaa"))
1128+
.setToAddress(ByteString.copyFromUtf8("bbb"))
1129+
.build();
1130+
StringBuilder sb = new StringBuilder();
1131+
for (int i = 0; i < 6666; i++) {
1132+
sb.append("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
1133+
}
1134+
Transaction transaction = Transaction.newBuilder().setRawData(raw.newBuilder()
1135+
.setData(ByteString.copyFrom(sb.toString().getBytes(StandardCharsets.UTF_8)))
1136+
.addContract(Transaction.Contract.newBuilder().setParameter(Any.pack(transferContract))
1137+
.setType(ContractType.TransferContract))).build();
1138+
TransactionCapsule trx = new TransactionCapsule(transaction);
1139+
trx.setInBlock(false);
1140+
assertThrows(
1141+
"Too big transaction with result, "
1142+
+ "TxId 1c05e9fca6a2d0c366ed4430456527eb40198e70c8b20f5ceca4739c68a79af8, "
1143+
+ "the size is 533483 bytes, maxTxSize 512000",
1144+
TooBigTransactionException.class, ()-> dbManager.validateCommon(trx));
1145+
1146+
trx.setInBlock(true);
1147+
assertThrows(
1148+
"Too big transaction, "
1149+
+ "TxId 1c05e9fca6a2d0c366ed4430456527eb40198e70c8b20f5ceca4739c68a79af8, "
1150+
+ "the size is 1066643 bytes, maxTxSize 512000",
1151+
TooBigTransactionException.class, ()-> dbManager.validateCommon(trx));
1152+
1153+
}
11171154
}

0 commit comments

Comments
 (0)