Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(freezeV2): optimize votes and latest consume time #4750

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions actuator/src/main/java/org/tron/core/actuator/VMActuator.java
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,7 @@ public long getAccountEnergyLimitWithFixRatio(AccountCapsule account, long feeLi
rootRepository.getDynamicPropertiesStore(),
ChainBaseManager.getInstance().getAccountStore());
energyProcessor.updateUsage(account);
account.setLatestConsumeTimeForEnergy(now);
receipt.setCallerEnergyUsage(account.getEnergyUsage());
receipt.setCallerEnergyWindowSize(account.getWindowSize(Common.ResourceCode.ENERGY));
account.setEnergyUsage(
Expand Down Expand Up @@ -717,6 +718,7 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu
rootRepository.getDynamicPropertiesStore(),
ChainBaseManager.getInstance().getAccountStore());
energyProcessor.updateUsage(creator);
creator.setLatestConsumeTimeForEnergy(now);
receipt.setOriginEnergyUsage(creator.getEnergyUsage());
receipt.setOriginEnergyWindowSize(creator.getWindowSize(Common.ResourceCode.ENERGY));
creator.setEnergyUsage(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ public void execute(UnDelegateResourceParam param, Repository repo) {

long newNetUsage = receiverCapsule.getNetUsage() - transferUsage;
receiverCapsule.setNetUsage(newNetUsage);
receiverCapsule.setLatestConsumeTime(now);
break;
case ENERGY:
EnergyProcessor energyProcessor =
Expand All @@ -142,6 +143,7 @@ public void execute(UnDelegateResourceParam param, Repository repo) {

long newEnergyUsage = receiverCapsule.getEnergyUsage() - transferUsage;
receiverCapsule.setEnergyUsage(newEnergyUsage);
receiverCapsule.setLatestConsumeTimeForEnergy(now);
break;
default:
//this should never happen
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import com.google.common.collect.Lists;
import com.google.protobuf.ByteString;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

Expand Down Expand Up @@ -140,7 +141,7 @@ public long execute(UnfreezeBalanceV2Param param, Repository repo) {
accountCapsule.addUnfrozenV2List(param.getResourceType(), unfreezeBalance, expireTime);

this.updateTotalResourceWeight(param.getResourceType(), unfreezeBalance, repo);
this.clearVotes(accountCapsule, param.getResourceType(), ownerAddress, repo);
this.updateVote(accountCapsule, param.getResourceType(), ownerAddress, repo);

if (repo.getDynamicPropertiesStore().supportAllowNewResourceModel()
&& !accountCapsule.oldTronPowerIsInvalid()) {
Expand Down Expand Up @@ -215,34 +216,28 @@ public void updateTotalResourceWeight(Common.ResourceCode freezeType,
}
}

private void clearVotes(
AccountCapsule accountCapsule, Common.ResourceCode freezeType, byte[] ownerAddress, Repository repo) {
private void updateVote(
AccountCapsule accountCapsule,
Common.ResourceCode freezeType,
byte[] ownerAddress,
Repository repo) {
DynamicPropertiesStore dynamicStore = repo.getDynamicPropertiesStore();

boolean needToClearVote = true;
if (repo.getDynamicPropertiesStore().supportAllowNewResourceModel()
&& accountCapsule.oldTronPowerIsInvalid()) {
switch (freezeType) {
case BANDWIDTH:
case ENERGY:
needToClearVote = false;
break;
default:
break;
}
if (!VMConfig.allowTvmVote() || accountCapsule.getVotesList().isEmpty()) {
return;
}

if (needToClearVote && VMConfig.allowTvmVote() && !accountCapsule.getVotesList().isEmpty()) {
long usedTronPower = 0;
for (Protocol.Vote vote : accountCapsule.getVotesList()) {
usedTronPower += vote.getVoteCount();
}
long ownedTronPower;
if (repo.getDynamicPropertiesStore().supportAllowNewResourceModel()) {
ownedTronPower = accountCapsule.getAllTronPower();
if (dynamicStore.supportAllowNewResourceModel()) {
if (accountCapsule.oldTronPowerIsInvalid()) {
switch (freezeType) {
case BANDWIDTH:
case ENERGY:
// there is no need to change votes
return;
default:
break;
}
} else {
ownedTronPower = accountCapsule.getTronPower();
}
if (ownedTronPower < usedTronPower * TRX_PRECISION) {
// clear all votes at once when new resource model start
VotesCapsule votesCapsule = repo.getVotes(ownerAddress);
if (votesCapsule == null) {
votesCapsule =
Expand All @@ -251,7 +246,53 @@ private void clearVotes(
accountCapsule.clearVotes();
votesCapsule.clearNewVotes();
repo.updateVotes(ownerAddress, votesCapsule);
return;
}
}

long totalVote = 0;
for (Protocol.Vote vote : accountCapsule.getVotesList()) {
totalVote += vote.getVoteCount();
}
if (totalVote == 0) {
return;
}

long ownedTronPower;
if (dynamicStore.supportAllowNewResourceModel()) {
ownedTronPower = accountCapsule.getAllTronPower();
} else {
ownedTronPower = accountCapsule.getTronPower();
}
// tron power is enough to total votes
if (ownedTronPower >= totalVote * TRX_PRECISION) {
return;
}

VotesCapsule votesCapsule = repo.getVotes(ownerAddress);
if (votesCapsule == null) {
votesCapsule =
new VotesCapsule(ByteString.copyFrom(ownerAddress), accountCapsule.getVotesList());
}

// Update Owner Voting
List<Protocol.Vote> votesToAdd = new ArrayList<>();
for (Protocol.Vote vote : accountCapsule.getVotesList()) {
long newVoteCount =
(long) ((double) vote.getVoteCount() / totalVote * ownedTronPower / TRX_PRECISION);
if (newVoteCount > 0) {
votesToAdd.add(
Protocol.Vote.newBuilder()
.setVoteAddress(vote.getVoteAddress())
.setVoteCount(newVoteCount)
.build());
}
}
votesCapsule.clearNewVotes();
votesCapsule.addAllNewVotes(votesToAdd);
repo.updateVotes(ownerAddress, votesCapsule);

accountCapsule.clearVotes();
accountCapsule.addAllVotes(votesToAdd);
}
}
2 changes: 2 additions & 0 deletions actuator/src/main/java/org/tron/core/vm/program/Program.java
Original file line number Diff line number Diff line change
Expand Up @@ -544,6 +544,7 @@ private long transferFrozenV2BalanceToInheritor(byte[] ownerAddr, byte[] inherit
// merge usage
BandwidthProcessor bandwidthProcessor = new BandwidthProcessor(ChainBaseManager.getInstance());
bandwidthProcessor.updateUsage(ownerCapsule);
ownerCapsule.setLatestConsumeTime(now);
if (ownerCapsule.getNetUsage() > 0) {
long newNetUsage =
bandwidthProcessor.unDelegateIncrease(
Expand All @@ -560,6 +561,7 @@ private long transferFrozenV2BalanceToInheritor(byte[] ownerAddr, byte[] inherit
new EnergyProcessor(
repo.getDynamicPropertiesStore(), ChainBaseManager.getInstance().getAccountStore());
energyProcessor.updateUsage(ownerCapsule);
ownerCapsule.setLatestConsumeTimeForEnergy(now);
if (ownerCapsule.getEnergyUsage() > 0) {
long newEnergyUsage =
energyProcessor.unDelegateIncrease(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,10 @@ public void addVotes(ByteString voteAddress, long voteAdd) {
.build();
}

public void addAllVotes(List<Vote> votesToAdd) {
this.account = this.account.toBuilder().addAllVotes(votesToAdd).build();
}

public void clearLatestAssetOperationTimeV2() {
this.account = this.account.toBuilder()
.clearLatestAssetOperationTimeV2()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ public void addNewVotes(ByteString voteAddress, long voteCount) {
.build();
}

public void addAllNewVotes(List<Vote> votesToAdd) {
this.votes = this.votes.toBuilder().addAllNewVotes(votesToAdd).build();
}

public void addOldVotes(ByteString voteAddress, long voteCount) {
this.votes = this.votes.toBuilder()
.addOldVotes(Vote.newBuilder().setVoteAddress(voteAddress).setVoteCount(voteCount).build())
Expand Down