Address._deriveAddress = function(scriptType, publicKeyRing, path, m, network) {
  $.checkArgument(_.contains(_.values(Constants.SCRIPT_TYPES), scriptType));

  var publicKeys = _.map(publicKeyRing, function(item) {
    var xpub = new Bitcore.HDPublicKey(item.xPubKey);
    return xpub.derive(path).publicKey;
  });

  var bitcoreAddress;
  switch (scriptType) {
    case Constants.SCRIPT_TYPES.P2SH:
      bitcoreAddress = Bitcore.Address.createMultisig(publicKeys, m, network);
      break;
    case Constants.SCRIPT_TYPES.P2PKH:
      $.checkState(_.isArray(publicKeys) && publicKeys.length == 1);
      bitcoreAddress = Bitcore.Address.fromPublicKey(publicKeys[0], network);
      break;
  }

  return {
    address: bitcoreAddress.toString(),
    path: path,
    publicKeys: _.invoke(publicKeys, 'toString'),
  };
};
Esempio n. 2
0
function cmdAccountAddress(newAddr)
{
	var privkeyObj = wallet.privkeys[0];
	var acctObj = wallet.accounts[wallet.defaultAccount];

	// Select last|next key to display|generate
	var keyIndex;
	if (newAddr)
		keyIndex = acctObj.nextKey;
	else {
		if (acctObj.nextKey == 0) {
			console.error("no key yet generated");
			return;
		}

		keyIndex = acctObj.nextKey - 1;
	}

	// Verify this is BIP 44 etc. compatible
	var hdpath_hard = "m/44'/0'/" +
		     acctObj.index.toString() + "'";
	var hdpath_pub = "m/0/" +
		     keyIndex.toString();

	// Get pubkey for hardened path
	var hdpriv = new bitcore.HDPrivateKey(privkeyObj.data);
	var derivedKey = hdpriv.derive(hdpath_hard);
	var hdpub = derivedKey.hdPublicKey;

	// Derive address for public path
	var address = new bitcore.Address(hdpub.derive(hdpath_pub).publicKey,
					  network);

	// Output [generated] address
	var addressStr = address.toString();
	console.log(addressStr);

	// If creating a new address, store new cache entry
	if (newAddr) {
		var matchObj = {
			address: addressStr,
			createTime: getUnixtime(),
			account: acctObj.name,
			acctIndex: acctObj.index,
			keyIndex: keyIndex,
			change: false,
		};

		acctObj.nextKey++;
		modified = true;

		wcache.matchAddresses[addressStr] = matchObj;
		wcacheModified = true;
	}
}
Esempio n. 3
0
Network.prototype._verifyMessage = function(message, contact, callback) {
  if (!utils.isCompatibleVersion(contact.protocol)) {
    this._router.removeContact(contact);
    return callback(new Error('Protocol version is incompatible'));
  }

  var messagekey = kad.Message.isRequest(message) ? 'params' : 'result';
  var nonce = message[messagekey].nonce;
  var signature = message[messagekey].signature;

  if (Date.now() > (constants.NONCE_EXPIRE + nonce)) {
    return callback(new Error('Message signature expired'));
  }

  var addr = bitcore.Address.fromPublicKeyHash(Buffer(contact.nodeID, 'hex'));
  var signobj = this._createSignatureObject(signature);

  this._verifySignature({
    message: message,
    nonce: nonce,
    signobj: signobj,
    address: addr,
    contact: contact,
    signature: signature
  }, callback);
};
CWPrivateKey.prototype.isValid = function() {
  try {
    return bitcore.Address.isValid(this.getAddress(), NETWORK, bitcore.Address.Pay2PubKeyHash);
  } catch (err) {
    return false;
  }
}
Esempio n. 5
0
CWBitcore.isValidAddress = function(val) {
  try {
    return bitcore.Address.isValid(val, NETWORK, bitcore.Address.Pay2PubKeyHash);
  } catch (err) {
    return false;
  }
};
Esempio n. 6
0
  this._validateContact(contact, function(err) {
    if (err && Network.RPC_VALIDATION_EXEMPT.indexOf(message.method) === -1) {
      return callback(err);
    }

    var messagekey = kad.Message.isRequest(message) ? 'params' : 'result';
    var nonce = message[messagekey].nonce;
    var signature = message[messagekey].signature;

    if (Date.now() > (constants.NONCE_EXPIRE + nonce)) {
      return callback(new Error('Message signature expired'));
    }

    var addr = bitcore.Address.fromPublicKeyHash(Buffer(contact.nodeID, 'hex'));
    var signobj = self._createSignatureObject(signature);

    self._verifySignature({
      message: message,
      nonce: nonce,
      signobj: signobj,
      address: addr,
      contact: contact,
      signature: signature
    }, callback);
  });
Esempio n. 7
0
Contract.prototype.verify = function(actor, pubkeyhash) {
  var property = actor + '_signature';
  var message = Message(this._getSigningData());
  var address = bitcore.Address.fromPublicKeyHash(Buffer(pubkeyhash, 'hex'));

  return message.verify(address, this.get(property));
};
Esempio n. 8
0
PayPro._getPayProRefundOutputs = function(addrStr, amount) {
  amount = amount.toString(10);

  var output = new BitcorePayPro.Output();
  var addr = new Bitcore.Address(addrStr);

  var s;
  if (addr.isPayToPublicKeyHash()) {
    s = Bitcore.Script.buildPublicKeyHashOut(addr);
  } else if (addr.isPayToScriptHash()) {
    s = Bitcore.Script.buildScriptHashOut(addr);
  } else {
    throw new Error('Unrecognized address type ' + addr.type);
  }

  //  console.log('PayPro refund address set to:', addrStr,s);
  output.set('script', s.toBuffer());
  output.set('amount', amount);
  return [output];
};
CWBitcore.isValidAddress = function(val) {
  try {
    var p2pkh = bitcore.Address.isValid(val, NETWORK, bitcore.Address.Pay2PubKeyHash);
    if (!p2pkh) {
      var bech32 = bitcoinjs.address.fromBech32(val);

      return typeof(bech32) !== 'undefined';
    }

    return p2pkh;
  } catch (err) {
    return false;
  }
}
Esempio n. 10
0
Network.prototype._verifyMessage = function(message, contact, callback) {
  var nonce, signature;

  if (!utils.isCompatibleVersion(contact.protocol)) {
    return callback(new Error('Protocol version is incompatible'));
  }

  if (kad.Message.isRequest(message)) {
    nonce = message.params.nonce;
    signature = message.params.signature;
  } else {
    nonce = message.result.nonce;
    signature = message.result.signature;
  }

  if (Date.now() > (constants.NONCE_EXPIRE + nonce)) {
    return callback(new Error('Message signature expired'));
  }

  var target = message.id + nonce;
  var addr = bitcore.Address.fromPublicKeyHash(Buffer(contact.nodeID, 'hex'));

  var compactSig;
  var signobj;

  try {
    compactSig = new Buffer(signature, 'base64');
    signobj = bitcore.crypto.Signature.fromCompact(compactSig);
  } catch (err) {
    return callback(new Error('Signature verification failed'));
  }

  var signedmsg = Message(target);
  var ecdsa = new bitcore.crypto.ECDSA();

  ecdsa.hashbuf = signedmsg.magicHash();
  ecdsa.sig = signobj;

  this._pubkeys[contact.nodeID] = ecdsa.toPublicKey();

  if (!signedmsg.verify(addr, signature)) {
    return callback(new Error('Signature verification failed'));
  }

  callback();
};
Esempio n. 11
0
scard.fzcRedeemScript = function(year, month, day, hours, minutes, privKey) {
    var tr = scard.getLockTime(year, month, day, hours, minutes);
    var redeemScript = bitcorelib.Script.empty()
        // useful generic way to get the minimal encoding of the locktime stack argument
        .add(bitcorelib.crypto.BN.fromNumber(tr.locktime).toScriptNumBuffer())
        .add('OP_NOP2').add('OP_DROP')
        .add(bitcorelib.Script.buildPublicKeyHashOut(privKey.toAddress()));
    var p2shAddress = bitcorelib.Address.payingTo(redeemScript);
    return {
        date: tr.date,
        locktime: tr.locktime,
        hex: redeemScript.toHex(),
        asm: redeemScript.toASM(),
        redeemScript: redeemScript,
        scriptPubKey: redeemScript.toScriptHashOut(),
        address: p2shAddress,
        privKey: privKey
    }
}
CWBitcore.pubKeyToPubKeyHash = function(pubKey) {
  return bitcore.Address.fromPublicKey(bitcore.PublicKey(pubKey, {network: NETWORK}), NETWORK).toString();
}
Esempio n. 13
0
function cmdSpend(spendFn)
{
	spendInfo = JSON.parse(fs.readFileSync(spendFn, 'utf8'));
	var account = spendInfo.account;
	var acctObj = wallet.accounts[account];

	// List UTXOs for this account
	var acctUtxos = [];
	var privkeys = [];
	for (var utxoId in wcache.unspent) {
		var utxo = wcache.unspent[utxoId];
		var addrInfo = wcache.matchAddresses[utxo.address];
		if (addrInfo.account == account) {
			var utxoObj = new bitcore.Transaction.UnspentOutput(utxo);
			acctUtxos.push(utxoObj);
			privkeys.push(privkeyFromAddress(utxoObj.address));
		}
	}

	//
	// Generate change address
	//

	// Verify this is BIP 44 etc. compatible
	var keyIndex = acctObj.nextKey;
	var hdpath_hard = "m/44'/0'/" +
		     acctObj.index.toString() + "'";
	var hdpath_pub = "m/1/" +
		     keyIndex.toString();

	// Get pubkey for hardened path
	var privkeyObj = wallet.privkeys[0];
	var hdpriv = new bitcore.HDPrivateKey(privkeyObj.data);
	var derivedKey = hdpriv.derive(hdpath_hard);
	var hdpub = derivedKey.hdPublicKey;

	// Derive address for public path
	var changeAddr = new bitcore.Address(hdpub.derive(hdpath_pub).publicKey,
					  network);

	var addressStr = changeAddr.toString();

	// Build new match object for new change address
	var matchObj = {
		address: addressStr,
		createTime: getUnixtime(),
		account: acctObj.name,
		acctIndex: acctObj.index,
		keyIndex: keyIndex,
		change: true,
	};

	// Store match obj in cache
	acctObj.nextKey++;
	modified = true;

	wcache.matchAddresses[addressStr] = matchObj;
	wcacheModified = true;

	if ('btc' in spendInfo.to)
		spendInfo.to.satoshis = bitcore.Unit.fromBTC(spendInfo.to.btc).toSatoshis();

	// Generate and sign bitcoin transaction
	var tx = new bitcore.Transaction()
		.from(acctUtxos)
		.to(spendInfo.to.address, spendInfo.to.satoshis)
		.change(changeAddr)
		.sign(privkeys);

	// Add new tx to internal cache
	scanTx(tx, null);

	// Sync db
	walletWrite();
	cacheWrite();

	// Output transaction (hex) to console
	console.log(tx.toString());

	// Init bitcoind RPC
	rpcInfoRead();

	const rpc = new RpcClient(rpcInfoObj);

	rpc.sendRawTransaction(tx.toString(), function (err, res) {
		if (err) {
			console.error("Send TX failed, " + err);
			return;
		}

		console.log("Sent txid " + tx.hash);
	});
}
Esempio n. 14
0
KeyPair.prototype.getAddress = function() {
  return bitcore.Address.fromPublicKeyHash(
    new Buffer(this.getNodeID(), 'hex')
  ).toString();
};
Esempio n. 15
0
bitcore.Networks.defaultNetwork = bitcore.Networks.testnet; // works for regtest

// note: using a fixed private key of 1 for ease of demonstration only.
// address = mrCDrCybB6J1vRfbwM5hemdJz73FwDBC8r
// privKey WIF = cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN87JcbXMTcA
const privKey = bitcore.PrivateKey(bitcore.crypto.BN.One);

const redeemScript = bitcore.Script.empty()
  // useful generic way to get the minimal encoding of the locktime stack argument
  .add(bitcore.crypto.BN.fromNumber(LOCK_UNTIL_BLOCK).toScriptNumBuffer())
  .add('OP_CHECKLOCKTIMEVERIFY').add('OP_DROP')
  .add(bitcore.Script.buildPublicKeyHashOut(privKey.toAddress()));

// address = 2MxEcV5dx8CsDAByqN5PbB3NPmhyBkNLHVD
const p2shAddress = bitcore.Address.payingTo(redeemScript);

const freezeTransaction = new bitcore.Transaction().from({
  txid: args.txid, // tran id of an utxo associated with the privKey's address
  vout: Number(args.vout), // output index of the utxo within the transaction with id = txid
  scriptPubKey: args.scriptPubKey, // scriptPubKey of the utxo txid[vout]
  satoshis: Number(args.satoshis), // value of the utxo txid[vout]
})
.to(p2shAddress, Number(args.satoshis) - 100000)
.sign(privKey);

const getSpendTransaction = function(lockTime, sequenceNumber) {
  const result = new bitcore.Transaction().from({
    txid: freezeTransaction.id,
    vout: 0,
    scriptPubKey: redeemScript.toScriptHashOut(),
Esempio n. 16
0
var params   = JSON.parse(process.argv[2]);
var pubKeys  = [];
var external = (params.isExternal === 'external') ? 0 : 1;

params.extendedPubKeys.forEach(function(extendedPubKeyBase58) {

    var extendedPubKey = new bitcore.HDPublicKey(extendedPubKeyBase58);
    pubKeys.push(extendedPubKey.derive(external).derive(params.derivation).publicKey);

});


var redeemScript = bitcore.Script.buildMultisigOut(pubKeys, params.signRequired);
var script = redeemScript.toScriptHashOut();

var multisigAddress = new bitcore.Address(script, bitcore.Networks.livenet);

var stdout = {
    redeemScript: redeemScript.toBuffer().toString('hex'), // serialize to Hex format the redeemScript
    address:      multisigAddress.toString(),
    pubKeys:      pubKeys.map(function(pubkey) { return pubkey.toString(); }).sort() // get pubKeys and sort them alphabetically
};

if (bitcore.Address.isValid(multisigAddress.toString(), bitcore.Networks.livenet, bitcore.Address.PayToScriptHash)) {

    // stdout
    console.log(JSON.stringify(stdout));

} else {

    throw new Error('Address generated is invalid (not a PayToScriptHash).');