Skip to content

Commit

Permalink
In serilizer for transactions, sort addresses and public keys in dece…
Browse files Browse the repository at this point in the history
…nding order
  • Loading branch information
James Calfee committed Mar 21, 2016
1 parent f02ef6f commit 947f5ba
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 10 deletions.
21 changes: 16 additions & 5 deletions dl/src/chain/serializer_types.js
Original file line number Diff line number Diff line change
Expand Up @@ -785,6 +785,10 @@ Types.public_key = {
}
v.required(object);
return object.toString()
},
compare(a, b) {
// sort decending
return -1 * strCmp(a.toString(), b.toString())
}
};

Expand All @@ -809,13 +813,20 @@ Types.address =
return chain_config.address_prefix + "664KmHxSuQyDsfwo4WEJvWpzg1QKdg67S";
}
return Types.address._to_address(object).toString();
},
compare(a, b) {
// sort decending
return -1 * strCmp(a.toString(), b.toString())
}
}

let first = el => Array.isArray(el) ? el[0] : el
let strCmp = (a, b) => a > b ? 1 : a < b ? -1 : 0
let firstEl = el => Array.isArray(el) ? el[0] : el
let sortOperation = (array, st_operation) => st_operation.compare ?
array.sort((a,b)=> st_operation.compare(first(a), first(b))) : // custom compare operation
array.sort((a,b)=> st_operation.compare(firstEl(a), firstEl(b))) : // custom compare operation
array.sort((a,b)=>
typeof first(a) === "number" && typeof first(b) === "number" ? first(a) - first(b) :
first(a).toString() > first(b).toString()
)
typeof firstEl(a) === "number" && typeof firstEl(b) === "number" ? firstEl(a) - firstEl(b) :
// A binary string compare does not work. Performanance is very good so HEX is used.. localeCompare is another option.
Buffer.isBuffer(firstEl(a)) && Buffer.isBuffer(firstEl(b)) ? strCmp(firstEl(a).toString("hex"), firstEl(b).toString("hex")) :
strCmp(firstEl(a).toString(), firstEl(b).toString())
)
10 changes: 5 additions & 5 deletions dl/test/types_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,13 @@ describe("types", function() {
it("public_key sort", function() {
let mapType = type.map(type.public_key, type.uint16)
let map = mapType.fromObject([//not sorted
["GPH7hC5RAxkenTAfaBncgyH4RNJKtkPJURXnuCabqCf7iu5QYL3ZW",0],
["GPH7W15NjWQNx1pkmPdwWdCLukR9wMk44PU6tDYdqQ5rQtgy3dwks",0],
["GPH56ankGHKf6qUsQe7vPsXTSEqST6Dt1ff73aV3YQbedzRua8NLQ",0],
["GPH8me6d9PqzTgcoHxx6b4rnvWVTqz11kafidRAZwfacJkcJtfd75",0],
])
let mapObject = mapType.toObject(map)
assert.deepEqual(mapObject, [ // uppercase comes first
["GPH7W15NjWQNx1pkmPdwWdCLukR9wMk44PU6tDYdqQ5rQtgy3dwks",0],
["GPH7hC5RAxkenTAfaBncgyH4RNJKtkPJURXnuCabqCf7iu5QYL3ZW",0],
assert.deepEqual(mapObject, [ // sorted (uppercase comes first)
["GPH8me6d9PqzTgcoHxx6b4rnvWVTqz11kafidRAZwfacJkcJtfd75",0],
["GPH56ankGHKf6qUsQe7vPsXTSEqST6Dt1ff73aV3YQbedzRua8NLQ",0],
])
})

Expand Down

0 comments on commit 947f5ba

Please sign in to comment.