resolved merge conflicts

This commit is contained in:
Gordon Hall 2014-04-19 12:13:24 -04:00
commit 76247ff532
34 changed files with 287 additions and 97 deletions

View File

@ -14,40 +14,41 @@ requireWhenAccessed('bignum', 'bignum');
requireWhenAccessed('base58', 'base58-native');
requireWhenAccessed('bufferput', 'bufferput');
requireWhenAccessed('buffertools', 'buffertools');
requireWhenAccessed('Buffers.monkey', './Buffers.monkey');
requireWhenAccessed('Buffers.monkey', './patches/Buffers.monkey');
requireWhenAccessed('config', './config');
requireWhenAccessed('const', './const');
requireWhenAccessed('Deserialize', './Deserialize');
requireWhenAccessed('Deserialize', './lib/Deserialize');
requireWhenAccessed('log', './util/log');
requireWhenAccessed('networks', './networks');
requireWhenAccessed('util', './util/util');
requireWhenAccessed('EncodedData', './util/EncodedData');
requireWhenAccessed('VersionedData', './util/VersionedData');
requireWhenAccessed('BinaryParser', './util/BinaryParser');
requireWhenAccessed('Address', './Address');
requireWhenAccessed('BIP32', './BIP32');
requireWhenAccessed('Point', './Point');
requireWhenAccessed('Opcode', './Opcode');
requireWhenAccessed('Script', './Script');
requireWhenAccessed('Transaction', './Transaction');
requireWhenAccessed('TransactionBuilder', './TransactionBuilder');
requireWhenAccessed('Connection', './Connection');
requireWhenAccessed('Peer', './Peer');
requireWhenAccessed('Block', './Block');
requireWhenAccessed('ScriptInterpreter', './ScriptInterpreter');
requireWhenAccessed('Bloom', './Bloom');
requireWhenAccessed('Key', './Key');
requireWhenAccessed('Address', './lib/Address');
requireWhenAccessed('BIP32', './lib/BIP32');
requireWhenAccessed('Point', './lib/Point');
requireWhenAccessed('Opcode', './lib/Opcode');
requireWhenAccessed('Script', './lib/Script');
requireWhenAccessed('Transaction', './lib/Transaction');
requireWhenAccessed('TransactionBuilder', './lib/TransactionBuilder');
requireWhenAccessed('Connection', './lib/Connection');
requireWhenAccessed('Peer', './lib/Peer');
requireWhenAccessed('Block', './lib/Block');
requireWhenAccessed('ScriptInterpreter', './lib/ScriptInterpreter');
requireWhenAccessed('Bloom', './lib/Bloom');
requireWhenAccessed('Key', './lib/Key');
Object.defineProperty(module.exports, 'KeyModule', {get: function() {
console.log('KeyModule is deprecated.');
return require('bindings')('KeyModule');
}});
requireWhenAccessed('SINKey', './SINKey');
requireWhenAccessed('SIN', './SIN');
requireWhenAccessed('PrivateKey', './PrivateKey');
requireWhenAccessed('RpcClient', './RpcClient');
requireWhenAccessed('Wallet', './Wallet');
requireWhenAccessed('WalletKey', './WalletKey');
requireWhenAccessed('PeerManager', './PeerManager');
requireWhenAccessed('SINKey', './lib/SINKey');
requireWhenAccessed('SIN', './lib/SIN');
requireWhenAccessed('PrivateKey', './lib/PrivateKey');
requireWhenAccessed('RpcClient', './lib/RpcClient');
requireWhenAccessed('Wallet', './lib/Wallet');
requireWhenAccessed('WalletKey', './lib/WalletKey');
requireWhenAccessed('PeerManager', './lib/PeerManager');
requireWhenAccessed('Message', './lib/Message');
module.exports.Buffer = Buffer;
if (typeof process.versions === 'undefined') {

View File

@ -23,31 +23,32 @@ var pack = function (params) {
};
var modules = [
'Address',
'BIP32',
'Block',
'Bloom',
'Buffers.monkey',
'Connection',
'Deserialize',
'Gruntfile',
'Number.monkey',
'Opcode',
'Peer',
'PeerManager',
'PrivateKey',
'RpcClient',
'Key',
'Point',
'SIN',
'SINKey',
'Script',
'ScriptInterpreter',
'Sign',
'Transaction',
'TransactionBuilder',
'Wallet',
'WalletKey',
'lib/Address',
'lib/BIP32',
'lib/Block',
'lib/Bloom',
'lib/Connection',
'lib/Deserialize',
'lib/Message',
'lib/Opcode',
'lib/Peer',
'lib/PeerManager',
'lib/PrivateKey',
'lib/RpcClient',
'lib/Key',
'lib/Point',
'lib/SIN',
'lib/SINKey',
'lib/Script',
'lib/ScriptInterpreter',
'lib/Sign',
'lib/Transaction',
'lib/TransactionBuilder',
'lib/Wallet',
'lib/WalletKey',
'patches/Buffers.monkey',
'patches/Number.monkey',
'config',
'const',
'networks',

View File

@ -1,4 +1,4 @@
var PeerManager = require('../PeerManager');
var PeerManager = require('../lib/PeerManager');
var peerman = new PeerManager();
peerman.discoverPeers(function(err, peers) {

View File

@ -4,6 +4,7 @@ var run = function() {
// Replace '../bitcore' with 'bitcore' if you use this code elsewhere.
var bitcore = require('../bitcore');
var Peer = bitcore.Peer;
var TransactionBuilder = bitcore.TransactionBuilder;
var PeerManager = bitcore.PeerManager;

View File

@ -1,8 +1,8 @@
'use strict';
var imports = require('soop').imports();
var coinUtil = imports.coinUtil || require('./util/util');
var parent = imports.parent || require('./util/VersionedData');
var networks = imports.networks || require('./networks');
var coinUtil = imports.coinUtil || require('../util');
var parent = imports.parent || require('../util/VersionedData');
var networks = imports.networks || require('../networks');
var Script = imports.Script || require('./Script');
function Address() {
@ -47,6 +47,10 @@ Address.fromScript = function(script, network) {
if (!network)
network = 'livenet';
if (typeof script === 'string') {
script = new Script(new Buffer(script,'hex'));
}
var version = networks[network].P2SHVersion;
var buf = script.getBuffer();
var hash = coinUtil.sha256ripe160(buf);
@ -54,6 +58,45 @@ Address.fromScript = function(script, network) {
return new Address(version, hash);
};
//extract and address from scriptPubKey
Address.fromScriptPubKey = function(scriptPubKey, network) {
if (typeof scriptPubKey === 'string') {
scriptPubKey = new Script(new Buffer(scriptPubKey,'hex'));
}
if (!network)
network = 'livenet';
var ret=[], version;
var payload = scriptPubKey.capture();
if (payload) {
var txType = scriptPubKey.classify();
switch (txType) {
case Script.TX_PUBKEY:
payload[0] = coinUtil.sha256ripe160(payload[0]);
version = networks[network].addressVersion;
break;
case Script.TX_PUBKEYHASH:
version = networks[network].addressVersion;
break;
case Script.TX_MULTISIG:
version = networks[network].addressVersion;
for(var i in payload)
payload[i] = coinUtil.sha256ripe160(payload[i]);
break;
case Script.TX_SCRIPTHASH:
version = networks[network].P2SHVersion;
break;
}
for(var i in payload)
ret.push(new Address(version,payload[i]));
}
return ret;
};
Address.prototype.validate = function() {
this.doAsBinary(function() {
Address.super(this, 'validate', arguments);

View File

@ -1,11 +1,11 @@
var imports = require('soop').imports();
var base58 = imports.base58 || require('base58-native').base58;
var coinUtil = imports.coinUtil || require('./util/util');
var coinUtil = imports.coinUtil || require('../util');
var Key = imports.Key || require('./Key');
var Point = imports.Point || require('./Point');
var bignum = imports.bignum || require('bignum');
var crypto = require('crypto');
var networks = require('./networks');
var networks = require('../networks');
var secp256k1_n = new bignum("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16);
var secp256k1_Gx = new bignum("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 16);

View File

@ -1,6 +1,6 @@
var imports = require('soop').imports();
var util = imports.util || require('./util/util');
var util = imports.util || require('../util');
var Debug1 = imports.Debug1 || function() {};
var Script = imports.Script || require('./Script');
var Bignum = imports.Bignum || require('bignum');
@ -11,7 +11,7 @@ var Transaction = imports.Transaction || require('./Transaction');
var TransactionIn = Transaction.In;
var TransactionOut = Transaction.Out;
var COINBASE_OP = Transaction.COINBASE_OP;
var VerificationError = imports.VerificationError || require('./util/error').VerificationError;
var VerificationError = imports.VerificationError || require('../util/error').VerificationError;
var BlockRules = {
maxTimeOffset: 2 * 60 * 60, // How far block timestamps can be into the future
largestHash: Bignum(2).pow(256)

View File

@ -1,20 +1,20 @@
var imports = require('soop').imports();
var log = imports.log || require('./util/log');
var log = imports.log || require('../util/log');
var MAX_RECEIVE_BUFFER = 10000000;
var PROTOCOL_VERSION = 70000;
var Put = imports.Put || require('bufferput');
var Buffers = imports.Buffers || require('buffers');
require('./Buffers.monkey').patch(Buffers);
require('../patches/Buffers.monkey').patch(Buffers);
var bitcoreDefaults = imports.config || require('./config');
var networks = imports.networks || require('./networks');
var bitcoreDefaults = imports.config || require('../config');
var networks = imports.networks || require('../networks');
var Block = imports.Block || require('./Block');
var Transaction = imports.Transaction || require('./Transaction');
var util = imports.util || require('./util/util');
var Parser = imports.Parser || require('./util/BinaryParser');
var util = imports.util || require('../util');
var Parser = imports.Parser || require('../util/BinaryParser');
var buffertools = imports.buffertools || require('buffertools');
var doubleSha256 = imports.doubleSha256 || util.twoSha256;
var nonce = util.generateNonce();

View File

@ -7,7 +7,7 @@ if (process.versions) {
module.exports = Key;
} else {
// pure js version
var ECKey = require('./browser/vendor-bundle.js').ECKey;
var ECKey = require('../browser/vendor-bundle.js').ECKey;
var buffertools = require('buffertools');
var kSpec = function() {

42
lib/Message.js Normal file
View File

@ -0,0 +1,42 @@
'use strict';
var imports = require('soop').imports();
var coinUtil = imports.coinUtil || require('../util');
var Key = imports.Key || require('./Key');
var Message = function() {
};
Message.sign = function(str, key) {
var hash = Message.magicHash(str);
var sig = key.signSync(hash);
return sig;
};
Message.verifyWithPubKey = function(pubkey, message, sig) {
var hash = Message.magicHash(message);
var key = new Key();
if (pubkey.length == 65)
key.compressed = false;
key.public = pubkey;
return key.verifySignatureSync(hash, sig);
};
//TODO: Message.verify ... with address, not pubkey
Message.magicBytes = new Buffer('Bitcoin Signed Message:\n');
Message.magicHash = function(str) {
var magicBytes = Message.magicBytes;
var prefix1 = coinUtil.varIntBuf(magicBytes.length);
var message = new Buffer(str);
var prefix2 = coinUtil.varIntBuf(message.length);
var buf = Buffer.concat([prefix1, magicBytes, prefix2, message]);
var hash = coinUtil.twoSha256(buf);
return hash;
};
module.exports = require('soop')(Message);

View File

@ -1,8 +1,7 @@
var imports = require('soop').imports();
var extend = imports.extend || require('extend');
var log = imports.log || require('./util/log');
var bitcoreDefaults = imports.config || require('./config');
var log = imports.log || require('../util/log');
var bitcoreDefaults = imports.config || require('../config');
var Connection = imports.Connection || require ('./Connection');
var Peer = imports.Peer || require('./Peer');
@ -217,7 +216,7 @@ PeerManager.prototype.discoverPeers = function(callback) {
var self = this;
var async = imports.async || require('async');
var dns = imports.dns || require('dns');
var networks = imports.networks || require('./networks')[this.config.network];
var networks = imports.networks || require('../networks')[this.config.network];
var seeds = networks.dnsSeeds;
// keep track of tried seeds and results

View File

@ -7,11 +7,11 @@ var assert = require('assert');
//browser
if (!process.versions) {
var ECKey = require('./browser/vendor-bundle.js').ECKey;
var ECPointFp = require('./browser/vendor-bundle.js').ECPointFp;
var ECFieldElementFp = require('./browser/vendor-bundle.js').ECFieldElementFp;
var getSECCurveByName = require('./browser/vendor-bundle.js').getSECCurveByName;
var BigInteger = require('./browser/vendor-bundle.js').BigInteger;
var ECKey = require('../browser/vendor-bundle.js').ECKey;
var ECPointFp = require('../browser/vendor-bundle.js').ECPointFp;
var ECFieldElementFp = require('../browser/vendor-bundle.js').ECFieldElementFp;
var getSECCurveByName = require('../browser/vendor-bundle.js').getSECCurveByName;
var BigInteger = require('../browser/vendor-bundle.js').BigInteger;
var should = require('chai').should();
}

View File

@ -1,7 +1,7 @@
var imports = require('soop').imports();
var parent = imports.parent || require('./util/VersionedData');
var networks= imports.networks || require('./networks');
var parent = imports.parent || require('../util/VersionedData');
var networks= imports.networks || require('../networks');
//compressed is true if public key is compressed; false otherwise
function PrivateKey(version, buf, compressed) {

View File

@ -5,7 +5,7 @@
var imports = require('soop').imports();
var http = imports.http || require('http');
var https = imports.https || require('https');
var log = imports.log || require('./util/log');
var log = imports.log || require('../util/log');
function RpcClient(opts) {
opts = opts || {};

View File

@ -1,5 +1,5 @@
var imports = require('soop').imports();
var parent = imports.parent || require('./util/VersionedData');
var parent = imports.parent || require('../util/VersionedData');
function SIN(type, payload) {
if (typeof type != 'number') {

View File

@ -1,5 +1,5 @@
var coinUtil = require('./util/util');
var timeUtil = require('./util/time');
var coinUtil = require('../util');
var timeUtil = require('../util/time');
var Key = require('./Key');
var SIN = require('./SIN');

View File

@ -1,6 +1,6 @@
var imports = require('soop').imports();
var config = imports.config || require('./config');
var log = imports.log || require('./util/log');
var config = imports.config || require('../config');
var log = imports.log || require('../util/log');
var Opcode = imports.Opcode || require('./Opcode');
var buffertools = imports.buffertools || require('buffertools');
@ -9,8 +9,8 @@ for (var i in Opcode.map) {
eval(i + " = " + Opcode.map[i] + ";");
}
var util = imports.util || require('./util/util');
var Parser = imports.Parser || require('./util/BinaryParser');
var util = imports.util || require('../util/util');
var Parser = imports.Parser || require('../util/BinaryParser');
var Put = imports.Put || require('bufferput');
var TX_UNKNOWN = 0;

View File

@ -1,11 +1,11 @@
var imports = require('soop').imports();
var config = imports.config || require('./config');
var log = imports.log || require('./util/log');
var util = imports.util || require('./util/util');
var config = imports.config || require('../config');
var log = imports.log || require('../util/log');
var util = imports.util || require('../util');
var Opcode = imports.Opcode || require('./Opcode');
var buffertools = imports.buffertools || require('buffertools');
var bignum = imports.bignum || require('bignum');
var Util = imports.Util || require('./util/util');
var Util = imports.Util || require('../util');
var Script = require('./Script');
var Key = require('./Key');

View File

@ -1,17 +1,17 @@
var imports = require('soop').imports();
var config = imports.config || require('./config');
var log = imports.log || require('./util/log');
var config = imports.config || require('../config');
var log = imports.log || require('../util/log');
var Address = imports.Address || require('./Address');
var Script = imports.Script || require('./Script');
var ScriptInterpreter = imports.ScriptInterpreter || require('./ScriptInterpreter');
var util = imports.util || require('./util/util');
var util = imports.util || require('../util');
var bignum = imports.bignum || require('bignum');
var Put = imports.Put || require('bufferput');
var Parser = imports.Parser || require('./util/BinaryParser');
var Parser = imports.Parser || require('../util/BinaryParser');
var Step = imports.Step || require('step');
var buffertools = imports.buffertools || require('buffertools');
var error = imports.error || require('./util/error');
var networks = imports.networks || require('./networks');
var error = imports.error || require('../util/error');
var networks = imports.networks || require('../networks');
var WalletKey = imports.WalletKey || require('./WalletKey');
var PrivateKey = imports.PrivateKey || require('./PrivateKey');

View File

@ -82,10 +82,10 @@
var imports = require('soop').imports();
var Address = imports.Address || require('./Address');
var Script = imports.Script || require('./Script');
var util = imports.util || require('./util/util');
var util = imports.util || require('../util');
var bignum = imports.bignum || require('bignum');
var buffertools = imports.buffertools || require('buffertools');
var networks = imports.networks || require('./networks');
var networks = imports.networks || require('../networks');
var WalletKey = imports.WalletKey || require('./WalletKey');
var PrivateKey = imports.PrivateKey || require('./PrivateKey');

View File

@ -3,10 +3,10 @@ var imports = require('soop').imports();
var hex = function(hex) {return new Buffer(hex, 'hex');};
var fs = require('fs');
var EncFile = require('./util/EncFile');
var EncFile = require('../util/EncFile');
var Address = require('./Address');
var networks = require('./networks');
var util = imports.util || require('./util/util');
var networks = require('../networks');
var util = imports.util || require('../util');
var ENC_METHOD = 'aes-256-cbc';
var skeleton = {

View File

@ -1,7 +1,7 @@
var imports = require('soop').imports();
var coinUtil = require('./util/util');
var timeUtil = require('./util/time');
var coinUtil = require('../util');
var timeUtil = require('../util/time');
var Key = require('./Key');
var PrivateKey = require('./PrivateKey');
var Address = require('./Address');

View File

@ -25,6 +25,7 @@
<script src="test/test.EncodedData.js"></script>
<script src="test/test.Key.js"></script>
<script src="test/test.main.js"></script>
<script src="test/test.Message.js"></script>
<script src="test/test.misc.js"></script>
<script src="test/test.Opcode.js"></script>
<script src="test/test.Peer.js"></script>

View File

@ -24,6 +24,7 @@
<script src="test.EncodedData.js"></script>
<script src="test.Key.js"></script>
<script src="test.main.js"></script>
<script src="test.Message.js"></script>
<script src="test.misc.js"></script>
<script src="test.Opcode.js"></script>
<script src="test.Peer.js"></script>

View File

@ -119,6 +119,13 @@ describe('Address', function() {
var addr = Address.fromScript(script);
var addr2 = Address.fromPubKeys(mReq, pubKeys);
addr.toString().should.equal(addr2.toString());
// Same case, using HEX
var scriptHex = bitcore.Script.createMultisig(mReq, pubKeys).getBuffer().toString('hex');
var addrB = Address.fromScript(scriptHex);
var addr2B = Address.fromPubKeys(mReq, pubKeys);
addrB.toString().should.equal(addr2B.toString());
});
it('it should make this hand-crafted address', function() {
@ -138,4 +145,40 @@ describe('Address', function() {
});
});
describe('#fromScriptPubKey', function() {
// All examples checked againt bitcoind decodescript
var cases = [
['76a91423b7530a00dd7951e11791c529389421c0b8d83b88ac', 'mimoZNLcP2rrMRgdeX5PSnR7AjCqQveZZ4'],
['a9147049be48e74a660157da3ed64569981592f7fa0587','2N3Ux1YTnt1ixofYvJfaabqZSj2MBF3jsmv'],
['76a914774e603bafb717bd3f070e68bbcccfd907c77d1388ac', 'mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE'],
['76a914b00127584485a7cff0949ef0f6bc5575f06ce00d88ac', 'mwZabyZXg8JzUtFX1pkGygsMJjnuqiNhgd'],
['532103bf025eb410407aec5a67c975ce222e363bb88c69bb1acce45d20d85602df2ec52103d76dd6d99127f4b733e772f0c0a09c573ac7e4d69b8bf50272292da2e093de2c2103dd9acd8dd1816c825d6b0739339c171ae2cb10efb53699680537865b07086e9b2102371cabbaf466c3a536034b4bda64ad515807bffd87488f44f93c2373d4d189c9210264cd444358f8d57f8637a7309f9736806f4883aebc4fe7da4bad1e4b37f2d12c55ae', [
"n4JAZc4cJimQbky5wxZUEDeAFZtGaZrjWK",
"msge5muNmBSRDn5nsaRcHCU6dg2zimA8wQ",
"mvz9MjocpyXdgXqRcZYazsdE8iThdvjdhk",
"miQGZ2gybQe7UvUQDBYsgcctUteij5pTpm",
"mu9kmhGrzREKsWaXUEUrsRLLMG4UMPy1LF"
]]
];
for(var i in cases){
var c=cases[i];
it('it should generate the right address', function(){
if (typeof c[1] === 'string') {
(new Address.fromScriptPubKey(c[0],'testnet')).toString().should.equal(c[1]);
var s = new bitcore.Script(new Buffer(c[0],'hex'));
(new Address.fromScriptPubKey(s,'testnet')).toString().should.equal(c[1]);
}
else {
var as=new Address.fromScriptPubKey(c[0],'testnet');
for(var j in as){
as[j].toString().should.equal(c[1][j]);
}
}
});
}
});
});

57
test/test.Message.js Normal file
View File

@ -0,0 +1,57 @@
'use strict';
var chai = chai || require('chai');
var should = chai.should();
var bitcore = bitcore || require('../bitcore');
var Message = bitcore.Message;
var coinUtil = bitcore.util;
describe('Message', function() {
describe('sign', function() {
it('should return a signature', function() {
var key = bitcore.Key.generateSync();
var sig = Message.sign('my message', key);
sig.length.should.be.greaterThan(0);
});
});
describe('verifyWithPubKey', function() {
it('should verify a signed message', function() {
var message = 'my message';
var key = bitcore.Key.generateSync();
var sig = Message.sign(message, key);
Message.verifyWithPubKey(key.public, message, sig).should.equal(true);
});
});
describe('magicBytes', function() {
it('should be "Bitcoin Signed Message:\\n"', function() {
Message.magicBytes.toString().should.equal('Bitcoin Signed Message:\n');
});
});
describe('magicHash', function() {
it('should hash the message with the magic bytes', function() {
var str = 'my message';
var magicBytes = Message.magicBytes;
var prefix1 = coinUtil.varIntBuf(magicBytes.length);
var message = new Buffer(str);
var prefix2 = coinUtil.varIntBuf(message.length);
var buf = Buffer.concat([prefix1, magicBytes, prefix2, message]);
var hash = coinUtil.twoSha256(buf);
var hash2 = Message.magicHash(str);
hash.toString().should.equal(hash2.toString());
});
it('should hash this message the same way as bitcoinjs-lib', function() {
var hashHex = '74eacdc6c04724869380907bf4aab561a1494a4a800fba266b29b8158c2c4cec';
var str = 'this is a test message';
hashHex.should.equal(Message.magicHash(str).toString('hex'));
});
});
});

1
util/index.js Normal file
View File

@ -0,0 +1 @@
module.exports = require('./util');