Jayant Krishnamurthy 2 years ago
parent
commit
652670d5df

+ 0 - 3
pyth-rng/config.yaml

@@ -2,6 +2,3 @@ chains:
   - chain_id: "optimism-goerli"
     geth_rpc_addr: https://goerli.optimism.io
     contract_addr: 0x28F16Af4D87523910b843a801454AEde5F9B0459
-  - chain_id: "arbitrum-sepolia"
-    geth_rpc_addr: https://goerli.optimism.io
-    contract_addr: 0x28F16Af4D87523910b843a801454AEde5F9B0459

+ 1 - 1
pyth-rng/src/command/register_provider.rs

@@ -24,7 +24,7 @@ pub async fn register_provider(opts: &RegisterProviderOptions) -> Result<(), Box
 
     // Create a new random hash chain.
     let random = rand::random::<[u8; 32]>();
-    let mut chain = PebbleHashChain::from_config(&opts.randomness, random)?;
+    let mut chain = PebbleHashChain::from_config(&opts.randomness, &opts.chain_id, random)?;
 
     // Arguments to the contract to register our new provider.
     let fee_in_wei = opts.fee;

+ 2 - 1
pyth-rng/src/command/run.rs

@@ -60,7 +60,8 @@ pub async fn run(opts: &RunOptions) -> Result<(), Box<dyn Error>> {
         // This approach works fine as long as we haven't rotated the commitment (i.e., all user requests
         // are for the most recent chain).
         let random: [u8; 32] = provider_info.commitment_metadata;
-        let hash_chain = PebbleHashChain::from_config(&opts.randomness, random)?;
+        let hash_chain =
+            PebbleHashChain::from_config(&opts.randomness, &chain_config.chain_id, random)?;
         let chain_state = HashChainState {
             offsets:     vec![provider_info
                 .original_commitment_sequence_number

+ 14 - 6
pyth-rng/src/state.rs

@@ -1,5 +1,8 @@
 use {
-    crate::config::RandomnessOptions,
+    crate::{
+        api::ChainId,
+        config::RandomnessOptions,
+    },
     anyhow::{
         ensure,
         Result,
@@ -32,12 +35,17 @@ impl PebbleHashChain {
         Self { hash, next: 0 }
     }
 
-    // TODO: possibly take the chain id here to ensure different hash chains on every blockchain
-    pub fn from_config(opts: &RandomnessOptions, random: [u8; 32]) -> Result<Self, Box<dyn Error>> {
-        let mut secret: [u8; 32] = [0u8; 32];
-        secret.copy_from_slice(&hex::decode(opts.secret.clone())?[0..32]);
-        let secret: [u8; 32] = Keccak256::digest([random, secret].flatten()).into();
+    pub fn from_config(
+        opts: &RandomnessOptions,
+        chain_id: &ChainId,
+        random: [u8; 32],
+    ) -> Result<Self, Box<dyn Error>> {
+        let mut input: Vec<u8> = vec![];
+        input.extend_from_slice(&hex::decode(opts.secret.clone())?);
+        input.extend_from_slice(&chain_id.as_bytes());
+        input.extend_from_slice(&random);
 
+        let secret: [u8; 32] = Keccak256::digest(input).into();
         Ok(Self::new(secret, opts.chain_length.try_into()?))
     }