witness script for weighted wallet

This commit is contained in:
gladcow 2020-04-15 10:23:38 +03:00
parent 9842a11846
commit 6e3a0e962b
2 changed files with 68 additions and 0 deletions

View file

@ -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<std::pair<fc::ecc::public_key, uint16_t> > &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()
{
}
} } }

View file

@ -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<std::pair<fc::ecc::public_key, uint16_t>>& 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<std::pair<fc::ecc::public_key, uint16_t>> keys_data_;
};
} } }
FC_REFLECT( graphene::peerplays_sidechain::bitcoin::bitcoin_address, (address)(type)(raw_address) );