Creating multisig address with custom script using libbitcoin

This commit is contained in:
Srdjan Obucina 2020-04-06 01:18:53 +02:00
parent 3e901c264c
commit 4aa93b6035

View file

@ -1361,6 +1361,40 @@ std::string sidechain_net_handler_bitcoin::create_multisig_address_standalone(co
using namespace libbitcoin::machine;
using namespace libbitcoin::wallet;
// Online visualizer/debugger
// https://siminchen.github.io/bitcoinIDE/build/editor.html
//
// 0 03456772301e221026269d3095ab5cb623fc239835b583ae4632f99a15107ef275 OP_CHECKSIG
// 0 02d67c26cf20153fe7625ca1454222d3b3aeb53b122d8a0f7d32a3dd4b2c2016f4 OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 025f7cfda933516fd590c5a34ad4a68e3143b6f4155a64b3aab2c55fb851150f61 OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 0228155bb1ddcd11c7f14a2752565178023aa963f84ea6b6a052bddebad6fe9866 OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 037500441cfb4484da377073459511823b344f1ef0d46bac1efd4c7c466746f666 OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 02ef0d79bfdb99ab0be674b1d5d06c24debd74bffdc28d466633d6668cc281cccf OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 0317941e4219548682fb8d8e172f0a8ce4d83ce21272435c85d598558c8e060b7f OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 0266065b27f7e3d3ad45b471b1cd4e02de73fc4737dc2679915a45e293c5adcf84 OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 023821cc3da7be9e8cdceb8f146e9ddd78a9519875ecc5b42fe645af690544bccf OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 0229ff2b2106b76c27c393e82d71c20eec32bcf1f0cf1a9aca8a237269a67ff3e5 OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 024d113381cc09deb8a6da62e0470644d1a06de82be2725b5052668c8845a4a8da OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 03df2462a5a2f681a3896f61964a65566ff77448be9a55a6da18506fd9c6c051c1 OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 02bafba3096f546cc5831ce1e49ba7142478a659f2d689bbc70ed37235255172a8 OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 0287bcbd4f5d357f89a86979b386402445d7e9a5dccfd16146d1d2ab0dc2c32ae8 OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 0 02053859d76aa375d6f343a60e3678e906c008015e32fe4712b1fd2b26473bdd73 OP_CHECKSIG
// OP_IF OP_1 OP_ADD OP_ENDIF
// 11 OP_GREATERTHANOREQUAL
libbitcoin::machine::operation::list witness_script_ops;
uint16_t idx = 0;
@ -1368,22 +1402,15 @@ std::string sidechain_net_handler_bitcoin::create_multisig_address_standalone(co
for (auto son_pubkey : son_pubkeys) {
ec_public key = ec_public(son_pubkey.first);
data_chunk key_data = to_chunk(key.point());
uint16_t weight = son_pubkey.second;
total_weight = total_weight + weight;
if (idx == 0) {
witness_script_ops.emplace_back(key_data);
witness_script_ops.emplace_back(opcode::checksig);
witness_script_ops.emplace_back(opcode::if_);
witness_script_ops.emplace_back(opcode::push_positive_1);
witness_script_ops.emplace_back(opcode::else_);
witness_script_ops.emplace_back(opcode::push_size_0);
witness_script_ops.emplace_back(opcode::endif);
} else {
witness_script_ops.emplace_back(opcode::swap);
witness_script_ops.emplace_back(key_data);
witness_script_ops.emplace_back(opcode::checksig);
witness_script_ops.emplace_back(opcode::push_size_0);
witness_script_ops.emplace_back(key_data);
witness_script_ops.emplace_back(opcode::checksig);
if (idx > 0) {
witness_script_ops.emplace_back(opcode::if_);
witness_script_ops.emplace_back(opcode::push_positive_1);
witness_script_ops.emplace_back(opcode::add);