Skip to content

Commit 45e3bf8

Browse files
authored
feat(*): disable exchange transaction (#6507)
1 parent 72e31d9 commit 45e3bf8

File tree

4 files changed

+138
-4
lines changed

4 files changed

+138
-4
lines changed

common/src/main/java/org/tron/core/config/Parameter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ public enum ForkBlockVersionEnum {
2626
VERSION_4_7_4(29, 1596780000000L, 80),
2727
VERSION_4_7_5(30, 1596780000000L, 80),
2828
VERSION_4_7_7(31, 1596780000000L, 80),
29-
VERSION_4_8_0(32, 1596780000000L, 80);
29+
VERSION_4_8_0(32, 1596780000000L, 80),
30+
VERSION_4_8_0_1(33, 1596780000000L, 70);
3031
// if add a version, modify BLOCK_VERSION simultaneously
3132

3233
@Getter
@@ -75,7 +76,7 @@ public class ChainConstant {
7576
public static final int SINGLE_REPEAT = 1;
7677
public static final int BLOCK_FILLED_SLOTS_NUMBER = 128;
7778
public static final int MAX_FROZEN_NUMBER = 1;
78-
public static final int BLOCK_VERSION = 32;
79+
public static final int BLOCK_VERSION = 33;
7980
public static final long FROZEN_PERIOD = 86_400_000L;
8081
public static final long DELEGATE_PERIOD = 3 * 86_400_000L;
8182
public static final long TRX_PRECISION = 1000_000L;

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
import org.tron.core.capsule.TransactionRetCapsule;
9898
import org.tron.core.capsule.WitnessCapsule;
9999
import org.tron.core.capsule.utils.TransactionUtil;
100+
import org.tron.core.config.Parameter;
100101
import org.tron.core.config.Parameter.ChainConstant;
101102
import org.tron.core.config.args.Args;
102103
import org.tron.core.consensus.ProposalController;
@@ -873,6 +874,11 @@ public boolean pushTransaction(final TransactionCapsule trx)
873874
return true;
874875
}
875876

877+
if (isExchangeTransaction(trx.getInstance())) {
878+
throw new ContractValidateException("ExchangeTransactionContract is rejected");
879+
}
880+
881+
876882
pushTransactionQueue.add(trx);
877883
Metrics.gaugeInc(MetricKeys.Gauge.MANAGER_QUEUE, 1,
878884
MetricLabels.Gauge.QUEUE_QUEUED);
@@ -1676,6 +1682,11 @@ public BlockCapsule generateBlock(Miner miner, long blockTime, long timeout) {
16761682
accountSet.add(ownerAddress);
16771683
}
16781684
}
1685+
1686+
if (isExchangeTransaction(transaction)) {
1687+
continue;
1688+
}
1689+
16791690
if (ownerAddressSet.contains(ownerAddress)) {
16801691
trx.setVerified(false);
16811692
}
@@ -1749,6 +1760,24 @@ private boolean isShieldedTransaction(Transaction transaction) {
17491760
}
17501761
}
17511762

1763+
private boolean isExchangeTransaction(Transaction transaction) {
1764+
Contract contract = transaction.getRawData().getContract(0);
1765+
switch (contract.getType()) {
1766+
case ExchangeTransactionContract: {
1767+
return true;
1768+
}
1769+
default:
1770+
return false;
1771+
}
1772+
}
1773+
1774+
private void rejectExchangeTransaction(Transaction transaction) throws ContractValidateException {
1775+
if (isExchangeTransaction(transaction) && chainBaseManager.getForkController()
1776+
.pass(Parameter.ForkBlockVersionEnum.VERSION_4_8_0_1)) {
1777+
throw new ContractValidateException("ExchangeTransactionContract is rejected");
1778+
}
1779+
}
1780+
17521781
public TransactionStore getTransactionStore() {
17531782
return chainBaseManager.getTransactionStore();
17541783
}
@@ -1803,6 +1832,7 @@ private void processBlock(BlockCapsule block, List<TransactionCapsule> txs)
18031832
List<TransactionInfo> results = new ArrayList<>();
18041833
long num = block.getNum();
18051834
for (TransactionCapsule transactionCapsule : block.getTransactions()) {
1835+
rejectExchangeTransaction(transactionCapsule.getInstance());
18061836
if (chainBaseManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()
18071837
&& transactionCapsule.retCountIsGreatThanContractCount()) {
18081838
throw new BadBlockException(String.format("The result count %d of this transaction %s is "

framework/src/main/java/org/tron/program/Version.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ public class Version {
44

55
public static final String VERSION_NAME = "GreatVoyage-v4.7.7-243-gb3555dd655";
66
public static final String VERSION_CODE = "18631";
7-
private static final String VERSION = "4.8.0";
7+
private static final String VERSION = "4.8.0.1";
88

99
public static String getVersion() {
1010
return VERSION;

framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package org.tron.core.actuator;
22

3+
import static org.junit.Assert.assertThrows;
34
import static org.junit.Assert.fail;
45
import static org.tron.core.config.Parameter.ChainSymbol.TRX_SYMBOL_BYTES;
56

67
import com.google.protobuf.Any;
78
import com.google.protobuf.ByteString;
9+
import java.lang.reflect.InvocationTargetException;
10+
import java.lang.reflect.Method;
811
import java.util.Arrays;
912
import java.util.Map;
1013
import junit.framework.TestCase;
@@ -13,18 +16,30 @@
1316
import org.junit.Before;
1417
import org.junit.Test;
1518
import org.tron.common.BaseTest;
19+
import org.tron.common.crypto.ECKey;
1620
import org.tron.common.utils.ByteArray;
21+
import org.tron.common.utils.ForkController;
22+
import org.tron.common.utils.PublicMethod;
23+
import org.tron.consensus.base.Param;
24+
import org.tron.consensus.base.Param.Miner;
1725
import org.tron.core.Constant;
1826
import org.tron.core.Wallet;
1927
import org.tron.core.capsule.AccountCapsule;
2028
import org.tron.core.capsule.AssetIssueCapsule;
29+
import org.tron.core.capsule.BlockCapsule;
2130
import org.tron.core.capsule.ExchangeCapsule;
31+
import org.tron.core.capsule.TransactionCapsule;
2232
import org.tron.core.capsule.TransactionResultCapsule;
33+
import org.tron.core.capsule.WitnessCapsule;
34+
import org.tron.core.config.Parameter;
35+
import org.tron.core.config.Parameter.ForkBlockVersionEnum;
2336
import org.tron.core.config.args.Args;
37+
import org.tron.core.db.Manager;
2438
import org.tron.core.exception.ContractExeException;
2539
import org.tron.core.exception.ContractValidateException;
2640
import org.tron.core.exception.ItemNotFoundException;
2741
import org.tron.protos.Protocol.AccountType;
42+
import org.tron.protos.Protocol.Transaction.Contract.ContractType;
2843
import org.tron.protos.Protocol.Transaction.Result.code;
2944
import org.tron.protos.contract.AssetIssueContractOuterClass;
3045
import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract;
@@ -1674,7 +1689,7 @@ public void noContract() {
16741689
public void invalidContractType() {
16751690
ExchangeTransactionActuator actuator = new ExchangeTransactionActuator();
16761691
// create AssetIssueContract, not a valid ClearABI contract , which will throw e expectipon
1677-
Any invalidContractTypes = Any.pack(AssetIssueContractOuterClass.AssetIssueContract.newBuilder()
1692+
Any invalidContractTypes = Any.pack(AssetIssueContract.newBuilder()
16781693
.build());
16791694
actuator.setChainBaseManager(dbManager.getChainBaseManager())
16801695
.setAny(invalidContractTypes);
@@ -1725,4 +1740,92 @@ private void processAndCheckInvalid(ExchangeTransactionActuator actuator,
17251740
}
17261741
}
17271742

1743+
/**
1744+
* isExchangeTransaction
1745+
*/
1746+
@Test
1747+
public void isExchangeTransactionPush() {
1748+
try {
1749+
TransactionCapsule transactionCap = new TransactionCapsule(
1750+
ExchangeTransactionContract.newBuilder()
1751+
.setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS_SECOND)))
1752+
.setExchangeId(1)
1753+
.setTokenId(ByteString.copyFrom("_".getBytes()))
1754+
.setQuant(1)
1755+
.setExpected(1)
1756+
.build(), ContractType.ExchangeTransactionContract);
1757+
dbManager.pushTransaction(transactionCap);
1758+
1759+
} catch (Exception e) {
1760+
Assert.assertTrue(true);
1761+
}
1762+
}
1763+
1764+
@Test
1765+
public void isExchangeTransactionGenerate() {
1766+
try {
1767+
1768+
String key = PublicMethod.getRandomPrivateKey();
1769+
byte[] privateKey = ByteArray.fromHexString(key);
1770+
final ECKey ecKey = ECKey.fromPrivate(privateKey);
1771+
byte[] address = ecKey.getAddress();
1772+
WitnessCapsule witnessCapsule = new WitnessCapsule(ByteString.copyFrom(address));
1773+
1774+
String OWNER_ADDRESS_SECOND =
1775+
Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc";
1776+
TransactionCapsule transactionCap = new TransactionCapsule(
1777+
ExchangeTransactionContract.newBuilder()
1778+
.setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS_SECOND)))
1779+
.setExchangeId(1)
1780+
.setTokenId(ByteString.copyFrom("_".getBytes()))
1781+
.setQuant(1)
1782+
.setExpected(1)
1783+
.build(), ContractType.ExchangeTransactionContract);
1784+
dbManager.getPendingTransactions().add(transactionCap);
1785+
Param param = Param.getInstance();
1786+
Miner miner = param.new Miner(privateKey, witnessCapsule.getAddress(),
1787+
witnessCapsule.getAddress());
1788+
BlockCapsule blockCapsule = dbManager
1789+
.generateBlock(miner, 1533529947843L, System.currentTimeMillis() + 1000);
1790+
} catch (Exception e) {
1791+
Assert.assertTrue(false);
1792+
}
1793+
}
1794+
1795+
@Test
1796+
public void rejectExchangeTransaction() {
1797+
try {
1798+
long maintenanceTimeInterval = dbManager.getDynamicPropertiesStore()
1799+
.getMaintenanceTimeInterval();
1800+
long hardForkTime =
1801+
((ForkBlockVersionEnum.VERSION_4_0_1.getHardForkTime() - 1) / maintenanceTimeInterval + 1)
1802+
* maintenanceTimeInterval;
1803+
dbManager.getDynamicPropertiesStore()
1804+
.saveLatestBlockHeaderTimestamp(hardForkTime + 1);
1805+
byte[] stats = new byte[27];
1806+
Arrays.fill(stats, (byte) 1);
1807+
dbManager.getDynamicPropertiesStore()
1808+
.statsByVersion(ForkBlockVersionEnum.VERSION_4_8_0_1.getValue(), stats);
1809+
boolean flag = ForkController.instance().pass(ForkBlockVersionEnum.VERSION_4_8_0_1);
1810+
Assert.assertTrue(flag);
1811+
String OWNER_ADDRESS_SECOND =
1812+
Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc";
1813+
TransactionCapsule transactionCap = new TransactionCapsule(
1814+
ExchangeTransactionContract.newBuilder()
1815+
.setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS_SECOND)))
1816+
.setExchangeId(1)
1817+
.setTokenId(ByteString.copyFrom("_".getBytes()))
1818+
.setQuant(1)
1819+
.setExpected(1)
1820+
.build(), ContractType.ExchangeTransactionContract);
1821+
Method rejectExchangeTransaction = Manager.class.getDeclaredMethod(
1822+
"rejectExchangeTransaction", org.tron.protos.Protocol.Transaction.class);
1823+
rejectExchangeTransaction.setAccessible(true);
1824+
Exception ex = assertThrows(InvocationTargetException.class, () -> {
1825+
rejectExchangeTransaction.invoke(dbManager, transactionCap.getInstance());
1826+
});
1827+
} catch (Exception e) {
1828+
fail();
1829+
}
1830+
}
17281831
}

0 commit comments

Comments
 (0)