https://github.com/massmux/multisig
https://github.com/massmux/multisig
Last synced: about 2 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/massmux/multisig
- Owner: massmux
- Created: 2023-07-08T09:12:22.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2023-07-09T05:29:37.000Z (almost 2 years ago)
- Last Synced: 2025-02-13T09:23:40.849Z (4 months ago)
- Language: Python
- Size: 8.79 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Create Multisignature address with single keys and make signatures
If you have, for example, 3 single wallets (paper wallets) we can combine for getting a 2/3 multisignature single wallet. So a single address in which funds need 2 signatures (on 3) to be spent. This library allows creating such multisignature single-address wallet and collecting the signatures to spend it.
## Create Multisig and add the first signature
In the following example we create a multisig 2/3, using 3 public keys and use the first private key to make the partial signed transaction transaction.
```
>>> import multisig
>>> from multisig import TestnetMultisig
>>> a=TestnetMultisig(2,3)
>>> a.create_multisig("FIRSTPRIV", ['02ED3F28DA4FF57FE55D97F57E85360A8599093E3C30C37E85A1B9EDF7DC07BE34', '02ECEC779F1EDFAD7F2A37D3EA3FA954FA3DF8FF8F7B42A88F28B035E28E79B0E0', '03638F7C91C2A56A6B2EAC5CF2C545918E447D96973E560CB4E22BAADE136096C4'])
{'public_keys': ['02ED3F28DA4FF57FE55D97F57E85360A8599093E3C30C37E85A1B9EDF7DC07BE34', '02ECEC779F1EDFAD7F2A37D3EA3FA954FA3DF8FF8F7B42A88F28B035E28E79B0E0', '03638F7C91C2A56A6B2EAC5CF2C545918E447D96973E560CB4E22BAADE136096C4'], 'address': '2NB2f37DUMEJTypBziLn6sDJRVKRdCP92oP', 'segwit_address': '2N2tetuNDm3MBqdQ57b6Qb4NMkVjJuuN8aN', 'required_keys': 2, 'total_keys': 3}
>>> a.add_recipient(('tb1qu8l6t60jcv8zhpncyx0h9c2d8cfj3n73qda3cg', 0.0005))
('tb1qu8l6t60jcv8zhpncyx0h9c2d8cfj3n73qda3cg', 0.0005, 'btc')
>>> parz=a.get_transaction(5) # sats/vb (miner fees)
>>> parz
'01000000000102b8759fda2a05ecf0f1b9f875fc882d1ce0e238fd14f55d19c724b5420697af6f01000000232200202cec399422528959e7f9e4f6034ad70127989573c25da764b96f64f2db196d23ffffffffa63220a32863c605d13d7e3d05572a8f1e5a233d43a127337783965d85baa93000000000232200202cec399422528959e7f9e4f6034ad70127989573c25da764b96f64f2db196d23ffffffff0250c3000000000000160014e1ffa5e9f2c30e2b8678219f72e14d3e1328cfd1113201000000000017a91469cd506c6a35cc06a84e4ec8f31175a71da2018687040047304402206a12f77ed7607856693a787ddb740df9467e023107a5c248ddccf92a8422468f02201c51b17d3714593b61c020e24536bdf4e189640c841f72ab2fb8e3df89204caf010069522102ecec779f1edfad7f2a37d3ea3fa954fa3df8ff8f7b42a88f28b035e28e79b0e02102ed3f28da4ff57fe55d97f57e85360a8599093e3c30c37e85a1b9edf7dc07be342103638f7c91c2a56a6b2eac5cf2c545918e447d96973e560cb4e22baade136096c453ae040047304402201a39e72dea9e4693080378f73ce3fb0e3dd7b9a87fb0c29c6f623fca300ceced02205a45db1437077c1b6badbbbb5fb154c47a1754b3d951f7661e3eedda14577ce8010069522102ecec779f1edfad7f2a37d3ea3fa954fa3df8ff8f7b42a88f28b035e28e79b0e02102ed3f28da4ff57fe55d97f57e85360a8599093e3c30c37e85a1b9edf7dc07be342103638f7c91c2a56a6b2eac5cf2c545918e447d96973e560cb4e22baade136096c453ae00000000'
```## Add the second (or n) signature
Now we can add the signature from the second private key to an already signed transaction with the first key
```
>>> from multisig import TestnetMultisig
>>> a=TestnetMultisig(2,3)
>>> a.create_multisig("SECONDPRIV", ['02ED3F28DA4FF57FE55D97F57E85360A8599093E3C30C37E85A1B9EDF7DC07BE34', '02ECEC779F1EDFAD7F2A37D3EA3FA954FA3DF8FF8F7B42A88F28B035E28E79B0E0', '03638F7C91C2A56A6B2EAC5CF2C545918E447D96973E560CB4E22BAADE136096C4'])
{'public_keys': ['02ED3F28DA4FF57FE55D97F57E85360A8599093E3C30C37E85A1B9EDF7DC07BE34', '02ECEC779F1EDFAD7F2A37D3EA3FA954FA3DF8FF8F7B42A88F28B035E28E79B0E0', '03638F7C91C2A56A6B2EAC5CF2C545918E447D96973E560CB4E22BAADE136096C4'], 'address': '2NB2f37DUMEJTypBziLn6sDJRVKRdCP92oP', 'segwit_address': '2N2tetuNDm3MBqdQ57b6Qb4NMkVjJuuN8aN', 'required_keys': 2, 'total_keys': 3}
>>> parz='01000000000102b8759fda2a05ecf0f1b9f875fc882d1ce0e238fd14f55d19c724b5420697af6f01000000232200202cec399422528959e7f9e4f6034ad70127989573c25da764b96f64f2db196d23ffffffffa63220a32863c605d13d7e3d05572a8f1e5a233d43a127337783965d85baa93000000000232200202cec399422528959e7f9e4f6034ad70127989573c25da764b96f64f2db196d23ffffffff0250c3000000000000160014e1ffa5e9f2c30e2b8678219f72e14d3e1328cfd1113201000000000017a91469cd506c6a35cc06a84e4ec8f31175a71da2018687040047304402206a12f77ed7607856693a787ddb740df9467e023107a5c248ddccf92a8422468f02201c51b17d3714593b61c020e24536bdf4e189640c841f72ab2fb8e3df89204caf010069522102ecec779f1edfad7f2a37d3ea3fa954fa3df8ff8f7b42a88f28b035e28e79b0e02102ed3f28da4ff57fe55d97f57e85360a8599093e3c30c37e85a1b9edf7dc07be342103638f7c91c2a56a6b2eac5cf2c545918e447d96973e560cb4e22baade136096c453ae040047304402201a39e72dea9e4693080378f73ce3fb0e3dd7b9a87fb0c29c6f623fca300ceced02205a45db1437077c1b6badbbbb5fb154c47a1754b3d951f7661e3eedda14577ce8010069522102ecec779f1edfad7f2a37d3ea3fa954fa3df8ff8f7b42a88f28b035e28e79b0e02102ed3f28da4ff57fe55d97f57e85360a8599093e3c30c37e85a1b9edf7dc07be342103638f7c91c2a56a6b2eac5cf2c545918e447d96973e560cb4e22baade136096c453ae00000000'
>>> a.sign_transaction(parz,"SECONDPRIV")
'01000000000102b8759fda2a05ecf0f1b9f875fc882d1ce0e238fd14f55d19c724b5420697af6f01000000232200202cec399422528959e7f9e4f6034ad70127989573c25da764b96f64f2db196d23ffffffffa63220a32863c605d13d7e3d05572a8f1e5a233d43a127337783965d85baa93000000000232200202cec399422528959e7f9e4f6034ad70127989573c25da764b96f64f2db196d23ffffffff0250c3000000000000160014e1ffa5e9f2c30e2b8678219f72e14d3e1328cfd1113201000000000017a91469cd506c6a35cc06a84e4ec8f31175a71da2018687040048304502210082eb1d10af9f9611f6169f852b62aad92ae033941f5f2984f1059375bb9f604b0220330711fc35835cd1aa9db40e14b3c14d30b1a48d6161887cdb3d5378b9d814dc0147304402206a12f77ed7607856693a787ddb740df9467e023107a5c248ddccf92a8422468f02201c51b17d3714593b61c020e24536bdf4e189640c841f72ab2fb8e3df89204caf0169522102ecec779f1edfad7f2a37d3ea3fa954fa3df8ff8f7b42a88f28b035e28e79b0e02102ed3f28da4ff57fe55d97f57e85360a8599093e3c30c37e85a1b9edf7dc07be342103638f7c91c2a56a6b2eac5cf2c545918e447d96973e560cb4e22baade136096c453ae0400483045022100a995aa5ec606327183856c2a7c43908ac8e1663c53fa0ec51da9876b8594eb9c02202704390d425c369cadeca44b24ba8c7d83c60d5d0f23cbc1b309f30b4ecf1b3d0147304402201a39e72dea9e4693080378f73ce3fb0e3dd7b9a87fb0c29c6f623fca300ceced02205a45db1437077c1b6badbbbb5fb154c47a1754b3d951f7661e3eedda14577ce80169522102ecec779f1edfad7f2a37d3ea3fa954fa3df8ff8f7b42a88f28b035e28e79b0e02102ed3f28da4ff57fe55d97f57e85360a8599093e3c30c37e85a1b9edf7dc07be342103638f7c91c2a56a6b2eac5cf2c545918e447d96973e560cb4e22baade136096c453ae00000000'
```## Disclaimer
this is a open source free lib, use at your risk. This is released in an educational context.