Skip to content
This repository has been archived by the owner on Feb 19, 2024. It is now read-only.

Commit

Permalink
Merge branch 'hotfix/dont-return-unregistered-validators' into releas…
Browse files Browse the repository at this point in the history
…e/1.0-beta.39
  • Loading branch information
talekhinezh committed Jul 22, 2021
2 parents ae279fb + 8667a57 commit 2100873
Show file tree
Hide file tree
Showing 11 changed files with 295 additions and 604 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@
import com.radixdlt.crypto.ECPublicKey;
import com.radixdlt.identifiers.REAddr;
import com.radixdlt.networks.Addressing;
import com.radixdlt.statecomputer.ValidatorDetails;
import com.radixdlt.utils.UInt256;

import static com.radixdlt.api.JsonRpcUtil.jsonObject;
Expand Down Expand Up @@ -137,21 +136,6 @@ public static ValidatorInfoDetails create(
);
}

public static ValidatorInfoDetails create(ValidatorDetails details) {
return create(
details.getKey(),
details.getOwner(),
details.getName(),
details.getUrl(),
details.getStake(),
details.getOwnerStake(),
details.allowsDelegation(),
details.registered(),
details.getPercentage(),
details.getUptime()
);
}

public String getValidatorAddress(Addressing addressing) {
return addressing.forValidators().of(validator);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public JSONObject handleValidatorsLookupValidator(JSONObject request) {
request,
"validatorAddress",
address -> addressing.forValidators().fromString(address)
.flatMap(validatorInfoService::getValidator)
.map(validatorInfoService::getNextEpochValidator)
.map(d -> d.asJson(addressing))
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@

package com.radixdlt.api.handler;

import com.radixdlt.api.service.ValidatorInfoService;
import com.radixdlt.api.store.ValidatorUptime;
import com.radixdlt.application.system.state.ValidatorBFTData;
import com.radixdlt.application.system.state.ValidatorStakeData;
Expand All @@ -77,36 +78,40 @@
import org.json.JSONObject;

import com.google.inject.Inject;
import com.radixdlt.api.service.AccountInfoService;

import static com.radixdlt.api.JsonRpcUtil.*;
import static com.radixdlt.application.validators.scrypt.ValidatorUpdateRakeConstraintScrypt.RAKE_PERCENTAGE_GRANULARITY;

public final class ValidationHandler {
private final AccountInfoService accountService;
private final ValidatorInfoService validatorInfoService;
private final Addressing addressing;
private final ECPublicKey self;
private final RadixEngine<LedgerAndBFTProof> radixEngine;

@Inject
public ValidationHandler(
AccountInfoService accountService,
ValidatorInfoService validatorInfoService,
RadixEngine<LedgerAndBFTProof> radixEngine,
@Self ECPublicKey self,
Addressing addressing
) {
this.accountService = accountService;
this.validatorInfoService = validatorInfoService;
this.radixEngine = radixEngine;
this.self = self;
this.addressing = addressing;
}

private JSONObject getValidatorInfo() {
var metadata = accountService.getMyValidatorMetadata();
var stakeData = accountService.getStakeData();
var validatorData = stakeData.getFirst();
var allowDelegationFlag = accountService.getMyValidatorDelegationFlag();
var uptime = accountService.getMyValidatorUptime();
var metadata = validatorInfoService.getMetadata(self);
var validatorData = validatorInfoService.getValidatorStakeData(self);
var individualStakes = validatorInfoService.getEstimatedIndividualStakes(validatorData);
var stakesJson = jsonArray();
individualStakes.forEach((addr, amt) -> stakesJson.put(jsonObject()
.put("delegator", addressing.forAccounts().of(addr))
.put("amount", amt)
));
var allowDelegationFlag = validatorInfoService.getAllowDelegationFlag(self);
var uptime = validatorInfoService.getUptime(self);
var validatorAddress = addressing.forValidators().of(self);

var data = jsonObject()
Expand All @@ -119,26 +124,26 @@ private JSONObject getValidatorInfo() {
.put("registered", validatorData.isRegistered())
.put("owner", addressing.forAccounts().of(validatorData.getOwnerAddr()))
.put("validatorFee", (double) validatorData.getRakePercentage() / (double) RAKE_PERCENTAGE_GRANULARITY + "")
.put("stakes", stakeData.getSecond())
.put("stakes", stakesJson)
.put("totalStake", validatorData.getTotalStake())
.put("proposalsCompleted", uptime.getProposalsCompleted())
.put("proposalsMissed", uptime.getProposalsMissed())
.put("uptimePercentage", uptime.toPercentageString());

var updates = jsonObject();
var validatorRakeCopy = accountService.getMyNextValidatorFee();
var validatorRakeCopy = validatorInfoService.getNextValidatorFee(self);
if (validatorRakeCopy.getRakePercentage() != validatorData.getRakePercentage()) {
updates.put("validatorFee", (double) validatorRakeCopy.getRakePercentage() / (double) RAKE_PERCENTAGE_GRANULARITY + "");
}
var nextEpochRegisteredFlag = accountService.getMyNextEpochRegisteredFlag().isRegistered();
var nextEpochRegisteredFlag = validatorInfoService.getNextEpochRegisteredFlag(self).isRegistered();
if (nextEpochRegisteredFlag != validatorData.isRegistered()) {
updates.put("registered", nextEpochRegisteredFlag);
}
var nextEpochOwner = accountService.getMyNextEpochValidatorOwner().getOwner();
var nextEpochOwner = validatorInfoService.getNextEpochValidatorOwner(self).getOwner();
if (!nextEpochOwner.equals(validatorData.getOwnerAddr())) {
updates.put("owner", addressing.forAccounts().of(nextEpochOwner));
}
var preparedStakes = accountService.getPreparedStakesToMyValidator();
var preparedStakes = validatorInfoService.getPreparedStakes(self);
if (!preparedStakes.isEmpty()) {
var preparedStakesJson = jsonArray();
preparedStakes.forEach((addr, amount) -> preparedStakesJson.put(
Expand All @@ -148,20 +153,14 @@ private JSONObject getValidatorInfo() {
));
updates.put("stakes", preparedStakesJson);
}
var preparedUnstakes = accountService.getPreparedUnstakesFromMyValidator();
var preparedUnstakes = validatorInfoService.getEstimatedPreparedUnstakes(validatorData);
if (!preparedUnstakes.isEmpty()) {
var curStake = validatorData.getTotalStake();
var curOwnership = validatorData.getTotalOwnership();
var preparedUnstakesJson = jsonArray();
for (var e : preparedUnstakes.entrySet()) {
var unstakeValueEstimate = e.getValue().multiply(curStake).divide(curOwnership).getLow();
preparedUnstakesJson.put(jsonObject()
.put("amount", unstakeValueEstimate)
.put("delegator", addressing.forAccounts().of(e.getKey()))
);
curOwnership = curOwnership.subtract(e.getValue().getLow());
curStake = curStake.subtract(unstakeValueEstimate);
}
preparedUnstakes.forEach((addr, amount) -> preparedUnstakesJson.put(
jsonObject()
.put("amount", amount)
.put("delegator", addressing.forAccounts().of(addr))
));
updates.put("unstakes", preparedUnstakesJson);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,26 +64,16 @@

package com.radixdlt.api.service;

import com.radixdlt.api.store.ValidatorUptime;
import com.radixdlt.application.system.state.StakeOwnership;
import com.radixdlt.application.system.state.ValidatorBFTData;
import com.radixdlt.application.system.state.ValidatorStakeData;
import com.radixdlt.application.tokens.state.PreparedStake;
import com.radixdlt.application.tokens.state.PreparedUnstakeOwnership;
import com.radixdlt.application.tokens.state.TokenResourceMetadata;
import com.radixdlt.application.tokens.state.TokensInAccount;
import com.radixdlt.application.validators.state.AllowDelegationFlag;
import com.radixdlt.application.validators.state.ValidatorMetaData;
import com.radixdlt.application.validators.state.ValidatorOwnerCopy;
import com.radixdlt.application.validators.state.ValidatorFeeCopy;
import com.radixdlt.application.validators.state.ValidatorRegisteredCopy;
import com.radixdlt.atom.SubstateTypeId;
import com.radixdlt.constraintmachine.SubstateIndex;
import com.radixdlt.constraintmachine.SystemMapKey;
import com.radixdlt.engine.RadixEngine;
import com.radixdlt.utils.Pair;
import org.bouncycastle.util.Arrays;
import org.json.JSONArray;
import org.json.JSONObject;

import com.google.inject.Inject;
Expand All @@ -92,7 +82,6 @@
import com.radixdlt.identifiers.REAddr;
import com.radixdlt.networks.Addressing;
import com.radixdlt.statecomputer.LedgerAndBFTProof;
import com.radixdlt.utils.UInt256;
import com.radixdlt.utils.UInt384;

import java.util.HashMap;
Expand Down Expand Up @@ -123,89 +112,7 @@ public JSONObject getAccountInfo() {
.put("balance", getOwnBalance());
}

public ValidatorUptime getMyValidatorUptime() {
var validatorUptimeKey = SystemMapKey.ofSystem(SubstateTypeId.VALIDATOR_BFT_DATA.id(), bftKey.getCompressedBytes());
return radixEngine.get(validatorUptimeKey)
.map(ValidatorBFTData.class::cast)
.map(d -> ValidatorUptime.create(d.proposalsCompleted(), d.proposalsMissed()))
.orElse(ValidatorUptime.empty());
}

public AllowDelegationFlag getMyValidatorDelegationFlag() {
var validatorDataKey = SystemMapKey.ofSystem(SubstateTypeId.VALIDATOR_ALLOW_DELEGATION_FLAG.id(), bftKey.getCompressedBytes());
return (AllowDelegationFlag) radixEngine.get(validatorDataKey).orElse(AllowDelegationFlag.createVirtual(bftKey));
}

public ValidatorRegisteredCopy getMyNextEpochRegisteredFlag() {
var validatorDataKey = SystemMapKey.ofSystem(SubstateTypeId.VALIDATOR_REGISTERED_FLAG_COPY.id(), bftKey.getCompressedBytes());
return (ValidatorRegisteredCopy) radixEngine.get(validatorDataKey).orElse(ValidatorRegisteredCopy.createVirtual(bftKey));
}

public ValidatorFeeCopy getMyNextValidatorFee() {
var validatorDataKey = SystemMapKey.ofSystem(SubstateTypeId.VALIDATOR_RAKE_COPY.id(), bftKey.getCompressedBytes());
return (ValidatorFeeCopy) radixEngine.get(validatorDataKey).orElse(ValidatorFeeCopy.createVirtual(bftKey));
}

public ValidatorOwnerCopy getMyNextEpochValidatorOwner() {
var validatorDataKey = SystemMapKey.ofSystem(SubstateTypeId.VALIDATOR_OWNER_COPY.id(), bftKey.getCompressedBytes());
return (ValidatorOwnerCopy) radixEngine.get(validatorDataKey).orElse(ValidatorOwnerCopy.createVirtual(bftKey));
}

public ValidatorMetaData getMyValidatorMetadata() {
var validatorDataKey = SystemMapKey.ofSystem(SubstateTypeId.VALIDATOR_META_DATA.id(), bftKey.getCompressedBytes());
return (ValidatorMetaData) radixEngine.get(validatorDataKey).orElse(ValidatorMetaData.createVirtual(bftKey));
}

public UInt256 getTotalStake() {
return getMyValidator().getTotalStake();
}

public ValidatorStakeData getMyValidator() {
var validatorDataKey = SystemMapKey.ofSystem(SubstateTypeId.VALIDATOR_STAKE_DATA.id(), bftKey.getCompressedBytes());
return (ValidatorStakeData) radixEngine.get(validatorDataKey).orElse(ValidatorStakeData.createVirtual(bftKey));
}

public Map<REAddr, UInt384> getPreparedStakesToMyValidator() {
var index = SubstateIndex.create(
Arrays.concatenate(new byte[] {SubstateTypeId.PREPARED_STAKE.id(), 0}, bftKey.getCompressedBytes()),
PreparedStake.class
);
return radixEngine.reduceResources(index, PreparedStake::getOwner);
}

public Map<REAddr, UInt384> getPreparedUnstakesFromMyValidator() {
var index = SubstateIndex.create(
Arrays.concatenate(new byte[] {SubstateTypeId.PREPARED_UNSTAKE.id(), 0}, bftKey.getCompressedBytes()),
PreparedUnstakeOwnership.class
);
return radixEngine.reduceResources(index, PreparedUnstakeOwnership::getOwner);
}

public Pair<ValidatorStakeData, JSONArray> getStakeData() {
var myValidator = getMyValidator();
var index = SubstateIndex.create(
Arrays.concatenate(new byte[] {SubstateTypeId.STAKE_OWNERSHIP.id(), 0}, bftKey.getCompressedBytes()),
StakeOwnership.class
);
var stakeReceived = radixEngine.reduceResources(index, StakeOwnership::getOwner);
var unstakingOwnership = SubstateIndex.create(
Arrays.concatenate(new byte[] {SubstateTypeId.PREPARED_UNSTAKE.id(), 0}, bftKey.getCompressedBytes()),
PreparedUnstakeOwnership.class
);
radixEngine.reduceResources(unstakingOwnership, PreparedUnstakeOwnership::getOwner, stakeReceived);

var stakeFrom = jsonArray();
stakeReceived.forEach((address, amt) -> {
stakeFrom.put(
jsonObject()
.put("delegator", addressing.forAccounts().of(address))
.put("amount", amt.multiply(myValidator.getTotalStake()).divide(myValidator.getTotalOwnership()))
);
});
return Pair.of(myValidator, stakeFrom);
}

public String getOwnAddress() {
private String getOwnAddress() {
return addressing.forAccounts().of(REAddr.ofPubKeyAccount(bftKey));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ public class MetricsService {
private final InfoSupplier infoSupplier;
private final SystemConfigService systemConfigService;
private final AccountInfoService accountInfoService;
private final ValidatorInfoService validatorInfoService;
private final NetworkInfoService networkInfoService;
private final Addressing addressing;
private final InMemorySystemInfo inMemorySystemInfo;
Expand All @@ -217,6 +218,7 @@ public MetricsService(
InfoSupplier infoSupplier,
SystemConfigService systemConfigService,
AccountInfoService accountInfoService,
ValidatorInfoService validatorInfoService,
NetworkInfoService networkInfoService,
InMemorySystemInfo inMemorySystemInfo,
@Self BFTNode self,
Expand All @@ -226,6 +228,7 @@ public MetricsService(
this.infoSupplier = infoSupplier;
this.systemConfigService = systemConfigService;
this.accountInfoService = accountInfoService;
this.validatorInfoService = validatorInfoService;
this.networkInfoService = networkInfoService;
this.inMemorySystemInfo = inMemorySystemInfo;
this.self = self;
Expand Down Expand Up @@ -266,7 +269,8 @@ private void exportSystemInfo(StringBuilder builder) {
}

private UInt384 getTotalStake() {
return UInt384.from(accountInfoService.getTotalStake());
var stakeData = validatorInfoService.getValidatorStakeData(self.getKey());
return UInt384.from(stakeData.getTotalStake());
}

private UInt384 getXrdBalance() {
Expand Down Expand Up @@ -294,7 +298,7 @@ private String prepareNodeInfo() {

addEndpontStatuses(builder);
appendField(builder, "owner_address", addressing.forAccounts().of(REAddr.ofPubKeyAccount(self.getKey())));
appendField(builder, "validator_registered", accountInfoService.getMyNextEpochRegisteredFlag());
appendField(builder, "validator_registered", validatorInfoService.getNextEpochRegisteredFlag(self.getKey()));
addBranchAndCommit(builder);
addValidatorAddress(builder);
addAccumulatorState(builder);
Expand Down Expand Up @@ -338,7 +342,7 @@ private void appendField(StringBuilder builder, String name, Object value) {
private void exportCounters(StringBuilder builder) {
EXPORT_LIST.forEach(counterType -> generateCounterEntry(counterType, builder));

var uptime = accountInfoService.getMyValidatorUptime();
var uptime = validatorInfoService.getUptime(self.getKey());
appendCounter(builder, COUNTER_PREFIX + "radix_engine_cur_epoch_completed_proposals", uptime.getProposalsCompleted());
appendCounter(builder, COUNTER_PREFIX + "radix_engine_cur_epoch_missed_proposals", uptime.getProposalsMissed());
}
Expand Down
Loading

0 comments on commit 2100873

Please sign in to comment.