Skip to content

Commit

Permalink
Merge pull request #4750 from yanghang8612/feature/new_tvm_unfreeze_vote
Browse files Browse the repository at this point in the history
feat(freezeV2): optimize votes and latest consume time
  • Loading branch information
yanghang8612 authored Oct 31, 2022
2 parents da4d0dc + 431c547 commit 9b3820e
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 26 deletions.
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

0 comments on commit 9b3820e

Please sign in to comment.