btc_weighted_multisig_address implementation
This commit is contained in:
parent
6e3a0e962b
commit
dd9e350f9f
2 changed files with 48 additions and 10 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
} } }
|
} } }
|
||||||
|
|
|
||||||
|
|
@ -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_) );
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue