| 1266 | } |
| 1267 | |
| 1268 | void BlockChainState::process_input(const Hash &tid, size_t iid, const InputKey &input) { |
| 1269 | if (chain_reaction == 0) |
| 1270 | return; |
| 1271 | if (input.output_indexes.size() == 1) { |
| 1272 | size_t hidden_index = 0; |
| 1273 | invariant(read_hidden_amount_map(input.amount, input.output_indexes.at(0), &hidden_index), ""); |
| 1274 | OutputIndexData unp; |
| 1275 | invariant(read_hidden_amount_output(hidden_index, &unp), ""); |
| 1276 | spend_output(std::move(unp), hidden_index, std::numeric_limits<size_t>::max(), 0, true); |
| 1277 | return; |
| 1278 | } |
| 1279 | if (chain_reaction == 1) |
| 1280 | return; |
| 1281 | const auto input_index = m_next_nz_input_index; |
| 1282 | auto din_key = DIN_PREFIX + common::write_varint_sqlite4(m_next_nz_input_index); |
| 1283 | m_next_nz_input_index += 1; |
| 1284 | std::vector<size_t> absolute_indexes; |
| 1285 | invariant(relative_output_offsets_to_absolute(&absolute_indexes, input.output_indexes), ""); |
| 1286 | InputDesc din; |
| 1287 | std::vector<OutputIndexData> unspents; |
| 1288 | for (size_t i = 0; i != absolute_indexes.size(); ++i) { |
| 1289 | size_t hidden_index = 0; |
| 1290 | invariant(read_hidden_amount_map(input.amount, absolute_indexes.at(i), &hidden_index), ""); |
| 1291 | OutputIndexData unp; |
| 1292 | invariant(read_hidden_amount_output(hidden_index, &unp), ""); |
| 1293 | if (unp.spent) |
| 1294 | continue; |
| 1295 | din.first.push_back(hidden_index); |
| 1296 | unspents.push_back(std::move(unp)); |
| 1297 | } |
| 1298 | if (din.first.size() > 1) |
| 1299 | for (size_t i = 0; i != din.first.size(); ++i) { |
| 1300 | unspents[i].dins.push_back(input_index); |
| 1301 | auto key = OUTPUT_PREFIX + common::write_varint_sqlite4(din.first[i]); |
| 1302 | m_db.put(key, seria::to_binary(unspents[i]), false); |
| 1303 | } |
| 1304 | m_db.put(din_key, seria::to_binary(din), true); |
| 1305 | if (din.first.size() == 1) { |
| 1306 | spend_output(std::move(unspents[0]), din.first[0], input_index, 0, true); |
| 1307 | } |
| 1308 | } |
| 1309 | |
| 1310 | void BlockChainState::unprocess_input(const InputKey &input) { |
| 1311 | if (chain_reaction == 0) |
nothing calls this directly
no test coverage detected