fcoin/lib/bcoin/wallet.js
Fedor Indutny 458e606359 wip
2014-05-04 23:24:32 +04:00

93 lines
2.3 KiB
JavaScript

var assert = require('assert');
var bcoin = require('../bcoin');
var utils = bcoin.utils;
function Wallet() {
if (!(this instanceof Wallet))
return new Wallet();
this.key = bcoin.ecdsa.genKeyPair();
}
module.exports = Wallet;
Wallet.prototype.getHash = function getHash() {
var pub = this.key.getPublic('array');
return utils.ripesha(pub);
};
Wallet.prototype.getAddress = function getAddress() {
return Wallet.hash2addr(this.getHash());
};
Wallet.hash2addr = function hash2addr(hash) {
hash = utils.toArray(hash, 'hex');
// Add version
hash = [ 0 ].concat(hash);
var addr = hash.concat(utils.checksum(hash));
return utils.toBase58(addr);
};
Wallet.addr2hash = function addr2hash(addr) {
if (!Array.isArray(addr))
addr = utils.fromBase58(addr);
if (addr.length !== 25)
return false;
if (addr[0] !== 0)
return false;
var chk = utils.checksum(addr.slice(0, -4));
if (utils.readU32(chk, 0) !== utils.readU32(addr, 21))
return false;
return addr.slice(1, -4);
};
Wallet.prototype.validateAddress = function validateAddress(addr) {
var p = Wallet.addr2hash(addr);
return !!p;
};
Wallet.validateAddress = Wallet.prototype.validateAddress;
Wallet.prototype.own = function own(tx) {
return tx.outputs.some(function(output) {
return output.script.length === 5 &&
output.script[0] === 'dup' &&
output.script[1] === 'hash160' &&
utils.toHex(output.script[2]) === utils.toHex(this.getHash()) &&
output.script[3] === 'eqverify' &&
output.script[4] === 'checksig';
}, this);
};
Wallet.prototype.sign = function sign(tx, type) {
if (!type)
type = 'all';
assert.equal(type, 'all');
// Filter inputs that this wallet own
var inputs = tx.inputs.filter(function(input) {
return input.out.tx && this.own(input.out.tx);
}, this);
var pub = this.key.getPublic('array');
// Add signature script to each input
inputs.forEach(function(input, i) {
var copy = input.tx.clone();
var s = input.out.tx.getSubscript();
copy.inputs.forEach(function(input, j) {
input.script = i === j ? s : [];
});
var verifyStr = copy.render();
verifyStr = verifyStr.concat(bcoin.protocol.constants.hashType[type]);
var hash = utils.dsha256(verifyStr);
var signature = this.key.sign(hash).toDER();
}, this);
return inputs.length;
};