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

OriginTrail Mainnet Prerelease v6.3.0 #3135

Merged
merged 43 commits into from
Apr 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
ef12e8e
Support staking for Neuro (#3124)
djordjekovac Apr 12, 2024
ba2a136
Optimized function for fetching latest service agreements. (#3125)
djordjekovac Apr 12, 2024
be56196
Version bumped (#3127)
djordjekovac Apr 12, 2024
7e7d95e
Set proximityScoreFunctionsPairId in bid suggestion schema to accept …
Mihajlo-Pavlovic Apr 17, 2024
ad4b641
Merge branch 'v6/prerelease/devnet' into v6/develop
djordjekovac Apr 17, 2024
31422fb
Merge pull request #3126 from OriginTrail/v6/develop
djordjekovac Apr 17, 2024
64e887f
Always using new scoring function when calling bid suggestion
djordjekovac Apr 17, 2024
6138123
Merge pull request #3131 from OriginTrail/v6/devnet-4.3.0-hotfix
djordjekovac Apr 17, 2024
2334a3c
Merge pull request #3132 from OriginTrail/v6/develop
djordjekovac Apr 17, 2024
1d1b1c0
Merge pull request #3130 from OriginTrail/v6/prerelease/devnet
djordjekovac Apr 17, 2024
6fd8fce
Merge branch 'v6/prerelease/testnet' into v6/development-network
djordjekovac Apr 17, 2024
7419584
Merge pull request #3133 from OriginTrail/v6/development-network
djordjekovac Apr 18, 2024
feddcb2
Merge pull request #3134 from OriginTrail/v6/prerelease/testnet
djordjekovac Apr 18, 2024
4b4b2bf
Added retry logic for agreement ids
djordjekovac Apr 19, 2024
d81d29b
Merge branch 'v6/develop' into v6/devnet-4.3.0-hotfix1
djordjekovac Apr 19, 2024
dfb9c5f
PR comments fixed
djordjekovac Apr 19, 2024
2c62b8a
Merge branch 'v6/devnet-4.3.0-hotfix1' of https://github.com/OriginTr…
djordjekovac Apr 19, 2024
b6e91a9
Devnet 4.3.0 hotfix 1 (#3136)
djordjekovac Apr 19, 2024
a74122a
Merge branch 'v6/prerelease/devnet' into v6/develop
djordjekovac Apr 19, 2024
e724bec
Merge pull request #3137 from OriginTrail/v6/develop
djordjekovac Apr 19, 2024
285ffa6
Updated logic for fetching latest token ids
djordjekovac Apr 19, 2024
18733fe
Merge branch 'v6/develop' into v6/devnet-4.3.0-hotfix1
djordjekovac Apr 19, 2024
1320e33
Merge pull request #3139 from OriginTrail/v6/devnet-4.3.0-hotfix1
djordjekovac Apr 19, 2024
f11bf0a
Merge pull request #3140 from OriginTrail/v6/develop
djordjekovac Apr 19, 2024
122f117
Updated repository to ignore duplicates on adding new service agreement
djordjekovac Apr 19, 2024
afedf29
Merge pull request #3141 from OriginTrail/v6/devnet-4.3.0-hotfix1
djordjekovac Apr 19, 2024
1885d7c
Merge pull request #3142 from OriginTrail/v6/develop
djordjekovac Apr 19, 2024
71cf15a
Merge pull request #3138 from OriginTrail/v6/prerelease/devnet
djordjekovac Apr 19, 2024
3bcb8a0
Merge pull request #3143 from OriginTrail/v6/development-network
djordjekovac Apr 19, 2024
d92297b
Merge pull request #3144 from OriginTrail/v6/prerelease/testnet
djordjekovac Apr 19, 2024
ec9f9dc
Added additional logs, added check if agreement data already exists
djordjekovac Apr 23, 2024
a5f8fa8
version bump
djordjekovac Apr 23, 2024
c22588e
Merge pull request #3146 from OriginTrail/v6/6.3.0.hotfix2
djordjekovac Apr 23, 2024
6c0f225
Merge pull request #3147 from OriginTrail/v6/develop
djordjekovac Apr 23, 2024
d876553
Merge pull request #3148 from OriginTrail/v6/prerelease/devnet
djordjekovac Apr 23, 2024
5ab173b
Merge pull request #3149 from OriginTrail/v6/development-network
djordjekovac Apr 23, 2024
0ebf1a7
Merge pull request #3150 from OriginTrail/v6/prerelease/testnet
djordjekovac Apr 23, 2024
3c80001
Version updated - removed hotfix from version
djordjekovac Apr 24, 2024
6424e43
Merge pull request #3152 from OriginTrail/v6/remove-hotfix
djordjekovac Apr 24, 2024
6aa0814
Merge pull request #3153 from OriginTrail/v6/develop
djordjekovac Apr 24, 2024
375e33d
Merge pull request #3154 from OriginTrail/v6/prerelease/devnet
djordjekovac Apr 24, 2024
ca455c2
Merge pull request #3155 from OriginTrail/v6/development-network
djordjekovac Apr 24, 2024
fa107cc
Merge pull request #3156 from OriginTrail/v6/prerelease/testnet
djordjekovac Apr 24, 2024
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
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "origintrail_node",
"version": "6.2.4",
"version": "6.3.0",
"description": "OTNode V6",
"main": "index.js",
"type": "module",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,250 @@
/* eslint-disable no-await-in-loop */
import { setTimeout as sleep } from 'timers/promises';
import Command from '../../command.js';
import {
CONTENT_ASSET_HASH_FUNCTION_ID,
EXPECTED_TRANSACTION_ERRORS,
GET_ASSERTION_IDS_MAX_RETRY_COUNT,
GET_ASSERTION_IDS_RETRY_DELAY_IN_SECONDS,
GET_LATEST_SERVICE_AGREEMENT_BATCH_SIZE,
GET_LATEST_SERVICE_AGREEMENT_EXCLUDE_LATEST_TOKEN_ID,
GET_LATEST_SERVICE_AGREEMENT_FREQUENCY_MILLS,
SERVICE_AGREEMENT_SOURCES,
} from '../../../constants/constants.js';

class BlockchainGetLatestServiceAgreement extends Command {
constructor(ctx) {
super(ctx);
this.repositoryModuleManager = ctx.repositoryModuleManager;
this.blockchainModuleManager = ctx.blockchainModuleManager;
this.serviceAgreementService = ctx.serviceAgreementService;
this.ualService = ctx.ualService;
}

/**
* Executes command and produces one or more events
* @param command
*/
async execute(command) {
const { blockchain } = command.data;

const assetStorageContractAddresses =
this.blockchainModuleManager.getAssetStorageContractAddresses(blockchain);

const results = await Promise.all(
assetStorageContractAddresses.map((contract) =>
this.updateAgreementDataForAssetContract(
contract,
blockchain,
command.data[contract],
),
),
);

results.forEach((result) => {
if (result) {
// eslint-disable-next-line no-param-reassign
command.data[result.contract] = result.lastProcessedTokenId;
this.logger.debug(
`Get latest service agreement: updating last processed token id: ${result.lastProcessedTokenId} for blockchain ${blockchain}`,
);
}
});

return Command.repeat();
}

async updateAgreementDataForAssetContract(contract, blockchain, lastProcessedTokenId) {
this.logger.info(
`Get latest service agreement: Starting get latest service agreement command, last processed token id: ${lastProcessedTokenId} for blockchain: ${blockchain}`,
);
let latestBlockchainTokenId;
try {
latestBlockchainTokenId =
Number(await this.blockchainModuleManager.getLatestTokenId(blockchain, contract)) -
GET_LATEST_SERVICE_AGREEMENT_EXCLUDE_LATEST_TOKEN_ID;
} catch (error) {
if (error.message.includes(EXPECTED_TRANSACTION_ERRORS.NO_MINTED_ASSETS)) {
this.logger.info(
`Get latest service agreement: No minted assets on blockchain: ${blockchain}`,
);
return;
}
this.logger.error(
`Unable to process agreement data for asset contract ${contract}. Error: ${error}`,
);
return;
}

const latestDbTokenId =
lastProcessedTokenId ??
(await this.repositoryModuleManager.getLatestServiceAgreementTokenId(blockchain)) ??
latestBlockchainTokenId;

if (latestBlockchainTokenId < latestDbTokenId) {
this.logger.debug(
`Get latest service agreement: No new agreements found on blockchain: ${blockchain}.`,
);
return {
contract,
lastProcessedTokenId: latestDbTokenId,
};
}

if (latestBlockchainTokenId < latestDbTokenId) {
this.logger.debug(
`Get latest service agreement: No new agreements found on blockchain: ${blockchain}.`,
);
return;
}

this.logger.debug(
`Get latest service agreement: Latest token id on chain: ${latestBlockchainTokenId}, latest token id in database: ${latestDbTokenId} on blockchain: ${blockchain}`,
);

let tokenIdDifference = latestBlockchainTokenId - latestDbTokenId;
let getAgreementDataPromise = [];
for (
let tokenIdToBeFetched = latestDbTokenId + 1;
tokenIdToBeFetched <= latestBlockchainTokenId;
tokenIdToBeFetched += 1
) {
getAgreementDataPromise.push(
this.getAgreementDataForToken(tokenIdToBeFetched, blockchain, contract),
);
if (
getAgreementDataPromise.length === tokenIdDifference ||
getAgreementDataPromise.length === GET_LATEST_SERVICE_AGREEMENT_BATCH_SIZE
) {
const missingAgreements = await Promise.all(getAgreementDataPromise);

await this.repositoryModuleManager.bulkCreateServiceAgreementRecords(
missingAgreements.filter((agreement) => agreement != null),
);
getAgreementDataPromise = [];
tokenIdDifference -= GET_LATEST_SERVICE_AGREEMENT_BATCH_SIZE;
}
}
if (latestBlockchainTokenId - latestDbTokenId > 0) {
this.logger.debug(
`Get latest service agreement: Successfully fetched ${
latestBlockchainTokenId - latestDbTokenId
} on blockchain: ${blockchain}`,
);
}
return {
contract,
lastProcessedTokenId: latestBlockchainTokenId,
};
}

async getAgreementDataForToken(
tokenId,
blockchain,
contract,
hashFunctionId = CONTENT_ASSET_HASH_FUNCTION_ID,
) {
try {
if (await this.repositoryModuleManager.serviceAgreementExists(blockchain, tokenId)) {
this.logger.debug(
`Get latest service agreement: data exists in repository for token id: ${tokenId} on blockchain: ${blockchain}`,
);
return;
}
this.logger.debug(
`Get latest service agreement: Getting agreement data for token id: ${tokenId} on blockchain: ${blockchain}`,
);
let assertionIds = [];
let retryCount = 0;

while (assertionIds.length === 0) {
if (retryCount === GET_ASSERTION_IDS_MAX_RETRY_COUNT) {
throw Error(
`Get latest service agreement: Unable to get assertion ids for token id: ${tokenId} on blockchain: ${blockchain}`,
);
}
this.logger.debug(
`Get latest service agreement: getting assertion ids retry ${retryCount} for token id: ${tokenId} on blockchain: ${blockchain}`,
);
assertionIds = await this.blockchainModuleManager.getAssertionIds(
blockchain,
contract,
tokenId,
);
retryCount += 1;
await sleep(GET_ASSERTION_IDS_RETRY_DELAY_IN_SECONDS * 1000);
}

const keyword = await this.ualService.calculateLocationKeyword(
blockchain,
contract,
tokenId,
assertionIds[0],
);
const agreementId = await this.serviceAgreementService.generateId(
blockchain,
contract,
tokenId,
keyword,
hashFunctionId,
);
const agreementData = await this.blockchainModuleManager.getAgreementData(
blockchain,
agreementId,
);

if (!agreementData) {
throw Error(
`Get latest service agreement: Unable to fetch agreement data while processing asset created event for agreement id: ${agreementId}, blockchain id: ${blockchain}`,
);
}

const latestStateIndex = assertionIds.length - 1;

return {
blockchainId: blockchain,
assetStorageContractAddress: contract,
tokenId,
agreementId,
startTime: agreementData.startTime,
epochsNumber: agreementData.epochsNumber,
epochLength: agreementData.epochLength,
scoreFunctionId: agreementData.scoreFunctionId,
stateIndex: latestStateIndex,
assertionId: assertionIds[latestStateIndex],
hashFunctionId,
keyword,
proofWindowOffsetPerc: agreementData.proofWindowOffsetPerc,
dataSource: SERVICE_AGREEMENT_SOURCES.NODE,
};
} catch (error) {
this.logger.error(error.message);
}
}

/**
* Recover system from failure
* @param error
*/
async recover() {
return Command.repeat();
}

/**
* Builds default command
* @param map
* @returns {{add, data: *, delay: *, deadline: *}}
*/
default(map) {
const command = {
name: 'blockchainGetLatestServiceAgreement',
data: {},
period: GET_LATEST_SERVICE_AGREEMENT_FREQUENCY_MILLS,
transactional: false,
};
Object.assign(command, map);
return command;
}
}

export default BlockchainGetLatestServiceAgreement;
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import Command from '../../command.js';
import { GET_LATEST_SERVICE_AGREEMENT_FREQUENCY_MILLS } from '../../../constants/constants.js';

class GetLatestServiceAgreement extends Command {
constructor(ctx) {
super(ctx);
this.commandExecutor = ctx.commandExecutor;
this.shardingTableService = ctx.shardingTableService;
this.repositoryModuleManager = ctx.repositoryModuleManager;
this.blockchainModuleManager = ctx.blockchainModuleManager;
}

/**
* Executes command and produces one or more events
* @param command
*/
async execute() {
const operationId = this.operationIdService.generateId();

this.logger.info(
`Get latest service agreement: Starting get latest service agreement command for operation id: ${operationId}`,
);

await this.commandExecutor.delete('blockchainGetLatestServiceAgreement');

await Promise.all(
this.blockchainModuleManager.getImplementationNames().map(async (blockchain) => {
const commandData = {
blockchain,
operationId,
};

return this.commandExecutor.add({
name: 'blockchainGetLatestServiceAgreement',
data: commandData,
period: GET_LATEST_SERVICE_AGREEMENT_FREQUENCY_MILLS,
});
}),
);

return Command.empty();
}

/**
* Recover system from failure
* @param command
* @param error
*/
async recover(command) {
this.logger.warn(`Failed to execute ${command.name}. Error: ${command.message}`);

return Command.repeat();
}

/**
* Builds default command
* @param map
* @returns {{add, data: *, delay: *, deadline: *}}
*/
default(map) {
const command = {
name: 'getLatestServiceAgreement',
data: {},
transactional: false,
};
Object.assign(command, map);
return command;
}
}

export default GetLatestServiceAgreement;
Original file line number Diff line number Diff line change
Expand Up @@ -493,12 +493,9 @@ class BlockchainEpochCheckCommand extends Command {

/**
* Recover system from failure
* @param command
* @param error
*/
async recover(command) {
this.logger.warn(`Failed to execute ${command.name}. Error: ${command.message}`);

async recover() {
return Command.repeat();
}

Expand Down
Loading
Loading