From ce89a52d06554311418bc0ff3a68cacbbc530055 Mon Sep 17 00:00:00 2001 From: George Danezis <4999882+gdanezis@users.noreply.github.com> Date: Tue, 2 Jan 2024 18:14:14 +0000 Subject: [PATCH] Basic light client CLI (#15187) ## Description This PR adds a new command line utility that: * Syncs to all end-of-epoch checkpoints found either on a given list or by binary search (less efficient) * Check that a TID in a checkpoint sequence number is valid, based on checking committee certificates on the checkpoint, and print the effects digest. * Prints all events in a TID or the objects with OID * Checks that all types are correct by checking the transactions that created the modules are correct. ## Test Plan How did you test the new or updated feature? --- If your changes are not user-facing and not a breaking change, you can skip the following section. Otherwise, please indicate what changed, and then add to the Release Notes section as highlighted during the release process. ### Type of Change (Check all that apply) - [ ] protocol change - [x] user-visible impact - [ ] breaking change for a client SDKs - [ ] breaking change for FNs (FN binary must upgrade) - [ ] breaking change for validators or node operators (must upgrade binaries) - [ ] breaking change for on-chain data layout - [ ] necessitate either a data wipe or data migration ### Release notes Added a basic light client to cryptographically check outcomes of transactions without a full node. --- .gitignore | 2 + Cargo.lock | 25 + Cargo.toml | 1 + crates/sui-light-client/Cargo.toml | 29 + crates/sui-light-client/README.md | 62 ++ .../example_config/20873329.yaml | Bin 0 -> 11498 bytes .../example_config/20958462.bcs | Bin 0 -> 312825 bytes .../example_config/checkpoints.yaml | 241 ++++++ .../example_config/light_client.yaml | 3 + crates/sui-light-client/src/main.rs | 688 ++++++++++++++++++ crates/sui-rest-api/src/client.rs | 18 + 11 files changed, 1069 insertions(+) create mode 100644 crates/sui-light-client/Cargo.toml create mode 100644 crates/sui-light-client/README.md create mode 100644 crates/sui-light-client/example_config/20873329.yaml create mode 100644 crates/sui-light-client/example_config/20958462.bcs create mode 100644 crates/sui-light-client/example_config/checkpoints.yaml create mode 100644 crates/sui-light-client/example_config/light_client.yaml create mode 100644 crates/sui-light-client/src/main.rs diff --git a/.gitignore b/.gitignore index a7f1d5da764b9..b95fb9f872e05 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,5 @@ yarn-error.log* # misc *.key .env +checkpoints_dir/* +light_client.yaml \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 83966a75387da..354c7a60ec1ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12276,6 +12276,31 @@ dependencies = [ "workspace-hack", ] +[[package]] +name = "sui-light-client" +version = "0.0.0" +dependencies = [ + "anyhow", + "async-trait", + "bcs", + "bytes", + "clap", + "move-binary-format", + "move-core-types", + "serde", + "serde_json", + "serde_yaml 0.8.26", + "sui-config", + "sui-json", + "sui-json-rpc-types", + "sui-package-resolver", + "sui-rest-api", + "sui-sdk", + "sui-types", + "tokio", + "workspace-hack", +] + [[package]] name = "sui-macros" version = "0.7.0" diff --git a/Cargo.toml b/Cargo.toml index d2dba4e78a34e..e6b041c52dd32 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -115,6 +115,7 @@ members = [ "crates/sui-json-rpc-types", "crates/sui-keys", "crates/sui-kvstore", + "crates/sui-light-client", "crates/sui-macros", "crates/sui-metric-checker", "crates/sui-move", diff --git a/crates/sui-light-client/Cargo.toml b/crates/sui-light-client/Cargo.toml new file mode 100644 index 0000000000000..87121045faa53 --- /dev/null +++ b/crates/sui-light-client/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "sui-light-client" +version = "0.0.0" +authors = ["Mysten Labs "] +license = "Apache-2.0" +publish = false +edition = "2021" + +[dependencies] +anyhow.workspace = true +async-trait.workspace = true +bcs.workspace = true +bytes.workspace = true +clap.workspace = true +move-core-types.workspace = true +serde.workspace = true +tokio = { workspace = true, features = ["full"] } +serde_yaml.workspace = true +serde_json.workspace = true +sui-types.workspace = true +sui-config.workspace = true +sui-rest-api.workspace = true +sui-json.workspace = true +sui-sdk.workspace = true +move-binary-format.workspace = true +sui-json-rpc-types.workspace = true +sui-package-resolver.workspace = true +workspace-hack.workspace = true + diff --git a/crates/sui-light-client/README.md b/crates/sui-light-client/README.md new file mode 100644 index 0000000000000..fd5ca232ea382 --- /dev/null +++ b/crates/sui-light-client/README.md @@ -0,0 +1,62 @@ +This crate contains a Command Line Interface light client for Sui. + +# What is a light client? + +A light client allows checking the authenticity and validity of on-chain state, such as transactions, their effects including events and object contents, without the cost of running a full node. + +Running a *full node* requires downloading the full sequence of all transaction and re-executing them. Then the full state of the blockchain is available locally to serve reads. This is however an expensive process in terms of network bandwidth needed to download the full sequence of transactions, as well as CPU to re-execute it, and storage to store the full state of the blockchain. + +Alternatively, a *light client* only needs to download minimal information to authenticate blockchain state. Specifically in Sui, the light client needs to *sync* all end-of-epoch checkpoints that contain information about the committee in the next epoch. Sync involves downloading the checkpoints and checking their validity by checking their certificate. + +Once all end-of-epoch checkpoints are downloaded and checked, any event or current object can be checked for its validity. To do that the light client downloads the checkpoint in which the transaction was executed, and the effects structure that summarizes its effects on the system, including events emitted and objects created. The chain of validity from the checkpoint to the effects and its contents is checked via the certificate on the checkpoint and the hashes of all structures. + +## Ensuring valid data display + +A light client can ensure the correctness of the event and object data using the techniques defined above. However, the light client CLI utility also needs to pretty-print the structures in JSON, which requires knowledge of the correct type for each event or object. Types themselves are defined in modules that have been uploaded by past transactions. Therefore to ensure correct display the light client authenticates that all modules needed to display sought items are also correct. + +# Usage + +The light client requires a config file and a directory to cache checkpoints, and then can be used to check the validity of transaction and their events or of objects. + +## Setup + +The config file for the light client takes a URL for a full node, a directory (that must exist) and within the directory to name of the genesis blob for the Sui network. + +``` +full_node_url: "http://ord-mnt-rpcbig-06.mainnet.sui.io:9000" +checkpoint_summary_dir: "checkpoints_dir" +genesis_filename: "genesis.blob" +``` + +The genesis blob for the Sui mainnet can be found here: https://github.com/MystenLabs/sui-genesis/blob/main/mainnet/genesis.blob + +## Sync + +Every day there is a need to download new checkpoints through sync by doing: +``` +$ sui-light-client --config light_client.yaml sync +``` + +Where `light_client.yaml` is the config file above. + +This command will download all end-of-epoch checkpoints, and check them for validity. They will be cached within the checkpoint summary directory for use by future invocations. + +## Check Transaction + +To check a transaction was executed, as well as the events it emitted do: +``` +$ sui-light-client --config light_client.yaml transaction -t 8RiKBwuAbtu8zNCtz8SrcfHyEUzto6zi6cMVA9t4WhWk +``` + +Where the base58 encoding of the transaction ID is specified. If the transaction has been executed the transaction ID the effects digest are displayed and all the events are printed in JSON. If not an error is printed. + +## Check Object + +To check an object provide its ID in the following way: + +``` +$ sui-light-client --config light_client.yaml object -o 0xc646887891adfc0540ec271fd0203603fb4c841a119ec1e00c469441 +abfc7078 +``` + +The object ID is represented in Hex as displayed in explorers. If the object exists in the latest state it is printed out in JSON, otherwise an error is printed. \ No newline at end of file diff --git a/crates/sui-light-client/example_config/20873329.yaml b/crates/sui-light-client/example_config/20873329.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9314cd82fa9246d46604e329e7cce41d26e17f90 GIT binary patch literal 11498 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 DumBb9D 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 oBY=TH+?vHE, + + #[command(subcommand)] + command: Option, +} + +struct RemotePackageStore { + client: Client, + config: Config, +} + +impl RemotePackageStore { + pub fn new(client: Client, config: Config) -> Self { + Self { client, config } + } +} + +#[async_trait] +impl PackageStore for RemotePackageStore { + /// Latest version of the object at `id`. + async fn version(&self, id: AccountAddress) -> ResolverResult { + Ok(self.client.get_object(id.into()).await.unwrap().version()) + } + /// Read package contents. Fails if `id` is not an object, not a package, or is malformed in + /// some way. + async fn fetch(&self, id: AccountAddress) -> ResolverResult> { + let object = get_verified_object(&self.config, id.into()).await.unwrap(); + let package = Package::read(&object).unwrap(); + Ok(Arc::new(package)) + } +} + +#[derive(Subcommand, Debug)] +enum SCommands { + /// Sync all end-of-epoch checkpoints + Sync {}, + + /// Checks a specific transaction using the light client + Transaction { + /// Transaction hash + #[arg(short, long, value_name = "TID")] + tid: String, + }, + + /// Checks a specific object using the light client + Object { + /// Transaction hash + #[arg(short, long, value_name = "OID")] + oid: String, + }, +} + +// The config file for the light client including the root of trust genesis digest +#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] +struct Config { + /// Full node url + full_node_url: String, + + /// Checkpoint summary directory + checkpoint_summary_dir: PathBuf, + + // Genesis file name + genesis_filename: PathBuf, +} + +impl Config { + pub fn rest_url(&self) -> String { + format!("{}/rest", self.full_node_url) + } +} + +// The list of checkpoints at the end of each epoch +#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)] +struct CheckpointsList { + // List of end of epoch checkpoints + checkpoints: Vec, +} + +fn read_checkpoint_list(config: &Config) -> anyhow::Result { + let mut checkpoints_path = config.checkpoint_summary_dir.clone(); + checkpoints_path.push("checkpoints.yaml"); + // Read the resulting file and parse the yaml checkpoint list + let reader = fs::File::open(checkpoints_path.clone())?; + Ok(serde_yaml::from_reader(reader)?) +} + +fn read_checkpoint( + config: &Config, + seq: u64, +) -> anyhow::Result>> { + read_checkpoint_general(config, seq, None) +} + +fn read_checkpoint_general( + config: &Config, + seq: u64, + path: Option<&str>, +) -> anyhow::Result>> { + // Read the resulting file and parse the yaml checkpoint list + let mut checkpoint_path = config.checkpoint_summary_dir.clone(); + if let Some(path) = path { + checkpoint_path.push(path); + } + checkpoint_path.push(format!("{}.yaml", seq)); + let mut reader = fs::File::open(checkpoint_path.clone())?; + let metadata = fs::metadata(&checkpoint_path)?; + let mut buffer = vec![0; metadata.len() as usize]; + reader.read_exact(&mut buffer)?; + bcs::from_bytes(&buffer).map_err(|_| anyhow!("Unable to parse checkpoint file")) +} + +fn write_checkpoint( + config: &Config, + summary: &Envelope>, +) -> anyhow::Result<()> { + write_checkpoint_general(config, summary, None) +} + +fn write_checkpoint_general( + config: &Config, + summary: &Envelope>, + path: Option<&str>, +) -> anyhow::Result<()> { + // Write the checkpoint summary to a file + let mut checkpoint_path = config.checkpoint_summary_dir.clone(); + if let Some(path) = path { + checkpoint_path.push(path); + } + checkpoint_path.push(format!("{}.yaml", summary.sequence_number)); + let mut writer = fs::File::create(checkpoint_path.clone())?; + let bytes = + bcs::to_bytes(&summary).map_err(|_| anyhow!("Unable to serialize checkpoint summary"))?; + writer.write_all(&bytes)?; + Ok(()) +} + +fn write_checkpoint_list( + config: &Config, + checkpoints_list: &CheckpointsList, +) -> anyhow::Result<()> { + // Write the checkpoint list to a file + let mut checkpoints_path = config.checkpoint_summary_dir.clone(); + checkpoints_path.push("checkpoints.yaml"); + let mut writer = fs::File::create(checkpoints_path.clone())?; + let bytes = serde_yaml::to_vec(&checkpoints_list)?; + writer + .write_all(&bytes) + .map_err(|_| anyhow!("Unable to serialize checkpoint list")) +} + +async fn download_checkpoint_summary( + config: &Config, + seq: u64, +) -> anyhow::Result { + // Download the checkpoint from the server + let client = Client::new(config.rest_url()); + client.get_checkpoint_summary(seq).await +} + +/// Run binary search to for each end of epoch checkpoint that is missing +/// between the latest on the list and the latest checkpoint. +async fn sync_checkpoint_list_to_latest(config: &Config) -> anyhow::Result<()> { + // Get the local checkpoint list + let mut checkpoints_list: CheckpointsList = read_checkpoint_list(config)?; + let latest_in_list = checkpoints_list + .checkpoints + .last() + .ok_or(anyhow!("Empty checkpoint list"))?; + + // Download the latest in list checkpoint + let summary = download_checkpoint_summary(config, *latest_in_list).await?; + let mut last_epoch = summary.epoch(); + let mut last_checkpoint_seq = summary.sequence_number; + + // Download the very latest checkpoint + let client = Client::new(config.rest_url()); + let latest = client.get_latest_checkpoint().await?; + + // Binary search to find missing checkpoints + while last_epoch + 1 < latest.epoch() { + let mut start = last_checkpoint_seq; + let mut end = latest.sequence_number; + + let target_epoch = last_epoch + 1; + // Print target + println!("Target Epoch: {}", target_epoch); + let mut found_summary = None; + + while start < end { + let mid = (start + end) / 2; + let summary = download_checkpoint_summary(config, mid).await?; + + // print summary epoch and seq + println!( + "Epoch: {} Seq: {}: {}", + summary.epoch(), + summary.sequence_number, + summary.end_of_epoch_data.is_some() + ); + + if summary.epoch() == target_epoch && summary.end_of_epoch_data.is_some() { + found_summary = Some(summary); + break; + } + + if summary.epoch() <= target_epoch { + start = mid + 1; + } else { + end = mid; + } + } + + if let Some(summary) = found_summary { + // Note: Do not write summary to file, since we must only persist + // checkpoints that have been verified by the previous committee + + // Add to the list + checkpoints_list.checkpoints.push(summary.sequence_number); + write_checkpoint_list(config, &checkpoints_list)?; + + // Update + last_epoch = summary.epoch(); + last_checkpoint_seq = summary.sequence_number; + } + } + + Ok(()) +} + +async fn check_and_sync_checkpoints(config: &Config) -> anyhow::Result<()> { + sync_checkpoint_list_to_latest(config).await?; + + // Get the local checkpoint list + let checkpoints_list: CheckpointsList = read_checkpoint_list(config)?; + + // Load the genesis committee + let mut genesis_path = config.checkpoint_summary_dir.clone(); + genesis_path.push(&config.genesis_filename); + let genesis_committee = Genesis::load(&genesis_path)?.committee()?; + + // Check the signatures of all checkpoints + // And download any missing ones + + let mut prev_committee = genesis_committee; + for ckp_id in &checkpoints_list.checkpoints { + // check if there is a file with this name ckp_id.yaml in the checkpoint_summary_dir + let mut checkpoint_path = config.checkpoint_summary_dir.clone(); + checkpoint_path.push(format!("{}.yaml", ckp_id)); + + // If file exists read the file otherwise download it from the server + let summary = if checkpoint_path.exists() { + read_checkpoint(config, *ckp_id)? + } else { + // Download the checkpoint from the server + let summary = download_checkpoint_summary(config, *ckp_id).await?; + summary.clone().verify(&prev_committee)?; + // Write the checkpoint summary to a file + write_checkpoint(config, &summary)?; + summary + }; + + // Print the id of the checkpoint and the epoch number + println!( + "Epoch: {} Checkpoint ID: {}", + summary.epoch(), + summary.digest() + ); + + // Extract the new committee information + if let Some(EndOfEpochData { + next_epoch_committee, + .. + }) = &summary.end_of_epoch_data + { + let next_committee = next_epoch_committee.iter().cloned().collect(); + prev_committee = Committee::new(summary.epoch().saturating_add(1), next_committee); + } else { + return Err(anyhow!( + "Expected all checkpoints to be end-of-epoch checkpoints" + )); + } + } + + Ok(()) +} + +async fn get_full_checkpoint(config: &Config, seq: u64) -> anyhow::Result { + // Downloading the checkpoint from the server + let client: Client = Client::new(config.rest_url()); + let full_checkpoint = client.get_full_checkpoint(seq).await?; + + Ok(full_checkpoint) +} + +fn extract_verified_effects_and_events( + checkpoint: &CheckpointData, + committee: &Committee, + tid: TransactionDigest, +) -> anyhow::Result<(TransactionEffects, Option)> { + let summary = &checkpoint.checkpoint_summary; + + // Verify the checkpoint summary using the committee + summary.verify_with_contents(committee, Some(&checkpoint.checkpoint_contents))?; + + // Check the validity of the transaction + let contents = &checkpoint.checkpoint_contents; + let (matching_tx, _) = checkpoint + .transactions + .iter() + .zip(contents.iter()) + // Note that we get the digest of the effects to ensure this is + // indeed the correct effects that are authenticated in the contents. + .find(|(tx, digest)| { + tx.effects.execution_digests() == **digest && digest.transaction == tid + }) + .ok_or(anyhow!("Transaction not found in checkpoint contents"))?; + + // Check the events are all correct. + let events_digest = matching_tx.events.as_ref().map(|events| events.digest()); + anyhow::ensure!( + events_digest.as_ref() == matching_tx.effects.events_digest(), + "Events digest does not match" + ); + + // Since we do not check objects we do not return them + Ok((matching_tx.effects.clone(), matching_tx.events.clone())) +} + +async fn get_verified_effects_and_events( + config: &Config, + tid: TransactionDigest, +) -> anyhow::Result<(TransactionEffects, Option)> { + let sui_mainnet: Arc = Arc::new( + SuiClientBuilder::default() + .build(config.full_node_url.as_str()) + .await + .unwrap(), + ); + let read_api = sui_mainnet.read_api(); + + // Lookup the transaction id and get the checkpoint sequence number + let options = SuiTransactionBlockResponseOptions::new(); + let seq = read_api + .get_transaction_with_options(tid, options) + .await? + .checkpoint + .ok_or(anyhow!("Transaction not found"))?; + + // Download the full checkpoint for this sequence number + let full_check_point = get_full_checkpoint(config, seq).await?; + + // Load the list of stored checkpoints + let checkpoints_list: CheckpointsList = read_checkpoint_list(config)?; + + // find the stored checkpoint before the seq checkpoint + let prev_ckp_id = checkpoints_list + .checkpoints + .iter() + .filter(|ckp_id| **ckp_id < seq) + .last(); + + let committee = if let Some(prev_ckp_id) = prev_ckp_id { + // Read it from the store + let prev_ckp = read_checkpoint(config, *prev_ckp_id)?; + + // Check we have the right checkpoint + anyhow::ensure!( + prev_ckp.epoch().saturating_add(1) == full_check_point.checkpoint_summary.epoch(), + "Checkpoint sequence number does not match. Need to Sync." + ); + + // Get the committee from the previous checkpoint + let current_committee = prev_ckp + .end_of_epoch_data + .as_ref() + .ok_or(anyhow!( + "Expected all checkpoints to be end-of-epoch checkpoints" + ))? + .next_epoch_committee + .iter() + .cloned() + .collect(); + + // Make a committee object using this + Committee::new(prev_ckp.epoch().saturating_add(1), current_committee) + } else { + // Since we did not find a small committee checkpoint we use the genesis + let mut genesis_path = config.checkpoint_summary_dir.clone(); + genesis_path.push(&config.genesis_filename); + Genesis::load(&genesis_path)?.committee()? + }; + + extract_verified_effects_and_events(&full_check_point, &committee, tid) +} + +async fn get_verified_object(config: &Config, id: ObjectID) -> anyhow::Result { + let client: Client = Client::new(config.rest_url()); + let object = client.get_object(id).await?; + + // Need to authenticate this object + let (effects, _) = get_verified_effects_and_events(config, object.previous_transaction).await?; + + // check that this object ID, version and hash is in the effects + effects + .all_changed_objects() + .iter() + .find(|object_ref| object_ref.0 == object.compute_object_reference()) + .ok_or(anyhow!("Object not found"))?; + + Ok(object) +} + +#[tokio::main] +pub async fn main() { + // Command line arguments and config loading + let args = Args::parse(); + + let path = args + .config + .unwrap_or_else(|| panic!("Need a config file path")); + let reader = fs::File::open(path.clone()) + .unwrap_or_else(|_| panic!("Unable to load config from {}", path.display())); + let config: Config = serde_yaml::from_reader(reader).unwrap(); + + // Print config parameters + println!( + "Checkpoint Dir: {}", + config.checkpoint_summary_dir.display() + ); + + let client: Client = Client::new(config.rest_url()); + let remote_package_store = RemotePackageStore::new(client, config.clone()); + let resolver = Resolver::new(remote_package_store); + + match args.command { + Some(SCommands::Transaction { tid }) => { + let (effects, events) = get_verified_effects_and_events( + &config, + TransactionDigest::from_str(&tid).unwrap(), + ) + .await + .unwrap(); + + let exec_digests = effects.execution_digests(); + println!( + "Executed TID: {} Effects: {}", + exec_digests.transaction, exec_digests.effects + ); + + for event in events.as_ref().unwrap().data.iter() { + let type_layout = resolver + .type_layout(event.type_.clone().into()) + .await + .unwrap(); + + let json_val = + SuiJsonValue::from_bcs_bytes(Some(&type_layout), &event.contents).unwrap(); + + println!( + "Event:\n - Package: {}\n - Module: {}\n - Sender: {}\n - Type: {}\n{}", + event.package_id, + event.transaction_module, + event.sender, + event.type_, + serde_json::to_string_pretty(&json_val.to_json_value()).unwrap() + ); + } + } + Some(SCommands::Object { oid }) => { + let oid = ObjectID::from_str(&oid).unwrap(); + let object = get_verified_object(&config, oid).await.unwrap(); + + if let Data::Move(move_object) = &object.data { + let object_type = move_object.type_().clone(); + + let type_layout = resolver + .type_layout(object_type.clone().into()) + .await + .unwrap(); + + let json_val = + SuiJsonValue::from_bcs_bytes(Some(&type_layout), move_object.contents()) + .unwrap(); + + let (oid, version, hash) = object.compute_object_reference(); + println!( + "OID: {}\n - Version: {}\n - Hash: {}\n - Owner: {}\n - Type: {}\n{}", + oid, + version, + hash, + object.owner, + object_type, + serde_json::to_string_pretty(&json_val.to_json_value()).unwrap() + ); + } + } + + Some(SCommands::Sync {}) => { + check_and_sync_checkpoints(&config) + .await + .expect("Failed to sync checkpoints"); + } + _ => {} + } +} + +// Make a test namespace +#[cfg(test)] +mod tests { + use sui_types::messages_checkpoint::FullCheckpointContents; + + use super::*; + use std::path::{Path, PathBuf}; + + async fn read_full_checkpoint(checkpoint_path: &PathBuf) -> anyhow::Result { + let mut reader = fs::File::open(checkpoint_path.clone())?; + let metadata = fs::metadata(checkpoint_path)?; + let mut buffer = vec![0; metadata.len() as usize]; + reader.read_exact(&mut buffer)?; + bcs::from_bytes(&buffer).map_err(|_| anyhow!("Unable to parse checkpoint file")) + } + + // clippy ignore dead-code + #[allow(dead_code)] + async fn write_full_checkpoint( + checkpoint_path: &Path, + checkpoint: &CheckpointData, + ) -> anyhow::Result<()> { + let mut writer = fs::File::create(checkpoint_path)?; + let bytes = bcs::to_bytes(&checkpoint) + .map_err(|_| anyhow!("Unable to serialize checkpoint summary"))?; + writer.write_all(&bytes)?; + Ok(()) + } + + async fn read_data() -> (Committee, CheckpointData) { + let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + d.push("example_config/20873329.yaml"); + + let mut reader = fs::File::open(d.clone()).unwrap(); + let metadata = fs::metadata(&d).unwrap(); + let mut buffer = vec![0; metadata.len() as usize]; + reader.read_exact(&mut buffer).unwrap(); + let checkpoint: Envelope> = + bcs::from_bytes(&buffer) + .map_err(|_| anyhow!("Unable to parse checkpoint file")) + .unwrap(); + + let prev_committee = checkpoint + .end_of_epoch_data + .as_ref() + .ok_or(anyhow!( + "Expected all checkpoints to be end-of-epoch checkpoints" + )) + .unwrap() + .next_epoch_committee + .iter() + .cloned() + .collect(); + + // Make a committee object using this + let committee = Committee::new(checkpoint.epoch().saturating_add(1), prev_committee); + + let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + d.push("example_config/20958462.bcs"); + + let full_checkpoint = read_full_checkpoint(&d).await.unwrap(); + + (committee, full_checkpoint) + } + + #[tokio::test] + async fn test_checkpoint_all_good() { + let (committee, full_checkpoint) = read_data().await; + + extract_verified_effects_and_events( + &full_checkpoint, + &committee, + TransactionDigest::from_str("8RiKBwuAbtu8zNCtz8SrcfHyEUzto6zi6cMVA9t4WhWk").unwrap(), + ) + .unwrap(); + } + + #[tokio::test] + async fn test_checkpoint_bad_committee() { + let (mut committee, full_checkpoint) = read_data().await; + + // Change committee + committee.epoch += 10; + + assert!(extract_verified_effects_and_events( + &full_checkpoint, + &committee, + TransactionDigest::from_str("8RiKBwuAbtu8zNCtz8SrcfHyEUzto6zi6cMVA9t4WhWk").unwrap(), + ) + .is_err()); + } + + #[tokio::test] + async fn test_checkpoint_no_transaction() { + let (committee, full_checkpoint) = read_data().await; + + assert!(extract_verified_effects_and_events( + &full_checkpoint, + &committee, + TransactionDigest::from_str("8RiKBwuAbtu8zNCtz8SrcfHyEUzto6zj6cMVA9t4WhWk").unwrap(), + ) + .is_err()); + } + + #[tokio::test] + async fn test_checkpoint_bad_contents() { + let (committee, mut full_checkpoint) = read_data().await; + + // Change contents + let random_contents = FullCheckpointContents::random_for_testing(); + full_checkpoint.checkpoint_contents = random_contents.checkpoint_contents(); + + assert!(extract_verified_effects_and_events( + &full_checkpoint, + &committee, + TransactionDigest::from_str("8RiKBwuAbtu8zNCtz8SrcfHyEUzto6zj6cMVA9t4WhWk").unwrap(), + ) + .is_err()); + } + + #[tokio::test] + async fn test_checkpoint_bad_events() { + let (committee, mut full_checkpoint) = read_data().await; + + let event = full_checkpoint.transactions[4] + .events + .as_ref() + .unwrap() + .data[0] + .clone(); + + for t in &mut full_checkpoint.transactions { + if let Some(events) = &mut t.events { + events.data.push(event.clone()); + } + } + + assert!(extract_verified_effects_and_events( + &full_checkpoint, + &committee, + TransactionDigest::from_str("8RiKBwuAbtu8zNCtz8SrcfHyEUzto6zj6cMVA9t4WhWk").unwrap(), + ) + .is_err()); + } +} diff --git a/crates/sui-rest-api/src/client.rs b/crates/sui-rest-api/src/client.rs index 5ca673d2da67c..9e205019ca99b 100644 --- a/crates/sui-rest-api/src/client.rs +++ b/crates/sui-rest-api/src/client.rs @@ -55,6 +55,24 @@ impl Client { bcs::from_bytes(&bytes).map_err(Into::into) } + pub async fn get_checkpoint_summary( + &self, + checkpoint_sequence_number: CheckpointSequenceNumber, + ) -> Result { + let url = format!("{}/checkpoints/{checkpoint_sequence_number}", self.base_url); + + let checkpoint = self + .inner + .get(url) + .header(reqwest::header::ACCEPT, crate::APPLICATION_BCS) + .send() + .await? + .json() + .await?; + + Ok(checkpoint) + } + pub async fn get_object(&self, object_id: ObjectID) -> Result { let url = format!("{}/objects/{object_id}", self.base_url);