Skip to content

Commit 6fc52fa

Browse files
committed
ref(json_rpc): avoid redundant iterations and clones
1 parent b640af0 commit 6fc52fa

1 file changed

Lines changed: 44 additions & 35 deletions

File tree

  • node/src/actors/json_rpc

node/src/actors/json_rpc/api.rs

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,24 @@
1+
use actix::MailboxError;
2+
#[cfg(not(test))]
3+
use actix::SystemService;
4+
use futures::FutureExt;
5+
use itertools::Itertools;
6+
use jsonrpc_core::{BoxFuture, Error, Params, Value};
7+
use jsonrpc_pubsub::{Subscriber, SubscriptionId};
8+
use serde::{Deserialize, Serialize};
19
use std::{
2-
collections::{HashMap, HashSet},
10+
collections::{hash_map::Entry, HashMap, HashSet},
311
convert::TryFrom,
412
fmt::Debug,
513
net::SocketAddr,
614
path::PathBuf,
715
str::FromStr,
816
sync::{
9-
Arc,
1017
atomic::{AtomicUsize, Ordering},
18+
Arc,
1119
},
1220
};
1321

14-
#[cfg(not(test))]
15-
use actix::SystemService;
16-
use actix::MailboxError;
17-
use futures::FutureExt;
18-
use itertools::Itertools;
19-
use jsonrpc_core::{BoxFuture, Error, Params, Value};
20-
use jsonrpc_pubsub::{Subscriber, SubscriptionId};
21-
use serde::{Deserialize, Serialize};
22-
2322
#[cfg(test)]
2423
use self::mock_actix::SystemService;
2524
use crate::{
@@ -49,14 +48,14 @@ use crate::{
4948
use witnet_crypto::{hash::calculate_sha256, key::KeyPath};
5049
use witnet_data_structures::{
5150
chain::{
52-
Block, DataRequestInfo, DataRequestOutput, DataRequestStage, Epoch, EpochConstants, Hash,
53-
Hashable, KeyedSignature, PublicKeyHash, RADType, StakeOutput, StateMachine,
54-
SyncStatus, ValueTransferOutput, tapi::ActiveWips,
51+
tapi::ActiveWips, Block, DataRequestInfo, DataRequestOutput, DataRequestStage, Epoch, EpochConstants,
52+
Hash, Hashable, KeyedSignature, PublicKeyHash, RADType, StakeOutput, StateMachine,
53+
SyncStatus, ValueTransferOutput,
5554
},
5655
get_environment, get_protocol_version,
5756
proto::{
58-
ProtobufConvert,
5957
versioning::{ProtocolVersion, VersionedHashable},
58+
ProtobufConvert,
6059
},
6160
serialization_helpers::number_from_string,
6261
staking::prelude::*,
@@ -2648,30 +2647,40 @@ pub async fn get_value_transfer(params: Result<GetValueTransferParams, Error>) -
26482647
let mut input_value = 0u64;
26492648
let mut input_transactions: HashMap<Hash, Transaction> = HashMap::new();
26502649
// Fetch each different input transaction just once, even when referred multiples times
2651-
for input in vtt.body.inputs.clone() {
2650+
for input in &vtt.body.inputs {
26522651
let hash = input.output_pointer().transaction_id;
2653-
if let std::collections::hash_map::Entry::Vacant(e) = input_transactions.entry(hash) {
2654-
let transaction = get_transaction(Ok((hash,))).await?;
2655-
let transaction =
2656-
serde_json::from_value::<GetTransactionOutput>(transaction)
2657-
.map_err(internal_error)?
2658-
.transaction;
2659-
e.insert(transaction.clone());
2660-
}
2661-
}
2662-
// Sum up the value of every single input
2663-
for input in vtt.body.inputs.clone() {
2664-
let hash = input.output_pointer().transaction_id;
2665-
if let Some(transaction) = input_transactions.get(&hash) {
2666-
input_value += get_transaction_output_value(
2667-
transaction,
2668-
input.output_pointer().output_index as usize,
2669-
);
2670-
}
2652+
2653+
// Sum up the value of every single input
2654+
input_value += match input_transactions.entry(hash) {
2655+
Entry::Occupied(entry) => {
2656+
let transaction = entry.get();
2657+
2658+
get_transaction_output_value(
2659+
transaction,
2660+
input.output_pointer().output_index as usize,
2661+
)
2662+
}
2663+
Entry::Vacant(entry) => {
2664+
let transaction = get_transaction(Ok((hash,))).await?;
2665+
let transaction =
2666+
serde_json::from_value::<GetTransactionOutput>(transaction)
2667+
.map_err(internal_error)?
2668+
.transaction;
2669+
let transaction_value = get_transaction_output_value(
2670+
&transaction,
2671+
input.output_pointer().output_index as usize,
2672+
);
2673+
2674+
entry.insert(transaction);
2675+
2676+
transaction_value
2677+
}
2678+
};
26712679
}
2680+
let fee = input_value.saturating_sub(vtt.body.value());
26722681

26732682
GetValueTransfersOutput::Simple(GetValueTransferSimpleOutput {
2674-
fee: input_value.saturating_sub(vtt.body.value()),
2683+
fee,
26752684
metadata,
26762685
recipient,
26772686
sender,

0 commit comments

Comments
 (0)