Skip to content
This repository has been archived by the owner on Dec 16, 2021. It is now read-only.

Commit

Permalink
Update to Drive 0.2.0
Browse files Browse the repository at this point in the history
* Update `addStPacket` to match the Drive interface

* Refactored sendRawTransition method

* Fix DashDrive adapter

* Fix `sendRawTransition` tests

* Rename params

* Bump version
  • Loading branch information
dalibran authored and shumkov committed Feb 23, 2019
1 parent 2bed6f1 commit 3b51f9f
Show file tree
Hide file tree
Showing 11 changed files with 231 additions and 292 deletions.
4 changes: 2 additions & 2 deletions doc/REFERENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -595,8 +595,8 @@ Sends raw state transition to the network.

| name | type | description |
|---------------------------|--------------------|----------------------------|
| args.rawTransitionHeader | *Needs definition* | *needs definition* |
| args.rawTransitionPacket | *needs definition* | *needs definition* |
| args.rawStateTransition | *Needs definition* | *needs definition* |
| args.rawSTPacket | *needs definition* | *needs definition* |

##### Response

Expand Down
5 changes: 3 additions & 2 deletions lib/api/dashDriveAdapter/AbstractDashDriveAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
class AbstractDashDriveAdapter {
/**
* Add State Transition Packet to DashDrive storage
* @param {string} packet - raw data packet serialized to hex string
* @param {string} rawSTPacket - raw data packet serialized to hex string
* @param {string} rawStateTransition - serialized state transition header
* @return {Promise<string>} - packet id
*/
addSTPacket(packet) {
addSTPacket(rawSTPacket, rawStateTransition) {
throw new Error('Not implemented');
}

Expand Down
12 changes: 8 additions & 4 deletions lib/api/dashDriveAdapter/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,15 @@ class DashDriveAdapter extends AbstractDashDriveAdapter {

/**
* Add State Transition Packet to DashDrive storage
* @param {string} packet - raw data packet serialized to hex string
* @return {Promise<string>} - packet id
* @param {string} rawSTPacket - raw data packet serialized to hex string
* @param {string} rawStateTransition - special transaction
* @return {Promise<undefined>}
*/
addSTPacket(packet) {
return this.request('addSTPacket', { packet });
addSTPacket(rawSTPacket, rawStateTransition) {
return this.request('addSTPacket', {
stPacket: rawSTPacket,
stateTransition: rawStateTransition,
});
}

/**
Expand Down
85 changes: 17 additions & 68 deletions lib/rpcServer/commands/sendRawTransition.js
Original file line number Diff line number Diff line change
@@ -1,81 +1,27 @@
const { Transaction } = require('@dashevo/dashcore-lib');
const Schema = require('@dashevo/dash-schema/dash-schema-lib');
const crypto = require('crypto');
const Validator = require('../../utils/Validator');
const argsSchema = require('../schemas/sendRawTransition');

const validator = new Validator(argsSchema);

/**
* Returns the string hex digest of a double SHA-256 hash.
* @param {String|Buffer} data The incoming data to hash
* @param {Object} cryptoLib The Node.js standard crypto library or equivalent
* @return {String}
*/
const doubleSha256 = (data, cryptoLib = crypto) => {
// The implementation of hash in Node.js is stateful and requires separate objects
const hasher1 = cryptoLib.createHash('sha256');
const firstHash = hasher1.update(data).digest();
const hasher2 = cryptoLib.createHash('sha256');
const secondHashHexDigest = hasher2.update(firstHash).digest('hex');
return secondHashHexDigest;
};

const createStateTransition = ({
TransactionClass = Transaction,
rawTransitionHeader,
rawTransitionDataPacket,
}) => {
if (!rawTransitionDataPacket) {
throw new Error('Updating state requires a transition data packet');
}

const rawTransitionDataPacketHexBuffer = Buffer.from(rawTransitionDataPacket, 'hex');
const packet = Schema.serialize.decode(rawTransitionDataPacketHexBuffer);

const packetHash = doubleSha256(rawTransitionDataPacketHexBuffer);
// TODO: The following function is bugged and should be reported to Andy
// const packetHash = SchemaClass.hash.stpacket(packet);
const headerTransaction = new TransactionClass(rawTransitionHeader);
const headerTransactionHash = headerTransaction.extraPayload.hashSTPacket;

if (packetHash !== headerTransactionHash) {
throw new Error('The hash of the data packet doesn\'t match the hash present in the header');
}

const stateTransition = {
headerTransaction,
packet,
};

return stateTransition;
};

/**
* @param coreAPI
* @param {AbstractDashDriveAdapter} dashDriveAPI
* @return {function({rawTransitionHeader, rawTransitionPacket?}): string}
*/
function sendRawTransitionFactory(coreAPI, dashDriveAPI) {
/**
* Layer 2 endpoint
* sends raw transition to quorum relay node
* sends raw transition to quorum relay node and ST Packet to the local Drive
*
* @typedef sendRawTransition
* @param args
* @param args.rawTransitionHeader
* @param [args.rawTransitionPacket]
* @param args.rawStateTransition
* @param args.rawSTPackett
* @return {Promise<string>}
*/
const sendRawTransition = async (args) => {
validator.validate(args);
const { rawTransitionHeader, rawTransitionPacket: rawTransitionDataPacket } = args;
const { headerTransaction: stateTransitionHeader } = createStateTransition({
rawTransitionHeader,
rawTransitionDataPacket,
});
await dashDriveAPI.addSTPacket(rawTransitionDataPacket);
const txid = await coreAPI.sendRawTransaction(stateTransitionHeader.serialize());
return txid;

const { rawSTPacket, rawStateTransition } = args;

await dashDriveAPI.addSTPacket(rawSTPacket, rawStateTransition);

return coreAPI.sendRawTransaction(rawStateTransition);
};

return sendRawTransition;
Expand Down Expand Up @@ -123,15 +69,18 @@ function sendRawTransitionFactory(coreAPI, dashDriveAPI) {
* title: Parameters
* type: object
* required:
* - rawTransitionHeader
* - rawStateTransition
* - rawSTPacket
* properties:
* rawTransitionHeader:
* rawStateTransition:
* type: string
* default: ''
* description: Raw transition
* rawSTPacket:
* type: string
* default: ''
* description: Raw ST Packet
*/
/* eslint-enable max-len */

sendRawTransitionFactory.createStateTransition = createStateTransition;
sendRawTransitionFactory.doubleSha256 = doubleSha256;
module.exports = sendRawTransitionFactory;
9 changes: 5 additions & 4 deletions lib/rpcServer/schemas/sendRawTransition.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
{
"type": "object",
"properties": {
"rawTransitionHeader": {
"rawStateTransition": {
"type": "string",
"pattern": "^(0x|0X)?[a-fA-F0-9]+$"
},
"rawTransitionPacket": {
"rawSTPacket": {
"type": "string",
"pattern": "^(0x|0X)?[a-fA-F0-9]+$"
}
},
"required": [
"rawTransitionHeader"
"rawStateTransition",
"rawSTPacket"
]
}
}
Loading

0 comments on commit 3b51f9f

Please sign in to comment.