btc_weighted_multisig_address implementation

This commit is contained in:
gladcow 2020-04-15 12:54:23 +03:00
parent 6e3a0e962b
commit dd9e350f9f
2 changed files with 48 additions and 10 deletions

View file

@ -255,21 +255,23 @@ bytes btc_multisig_segwit_address::get_address_bytes( const bytes& script_hash )
return address_bytes; 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) btc_weighted_multisig_address::btc_weighted_multisig_address(const std::vector<std::pair<fc::ecc::public_key, uint16_t> > &keys_data,
network network_type) :
network_type_(network_type)
{ {
create_redeem_script(); create_redeem_script(keys_data);
create_witness_script(); create_witness_script();
create_segwit_address(); create_segwit_address();
type = payment_type::P2WSH; type = payment_type::P2WSH;
} }
void btc_weighted_multisig_address::create_redeem_script() void btc_weighted_multisig_address::create_redeem_script(const std::vector<std::pair<fc::ecc::public_key, uint16_t>>& keys_data)
{ {
script_builder builder; script_builder builder;
uint32_t total_weight = 0; uint32_t total_weight = 0;
builder << uint32_t(0); builder << uint32_t(0);
for (auto &p : keys_data_) { for (auto &p : keys_data) {
total_weight += p.second; total_weight += p.second;
builder << op::SWAP; builder << op::SWAP;
builder << p.first.serialize(); builder << p.first.serialize();
@ -284,6 +286,9 @@ void btc_weighted_multisig_address::create_redeem_script()
builder << op::GREATERTHANOREQUAL; builder << op::GREATERTHANOREQUAL;
redeem_script_ = builder; redeem_script_ = builder;
fc::sha256 sh = fc::sha256::hash(redeem_script_);
raw_address = bytes(sh.data(), sh.data() + sh.data_size());
} }
void btc_weighted_multisig_address::create_witness_script() void btc_weighted_multisig_address::create_witness_script()
@ -297,7 +302,22 @@ void btc_weighted_multisig_address::create_witness_script()
void btc_weighted_multisig_address::create_segwit_address() void btc_weighted_multisig_address::create_segwit_address()
{ {
std::string hrp;
switch(network_type_)
{
case(network::mainnet):
hrp = "bc";
break;
case(network::testnet):
hrp = "tb";
break;
case(network::regtest):
hrp = "bcrt";
break;
}
fc::sha256 sh = fc::sha256::hash(redeem_script_);
std::vector<uint8_t> hash_data(sh.data(), sh.data() + sh.data_size());
address = segwit_addr::encode(hrp, 0, hash_data);
} }
} } } } } }

View file

@ -127,23 +127,31 @@ class btc_weighted_multisig_address : public bitcoin_address
{ {
public: public:
enum network
{
mainnet,
testnet,
regtest
};
btc_weighted_multisig_address() = default; btc_weighted_multisig_address() = default;
btc_weighted_multisig_address( const std::vector<std::pair<fc::ecc::public_key, uint16_t>>& keys_data ); btc_weighted_multisig_address( const std::vector<std::pair<fc::ecc::public_key, uint16_t>>& keys_data,
network network_type = network::regtest);
bytes get_redeem_script() const { return redeem_script_; }
bytes get_witness_script() const { return witness_script_; } bytes get_witness_script() const { return witness_script_; }
network get_network_type() const { return network_type_; }
private: private:
void create_redeem_script(); void create_redeem_script(const std::vector<std::pair<fc::ecc::public_key, uint16_t>>& keys_data);
void create_witness_script(); void create_witness_script();
void create_segwit_address(); void create_segwit_address();
public: public:
network network_type_;
bytes redeem_script_; bytes redeem_script_;
bytes witness_script_; bytes witness_script_;
std::vector<std::pair<fc::ecc::public_key, uint16_t>> keys_data_;
}; };
} } } } } }
@ -154,3 +162,13 @@ FC_REFLECT_DERIVED( graphene::peerplays_sidechain::bitcoin::btc_multisig_address
(redeem_script)(keys_required)(witnesses_keys) ); (redeem_script)(keys_required)(witnesses_keys) );
FC_REFLECT_DERIVED( graphene::peerplays_sidechain::bitcoin::btc_multisig_segwit_address, (graphene::peerplays_sidechain::bitcoin::btc_multisig_address), (witness_script) ); FC_REFLECT_DERIVED( graphene::peerplays_sidechain::bitcoin::btc_multisig_segwit_address, (graphene::peerplays_sidechain::bitcoin::btc_multisig_address), (witness_script) );
FC_REFLECT_ENUM(graphene::peerplays_sidechain::bitcoin::btc_weighted_multisig_address::network,
(mainnet)
(testnet)
(regtest)
)
FC_REFLECT_DERIVED( graphene::peerplays_sidechain::bitcoin::btc_weighted_multisig_address,
(graphene::peerplays_sidechain::bitcoin::bitcoin_address),
(network_type_)(redeem_script_)(witness_script_) );