Просмотр исходного кода

drk/darkfid make json-rpc get-tx protocol safe.

x 3 лет назад
Родитель
Сommit
f76f33ad72
3 измененных файлов с 19 добавлено и 7 удалено
  1. 14 3
      bin/darkfid/src/rpc_blockchain.rs
  2. 3 3
      bin/drk/src/main.rs
  3. 2 1
      bin/drk/src/rpc_blockchain.rs

+ 14 - 3
bin/darkfid/src/rpc_blockchain.rs

@@ -22,7 +22,7 @@ use log::{debug, error};
 use serde_json::{json, Value};
 
 use darkfi::rpc::jsonrpc::{
-    ErrorCode::{InternalError, InvalidParams},
+    ErrorCode::{InternalError, InvalidParams, ParseError},
     JsonError, JsonResponse, JsonResult, JsonSubscriber,
 };
 
@@ -69,11 +69,22 @@ impl Darkfid {
     // --> {"jsonrpc": "2.0", "method": "blockchain.get_tx", "params": ["TxHash"], "id": 1}
     // <-- {"jsonrpc": "2.0", "result": {...}, "id": 1}
     pub async fn blockchain_get_tx(&self, id: Value, params: &[Value]) -> JsonResult {
-        if params.len() != 1 || !params[0].is_u64() {
+        if params.len() != 1 {
             return JsonError::new(InvalidParams, None, id).into()
         }
 
-        let tx_hash = blake3::Hash::from_hex(params[0].as_str().unwrap()).unwrap();
+        let tx_hash_str = if let Some(tx_hash_str) = params[0].as_str() {
+            tx_hash_str
+        } else {
+            return JsonError::new(InvalidParams, None, id).into()
+        };
+
+        let tx_hash = if let Ok(tx_hash) = blake3::Hash::from_hex(tx_hash_str) {
+            tx_hash
+        } else {
+            return JsonError::new(ParseError, None, id).into()
+        };
+
         let validator_state = self.validator_state.read().await;
 
         let txs = match validator_state.blockchain.transactions.get(&[tx_hash], true) {

+ 3 - 3
bin/drk/src/main.rs

@@ -944,9 +944,9 @@ async fn main() -> Result<()> {
 
                 let drk = Drk::new(args.endpoint).await?;
 
-                let tx =
-                    drk.get_tx(&tx_hash).await.with_context(|| "Failed to fetch transaction")?;
-                let tx = if let Some(tx) = tx {
+                let tx = if let Some(tx) =
+                    drk.get_tx(&tx_hash).await.with_context(|| "Failed to fetch transaction")?
+                {
                     tx
                 } else {
                     eprintln!("Tx not found");

+ 2 - 1
bin/drk/src/rpc_blockchain.rs

@@ -216,7 +216,8 @@ impl Drk {
 
     /// Queries darkfid for a tx with given hash
     pub async fn get_tx(&self, tx_hash: &blake3::Hash) -> Result<Option<Transaction>> {
-        let req = JsonRequest::new("blockchain.get_tx", json!([tx_hash.as_bytes()]));
+        let tx_hash_str: &str = &tx_hash.to_hex();
+        let req = JsonRequest::new("blockchain.get_tx", json!([tx_hash_str]));
 
         match self.rpc_client.request(req).await {
             Ok(v) => {