From 6e3a0e962b56a3260dc6cfed06986e2e230c2aea Mon Sep 17 00:00:00 2001 From: gladcow Date: Wed, 15 Apr 2020 10:23:38 +0300 Subject: [PATCH] witness script for weighted wallet --- .../bitcoin/bitcoin_address.cpp | 45 +++++++++++++++++++ .../bitcoin/bitcoin_address.hpp | 23 ++++++++++ 2 files changed, 68 insertions(+) diff --git a/libraries/plugins/peerplays_sidechain/bitcoin/bitcoin_address.cpp b/libraries/plugins/peerplays_sidechain/bitcoin/bitcoin_address.cpp index ebb87cb6..c9cf88db 100755 --- a/libraries/plugins/peerplays_sidechain/bitcoin/bitcoin_address.cpp +++ b/libraries/plugins/peerplays_sidechain/bitcoin/bitcoin_address.cpp @@ -255,4 +255,49 @@ bytes btc_multisig_segwit_address::get_address_bytes( const bytes& script_hash ) return address_bytes; } +btc_weighted_multisig_address::btc_weighted_multisig_address(const std::vector > &keys_data) : + keys_data_(keys_data) +{ + create_redeem_script(); + create_witness_script(); + create_segwit_address(); + type = payment_type::P2WSH; +} + +void btc_weighted_multisig_address::create_redeem_script() +{ + script_builder builder; + uint32_t total_weight = 0; + builder << uint32_t(0); + for (auto &p : keys_data_) { + total_weight += p.second; + builder << op::SWAP; + builder << p.first.serialize(); + builder << op::CHECKSIG; + builder << op::IF; + builder << uint32_t(p.second); + builder << op::ADD; + builder << op::ENDIF; + } + uint32_t threshold_weight = 2 * total_weight / 3; + builder << threshold_weight; + builder << op::GREATERTHANOREQUAL; + + redeem_script_ = builder; +} + +void btc_weighted_multisig_address::create_witness_script() +{ + script_builder builder; + builder << op::_0; + builder << fc::sha256::hash( redeem_script_.data(), redeem_script_.size() ); + + witness_script_ = builder; +} + +void btc_weighted_multisig_address::create_segwit_address() +{ + +} + } } } diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/bitcoin/bitcoin_address.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/bitcoin/bitcoin_address.hpp index 3e1bfbb8..f4afa6e5 100755 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/bitcoin/bitcoin_address.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/bitcoin/bitcoin_address.hpp @@ -123,6 +123,29 @@ public: }; +class btc_weighted_multisig_address : public bitcoin_address +{ + +public: + + btc_weighted_multisig_address() = default; + + btc_weighted_multisig_address( const std::vector>& keys_data ); + + bytes get_witness_script() const { return witness_script_; } + +private: + + void create_redeem_script(); + void create_witness_script(); + void create_segwit_address(); + +public: + bytes redeem_script_; + bytes witness_script_; + std::vector> keys_data_; +}; + } } } FC_REFLECT( graphene::peerplays_sidechain::bitcoin::bitcoin_address, (address)(type)(raw_address) );