Electroneum
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);
57  crypto::public_key pskh;
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 }
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
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&#39;s spend public key by summing all o...
Definition: multisig.cpp:132
std::vector< crypto::secret_key > calculate_multisig_keys(const std::vector< crypto::public_key > &derivations)
calculate_multisig_keys. Calculates secret multisig keys from others&#39; participants ones as follows: m...
Definition: multisig.cpp:111
unsigned int uint32_t
Definition: stdint.h:126
crypto::secret_key get_multisig_blinded_secret_key(const crypto::secret_key &key)
Definition: multisig.cpp:47
POD_CLASS public_key
Definition: crypto.h:76
void scalarmultBase(key &aG, const key &a)
Definition: rctOps.cpp:350
crypto::secret_key generate_multisig_view_secret_key(const crypto::secret_key &skey, const std::vector< crypto::secret_key > &skeys)
Definition: multisig.cpp:124
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
uint8_t threshold
Definition: blockchain.cpp:92
Here is the call graph for this function: