Make serialization roundtrip recover info about inputs

This commit is contained in:
Esteban Ordano 2015-01-06 09:26:14 -03:00
parent ce7a9d33c6
commit dc6ff32290
2 changed files with 55 additions and 2 deletions

View File

@ -9,12 +9,13 @@ var $ = require('../../util/preconditions');
var Script = require('../../script'); var Script = require('../../script');
var Signature = require('../../crypto/signature'); var Signature = require('../../crypto/signature');
var Sighash = require('../sighash'); var Sighash = require('../sighash');
var PublicKey = require('../../publickey');
var BufferUtil = require('../../util/buffer'); var BufferUtil = require('../../util/buffer');
/** /**
* @constructor * @constructor
*/ */
function MultiSigScriptHashInput(input, pubkeys, threshold) { function MultiSigScriptHashInput(input, pubkeys, threshold, signatures) {
Input.apply(this, arguments); Input.apply(this, arguments);
var self = this; var self = this;
this.publicKeys = _.sortBy(pubkeys, function(publicKey) { return publicKey.toString('hex'); }); this.publicKeys = _.sortBy(pubkeys, function(publicKey) { return publicKey.toString('hex'); });
@ -27,10 +28,50 @@ function MultiSigScriptHashInput(input, pubkeys, threshold) {
}); });
this.threshold = threshold; this.threshold = threshold;
// Empty array of signatures // Empty array of signatures
this.signatures = new Array(this.publicKeys.length); this.signatures = signatures ? this._deserializeSignatures(signatures) : new Array(this.publicKeys.length);
} }
inherits(MultiSigScriptHashInput, Input); inherits(MultiSigScriptHashInput, Input);
MultiSigScriptHashInput.prototype.toObject = function() {
var obj = Input.prototype.toObject.apply(this, arguments);
obj.threshold = this.threshold;
obj.publicKeys = _.map(this.publicKeys, function(publicKey) { return publicKey.toString(); });
obj.signatures = this._serializeSignatures();
return obj;
};
MultiSigScriptHashInput.prototype._deserializeSignatures = function(signatures) {
return _.map(signatures, function(signature) {
if (!signature) {
return signature;
}
return {
publicKey: new PublicKey(signature.publicKey),
prevTxId: signature.txId,
outputIndex: signature.outputIndex,
inputIndex: signature.inputIndex,
signature: Signature.fromString(signature.signature),
sigtype: signature.sigtype
};
});
};
MultiSigScriptHashInput.prototype._serializeSignatures = function() {
return _.map(this.signatures, function(signature) {
if (!signature) {
return signature;
}
return {
publicKey: signature.publicKey.toString(),
prevTxId: signature.txId,
outputIndex: signature.outputIndex,
inputIndex: signature.inputIndex,
signature: signature.signature.toString(),
sigtype: signature.sigtype
};
});
};
MultiSigScriptHashInput.prototype.getSignatures = function(transaction, privateKey, index, sigtype) { MultiSigScriptHashInput.prototype.getSignatures = function(transaction, privateKey, index, sigtype) {
$.checkState(this.output instanceof Output); $.checkState(this.output instanceof Output);
sigtype = sigtype || Signature.SIGHASH_ALL; sigtype = sigtype || Signature.SIGHASH_ALL;

View File

@ -234,6 +234,18 @@ Transaction.prototype.toObject = function toObject() {
Transaction.prototype.fromObject = function(transaction) { Transaction.prototype.fromObject = function(transaction) {
var self = this; var self = this;
_.each(transaction.inputs, function(input) { _.each(transaction.inputs, function(input) {
if (input.output.script) {
input.output.script = new Script(input.output.script);
if (input.output.script.isPublicKeyHashOut()) {
self.addInput(new Input.PublicKeyHash(input));
return;
} else if (input.output.script.isScriptHashOut() && input.publicKeys && input.threshold) {
self.addInput(new Input.MultiSigScriptHash(
input, input.publicKeys, input.threshold, input.signatures
));
return;
}
}
self.addInput(new Input(input)); self.addInput(new Input(input));
}); });
_.each(transaction.outputs, function(output) { _.each(transaction.outputs, function(output) {