Skip to content
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
8 changes: 4 additions & 4 deletions .pnp.cjs

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

Binary file not shown.
2 changes: 1 addition & 1 deletion packages/dashmate/configs/system/base.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ module.exports = {
},
tenderdash: {
docker: {
image: 'dashpay/tenderdash:0.6.0',
image: 'dashpay/tenderdash:0.7.0-dev.4',
},
p2p: {
port: 26656,
Expand Down
1 change: 1 addition & 0 deletions packages/dashmate/docker-compose.platform.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ services:
- INITIAL_CORE_CHAINLOCKED_HEIGHT=${PLATFORM_DRIVE_TENDERDASH_GENESIS_INITIAL_CORE_CHAIN_LOCKED_HEIGHT:-1}
- VALIDATOR_SET_LLMQ_TYPE=${PLATFORM_DRIVE_ABCI_VALIDATOR_SET_LLMQ_TYPE:?err}
- NETWORK=${NETWORK}
- TENDERDASH_P2P_PORT=${PLATFORM_DRIVE_TENDERDASH_P2P_PORT}
command: yarn workspace @dashevo/drive abci

drive_tenderdash:
Expand Down
2 changes: 2 additions & 0 deletions packages/js-drive/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -91,3 +91,5 @@ LOG_STATE_REPOSITORY=false
LOG_MERK=false

NODE_ENV=production

TENDERDASH_P2P_PORT=26656
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,12 @@ const {
function createValidatorSetUpdate(validatorSet) {
const validatorUpdates = validatorSet.getValidators()
.map((validator) => {
const networkInfo = validator.getNetworkInfo();

const validatorUpdate = new ValidatorUpdate({
power: validator.getVotingPower(),
proTxHash: validator.getProTxHash(),
nodeAddress: `tcp://${networkInfo.getHost()}:${networkInfo.getPort()}`,
});

if (validator.getPublicKeyShare()) {
Expand Down
1 change: 1 addition & 0 deletions packages/js-drive/lib/createDIContainer.js
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,7 @@ function createDIContainer(options) {

return Long.fromString(options.FEATURE_FLAGS_CONTRACT_BLOCK_HEIGHT);
}),
tenderdashP2pPort: asValue(options.TENDERDASH_P2P_PORT),
});

/**
Expand Down
18 changes: 15 additions & 3 deletions packages/js-drive/lib/validator/Validator.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ const PublicKeyShareIsNotPresentError = require('./errors/PublicKeyShareIsNotPre
class Validator {
/**
* @param {Buffer} proTxHash
* @param {ValidatorNetworkInfo} networkInfo
* @param {Buffer} [pubKeyShare]
*/
constructor(proTxHash, pubKeyShare = undefined) {
constructor(proTxHash, networkInfo, pubKeyShare = undefined) {
this.proTxHash = proTxHash;
this.networkInfo = networkInfo;
this.pubKeyShare = pubKeyShare;
}

Expand Down Expand Up @@ -36,12 +38,22 @@ class Validator {
return Validator.DEFAULT_DASH_VOTING_POWER;
}

/**
* Get network info
*
* @returns {ValidatorNetworkInfo}
*/
getNetworkInfo() {
return this.networkInfo;
}

/**
* @param {Object} member
* @param {ValidatorNetworkInfo} networkInfo
* @param {boolean} [pubKeyShareRequired=false]
* @return {Validator}
*/
static createFromQuorumMember(member, pubKeyShareRequired = false) {
static createFromQuorumMember(member, networkInfo, pubKeyShareRequired = false) {
const proTxHash = Buffer.from(member.proTxHash, 'hex');

let pubKeyShare;
Expand All @@ -51,7 +63,7 @@ class Validator {
throw new PublicKeyShareIsNotPresentError(member);
}

return new Validator(proTxHash, pubKeyShare);
return new Validator(proTxHash, networkInfo, pubKeyShare);
}
}

Expand Down
29 changes: 29 additions & 0 deletions packages/js-drive/lib/validator/ValidatorNetworkInfo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
class ValidatorNetworkInfo {
/**
*
* @param {string} host
* @param {number} port
*/
constructor(host, port) {
this.host = host;
this.port = port;
}

/**
* Get validator host
* @returns {string}
*/
getHost() {
return this.host;
}

/**
* Get validator port
* @returns {number}
*/
getPort() {
return this.port;
}
}

module.exports = ValidatorNetworkInfo;
20 changes: 18 additions & 2 deletions packages/js-drive/lib/validator/ValidatorSet.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const Validator = require('./Validator');
const ValidatorSetIsNotInitializedError = require('./errors/ValidatorSetIsNotInitializedError');
const ValidatorNetworkInfo = require('./ValidatorNetworkInfo');

class ValidatorSet {
/**
Expand All @@ -8,19 +9,22 @@ class ValidatorSet {
* @param {fetchQuorumMembers} fetchQuorumMembers
* @param {number} validatorSetLLMQType
* @param {RpcClient} coreRpcClient
* @param {number} tenderdashP2pPort
*/
constructor(
simplifiedMasternodeList,
getRandomQuorum,
fetchQuorumMembers,
validatorSetLLMQType,
coreRpcClient,
tenderdashP2pPort,
) {
this.simplifiedMasternodeList = simplifiedMasternodeList;
this.getRandomQuorum = getRandomQuorum;
this.fetchQuorumMembers = fetchQuorumMembers;
this.validatorSetLLMQType = validatorSetLLMQType;
this.coreRpcClient = coreRpcClient;
this.tenderdashP2pPort = tenderdashP2pPort;

this.quorum = null;
this.validators = [];
Expand Down Expand Up @@ -133,9 +137,21 @@ class ValidatorSet {
const isThisNodeMember = !!quorumMembers
.find((member) => member.valid && member.proTxHash === proTxHash);

this.validators = quorumMembers
const validMasternodesList = this.simplifiedMasternodeList
.getStore()
.getCurrentSML()
.getValidMasternodesList();

this.validators = await Promise.all(quorumMembers
.filter((member) => member.valid)
.map((member) => Validator.createFromQuorumMember(member, isThisNodeMember));
.map(async (member) => {
const masternode = validMasternodesList
.find((mnEntry) => mnEntry.proRegTxHash === member.proTxHash);

const networkInfo = new ValidatorNetworkInfo(masternode.getIp(), this.tenderdashP2pPort);

return Validator.createFromQuorumMember(member, networkInfo, isThisNodeMember);
}));
}
}

Expand Down
2 changes: 1 addition & 1 deletion packages/js-drive/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
"sinon-chai": "^3.7.0"
},
"dependencies": {
"@dashevo/abci": "~0.21.0",
"@dashevo/abci": "github:dashevo/js-abci#v0.22-dev",
"@dashevo/dapi-grpc": "workspace:~",
"@dashevo/dashcore-lib": "~0.19.28",
"@dashevo/dashd-rpc": "^2.3.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ const {
const { expect } = require('chai');

const createValidatorSetUpdate = require('../../../../../lib/abci/handlers/validator/createValidatorSetUpdate');
const ValidatorNetworkInfo = require('../../../../../lib/validator/ValidatorNetworkInfo');

describe('createValidatorSetUpdate', () => {
let validatorSetMock;
Expand All @@ -20,10 +21,12 @@ describe('createValidatorSetUpdate', () => {
getPublicKeyShare: this.sinon.stub(),
getVotingPower: this.sinon.stub(),
getProTxHash: this.sinon.stub(),
getNetworkInfo: this.sinon.stub(),
};

validatorMock.getVotingPower.returns(Buffer.alloc(2, 32));
validatorMock.getProTxHash.returns(Buffer.alloc(3, 32));
validatorMock.getNetworkInfo.returns(new ValidatorNetworkInfo('192.168.65.2', 26656));

validatorSetMock = {
getValidators: this.sinon.stub(),
Expand Down
18 changes: 16 additions & 2 deletions packages/js-drive/test/unit/validator/Validator.spec.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,26 @@
const { expect } = require('chai');
const Validator = require('../../../lib/validator/Validator');
const ValidatorNetworkInfo = require('../../../lib/validator/ValidatorNetworkInfo');

describe('Validator', () => {
describe('createFromQuorumMember', () => {
let networkInfo;
let host;
let port;

beforeEach(() => {
host = '192.168.65.2';
port = 26656;
networkInfo = new ValidatorNetworkInfo(host, port);
});

describe('#createFromQuorumMember', () => {
it('should create an instance from quorum member info', () => {
const memberInfo = {
proTxHash: Buffer.alloc(0, 32).toString('hex'),
pubKeyShare: Buffer.alloc(1, 32).toString('hex'),
};

const instance = Validator.createFromQuorumMember(memberInfo);
const instance = Validator.createFromQuorumMember(memberInfo, networkInfo);

expect(instance).to.be.an.instanceOf(Validator);
expect(instance.getProTxHash()).to.deep.equal(
Expand All @@ -18,6 +29,9 @@ describe('Validator', () => {
expect(instance.getPublicKeyShare()).to.deep.equal(
Buffer.from(memberInfo.pubKeyShare, 'hex'),
);
expect(instance.getNetworkInfo()).to.be.an.instanceOf(ValidatorNetworkInfo);
expect(instance.getNetworkInfo().getHost()).to.equal(host);
expect(instance.getNetworkInfo().getPort()).to.equal(port);
});
});
});
24 changes: 24 additions & 0 deletions packages/js-drive/test/unit/validator/ValidatorNetworkInfo.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const ValidatorNetworkInfo = require('../../../lib/validator/ValidatorNetworkInfo');

describe('ValidatorNetworkInfo', () => {
let validatorNetworkInfo;
let host;
let port;

beforeEach(() => {
host = '192.168.65.2';
port = 26656;
});

it('should return host', () => {
validatorNetworkInfo = new ValidatorNetworkInfo(host, port);

expect(validatorNetworkInfo.getHost()).to.equal(host);
});

it('should return port', () => {
validatorNetworkInfo = new ValidatorNetworkInfo(host, port);

expect(validatorNetworkInfo.getPort()).to.equal(port);
});
});
27 changes: 27 additions & 0 deletions packages/js-drive/test/unit/validator/ValidatorSet.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const Long = require('long');

const QuorumEntry = require('@dashevo/dashcore-lib/lib/deterministicmnlist/QuorumEntry');

const SimplifiedMNListEntry = require('@dashevo/dashcore-lib/lib/deterministicmnlist/SimplifiedMNListEntry');
const ValidatorSet = require('../../../lib/validator/ValidatorSet');
const getSmlFixture = require('../../../lib/test/fixtures/getSmlFixture');
const ValidatorSetIsNotInitializedError = require('../../../lib/validator/errors/ValidatorSetIsNotInitializedError');
Expand All @@ -18,6 +19,7 @@ describe('ValidatorSet', () => {
let quorumEntry;
let coreHeight;
let coreRpcClientMock;
let validatorNetworkPort;

let validatorSetLLMQType;

Expand All @@ -42,6 +44,24 @@ describe('ValidatorSet', () => {
getQuorumsOfType: this.sinon.stub().returns(
getSmlFixture()[0].newQuorums.filter((quorum) => quorum.llmqType === 1),
),
getValidMasternodesList: this.sinon.stub().returns([
new SimplifiedMNListEntry({
proRegTxHash: 'c286807d463b06c7aba3b9a60acf64c1fc03da8c1422005cd9b4293f08cf0562',
confirmedHash: '4eb56228c535db3b234907113fd41d57bcc7cdcb8e0e00e57590af27ee88c119',
service: '192.168.65.2:20101',
pubKeyOperator: '809519c5f6f3be1c08782ac42ae9a83b6c7205eba43f9a96a4f032ec7a73f1a7c25fa78cce0d6d9c135f7e2c28527179',
votingAddress: 'yXmprXYP51uzfMyndtWwxz96MnkCKkFc9x',
isValid: true,
}),
new SimplifiedMNListEntry({
proRegTxHash: 'a3e1edc6bd352eeaf0ae58e30781ef4b127854241a3fe7fddf36d5b7e1dc2b3f',
confirmedHash: '27a0b637b56af038c45e2fd1f06c2401c8dadfa28ca5e0d19ca836cc984a8378',
service: '192.168.65.2:20201',
pubKeyOperator: '987a4873caba62cd45a2f7d4aa6d94519ee6753e9bef777c927cb94ade768a542b0ff34a93231d3a92b4e75ffdaa366e',
votingAddress: 'ycL7L4mhYoaZdm9TH85svvpfeKtdfo249u',
isValid: true,
}),
]),
};

smlStoreMock = {
Expand Down Expand Up @@ -86,12 +106,15 @@ describe('ValidatorSet', () => {
masternode: this.sinon.stub().throws(notMasternodeError),
};

validatorNetworkPort = 26656;

validatorSet = new ValidatorSet(
simplifiedMasternodeListMock,
getRandomQuorumMock,
fetchQuorumMembersMock,
validatorSetLLMQType,
coreRpcClientMock,
validatorNetworkPort,
);
});

Expand All @@ -111,6 +134,8 @@ describe('ValidatorSet', () => {
validatorSetLLMQType,
quorumEntry.quorumHash,
);

expect(smlStoreMock.getCurrentSML().getValidMasternodesList).to.be.calledOnce();
});

it('should throw an error if the node is a quorum member and doesn\'t receive public key shares', async () => {
Expand Down Expand Up @@ -157,6 +182,8 @@ describe('ValidatorSet', () => {
validatorSetLLMQType,
quorumEntry.quorumHash,
);

expect(smlStoreMock.getCurrentSML().getValidMasternodesList).to.be.calledOnce();
});

it('should not rotate validator set if height not divisible by ROTATION_BLOCK_INTERVAL', async () => {
Expand Down
10 changes: 5 additions & 5 deletions packages/platform-test-suite/test/e2e/contacts.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ describe('e2e', () => {
type: 'object',
indices: [
{
name: "ownerId",
name: 'ownerId',
properties: [{ $ownerId: 'asc' }],
unique: true,
},
},
],
properties: {
avatarUrl: {
Expand All @@ -49,12 +49,12 @@ describe('e2e', () => {
type: 'object',
indices: [
{
name: "onwerIdToUserId",
name: 'onwerIdToUserId',
properties: [
{ $ownerId: 'asc' },
{ toUserId: 'asc' }
{ toUserId: 'asc' },
],
unique: true
unique: true,
},
],
properties: {
Expand Down
Loading