use of com.radixdlt.utils.UInt256 in project radixdlt by radixdlt.
the class BerkeleyLedgerEntryStore method open.
private void open() {
var primaryConfig = buildPrimaryConfig();
var rriConfig = buildRriConfig();
var pendingConfig = buildPendingConfig();
try {
// This SuppressWarnings here is valid, as ownership of the underlying
// resource is not changed here, the resource is just accessed.
@SuppressWarnings("resource") var env = dbEnv.getEnvironment();
txnDatabase = env.openDatabase(null, TXN_DB_NAME, primaryConfig);
resourceDatabase = env.openDatabase(null, RESOURCE_DB_NAME, rriConfig);
mapDatabase = env.openDatabase(null, MAP_DB_NAME, rriConfig);
substatesDatabase = env.openDatabase(null, SUBSTATE_DB_NAME, primaryConfig);
indexedSubstatesDatabase = env.openSecondaryDatabase(null, INDEXED_SUBSTATE_DB_NAME, substatesDatabase, (SecondaryConfig) new SecondaryConfig().setKeyCreator((secondary, key, data, result) -> {
if (entryToSpin(data) != REOp.UP) {
return false;
}
var substateTypeId = data.getData()[data.getOffset()];
final int prefixIndexSize;
if (substateTypeId == SubstateTypeId.TOKENS.id()) {
// Indexing not necessary for verification at the moment but useful
// for construction
// 0: Type Byte
// 1: Reserved Byte
// 2-37: Account Address
prefixIndexSize = 2 + (1 + ECPublicKey.COMPRESSED_BYTES);
} else if (substateTypeId == SubstateTypeId.STAKE_OWNERSHIP.id()) {
// Indexing not necessary for verification at the moment but useful
// for construction
// This should have had validator keys and account addresses switched
// so that
// prefix indexing could be done against account addresses rather than
// validators
// so that actions like "Unstake Everything" could be implemented and
// queries against
// accounts. A later to do...
// 0: Type Byte
// 1: Reserved Byte
// 2-36: Validator Key
// 37-69: Account Address
prefixIndexSize = 2 + ECPublicKey.COMPRESSED_BYTES + (1 + ECPublicKey.COMPRESSED_BYTES);
} else if (substateTypeId == SubstateTypeId.EXITING_STAKE.id()) {
// 0: Type Byte
// 1: Reserved Byte
// 2-5: Epoch
// 6-40: Validator Key
// 41-73: Account Address
prefixIndexSize = 2 + Long.BYTES + ECPublicKey.COMPRESSED_BYTES + (1 + ECPublicKey.COMPRESSED_BYTES);
} else if (substateTypeId == SubstateTypeId.PREPARED_STAKE.id()) {
// 0: Type Byte
// 1: Reserved Byte
// 2-36: Validator Key
// 37-69: Account Address
prefixIndexSize = 2 + ECPublicKey.COMPRESSED_BYTES + (1 + ECPublicKey.COMPRESSED_BYTES);
} else if (substateTypeId == SubstateTypeId.PREPARED_UNSTAKE.id()) {
// 0: Type Byte
// 1: Reserved Byte
// 2-36: Validator Key
// 37-69: Account Address
prefixIndexSize = 2 + ECPublicKey.COMPRESSED_BYTES + (1 + ECPublicKey.COMPRESSED_BYTES);
} else if (substateTypeId == SubstateTypeId.VALIDATOR_OWNER_COPY.id()) {
// 0: Type Byte
// 1: Reserved Byte
// 2: Optional flag
// 3-6: Epoch
// 7-41: Validator Key
prefixIndexSize = 3 + Long.BYTES + ECPublicKey.COMPRESSED_BYTES;
} else if (substateTypeId == SubstateTypeId.VALIDATOR_REGISTERED_FLAG_COPY.id()) {
// 0: Type Byte
// 1: Reserved Byte
// 2: Optional flag
// 3-6: Epoch
// 7-41: Validator Key
prefixIndexSize = 3 + Long.BYTES + ECPublicKey.COMPRESSED_BYTES;
} else if (substateTypeId == SubstateTypeId.VALIDATOR_RAKE_COPY.id()) {
// 0: Type Byte
// 1: Reserved Byte
// 2: Optional flag
// 3-6: Epoch
// 7-41: Validator Key
prefixIndexSize = 3 + Long.BYTES + ECPublicKey.COMPRESSED_BYTES;
} else if (substateTypeId == SubstateTypeId.VALIDATOR_STAKE_DATA.id()) {
// 0: Type Byte
// 1: Reserved Byte
// 2: Registered Byte
// 3-34: Stake amount
// 35-67: Validator key
prefixIndexSize = 3 + UInt256.BYTES + ECPublicKey.COMPRESSED_BYTES;
} else {
// 0: Type Byte
prefixIndexSize = 1;
}
// Index by substate type
result.setData(data.getData(), data.getOffset(), prefixIndexSize);
return true;
}).setBtreeComparator(lexicographicalComparator()).setSortedDuplicates(true).setAllowCreate(true).setTransactional(true));
proofDatabase = env.openDatabase(null, PROOF_DB_NAME, primaryConfig);
vertexStoreDatabase = env.openDatabase(null, VERTEX_STORE_DB_NAME, pendingConfig);
epochProofDatabase = env.openSecondaryDatabase(null, EPOCH_PROOF_DB_NAME, proofDatabase, buildEpochProofConfig());
forkConfigDatabase = env.openDatabase(null, FORK_CONFIG_DB, primaryConfig);
forksVotingResultsDatabase = env.openDatabase(null, FORKS_VOTING_RESULTS_DB, primaryConfig.clone().setSortedDuplicates(true));
txnLog = AppendLog.openCompressed(new File(env.getHome(), LEDGER_NAME).getAbsolutePath(), systemCounters);
} catch (Exception e) {
throw new BerkeleyStoreException("Error while opening databases", e);
}
this.additionalStores.forEach(b -> b.open(dbEnv));
if (System.getProperty("db.check_integrity", "1").equals("1")) {
// TODO implement integrity check
// TODO perhaps we should implement recovery instead?
// TODO recovering should be integrated with recovering of ClientApiStore
}
}
use of com.radixdlt.utils.UInt256 in project radixdlt by radixdlt.
the class TokensConstraintScryptV3 method registerParticles.
private void registerParticles(Loader os) {
os.substate(new SubstateDefinition<>(TokenResource.class, SubstateTypeId.TOKEN_RESOURCE.id(), buf -> {
REFieldSerialization.deserializeReservedByte(buf);
var addr = REFieldSerialization.deserializeResourceAddr(buf);
var granularity = REFieldSerialization.deserializeNonZeroUInt256(buf);
if (!granularity.equals(UInt256.ONE)) {
throw new DeserializeException("Granularity must be one.");
}
var isMutable = REFieldSerialization.deserializeBoolean(buf);
var minter = REFieldSerialization.deserializeOptionalKey(buf);
return new TokenResource(addr, granularity, isMutable, minter.orElse(null));
}, (s, buf) -> {
REFieldSerialization.serializeReservedByte(buf);
REFieldSerialization.serializeREAddr(buf, s.addr());
REFieldSerialization.serializeUInt256(buf, UInt256.ONE);
REFieldSerialization.serializeBoolean(buf, s.isMutable());
REFieldSerialization.serializeOptionalKey(buf, s.optionalOwner());
}));
os.substate(new SubstateDefinition<>(TokenResourceMetadata.class, SubstateTypeId.TOKEN_RESOURCE_METADATA.id(), buf -> {
REFieldSerialization.deserializeReservedByte(buf);
var addr = REFieldSerialization.deserializeResourceAddr(buf);
var symbol = REFieldSerialization.deserializeString(buf);
var name = REFieldSerialization.deserializeString(buf);
var description = REFieldSerialization.deserializeString(buf);
var url = REFieldSerialization.deserializeUrl(buf);
var iconUrl = REFieldSerialization.deserializeUrl(buf);
return new TokenResourceMetadata(addr, symbol, name, description, iconUrl, url);
}, (s, buf) -> {
REFieldSerialization.serializeReservedByte(buf);
REFieldSerialization.serializeREAddr(buf, s.addr());
REFieldSerialization.serializeString(buf, s.symbol());
REFieldSerialization.serializeString(buf, s.name());
REFieldSerialization.serializeString(buf, s.description());
REFieldSerialization.serializeString(buf, s.url());
REFieldSerialization.serializeString(buf, s.iconUrl());
}));
os.substate(new SubstateDefinition<>(TokensInAccount.class, SubstateTypeId.TOKENS.id(), buf -> {
REFieldSerialization.deserializeReservedByte(buf);
var holdingAddr = REFieldSerialization.deserializeAccountREAddr(buf);
var addr = REFieldSerialization.deserializeResourceAddr(buf);
var amount = REFieldSerialization.deserializeNonZeroUInt256(buf);
return new TokensInAccount(holdingAddr, addr, amount);
}, (s, buf) -> {
REFieldSerialization.serializeReservedByte(buf);
REFieldSerialization.serializeREAddr(buf, s.holdingAddress());
REFieldSerialization.serializeREAddr(buf, s.resourceAddr());
buf.put(s.amount().toByteArray());
}));
}
use of com.radixdlt.utils.UInt256 in project radixdlt by radixdlt.
the class WeightedRotatingLeadersTest method setUp.
private void setUp(int validatorSetSize, int sizeOfCache) {
this.validatorsInOrder = Stream.generate(() -> ECKeyPair.generateNew().getPublicKey()).limit(validatorSetSize).map(BFTNode::create).map(node -> BFTValidator.from(node, UInt256.ONE)).sorted(Comparator.comparing(v -> v.getNode().getKey(), KeyComparator.instance().reversed())).collect(ImmutableList.toImmutableList());
BFTValidatorSet validatorSet = BFTValidatorSet.from(validatorsInOrder);
this.weightedRotatingLeaders = new WeightedRotatingLeaders(validatorSet, sizeOfCache);
this.weightedRotatingLeaders2 = new WeightedRotatingLeaders(validatorSet, sizeOfCache);
}
use of com.radixdlt.utils.UInt256 in project radixdlt by radixdlt.
the class WeightedRotatingLeadersTest method when_validators_distributed_by_fibonacci__then_leaders_also_distributed_in_fibonacci.
@Test
public void when_validators_distributed_by_fibonacci__then_leaders_also_distributed_in_fibonacci() {
// fibonacci sequence can quickly explode so keep sizes small
final int validatorSetSize = 8;
final int sizeOfCache = 4;
final Supplier<IntStream> fibonacci = () -> Stream.iterate(new int[] { 1, 1 }, t -> new int[] { t[1], t[0] + t[1] }).mapToInt(t -> t[0]).limit(validatorSetSize);
final int sumOfPower = fibonacci.get().sum();
this.validatorsInOrder = fibonacci.get().mapToObj(p -> BFTValidator.from(BFTNode.random(), UInt256.from(p))).collect(ImmutableList.toImmutableList());
BFTValidatorSet validatorSet = BFTValidatorSet.from(validatorsInOrder);
this.weightedRotatingLeaders = new WeightedRotatingLeaders(validatorSet, sizeOfCache);
Map<BFTNode, UInt256> proposerCounts = Stream.iterate(View.of(0), View::next).limit(sumOfPower).map(this.weightedRotatingLeaders::getProposer).collect(groupingBy(p -> p, collectingAndThen(counting(), UInt256::from)));
Map<BFTNode, UInt256> expected = validatorsInOrder.stream().collect(toMap(BFTValidator::getNode, BFTValidator::getPower));
assertThat(proposerCounts).isEqualTo(expected);
}
Aggregations