Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14864646
D14011.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
9 KB
Subscribers
None
D14011.diff
View Options
diff --git a/modules/ecash-script/README.md b/modules/ecash-script/README.md
--- a/modules/ecash-script/README.md
+++ b/modules/ecash-script/README.md
@@ -23,7 +23,7 @@
```
consumeNextPush({remainingHex:'042e786563'})
-// 2e786563
+// {data: 2e786563, pushedWith: '04'}
```
`swapEndianness`
@@ -40,3 +40,4 @@
1.0.0 Initial support for OP_RETURN parsing with functions `consume` and `consumeNextPush`
1.1.0 New functions `swapEndianness` and `isHexString`
+2.0.0 Modify `consumeNextPush` to return object `{data, pushedWith}` instead of string `data`
diff --git a/modules/ecash-script/package.json b/modules/ecash-script/package.json
--- a/modules/ecash-script/package.json
+++ b/modules/ecash-script/package.json
@@ -1,6 +1,6 @@
{
"name": "ecash-script",
- "version": "1.1.0",
+ "version": "2.0.0",
"description": "Parse script for eCash (XEC)",
"main": "index.js",
"scripts": {
diff --git a/modules/ecash-script/src/script.js b/modules/ecash-script/src/script.js
--- a/modules/ecash-script/src/script.js
+++ b/modules/ecash-script/src/script.js
@@ -61,7 +61,7 @@
* If the stack does not start with a valid push, it raises an error and the stack is left untouched.
* @param {object} stack an object containing a hex string outputScript of an eCash tx, e.g. {remainingHex: '4d...'}
* An object is used for 'stack' to allow in-place modification without returning the input
- * @returns {string} the first push on input stack, as a hex string
+ * @returns {object} {data, pushedWith}
* stack is modified in place so that the push is removed
*/
function consumeNextPush(stack) {
@@ -69,59 +69,54 @@
const clonedStack = JSON.parse(JSON.stringify(stack));
// Get the first byte on the stack
- let firstByte = module.exports.consume(clonedStack, 1);
+ let pushOpCode = consume(clonedStack, 1);
- if (opReturn.oneByteStackAdds.includes(firstByte)) {
+ if (opReturn.oneByteStackAdds.includes(pushOpCode)) {
// If this is a one-byte push, consume stack and return the byte
stack.remainingHex = clonedStack.remainingHex;
- return firstByte;
+ return { data: pushOpCode, pushedWith: pushOpCode };
}
- // Initialize pushdata, the byteCount in hex of the push
- let pushdata;
+ // Initialize variables
+ let pushBytecountHex, data;
// Apply conditional checks to determine the size of this push
- if (opReturn.oneBytePushdatas.includes(firstByte)) {
- // If the first byte on the stack is 0x01-0x4b, then this is pushdata
- pushdata = parseInt(firstByte, 16);
- } else if (firstByte === opReturn.OP_PUSHDATA1) {
+ if (opReturn.oneBytePushdatas.includes(pushOpCode)) {
+ // If the first byte on the stack is 0x01-0x4b, then this is pushedBytesHex
+ pushBytecountHex = pushOpCode;
+ } else if (pushOpCode === opReturn.OP_PUSHDATA1) {
// The next byte contains the number of bytes to be pushed onto the stack.
- pushdata = parseInt(module.exports.consume(clonedStack, 1), 16);
- } else if (firstByte === opReturn.OP_PUSHDATA2) {
+ pushBytecountHex = consume(clonedStack, 1);
+ } else if (pushOpCode === opReturn.OP_PUSHDATA2) {
// The next two bytes contain the number of bytes to be pushed onto the stack in little endian order.
-
- // pushdata is the the next 2 bytes, as little-endian
- // i.e. 04 would be 0x04 0x00 i.e. '0400'
- pushdata = module.exports.consume(clonedStack, 2);
-
- // Convert to big-endian so JS parseInt can get the value
- pushdata = swapEndianness(pushdata);
-
- // Convert to int
- pushdata = parseInt(pushdata, 16);
- } else if (firstByte === opReturn.OP_PUSHDATA4) {
+ pushBytecountHex = consume(clonedStack, 2);
+ } else if (pushOpCode === opReturn.OP_PUSHDATA4) {
// The next four bytes contain the number of bytes to be pushed onto the stack in little endian order.
-
- // pushdata is the first byte of the next 4 bytes, as little-endian
- // i.e. 04 would be 0x04 0x00 0x00 0x00 i.e. '04000000'
- pushdata = module.exports.consume(clonedStack, 4);
-
- // Convert to big-endian so JS parseInt can get the value
- pushdata = swapEndianness(pushdata);
-
- // Convert to int
- pushdata = parseInt(pushdata, 16);
+ pushBytecountHex = consume(clonedStack, 4);
} else {
- throw new Error(`${firstByte} is invalid pushdata`);
+ throw new Error(`${pushOpCode} is invalid pushdata`);
}
- // Now that you know pushdata in bytes, get the push
- let push = module.exports.consume(clonedStack, pushdata);
+ // Now that you know how many bytes are in the push, get the pushed data
+ data = consume(clonedStack, parseInt(swapEndianness(pushBytecountHex), 16));
// If no error, consume stack
stack.remainingHex = clonedStack.remainingHex;
- return push;
+ /*
+ Return {data, pushedWith}
+ Note that if the first byte on the stack is 0x01-0x4b,
+ this is both pushOpCode and pushBytecountHex
+
+ You don't want to return '0404' for e.g. '042e786563'
+ Conditionally remove pushBytecountHex for this case
+ */
+ return {
+ data,
+ pushedWith: `${pushOpCode}${
+ pushOpCode !== pushBytecountHex ? pushBytecountHex : ''
+ }`,
+ };
}
module.exports = {
diff --git a/modules/ecash-script/test/script.js b/modules/ecash-script/test/script.js
--- a/modules/ecash-script/test/script.js
+++ b/modules/ecash-script/test/script.js
@@ -131,7 +131,7 @@
'6a042e78656300154361706974616c4c6574746572735f416e645f2b21150076458db0ed96fe9863fc1ccec9fa2cfab884b0f6',
);
});
- it('consumeNextPush parses a valid alias registration OP_RETURN stack for all valid pushdata types', function () {
+ it('consumeNextPush returns expected pushdata for an OP_RETURN stack', function () {
const expectedPushes = [
'2e786563', // .xec
'00', // version 0
@@ -170,28 +170,43 @@
remainingHex: `${thesePushdatas[0]}${expectedPushes[0]}${thesePushdatas[1]}${expectedPushes[1]}${thesePushdatas[2]}${expectedPushes[2]}${thesePushdatas[3]}${expectedPushes[3]}`,
};
// First push, prefix
- assert.strictEqual(consumeNextPush(testStack), expectedPushes[0]);
+ assert.deepEqual(consumeNextPush(testStack), {
+ data: expectedPushes[0],
+ pushedWith: thesePushdatas[0],
+ });
// Stack is modified so that push is removed
assert.deepEqual(testStack, {
remainingHex: `${thesePushdatas[1]}${expectedPushes[1]}${thesePushdatas[2]}${expectedPushes[2]}${thesePushdatas[3]}${expectedPushes[3]}`,
});
// Second push, alias registration tx version number
- assert.strictEqual(consumeNextPush(testStack), expectedPushes[1]);
+ assert.deepEqual(consumeNextPush(testStack), {
+ data: expectedPushes[1],
+ pushedWith:
+ thesePushdatas[1] === ''
+ ? expectedPushes[1]
+ : thesePushdatas[1],
+ });
// Stack is modified so that push is removed
assert.deepEqual(testStack, {
remainingHex: `${thesePushdatas[2]}${expectedPushes[2]}${thesePushdatas[3]}${expectedPushes[3]}`,
});
// Third push, alias
- assert.strictEqual(consumeNextPush(testStack), expectedPushes[2]);
+ assert.deepEqual(consumeNextPush(testStack), {
+ data: expectedPushes[2],
+ pushedWith: thesePushdatas[2],
+ });
// Stack is modified so that push is removed
assert.deepEqual(testStack, {
remainingHex: `${thesePushdatas[3]}${expectedPushes[3]}`,
});
// Fourth push, <addressType><addressHash>
- assert.strictEqual(consumeNextPush(testStack), expectedPushes[3]);
+ assert.deepEqual(consumeNextPush(testStack), {
+ data: expectedPushes[3],
+ pushedWith: thesePushdatas[3],
+ });
// Stack is modified so that push is removed
assert.deepEqual(testStack, {
remainingHex: '',
@@ -246,7 +261,7 @@
'4e040404042e78656300154361706974616c4c6574746572735f416e645f2b21150076458db0ed96fe9863fc1ccec9fa2cfab884b0f6',
});
});
- it('consumeNextPush returns all one byte pushes', function () {
+ it('consumeNextPush returns all one byte pushes and empty string for associated pushdata', function () {
for (let i = 0; i < opReturn.oneByteStackAdds.length; i += 1) {
const testHexString = opReturn.oneByteStackAdds[i];
const stack = { remainingHex: testHexString };
@@ -254,7 +269,10 @@
const firstPush = consumeNextPush(stack); // alias registration prefix
// consumeNextPush returns the push of testHexString
- assert.strictEqual(firstPush, opReturn.oneByteStackAdds[i]);
+ assert.deepEqual(firstPush, {
+ data: opReturn.oneByteStackAdds[i],
+ pushedWith: opReturn.oneByteStackAdds[i],
+ });
// Verify stack has been modified in place
assert.deepEqual(stack, {
remainingHex: '',
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, May 20, 21:27 (17 h, 55 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5865951
Default Alt Text
D14011.diff (9 KB)
Attached To
D14011: [ecash-script] Add option to return pushdata to existing consumeNextPush function
Event Timeline
Log In to Comment