Electroneum
Loading...
Searching...
No Matches
multisig.cpp File Reference
Include dependency graph for multisig.cpp:

Go to the source code of this file.

Functions

void make_multisig_accounts (std::vector< cryptonote::account_base > &account, uint32_t threshold)

Function Documentation

◆ make_multisig_accounts()

void make_multisig_accounts ( std::vector< cryptonote::account_base > & account,
uint32_t threshold )

Definition at line 44 of file multisig.cpp.

45{
46 std::vector<crypto::secret_key> all_view_keys;
47 std::vector<std::vector<crypto::public_key>> derivations(account.size());
48 //storage for all set of multisig derivations and spend public key (in first round)
49 std::unordered_set<crypto::public_key> exchanging_keys;
50
51 for (size_t msidx = 0; msidx < account.size(); ++msidx)
52 {
53 crypto::secret_key vkh = cryptonote::get_multisig_blinded_secret_key(account[msidx].get_keys().m_view_secret_key);
54 all_view_keys.push_back(vkh);
55
56 crypto::secret_key skh = cryptonote::get_multisig_blinded_secret_key(account[msidx].get_keys().m_spend_secret_key);
59
60 derivations[msidx].push_back(pskh);
61 exchanging_keys.insert(pskh);
62 }
63
64 uint32_t roundsTotal = 1;
65 if (threshold < account.size())
66 roundsTotal = account.size() - threshold;
67
68 //secret multisig keys of every account
69 std::vector<std::vector<crypto::secret_key>> multisig_keys(account.size());
70 std::vector<crypto::secret_key> spend_skey(account.size());
71 std::vector<crypto::public_key> spend_pkey(account.size());
72 for (uint32_t round = 0; round < roundsTotal; ++round)
73 {
74 std::unordered_set<crypto::public_key> roundKeys;
75 for (size_t msidx = 0; msidx < account.size(); ++msidx)
76 {
77 // subtracting one's keys from set of all unique keys is the same as key exchange
78 auto myKeys = exchanging_keys;
79 for (const auto& d: derivations[msidx])
80 myKeys.erase(d);
81
82 if (threshold == account.size())
83 {
84 cryptonote::generate_multisig_N_N(account[msidx].get_keys(), std::vector<crypto::public_key>(myKeys.begin(), myKeys.end()), multisig_keys[msidx], (rct::key&)spend_skey[msidx], (rct::key&)spend_pkey[msidx]);
85 }
86 else
87 {
88 derivations[msidx] = cryptonote::generate_multisig_derivations(account[msidx].get_keys(), std::vector<crypto::public_key>(myKeys.begin(), myKeys.end()));
89 roundKeys.insert(derivations[msidx].begin(), derivations[msidx].end());
90 }
91 }
92
93 exchanging_keys = roundKeys;
94 roundKeys.clear();
95 }
96
97 std::unordered_set<crypto::public_key> all_multisig_keys;
98 for (size_t msidx = 0; msidx < account.size(); ++msidx)
99 {
100 std::unordered_set<crypto::secret_key> view_keys(all_view_keys.begin(), all_view_keys.end());
101 view_keys.erase(all_view_keys[msidx]);
102
103 crypto::secret_key view_skey = cryptonote::generate_multisig_view_secret_key(account[msidx].get_keys().m_view_secret_key, std::vector<secret_key>(view_keys.begin(), view_keys.end()));
104 if (threshold < account.size())
105 {
106 multisig_keys[msidx] = cryptonote::calculate_multisig_keys(derivations[msidx]);
107 spend_skey[msidx] = cryptonote::calculate_multisig_signer_key(multisig_keys[msidx]);
108 }
109 account[msidx].make_multisig(view_skey, spend_skey[msidx], spend_pkey[msidx], multisig_keys[msidx]);
110 for (const auto &k: multisig_keys[msidx]) {
111 all_multisig_keys.insert(rct::rct2pk(rct::scalarmultBase(rct::sk2rct(k))));
112 }
113 }
114
115 if (threshold < account.size())
116 {
117 std::vector<crypto::public_key> public_keys(std::vector<crypto::public_key>(all_multisig_keys.begin(), all_multisig_keys.end()));
119
120 for (size_t msidx = 0; msidx < account.size(); ++msidx)
121 account[msidx].finalize_multisig(spend_pkey);
122 }
123}
uint8_t threshold
epee::mlocked< tools::scrubbed< ec_scalar > > secret_key
Definition crypto.h:82
POD_CLASS public_key
Definition crypto.h:79
bool secret_key_to_public_key(const secret_key &sec, public_key &pub)
Definition crypto.h:262
crypto::secret_key calculate_multisig_signer_key(const std::vector< crypto::secret_key > &multisig_keys)
Definition multisig.cpp:100
crypto::public_key generate_multisig_M_N_spend_public_key(const std::vector< crypto::public_key > &pkeys)
generate_multisig_M_N_spend_public_key calculates multisig wallet's spend public key by summing all o...
Definition multisig.cpp:132
crypto::secret_key get_multisig_blinded_secret_key(const crypto::secret_key &key)
Definition multisig.cpp:47
std::vector< crypto::public_key > generate_multisig_derivations(const account_keys &keys, const std::vector< crypto::public_key > &derivations)
generate_multisig_derivations performs common DH key derivation. Each middle round in M/N scheme is D...
Definition multisig.cpp:87
void generate_multisig_N_N(const account_keys &keys, const std::vector< crypto::public_key > &spend_keys, std::vector< crypto::secret_key > &multisig_keys, rct::key &spend_skey, rct::key &spend_pkey)
Definition multisig.cpp:58
std::vector< crypto::secret_key > calculate_multisig_keys(const std::vector< crypto::public_key > &derivations)
calculate_multisig_keys. Calculates secret multisig keys from others' participants ones as follows: m...
Definition multisig.cpp:111
crypto::secret_key generate_multisig_view_secret_key(const crypto::secret_key &skey, const std::vector< crypto::secret_key > &skeys)
Definition multisig.cpp:124
void scalarmultBase(key &aG, const key &a)
Definition rctOps.cpp:350
unsigned int uint32_t
Definition stdint.h:126
Here is the call graph for this function: