Parcourir la source

feat(lazer): add example to parse and verify payload (#2260)

Pavel Strakhov il y a 10 mois
Parent
commit
8bf0ad2d2b

Fichier diff supprimé car celui-ci est trop grand
+ 561 - 33
lazer/Cargo.lock


+ 6 - 0
lazer/Cargo.toml

@@ -14,3 +14,9 @@ codegen-units = 1
 opt-level = 3
 incremental = false
 codegen-units = 1
+
+# These patches remove upper dependency version limitations,
+# allowing successful dependency resolution in the workspace.
+[patch.crates-io]
+curve25519-dalek = { git = "https://github.com/Riateche/curve25519-dalek.git", branch = "3.2.1-patch" }
+aes-gcm-siv = { git = "https://github.com/Riateche/AEADs.git", branch = "aes-gcm-siv-v0.10.3-patch" }

+ 5 - 0
lazer/sdk/rust/protocol/Cargo.toml

@@ -16,3 +16,8 @@ rust_decimal = "1.36.0"
 
 [dev-dependencies]
 bincode = "1.3.3"
+ed25519-dalek = { version = "2.1.1", features = ["rand_core"] }
+hex = "0.4.3"
+libsecp256k1 = "0.7.1"
+bs58 = "0.5.1"
+alloy-primitives = "0.8.19"

+ 51 - 0
lazer/sdk/rust/protocol/examples/parse_and_verify.rs

@@ -0,0 +1,51 @@
+use {
+    anyhow::bail,
+    byteorder::{ReadBytesExt, BE},
+    pyth_lazer_protocol::{
+        message::{EvmMessage, SolanaMessage},
+        payload::{PayloadData, EVM_FORMAT_MAGIC, SOLANA_FORMAT_MAGIC_BE},
+    },
+    std::io::{stdin, BufRead, Cursor},
+};
+
+fn main() -> anyhow::Result<()> {
+    println!("Reading hex encoded payloads from stdin...");
+    for line in stdin().lock().lines() {
+        let message = hex::decode(line?.trim())?;
+        let magic = Cursor::new(&message).read_u32::<BE>()?;
+        if magic == SOLANA_FORMAT_MAGIC_BE {
+            println!("this is a solana payload");
+            let message = SolanaMessage::deserialize_slice(&message)?;
+            println!(
+                "solana public key: {}",
+                bs58::encode(&message.public_key).into_string()
+            );
+            let key = ed25519_dalek::VerifyingKey::from_bytes(&message.public_key)?;
+            key.verify_strict(
+                &message.payload,
+                &ed25519_dalek::Signature::from_bytes(&message.signature),
+            )?;
+            println!("signature is valid");
+            let payload = PayloadData::deserialize_slice_le(&message.payload)?;
+            println!("payload: {payload:#?}");
+        } else if magic == EVM_FORMAT_MAGIC {
+            println!("this is an evm payload");
+            let message = EvmMessage::deserialize_slice(&message)?;
+            let public_key = libsecp256k1::recover(
+                &libsecp256k1::Message::parse(&alloy_primitives::keccak256(&message.payload)),
+                &libsecp256k1::Signature::parse_standard(&message.signature)?,
+                &libsecp256k1::RecoveryId::parse(message.recovery_id)?,
+            )?;
+            println!(
+                "evm address recovered from signature: {:?}",
+                hex::encode(&alloy_primitives::keccak256(&public_key.serialize()[1..])[12..])
+            );
+            let payload = PayloadData::deserialize_slice_be(&message.payload)?;
+            println!("payload: {payload:#?}");
+        } else {
+            bail!("unknown format");
+        }
+    }
+
+    Ok(())
+}

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff