Skip to content

Instantly share code, notes, and snippets.

@tonymorony
Last active April 29, 2019 15:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tonymorony/787f277a249a0ab767daa23d9eba1764 to your computer and use it in GitHub Desktop.
Save tonymorony/787f277a249a0ab767daa23d9eba1764 to your computer and use it in GitHub Desktop.
Wikipedia: Multisignature (often called multisig) is a form of technology used to add additional security for cryptocurrency transactions. Multisignature addresses require another user or users sign a transaction before it can be broadcast onto the block chain.
In this short guide will be demonstrated 2of2 multisignature wallet creation and usage. I'll use 2 nodes and Komodo assetchain. On KMD main chain steps will be same, just not use `-ac_name` param.
Step 1
At first lets get addresses on two nodes which we will combine the into single mutlisig address. Also we will need pubkey and privkey (wif) for each address:
# Node 1:
Getting `new address`:
./komodo-cli -ac_name=MSTEST getnewaddress
RDomQ4tftJGjcHBVpAUx549jZfxtJx74r5
Getting `pubkey`:
./komodo-cli -ac_name=MSTEST validateaddress RDomQ4tftJGjcHBVpAUx549jZfxtJx74r5
{
"isvalid": true,
"address": "RDomQ4tftJGjcHBVpAUx549jZfxtJx74r5",
"scriptPubKey": "76a91431a8cbc716e21238079729d46cb655ae7fadc9e388ac",
"segid": 37,
"ismine": true,
"iswatchonly": false,
"isscript": false,
"pubkey": "02dd22c272504af79b220ba37c12f777596eff4f54598e2db65be325a9393a3a26",
"iscompressed": true,
"account": ""
}
Getting `privkey`:
./komodo-cli -ac_name=MSTEST dumpprivkey RDomQ4tftJGjcHBVpAUx549jZfxtJx74r5
UrunDGyFJu5UFZG7BnFx9R6iaPmWaBX8iqHzRpFRjNp8kBEQYKNt
To summarise:
address: RDomQ4tftJGjcHBVpAUx549jZfxtJx74r5
pubkey: 02dd22c272504af79b220ba37c12f777596eff4f54598e2db65be325a9393a3a26
privkey: UrunDGyFJu5UFZG7BnFx9R6iaPmWaBX8iqHzRpFRjNp8kBEQYKNt
# Node 2:
./komodo-cli -ac_name=MSTEST getnewaddress
RBqZ6nHcANekX3zxF9y4zRyfB6X8VEWF7s
./komodo-cli -ac_name=MSTEST validateaddress RBqZ6nHcANekX3zxF9y4zRyfB6X8VEWF7s
{
"isvalid": true,
"address": "RBqZ6nHcANekX3zxF9y4zRyfB6X8VEWF7s",
"scriptPubKey": "76a9141c0f1c482d38c43bb847506a527521d2204afe6588ac",
"segid": 38,
"ismine": true,
"iswatchonly": false,
"isscript": false,
"pubkey": "032a73cd31fb86150c33f26312b665c21e5f9391829f29cf48aca03bbb4f9a2816",
"iscompressed": true,
"account": ""
}
./komodo-cli -ac_name=MSTEST dumpprivkey RBqZ6nHcANekX3zxF9y4zRyfB6X8VEWF7s
UsuE7jG8BD1CV2xuCoBCwgzzbs4HqZ2P2im5fdyJmP2tSd3arAv7
address: RBqZ6nHcANekX3zxF9y4zRyfB6X8VEWF7s
pubkey: 032a73cd31fb86150c33f26312b665c21e5f9391829f29cf48aca03bbb4f9a2816
privkey: UsuE7jG8BD1CV2xuCoBCwgzzbs4HqZ2P2im5fdyJmP2tSd3arAv7
Step 2
Now we can combine pubkeys to musig (2of2 in this example - parameter of createmultisig determining minimal amount of signatures for musig funds spending). You can execute this call on any node. :
./komodo-cli -ac_name=MSTEST createmultisig 2 '["02dd22c272504af79b220ba37c12f777596eff4f54598e2db65be325a9393a3a26","032a73cd31fb86150c33f26312b665c21e5f9391829f29cf48aca03bbb4f9a2816"]'
{
"address": "bEP3HK73CboW8tGN8obyHUQteBzYjFzgNm",
"redeemScript": "522102dd22c272504af79b220ba37c12f777596eff4f54598e2db65be325a9393a3a2621032a73cd31fb86150c33f26312b665c21e5f9391829f29cf48aca03bbb4f9a281652ae"
}
You can verify your script signatures amount and wallets in great tool made by Decker, e.g.:
https://deckersu.github.io/coinbin/?verify=522102dd22c272504af79b220ba37c12f777596eff4f54598e2db65be325a9393a3a2621032a73cd31fb86150c33f26312b665c21e5f9391829f29cf48aca03bbb4f9a281652ae#verify
Step 3
Lets fund our multisignature address:
./komodo-cli -ac_name=MSTEST sendtoaddress bEP3HK73CboW8tGN8obyHUQteBzYjFzgNm 7.77
194fea388c5474ae25d261d8c57213b79f9a111e774caeea066f796ddd99e81c
Step 4
Now we can spend funds from multisig address. Let's create rawtransaction first. As input I'm using unspent vout of transaction by which musig was funded. As destination address I put address to which I want to send amount of funds.
Please note, that in this example I'm sending whole deposited sum back, but in case if you want to send not all amount you have to manually specify second (change) output because by default change will be counted as miner fee. Most probably you'll get the `AcceptToMemoryPool: absurdly high fees` error because of this reason. (it can be passed trough by additional sendrawtransaction `true` param which actually set `allowhighfees=true`, but very unlikely you want to do it )
./komodo-cli -ac_name=MSTEST createrawtransaction '[{"txid":"194fea388c5474ae25d261d8c57213b79f9a111e774caeea066f796ddd99e81c","vout":1}]' '{"RP81MSVu39QgXhGDHfnk9d9KMnp4vhEVBu":7.77}'
0400008085202f89011ce899dd6d796f06eaae4c771e119a9fb71372c5d861d225ae74548c38ea4f190100000000ffffffff014014502e000000001976a91497d5106d5f69619803eb8d72a2bf45a4f033338a88ac00000000a80000000000000000000000000000
Then sign it from both nodes:
Node1:
./komodo-cli -ac_name=MSTEST signrawtransaction "0400008085202f89011ce899dd6d796f06eaae4c771e119a9fb71372c5d861d225ae74548c38ea4f190100000000ffffffff014014502e000000001976a91497d5106d5f69619803eb8d72a2bf45a4f033338a88ac00000000a80000000000000000000000000000" '[{"txid":"194fea388c5474ae25d261d8c57213b79f9a111e774caeea066f796ddd99e81c","vout":1,"scriptPubKey":"a914121cbc7a828772bd4612bc7b9765cbbf13d0b3cc87","redeemScript":"522102dd22c272504af79b220ba37c12f777596eff4f54598e2db65be325a9393a3a2621032a73cd31fb86150c33f26312b665c21e5f9391829f29cf48aca03bbb4f9a281652ae","amount":7.77}]' '["UrunDGyFJu5UFZG7BnFx9R6iaPmWaBX8iqHzRpFRjNp8kBEQYKNt"]'
{
"hex": "0400008085202f89011ce899dd6d796f06eaae4c771e119a9fb71372c5d861d225ae74548c38ea4f19010000009200483045022100a5f4bdf5b61a4f4baf0b5b48f69488b8f752e36cbac23ec0c762bba99552ac9e022036e658c7c8c19ec4bd423fcc6a109a811b189311fc874dd466e58a1755ef4e940147522102dd22c272504af79b220ba37c12f777596eff4f54598e2db65be325a9393a3a2621032a73cd31fb86150c33f26312b665c21e5f9391829f29cf48aca03bbb4f9a281652aeffffffff014014502e000000001976a91497d5106d5f69619803eb8d72a2bf45a4f033338a88ac00000000a80000000000000000000000000000",
"complete": false,
"errors": [
{
"txid": "194fea388c5474ae25d261d8c57213b79f9a111e774caeea066f796ddd99e81c",
"vout": 1,
"scriptSig": "00483045022100a5f4bdf5b61a4f4baf0b5b48f69488b8f752e36cbac23ec0c762bba99552ac9e022036e658c7c8c19ec4bd423fcc6a109a811b189311fc874dd466e58a1755ef4e940147522102dd22c272504af79b220ba37c12f777596eff4f54598e2db65be325a9393a3a2621032a73cd31fb86150c33f26312b665c21e5f9391829f29cf48aca03bbb4f9a281652ae",
"sequence": 4294967295,
"error": "Operation not valid with the current stack size"
}
]
}
Node2 (change hex to hex which you get from node1 signing and change privkey to node2 privkey):
./komodo-cli -ac_name=MSTEST signrawtransaction "0400008085202f89011ce899dd6d796f06eaae4c771e119a9fb71372c5d861d225ae74548c38ea4f19010000009200483045022100a5f4bdf5b61a4f4baf0b5b48f69488b8f752e36cbac23ec0c762bba99552ac9e022036e658c7c8c19ec4bd423fcc6a109a811b189311fc874dd466e58a1755ef4e940147522102dd22c272504af79b220ba37c12f777596eff4f54598e2db65be325a9393a3a2621032a73cd31fb86150c33f26312b665c21e5f9391829f29cf48aca03bbb4f9a281652aeffffffff014014502e000000001976a91497d5106d5f69619803eb8d72a2bf45a4f033338a88ac00000000a80000000000000000000000000000" '[{"txid":"194fea388c5474ae25d261d8c57213b79f9a111e774caeea066f796ddd99e81c","vout":1,"scriptPubKey":"a914121cbc7a828772bd4612bc7b9765cbbf13d0b3cc87","redeemScript":"522102dd22c272504af79b220ba37c12f777596eff4f54598e2db65be325a9393a3a2621032a73cd31fb86150c33f26312b665c21e5f9391829f29cf48aca03bbb4f9a281652ae","amount":7.77}]' '["UsuE7jG8BD1CV2xuCoBCwgzzbs4HqZ2P2im5fdyJmP2tSd3arAv7"]'
{
"hex": "0400008085202f89011ce899dd6d796f06eaae4c771e119a9fb71372c5d861d225ae74548c38ea4f1901000000da00483045022100a5f4bdf5b61a4f4baf0b5b48f69488b8f752e36cbac23ec0c762bba99552ac9e022036e658c7c8c19ec4bd423fcc6a109a811b189311fc874dd466e58a1755ef4e940147304402200abc8c1e1e26090a7012df8859a3986229da34b0edd82c42a64efc8b89390e6702202582cbdce3de13fe59196228d4d0a6a80916e23ccb343f1cf32515688a938ebb0147522102dd22c272504af79b220ba37c12f777596eff4f54598e2db65be325a9393a3a2621032a73cd31fb86150c33f26312b665c21e5f9391829f29cf48aca03bbb4f9a281652aeffffffff014014502e000000001976a91497d5106d5f69619803eb8d72a2bf45a4f033338a88ac00000000a80000000000000000000000000000",
"complete": true
}
And finally we are ready to broadcast our musig transaction:
./komodo-cli -ac_name=MSTEST sendrawtransaction 0400008085202f89011ce899dd6d796f06eaae4c771e119a9fb71372c5d861d225ae74548c38ea4f1901000000da00483045022100a5f4bdf5b61a4f4baf0b5b48f69488b8f752e36cbac23ec0c762bba99552ac9e022036e658c7c8c19ec4bd423fcc6a109a811b189311fc874dd466e58a1755ef4e940147304402200abc8c1e1e26090a7012df8859a3986229da34b0edd82c42a64efc8b89390e6702202582cbdce3de13fe59196228d4d0a6a80916e23ccb343f1cf32515688a938ebb0147522102dd22c272504af79b220ba37c12f777596eff4f54598e2db65be325a9393a3a2621032a73cd31fb86150c33f26312b665c21e5f9391829f29cf48aca03bbb4f9a281652aeffffffff014014502e000000001976a91497d5106d5f69619803eb8d72a2bf45a4f033338a88ac00000000a80000000000000000000000000000
23c2aaaf458ada3f171ee5d274e8dcfc91b62099ec15e4b2d02da2b2d1172cb1
Where 23c2aaaf458ada3f171ee5d274e8dcfc91b62099ec15e4b2d02da2b2d1172cb1 is output txid
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment