Add claim encoding for payment channels

This commit is contained in:
Ben Sharafian
2017-03-30 19:18:09 +02:00
parent e0aa8b6db3
commit 8d0d772835
4 changed files with 42 additions and 2 deletions

View File

@@ -1,5 +1,6 @@
/* eslint-disable func-style */ /* eslint-disable func-style */
const BN = require('bn.js');
const types = require('./types'); const types = require('./types');
const {HashPrefix} = require('./hash-prefixes'); const {HashPrefix} = require('./hash-prefixes');
const {BinaryParser} = require('./serdes/binary-parser'); const {BinaryParser} = require('./serdes/binary-parser');
@@ -30,6 +31,19 @@ function signingData(tx, prefix = HashPrefix.transactionSig) {
return serializeObject(tx, {prefix, signingFieldsOnly: true}); return serializeObject(tx, {prefix, signingFieldsOnly: true});
} }
function signingClaimData(claim) {
const prefix = HashPrefix.paymentChannelClaim
const channel = types.Hash256.from(claim.channel).toBytes()
const amount = new types.UInt64(new BN(claim.amount)).toBytes();
const bytesList = new BytesList();
bytesList.put(prefix)
bytesList.put(channel)
bytesList.put(amount)
return bytesList.toBytes()
}
function multiSigningData(tx, signingAccount) { function multiSigningData(tx, signingAccount) {
const prefix = HashPrefix.transactionMultiSig; const prefix = HashPrefix.transactionMultiSig;
const suffix = types.AccountID.from(signingAccount).toBytes(); const suffix = types.AccountID.from(signingAccount).toBytes();
@@ -47,6 +61,7 @@ module.exports = {
parseBytes, parseBytes,
multiSigningData, multiSigningData,
signingData, signingData,
signingClaimData,
binaryToJSON, binaryToJSON,
sha512Half, sha512Half,
transactionID, transactionID,

View File

@@ -21,7 +21,9 @@ const HashPrefix = {
// validation for signing // validation for signing
validation: bytes(0x56414C00), validation: bytes(0x56414C00),
// proposal for signing // proposal for signing
proposal: bytes(0x50525000) proposal: bytes(0x50525000),
// payment channel claim
paymentChannelClaim: bytes(0x434C4D00)
}; };
module.exports = { module.exports = {

View File

@@ -3,6 +3,7 @@ const coreTypes = require('./coretypes');
const {quality, const {quality,
binary: {bytesToHex, binary: {bytesToHex,
signingData, signingData,
signingClaimData,
multiSigningData, multiSigningData,
binaryToJSON, binaryToJSON,
serializeObject}} = coreTypes; serializeObject}} = coreTypes;
@@ -22,6 +23,11 @@ function encodeForSigning(json) {
return bytesToHex(signingData(json)); return bytesToHex(signingData(json));
} }
function encodeForSigningClaim(json) {
assert(typeof json === 'object');
return bytesToHex(signingClaimData(json));
}
function encodeForMultisigning(json, signer) { function encodeForMultisigning(json, signer) {
assert(typeof json === 'object'); assert(typeof json === 'object');
assert.equal(json.SigningPubKey, ''); assert.equal(json.SigningPubKey, '');
@@ -42,6 +48,7 @@ module.exports = {
decode, decode,
encode, encode,
encodeForSigning, encodeForSigning,
encodeForSigningClaim,
encodeForMultisigning, encodeForMultisigning,
encodeQuality, encodeQuality,
decodeQuality decodeQuality

View File

@@ -1,6 +1,7 @@
const _ = require('lodash'); const _ = require('lodash');
const assert = require('assert-diff'); const assert = require('assert-diff');
const {encodeForSigning, encodeForMultisigning} = require('../src'); const {encodeForSigning, encodeForSigningClaim, encodeForMultisigning} =
require('../src');
const tx_json = { const tx_json = {
Account: 'r9LqNeG6qHxjeUocjvVki2XR35weJ9mZgQ', Account: 'r9LqNeG6qHxjeUocjvVki2XR35weJ9mZgQ',
@@ -101,4 +102,19 @@ describe('Signing data', function() {
'C0A5ABEF242802EFED4B041E8F2D4A8CC86AE3D1'].join('') 'C0A5ABEF242802EFED4B041E8F2D4A8CC86AE3D1'].join('')
); );
}); });
it('can create claim blob', function() {
const channel =
'43904CBFCDCEC530B4037871F86EE90BF799DF8D2E0EA564BC8A3F332E4F5FB1'
const amount = '1000'
const json = {channel, amount}
const actual = encodeForSigningClaim(json)
assert.equal(actual, [
// hash prefix
'434C4D00',
// channel ID
'43904CBFCDCEC530B4037871F86EE90BF799DF8D2E0EA564BC8A3F332E4F5FB1',
// amount as a uint64
'00000000000003E8'
].join(''))
})
}); });