You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.8 KiB
70 lines
1.8 KiB
10 years ago
|
var StealthAddress = require('./stealthaddress');
|
||
|
var StealthKey = require('./stealthkey');
|
||
|
var Transaction = require('../transaction');
|
||
|
var Pubkey = require('../pubkey');
|
||
|
|
||
|
var StealthTx = function StealthTx(tx, sa, sk) {
|
||
|
if (!(this instanceof StealthTx))
|
||
|
return new StealthTx(tx, sa, sk);
|
||
|
if (tx instanceof Transaction) {
|
||
|
this.tx = tx;
|
||
|
this.sa = sa;
|
||
|
this.sk = sk;
|
||
|
} else if (tx) {
|
||
|
var obj = tx;
|
||
|
this.set(obj);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
StealthTx.prototype.set = function(obj) {
|
||
|
this.sk = obj.sk || this.sk;
|
||
|
this.sa = obj.sa || this.sa;
|
||
|
this.tx = obj.tx || this.tx;
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
StealthTx.prototype.isForMe = function() {
|
||
|
if (!this.notMine())
|
||
|
return true;
|
||
|
else
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
StealthTx.prototype.notMine = function() {
|
||
|
var err;
|
||
|
if (err = this.notStealth())
|
||
|
return "Not stealth: " + err;
|
||
|
var txopbuf = this.tx.txouts[0].script.chunks[1].buf;
|
||
|
var parsed = StealthTx.parseOpReturnData(txopbuf);
|
||
|
var pubkey = parsed.pubkey;
|
||
|
var pubkeyhashbuf = this.tx.txouts[1].script.chunks[2].buf;
|
||
|
var sk = this.sk;
|
||
|
if (sk.isForMe(pubkey, pubkeyhashbuf)) {
|
||
|
return false;
|
||
|
} else {
|
||
|
return "StealthTx not mine";
|
||
|
}
|
||
|
};
|
||
|
|
||
|
//For now, we only support a very limited variety of stealth tx
|
||
|
StealthTx.prototype.notStealth = function() {
|
||
|
var txouts = this.tx.txouts;
|
||
|
if (!(txouts.length >= 2))
|
||
|
return "Not enough txouts";
|
||
|
if (!txouts[0].script.isOpReturn())
|
||
|
return "First txout is not OP_RETURN";
|
||
|
if (!txouts[1].script.isPubkeyhashOut())
|
||
|
return "Second txout is not pubkeyhash";
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
StealthTx.parseOpReturnData = function(buf) {
|
||
|
var parsed = {};
|
||
|
parsed.version = buf[0];
|
||
|
parsed.noncebuf = buf.slice(1, 5);
|
||
|
parsed.pubkey = Pubkey().fromBuffer(buf.slice(5, 5 + 33));
|
||
|
return parsed;
|
||
|
};
|
||
|
|
||
|
module.exports = StealthTx;
|