Skip to content

Commit

Permalink
Merge pull request #5325 from tronprotocol/master
Browse files Browse the repository at this point in the history
feat(merge): merge master into develop
  • Loading branch information
forfreeday authored Jul 1, 2023
2 parents 4b6e0a5 + 9e95599 commit dcd0ebd
Show file tree
Hide file tree
Showing 22 changed files with 445 additions and 105 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,17 @@
import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION;
import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH;
import static org.tron.protos.contract.Common.ResourceCode.ENERGY;
import static org.tron.protos.contract.Common.ResourceCode.TRON_POWER;

import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicLong;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.tuple.Triple;
import org.tron.common.utils.DecodeUtil;
import org.tron.common.utils.StringUtil;
Expand Down Expand Up @@ -54,12 +58,13 @@ public boolean execute(Object result) throws ContractExeException {
List<UnFreezeV2> unfrozenV2List = ownerCapsule.getUnfrozenV2List();
long now = dynamicStore.getLatestBlockHeaderTimestamp();
AtomicLong atomicWithdrawExpireBalance = new AtomicLong(0L);
AtomicLong atomicCancelBalance = new AtomicLong(0L);
Triple<AtomicLong, AtomicLong, AtomicLong> triple =
Triple.of(new AtomicLong(0L), new AtomicLong(0L), new AtomicLong(0L));
Triple<Pair<AtomicLong, AtomicLong>, Pair<AtomicLong, AtomicLong>, Pair<AtomicLong, AtomicLong>>
triple = Triple.of(
Pair.of(new AtomicLong(0L), new AtomicLong(0L)),
Pair.of(new AtomicLong(0L), new AtomicLong(0L)),
Pair.of(new AtomicLong(0L), new AtomicLong(0L)));
for (UnFreezeV2 unFreezeV2 : unfrozenV2List) {
updateAndCalculate(triple, ownerCapsule, now, atomicWithdrawExpireBalance,
atomicCancelBalance, unFreezeV2);
updateAndCalculate(triple, ownerCapsule, now, atomicWithdrawExpireBalance, unFreezeV2);
}
ownerCapsule.clearUnfrozenV2();
addTotalResourceWeight(dynamicStore, triple);
Expand All @@ -71,24 +76,29 @@ public boolean execute(Object result) throws ContractExeException {

accountStore.put(ownerCapsule.createDbKey(), ownerCapsule);
ret.setWithdrawExpireAmount(withdrawExpireBalance);
ret.setCancelAllUnfreezeV2Amount(atomicCancelBalance.get());
Map<String, Long> cancelUnfreezeV2AmountMap = new HashMap<>();
cancelUnfreezeV2AmountMap.put(BANDWIDTH.name(), triple.getLeft().getRight().get());
cancelUnfreezeV2AmountMap.put(ENERGY.name(), triple.getMiddle().getRight().get());
cancelUnfreezeV2AmountMap.put(TRON_POWER.name(), triple.getRight().getRight().get());
ret.putAllCancelUnfreezeV2AmountMap(cancelUnfreezeV2AmountMap);
ret.setStatus(fee, code.SUCESS);
return true;
}

private void addTotalResourceWeight(DynamicPropertiesStore dynamicStore,
Triple<AtomicLong, AtomicLong, AtomicLong> triple) {
dynamicStore.addTotalNetWeight(triple.getLeft().get());
dynamicStore.addTotalEnergyWeight(triple.getMiddle().get());
dynamicStore.addTotalTronPowerWeight(triple.getRight().get());
Triple<Pair<AtomicLong, AtomicLong>,
Pair<AtomicLong, AtomicLong>,
Pair<AtomicLong, AtomicLong>> triple) {
dynamicStore.addTotalNetWeight(triple.getLeft().getLeft().get());
dynamicStore.addTotalEnergyWeight(triple.getMiddle().getLeft().get());
dynamicStore.addTotalTronPowerWeight(triple.getRight().getLeft().get());
}

private void updateAndCalculate(Triple<AtomicLong, AtomicLong, AtomicLong> triple,
AccountCapsule ownerCapsule, long now, AtomicLong atomicLong, AtomicLong cancelBalance,
UnFreezeV2 unFreezeV2) {
private void updateAndCalculate(Triple<Pair<AtomicLong, AtomicLong>, Pair<AtomicLong, AtomicLong>,
Pair<AtomicLong, AtomicLong>> triple,
AccountCapsule ownerCapsule, long now, AtomicLong atomicLong, UnFreezeV2 unFreezeV2) {
if (unFreezeV2.getUnfreezeExpireTime() > now) {
updateFrozenInfoAndTotalResourceWeight(ownerCapsule, unFreezeV2, triple);
cancelBalance.addAndGet(unFreezeV2.getUnfreezeAmount());
} else {
atomicLong.addAndGet(unFreezeV2.getUnfreezeAmount());
}
Expand Down Expand Up @@ -160,25 +170,29 @@ public long calcFee() {

public void updateFrozenInfoAndTotalResourceWeight(
AccountCapsule accountCapsule, UnFreezeV2 unFreezeV2,
Triple<AtomicLong, AtomicLong, AtomicLong> triple) {
Triple<Pair<AtomicLong, AtomicLong>, Pair<AtomicLong, AtomicLong>,
Pair<AtomicLong, AtomicLong>> triple) {
switch (unFreezeV2.getType()) {
case BANDWIDTH:
long oldNetWeight = accountCapsule.getFrozenV2BalanceWithDelegated(BANDWIDTH) / TRX_PRECISION;
accountCapsule.addFrozenBalanceForBandwidthV2(unFreezeV2.getUnfreezeAmount());
long newNetWeight = accountCapsule.getFrozenV2BalanceWithDelegated(BANDWIDTH) / TRX_PRECISION;
triple.getLeft().addAndGet(newNetWeight - oldNetWeight);
triple.getLeft().getLeft().addAndGet(newNetWeight - oldNetWeight);
triple.getLeft().getRight().addAndGet(unFreezeV2.getUnfreezeAmount());
break;
case ENERGY:
long oldEnergyWeight = accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY) / TRX_PRECISION;
accountCapsule.addFrozenBalanceForEnergyV2(unFreezeV2.getUnfreezeAmount());
long newEnergyWeight = accountCapsule.getFrozenV2BalanceWithDelegated(ENERGY) / TRX_PRECISION;
triple.getMiddle().addAndGet(newEnergyWeight - oldEnergyWeight);
triple.getMiddle().getLeft().addAndGet(newEnergyWeight - oldEnergyWeight);
triple.getMiddle().getRight().addAndGet(unFreezeV2.getUnfreezeAmount());
break;
case TRON_POWER:
long oldTPWeight = accountCapsule.getTronPowerFrozenV2Balance() / TRX_PRECISION;
accountCapsule.addFrozenForTronPowerV2(unFreezeV2.getUnfreezeAmount());
long newTPWeight = accountCapsule.getTronPowerFrozenV2Balance() / TRX_PRECISION;
triple.getRight().addAndGet(newTPWeight - oldTPWeight);
triple.getRight().getLeft().addAndGet(newTPWeight - oldTPWeight);
triple.getRight().getRight().addAndGet(unFreezeV2.getUnfreezeAmount());
break;
default:
break;
Expand Down
16 changes: 9 additions & 7 deletions actuator/src/main/java/org/tron/core/actuator/VMActuator.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import static java.lang.Math.min;
import static org.apache.commons.lang3.ArrayUtils.getLength;
import static org.apache.commons.lang3.ArrayUtils.isNotEmpty;
import static org.tron.protos.contract.Common.ResourceCode.ENERGY;

import com.google.protobuf.ByteString;
import java.math.BigInteger;
Expand Down Expand Up @@ -58,7 +59,6 @@
import org.tron.protos.Protocol.Transaction;
import org.tron.protos.Protocol.Transaction.Contract.ContractType;
import org.tron.protos.Protocol.Transaction.Result.contractResult;
import org.tron.protos.contract.Common;
import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract;
import org.tron.protos.contract.SmartContractOuterClass.SmartContract;
import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract;
Expand Down Expand Up @@ -568,12 +568,13 @@ public long getAccountEnergyLimitWithFixRatio(AccountCapsule account, long feeLi
energyProcessor.updateUsage(account);
account.setLatestConsumeTimeForEnergy(now);
receipt.setCallerEnergyUsage(account.getEnergyUsage());
receipt.setCallerEnergyWindowSize(account.getWindowSize(Common.ResourceCode.ENERGY));
receipt.setCallerEnergyWindowSize(account.getWindowSize(ENERGY));
receipt.setCallerEnergyWindowSizeV2(account.getWindowSizeV2(ENERGY));
account.setEnergyUsage(
energyProcessor.increase(account, Common.ResourceCode.ENERGY,
energyProcessor.increase(account, ENERGY,
account.getEnergyUsage(), min(leftFrozenEnergy, energyFromFeeLimit), now, now));
receipt.setCallerEnergyMergedUsage(account.getEnergyUsage());
receipt.setCallerEnergyMergedWindowSize(account.getWindowSize(Common.ResourceCode.ENERGY));
receipt.setCallerEnergyMergedWindowSize(account.getWindowSize(ENERGY));
rootRepository.updateAccount(account.createDbKey(), account);
}
return min(availableEnergy, energyFromFeeLimit);
Expand Down Expand Up @@ -730,12 +731,13 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu
energyProcessor.updateUsage(creator);
creator.setLatestConsumeTimeForEnergy(now);
receipt.setOriginEnergyUsage(creator.getEnergyUsage());
receipt.setOriginEnergyWindowSize(creator.getWindowSize(Common.ResourceCode.ENERGY));
receipt.setOriginEnergyWindowSize(creator.getWindowSize(ENERGY));
receipt.setOriginEnergyWindowSizeV2(creator.getWindowSizeV2(ENERGY));
creator.setEnergyUsage(
energyProcessor.increase(creator, Common.ResourceCode.ENERGY,
energyProcessor.increase(creator, ENERGY,
creator.getEnergyUsage(), creatorEnergyLimit, now, now));
receipt.setOriginEnergyMergedUsage(creator.getEnergyUsage());
receipt.setOriginEnergyMergedWindowSize(creator.getWindowSize(Common.ResourceCode.ENERGY));
receipt.setOriginEnergyMergedWindowSize(creator.getWindowSize(ENERGY));
rootRepository.updateAccount(creator.createDbKey(), creator);
}
return Math.addExact(callerEnergyLimit, creatorEnergyLimit);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,10 @@
import java.util.Map;
import java.util.Objects;

import static java.lang.Math.ceil;
import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL;
import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_MS;
import static org.tron.core.config.Parameter.ChainConstant.WINDOW_SIZE_PRECISION;
import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH;
import static org.tron.protos.contract.Common.ResourceCode.ENERGY;
import static org.tron.protos.contract.Common.ResourceCode.TRON_POWER;
Expand Down Expand Up @@ -1369,12 +1371,62 @@ public void setNewWindowSize(ResourceCode resourceCode, long newWindowSize) {

public long getWindowSize(ResourceCode resourceCode) {
long windowSize;
boolean windowOptimized;
if (resourceCode == BANDWIDTH) {
windowSize = this.account.getNetWindowSize();
windowOptimized = this.account.getNetWindowOptimized();
} else {
windowSize = this.account.getAccountResource().getEnergyWindowSize();
windowOptimized = this.account.getAccountResource().getEnergyWindowOptimized();
}
if (windowSize == 0) {
return WINDOW_SIZE_MS / BLOCK_PRODUCED_INTERVAL;
}
if (windowOptimized) {
return windowSize < WINDOW_SIZE_PRECISION ? WINDOW_SIZE_MS / BLOCK_PRODUCED_INTERVAL :
windowSize / WINDOW_SIZE_PRECISION;
} else {
return windowSize;
}
}

public long getWindowSizeV2(ResourceCode resourceCode) {
long windowSize;
boolean windowOptimized;
if (resourceCode == BANDWIDTH) {
windowSize = this.account.getNetWindowSize();
windowOptimized = this.account.getNetWindowOptimized();
} else {
windowSize = this.account.getAccountResource().getEnergyWindowSize();
windowOptimized = this.account.getAccountResource().getEnergyWindowOptimized();
}
if (windowSize == 0) {
return WINDOW_SIZE_MS / BLOCK_PRODUCED_INTERVAL * WINDOW_SIZE_PRECISION;
}
if (windowOptimized) {
return windowSize;
} else {
return windowSize * WINDOW_SIZE_PRECISION;
}
}

public boolean getWindowOptimized(ResourceCode resourceCode) {
boolean windowOptimized;
if (resourceCode == BANDWIDTH) {
windowOptimized = this.account.getNetWindowOptimized();
} else {
windowOptimized = this.account.getAccountResource().getEnergyWindowOptimized();
}
return windowOptimized;
}

public void setWindowOptimized(ResourceCode resourceCode, boolean windowOptimized) {
if (resourceCode == BANDWIDTH) {
this.account = this.account.toBuilder().setNetWindowOptimized(windowOptimized).build();
} else {
this.account = this.account.toBuilder().setAccountResource(this.account.getAccountResource()
.toBuilder().setEnergyWindowOptimized(windowOptimized).build()).build();
}
return windowSize == 0 ? WINDOW_SIZE_MS / BLOCK_PRODUCED_INTERVAL : windowSize;
}

public long getLastConsumeTime(ResourceCode resourceCode) {
Expand All @@ -1393,4 +1445,11 @@ public long getFrozenV2BalanceWithDelegated(ResourceCode resourceCode) {
}
}

public void setNewWindowSizeV2( ResourceCode resourceCode, long newWindowSize) {
this.setNewWindowSize(resourceCode, newWindowSize);
if (!this.getWindowOptimized(resourceCode)) {
this.setWindowOptimized(resourceCode, true);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ public class ReceiptCapsule {
@Setter
private long callerEnergyWindowSize;

@Getter
@Setter
private long callerEnergyWindowSizeV2;

/**
* Window size of caller after merging frozen energy
*/
Expand All @@ -83,6 +87,10 @@ public class ReceiptCapsule {
@Setter
private long originEnergyWindowSize;

@Getter
@Setter
private long originEnergyWindowSizeV2;

/**
* Window size of origin after merging frozen energy
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.tron.core.exception.BadItemException;
import org.tron.protos.Protocol.MarketOrderDetail;
Expand Down Expand Up @@ -89,13 +90,13 @@ public void setWithdrawExpireAmount(long amount) {
.setWithdrawExpireAmount(amount).build();
}

public long getCancelAllUnfreezeV2Amount() {
return transactionResult.getCancelAllUnfreezeV2Amount();
public Map<String, Long> getCancelUnfreezeV2AmountMap() {
return transactionResult.getCancelUnfreezeV2AmountMap();
}

public void setCancelAllUnfreezeV2Amount(long amount) {
public void putAllCancelUnfreezeV2AmountMap(Map<String, Long> map) {
this.transactionResult = this.transactionResult.toBuilder()
.setCancelAllUnfreezeV2Amount(amount).build();
.putAllCancelUnfreezeV2Amount(map).build();
}

public long getExchangeReceivedAmount() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ public static TransactionInfoCapsule buildTransactionInfoInstance(TransactionCap
builder.setExchangeId(programResult.getRet().getExchangeId());
builder.setWithdrawAmount(programResult.getRet().getWithdrawAmount());
builder.setWithdrawExpireAmount(programResult.getRet().getWithdrawExpireAmount());
builder.setCancelAllUnfreezeV2Amount(programResult.getRet().getCancelAllUnfreezeV2Amount());
builder.putAllCancelUnfreezeV2Amount(programResult.getRet().getCancelUnfreezeV2AmountMap());
builder.setExchangeReceivedAmount(programResult.getRet().getExchangeReceivedAmount());
builder.setExchangeInjectAnotherAmount(programResult.getRet().getExchangeInjectAnotherAmount());
builder.setExchangeWithdrawAnotherAmount(
Expand Down
Loading

0 comments on commit dcd0ebd

Please sign in to comment.