Skip to content

Instantly share code, notes, and snippets.

@itoonx
Forked from fanatid/bitcoinjs-lib.js
Created September 15, 2016 08:35
Show Gist options
  • Save itoonx/53652f9591e9b076663366d99f5afcbd to your computer and use it in GitHub Desktop.
Save itoonx/53652f9591e9b076663366d99f5afcbd to your computer and use it in GitHub Desktop.
bitcoin multisig transaction demo
var bitcoin = require('bitcoinjs-lib') // 1.4.x ?
var privKeys = [
'L2ALJznyt2croGHs8duBK2TZMB3Bc5ZpFZQSmR5QQUMPDDcUWeTw', // n2t8F1D41xy6f3d2B6DtjXRRsn8dgUzQ6C
'L3gM5giJqPAJcWyD8eKv94d4QgqyzqrYeAA9DnuJe23FszsnqD1w', // mjgF67B4pyEHuGTLU5jS333EasUrZBaxMB
'KwdYxYAbxntKvrMQtDHAamPT1pyuYkDRfAwESBqCGRdz9abQo3dW', // mwzPpNMFwLoJPXw2ez8mz6RrdYGaqZDind
'L5LTWMRBt27dHde1mnvV1RzW1mxQuQBxpm2TvNHsMaNvAQKqKov2', // mt7K2ChnJSp96k93HYdC8B9oqUmqLyESpL
'L4qQgxEbKJFJKans2UxFRzXisS7o3oBkyJGirAUgTxS9CfTo9Cd4', // mmvbfVqYrXdy1i4x9UzWc4PtgN7VjMNjeY
]
privKeys = privKeys.map(function(privKey) {
return bitcoin.ECKey.fromWIF(privKey)
})
var pubKeys = privKeys.map(function(privKey) {
return privKey.pub
})
// create multisig
var script = bitcoin.scripts.multisigOutput(2, [pubKeys[1], pubKeys[2], pubKeys[3]])
var txb1 = new bitcoin.TransactionBuilder()
txb1.addInput('9774024749b0104a98648641285cac4d518c9f824d9432d4ad67c1931028711b', 0)
txb1.addOutput(script, 990000)
txb1.sign(0, privKeys[0])
var tx1 = txb1.build()
console.log(tx1)
console.log(tx1.toHex()) // push tx to network
// spend multisig
var txb2 = new bitcoin.TransactionBuilder()
txb2.addInput(tx1.getId(), 0, bitcoin.Transaction.DEFAULT_SEQUENCE, script)
txb2.addOutput(pubKeys[4].getAddress(bitcoin.networks.testnet), 980000)
txb2.sign(0, privKeys[1])
var tx2 = txb2.buildIncomplete()
var txb3 = bitcoin.TransactionBuilder.fromTransaction(tx2)
txb3.prevOutScripts[0] = script
txb3.prevOutTypes[0] = 'multisig'
txb3.sign(0, privKeys[2])
var tx3 = txb3.build()
console.log(tx3)
console.log(tx3.toHex()) // push tx to network
var _ = require('lodash')
var bitcore = require('bitcore') // 0.12.5
var network = bitcore.Networks.testnet
var totalKeys = 3
var requiredSignatures = 2
var rawPrivateKeys = [
'cUTyK6kpESjzWRtvzb5KfenFB6PaGofwojkJMx68AQA6t2mQSKmV',
'cVQS3PFi9t1XWXAH2fKs5xczmeXKb5v4ZbwJ8u7vPgK9Xjx9CDts',
'cUoMsNvEeJGJpGwZNP3RRu9kYWHW4B2jTA3WPdnk9ZCMdtynJQDc'
]
// rawPrivateKeys = _.range(totalKeys).map(function () { return bitcore.PrivateKey(network).toWIF() })
var privateKeys = rawPrivateKeys.map(function (pk) { return bitcore.PrivateKey(pk) })
var publicKeys = privateKeys.map(function (pk) { return bitcore.PublicKey(pk) })
// multisig address
var address = bitcore.Address(publicKeys, requiredSignatures, network)
// get utxo from external source (chromanode, insight, blockr...)
var utxo = {
txId: '9500bed37ae3deaec7357d67864a57e193b2f0c87906cd17f28a2b0218495879',
outputIndex: 0,
address: address.toString(),
script: bitcore.Script(address).toHex(),
satoshis: 129191578
}
// create tx
var txObj = bitcore.Transaction()
.from(utxo, publicKeys, requiredSignatures)
.to('n3E3sYxTwz4FCU3LdUnKiiG1PTcPC654Za', utxo.satoshis - 100000)
.toObject()
// Alice sign tx
var sigAliceObj = bitcore.Transaction(txObj).getSignatures(privateKeys[0])[0]
// Bob sign tx
var sigBobObj = bitcore.Transaction(txObj).getSignatures(privateKeys[2])[0]
// apply Alice and Bob signatures
var tx = bitcore.Transaction(txObj)
.applySignature(sigAliceObj)
.applySignature(sigBobObj)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment