Skip to content

Commit 6ffedb4

Browse files
authored
merge master to 4.8.1 (tronprotocol#6509)
* feat(*): disable exchange transaction (tronprotocol#6507) * update a new version. version name:GreatVoyage-v4.8.0-1-g45e3bf88ca,version code:18634 (tronprotocol#6508)
1 parent 5551cfe commit 6ffedb4

4 files changed

Lines changed: 139 additions & 5 deletions

File tree

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

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

3334
@Getter
@@ -76,7 +77,7 @@ public class ChainConstant {
7677
public static final int SINGLE_REPEAT = 1;
7778
public static final int BLOCK_FILLED_SLOTS_NUMBER = 128;
7879
public static final int MAX_FROZEN_NUMBER = 1;
79-
public static final int BLOCK_VERSION = 33;
80+
public static final int BLOCK_VERSION = 34;
8081
public static final long FROZEN_PERIOD = 86_400_000L;
8182
public static final long DELEGATE_PERIOD = 3 * 86_400_000L;
8283
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
@@ -99,6 +99,7 @@
9999
import org.tron.core.capsule.TransactionRetCapsule;
100100
import org.tron.core.capsule.WitnessCapsule;
101101
import org.tron.core.capsule.utils.TransactionUtil;
102+
import org.tron.core.config.Parameter;
102103
import org.tron.core.config.Parameter.ChainConstant;
103104
import org.tron.core.config.args.Args;
104105
import org.tron.core.consensus.ProposalController;
@@ -876,6 +877,11 @@ public boolean pushTransaction(final TransactionCapsule trx)
876877
return false;
877878
}
878879

880+
if (isExchangeTransaction(trx.getInstance())) {
881+
throw new ContractValidateException("ExchangeTransactionContract is rejected");
882+
}
883+
884+
879885
pushTransactionQueue.add(trx);
880886
Metrics.gaugeInc(MetricKeys.Gauge.MANAGER_QUEUE, 1,
881887
MetricLabels.Gauge.QUEUE_QUEUED);
@@ -1701,6 +1707,11 @@ public BlockCapsule generateBlock(Miner miner, long blockTime, long timeout) {
17011707
accountSet.add(ownerAddress);
17021708
}
17031709
}
1710+
1711+
if (isExchangeTransaction(transaction)) {
1712+
continue;
1713+
}
1714+
17041715
if (ownerAddressSet.contains(ownerAddress)) {
17051716
trx.setVerified(false);
17061717
}
@@ -1774,6 +1785,24 @@ private boolean isShieldedTransaction(Transaction transaction) {
17741785
}
17751786
}
17761787

1788+
private boolean isExchangeTransaction(Transaction transaction) {
1789+
Contract contract = transaction.getRawData().getContract(0);
1790+
switch (contract.getType()) {
1791+
case ExchangeTransactionContract: {
1792+
return true;
1793+
}
1794+
default:
1795+
return false;
1796+
}
1797+
}
1798+
1799+
private void rejectExchangeTransaction(Transaction transaction) throws ContractValidateException {
1800+
if (isExchangeTransaction(transaction) && chainBaseManager.getForkController()
1801+
.pass(Parameter.ForkBlockVersionEnum.VERSION_4_8_0_1)) {
1802+
throw new ContractValidateException("ExchangeTransactionContract is rejected");
1803+
}
1804+
}
1805+
17771806
public TransactionStore getTransactionStore() {
17781807
return chainBaseManager.getTransactionStore();
17791808
}
@@ -1828,6 +1857,7 @@ private void processBlock(BlockCapsule block, List<TransactionCapsule> txs)
18281857
List<TransactionInfo> results = new ArrayList<>();
18291858
long num = block.getNum();
18301859
for (TransactionCapsule transactionCapsule : block.getTransactions()) {
1860+
rejectExchangeTransaction(transactionCapsule.getInstance());
18311861
if (chainBaseManager.getDynamicPropertiesStore().allowConsensusLogicOptimization()
18321862
&& transactionCapsule.retCountIsGreatThanContractCount()) {
18331863
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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
public class Version {
44

5-
public static final String VERSION_NAME = "GreatVoyage-v4.7.7-243-gb3555dd655";
6-
public static final String VERSION_CODE = "18631";
5+
public static final String VERSION_NAME = "GreatVoyage-v4.8.0-1-g45e3bf88ca";
6+
public static final String VERSION_CODE = "18634";
77
private static final String VERSION = "4.8.1";
88

99
public static String getVersion() {

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)