From b222550dd0760e7b1bdbe8c9b9f2ec87f0226f66 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Sat, 19 Jul 2014 16:54:18 -0300 Subject: [PATCH 1/4] add Transaction#getReceivingAddresses and send --- browser/bundle.js | 2 +- lib/NetworkMonitor.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/browser/bundle.js b/browser/bundle.js index 80d03bf..17e8318 100644 --- a/browser/bundle.js +++ b/browser/bundle.js @@ -59,7 +59,7 @@ module.exports=require('x1O6JW'); },{"../util":189,"./Key":"ALJ4PS","buffer":93}],"./lib/Message":[function(require,module,exports){ module.exports=require('CBDCgz'); },{}],"qYkfjX":[function(require,module,exports){ -var log=require("../util/log"),networks=require("../networks"),Address=require("./Address"),Peer=require("./Peer"),PeerManager=require("./PeerManager"),util=require("util"),EventEmitter=require("events").EventEmitter,preconditions=require("preconditions").singleton(),NetworkMonitor=function(e){preconditions.checkArgument(e),this.peerman=e,this.networkName=e.config.network,this.init()};util.inherits(NetworkMonitor,EventEmitter),NetworkMonitor.create=function(e){var t=new PeerManager({network:e.networkName});return t.addPeer(new Peer(e.host,e.port)),new NetworkMonitor(t)},NetworkMonitor.prototype.init=function(){var e=this,t=function(e){var t=e.message.invs;e.conn.sendGetData(t)},n=function(t){e.emit("block",t.message)},o=function(t){var n=t.message.tx;e.emit("tx",n);for(var o=n.getSendingAddresses(e.networkName),r=0;r Date: Thu, 24 Jul 2014 16:16:47 -0300 Subject: [PATCH 2/4] add support code for copay's new tx proposal check --- lib/Script.js | 60 +++++++++++++++++++++++++++++++++++++--- lib/Transaction.js | 8 ++++++ test/test.Transaction.js | 2 +- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/lib/Script.js b/lib/Script.js index c1ced7b..6f73243 100644 --- a/lib/Script.js +++ b/lib/Script.js @@ -115,6 +115,13 @@ Script.prototype.isMultiSig = function() { this.chunks[this.chunks.length - 1] == Opcode.map.OP_CHECKMULTISIG); }; +Script.prototype.isPubkeyHashScript = function() { + // TODO: add more restrictions to chunks + return (this.chunks.length == 2 && + Buffer.isBuffer(this.chunks[0]) && + Buffer.isBuffer(this.chunks[1])); +}; + Script.prototype.isP2shScriptSig = function() { if (!isSmallIntOp(this.chunks[0]) || this.chunks[0] !== 0) return false; @@ -133,20 +140,65 @@ Script.prototype.isMultiSigScriptSig = function() { Script.prototype.countSignatures = function() { var ret = 0; var l = this.chunks.length; - // Multisig? if (this.isMultiSigScriptSig()) { ret = l - 1; - } else if (this.isP2shScriptSig()) { + } + // p2sh + else if (this.isP2shScriptSig()) { ret = l - 2; } - // p2pubkey or p2pubkeyhash + // p2pubkeyhash + else if (this.isPubkeyHashScript()) { + ret = 1; + } + // p2pubkey else { - ret = buffertools.compare(this.getBuffer(), util.EMPTY_BUFFER) === 0 ? 0 : 1; + ret = 0; } return ret; }; + +Script.prototype.getSignatures = function() { + ret = []; + var l = this.chunks.length; + // Multisig? + if (this.isMultiSigScriptSig()) { + for(var i = 1; i Date: Thu, 24 Jul 2014 16:29:07 -0300 Subject: [PATCH 3/4] remove only from test --- browser/bundle.js | 6 +++--- test/test.Transaction.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/browser/bundle.js b/browser/bundle.js index 17e8318..053ee98 100644 --- a/browser/bundle.js +++ b/browser/bundle.js @@ -91,7 +91,7 @@ module.exports=require('EyghZQ'); },{}],"EyghZQ":[function(require,module,exports){ function SINKey(e){"object"!=typeof e&&(e={}),this.created=e.created,this.privKey=e.privKey}var coinUtil=require("../util"),timeUtil=require("../util/time"),Key=require("./Key"),SIN=require("./SIN");SINKey.prototype.generate=function(){this.privKey=Key.generateSync(),this.created=timeUtil.curtime()},SINKey.prototype.pubkeyHash=function(){return coinUtil.sha256ripe160(this.privKey.public)},SINKey.prototype.storeObj=function(){var e=this.privKey.public.toString("hex"),t=this.pubkeyHash(),i=new SIN(SIN.SIN_EPHEM,t),r={created:this.created,priv:this.privKey.private.toString("hex"),pub:e,sin:i.toString()};return r},module.exports=SINKey; },{"../util":189,"../util/time":192,"./Key":"ALJ4PS","./SIN":"tBM27q"}],"hQ0t76":[function(require,module,exports){ -(function(t){function e(t){this.buffer=t?t:f.EMPTY_BUFFER,this.chunks=[],this.parse()}function r(t){return t==h.map.OP_0||t>=h.map.OP_1&&t<=h.map.OP_16}function n(t){return t=t?2:65535>=t?3:5}function s(e){var r=void 0;return e=e?(r=new t(2),r.writeUInt8(h.map.OP_PUSHDATA1,0),r.writeUInt8(e,1)):65535>=e?(r=new t(3),r.writeUInt8(h.map.OP_PUSHDATA2,0),r.writeUInt16LE(e,1)):(r=new t(5),r.writeUInt8(h.map.OP_PUSHDATA4,0),r.writeUInt32LE(e,1)),r}var u=(require("../config"),require("../util/log")),h=require("./Opcode"),o=require("buffertools"),f=require("../util/util"),c=require("../util/BinaryParser"),p=require("bufferput"),a=0,l=1,g=2,k=3,w=4,y=["unknown","pubkey","pubkeyhash","multisig","scripthash"];e.TX_UNKNOWN=a,e.TX_PUBKEY=l,e.TX_PUBKEYHASH=g,e.TX_MULTISIG=k,e.TX_SCRIPTHASH=w,e.prototype.parse=function(){this.chunks=[];for(var t=new c(this.buffer);!t.eof();){var e,r,n=t.word8();n>0&&nh.map.OP_16)return!1}return!0},e.prototype.isP2SH=function(){return 3==this.chunks.length&&this.chunks[0]==h.map.OP_HASH160&&t.isBuffer(this.chunks[1])&&20==this.chunks[1].length&&this.chunks[2]==h.map.OP_EQUAL},e.prototype.isPubkey=function(){return 2==this.chunks.length&&t.isBuffer(this.chunks[0])&&this.chunks[1]==h.map.OP_CHECKSIG},e.prototype.isPubkeyHash=function(){return 5==this.chunks.length&&this.chunks[0]==h.map.OP_DUP&&this.chunks[1]==h.map.OP_HASH160&&t.isBuffer(this.chunks[2])&&20==this.chunks[2].length&&this.chunks[3]==h.map.OP_EQUALVERIFY&&this.chunks[4]==h.map.OP_CHECKSIG},e.prototype.isMultiSig=function(){return this.chunks.length>3&&r(this.chunks[0])&&this.chunks.slice(1,this.chunks.length-2).every(function(e){return t.isBuffer(e)})&&r(this.chunks[this.chunks.length-2])&&this.chunks[this.chunks.length-1]==h.map.OP_CHECKMULTISIG},e.prototype.isP2shScriptSig=function(){if(!r(this.chunks[0])||0!==this.chunks[0])return!1;var t=new e(this.chunks[this.chunks.length-1]),n=t.classify();return n!==a},e.prototype.isMultiSigScriptSig=function(){return r(this.chunks[0])&&0===this.chunks[0]?!this.isP2shScriptSig():!1},e.prototype.countSignatures=function(){var t=0,e=this.chunks.length;return t=this.isMultiSigScriptSig()?e-1:this.isP2shScriptSig()?e-2:0===o.compare(this.getBuffer(),f.EMPTY_BUFFER)?0:1},e.prototype.countMissingSignatures=function(){if(this.isMultiSig())return u.debug("Can not count missing signatures on normal Multisig script"),null;var t=0,n=this.chunks.length;if(r(this.chunks[0])&&0===this.chunks[0]){var i=new e(this.chunks[n-1]);if(r(i.chunks[0])){var s=i.chunks[0]-80;t=s-(n-2)}else u.debug("Unrecognized script type")}else 0===o.compare(this.getBuffer(),f.EMPTY_BUFFER)&&(t=1);return t},e.prototype.finishedMultiSig=function(){var t=this.countMissingSignatures();return null===t?null:0===t},e.prototype.getMultiSigInfo=function(){if(!this.isMultiSig())throw new Error("Script.getMultiSigInfo(): Not a multiSig script.");for(var t=this.chunks[0]-80,e=this.chunks[this.chunks.length-2]-80,r=[],n=1;ni;i++){var u=this.chunks[i];if(i>0&&(n+=" "),n+=t.isBuffer(u)?"0x"+f.formatBuffer(u,e?null:0):h.reverseMap[u],r&&i>r){n+=" ...";break}}return n},e.prototype.toString=function(t,e){var r="