From 65e0e4da964f71dcdc02706968c1828e06d3f1f7 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Wed, 31 Aug 2022 20:21:01 -0700 Subject: [PATCH] Remove old NFT mint and verify commands (#418) --- Cargo.lock | 66 ++++-------------------------- Cargo.toml | 2 - src/main.rs | 15 +++---- src/nft.rs | 88 ---------------------------------------- src/subcommand.rs | 6 --- src/subcommand/mint.rs | 33 --------------- src/subcommand/verify.rs | 26 ------------ tests/lib.rs | 1 - tests/nft.rs | 31 -------------- tests/test.rs | 5 --- 10 files changed, 12 insertions(+), 261 deletions(-) delete mode 100644 src/nft.rs delete mode 100644 src/subcommand/mint.rs delete mode 100644 src/subcommand/verify.rs delete mode 100644 tests/nft.rs diff --git a/Cargo.lock b/Cargo.lock index 1cad16b7f0..5e33ac08eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -300,17 +300,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "async-rustls" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c86f33abd5a4f3e2d6d9251a9e0c6a7e52eb1113caf893dae8429bf4a53f378" -dependencies = [ - "futures-lite", - "rustls 0.19.1", - "webpki 0.21.4", -] - [[package]] name = "async-std" version = "1.12.0" @@ -444,7 +433,7 @@ dependencies = [ "http-body", "hyper", "pin-project-lite", - "rustls 0.20.6", + "rustls", "rustls-pemfile", "tokio", "tokio-rustls", @@ -1000,7 +989,7 @@ checksum = "25ae36f27655f7705dd8e9105600a79e4f23d390649abbbc57aa87adbc57245d" dependencies = [ "bitcoin", "log", - "rustls 0.20.6", + "rustls", "serde", "serde_json", "socks", @@ -1191,7 +1180,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" dependencies = [ "futures-io", - "rustls 0.20.6", + "rustls", "webpki 0.22.0", ] @@ -1324,12 +1313,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "half" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - [[package]] name = "hashbrown" version = "0.11.2" @@ -1910,7 +1893,6 @@ name = "ord" version = "0.0.3" dependencies = [ "anyhow", - "async-rustls", "axum", "axum-server", "bdk", @@ -1937,10 +1919,9 @@ dependencies = [ "regex", "reqwest", "rust-embed", - "rustls 0.20.6", + "rustls", "rustls-acme", "serde", - "serde_cbor", "serde_json", "sys-info", "tempfile", @@ -2574,19 +2555,6 @@ dependencies = [ "nom", ] -[[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" -dependencies = [ - "base64", - "log", - "ring", - "sct 0.6.1", - "webpki 0.21.4", -] - [[package]] name = "rustls" version = "0.20.6" @@ -2595,7 +2563,7 @@ checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" dependencies = [ "log", "ring", - "sct 0.7.0", + "sct", "webpki 0.22.0", ] @@ -2619,7 +2587,7 @@ dependencies = [ "pin-project", "rcgen", "ring", - "rustls 0.20.6", + "rustls", "serde", "serde_json", "smol", @@ -2671,16 +2639,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sct" version = "0.7.0" @@ -2764,16 +2722,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde_cbor" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" -dependencies = [ - "half", - "serde", -] - [[package]] name = "serde_derive" version = "1.0.143" @@ -3237,7 +3185,7 @@ version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls 0.20.6", + "rustls", "tokio", "webpki 0.22.0", ] diff --git a/Cargo.toml b/Cargo.toml index 5994986fda..bbe724e8d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,6 @@ autotests = false [dependencies] anyhow = { version = "1.0.56", features = ["backtrace"] } -async-rustls = "0.2.0" axum = "0.5.6" axum-server = "0.4.0" bitcoin = "0.28.1" @@ -30,7 +29,6 @@ rust-embed = "6.4.0" rustls = "0.20.6" rustls-acme = { version = "0.5.0", features = ["axum"] } serde = { version = "1.0.137", features = ["derive"] } -serde_cbor = "0.11.2" serde_json = "1.0.81" sys-info = "0.9.1" tokio = { version = "1.17.0", features = ["rt-multi-thread"] } diff --git a/src/main.rs b/src/main.rs index 3c049b8ad1..57015952b9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,6 @@ use { epoch::Epoch, height::Height, index::{Index, List}, - nft::Nft, options::Options, ordinal::Ordinal, purse::Purse, @@ -34,14 +33,12 @@ use { blockdata::{constants::COIN_VALUE, transaction::TxOut}, consensus::{Decodable, Encodable}, hash_types::BlockHash, - hashes::{sha256, sha256d, Hash, HashEngine}, + hashes::{sha256d, Hash}, secp256k1::{ - self, - rand::{self, thread_rng}, - schnorr::Signature, - KeyPair, Secp256k1, XOnlyPublicKey, + rand::{self}, + Secp256k1, }, - util::{key::PrivateKey, psbt::PartiallySignedTransaction}, + util::psbt::PartiallySignedTransaction, Address, Block, Network, OutPoint, Transaction, Txid, }, chrono::{DateTime, NaiveDateTime, Utc}, @@ -54,8 +51,7 @@ use { collections::VecDeque, env, fmt::{self, Display, Formatter}, - fs, - io::{self, Write}, + fs, io, net::ToSocketAddrs, ops::{Add, AddAssign, Deref, Sub}, path::{Path, PathBuf}, @@ -98,7 +94,6 @@ mod degree; mod epoch; mod height; mod index; -mod nft; mod options; mod ordinal; mod purse; diff --git a/src/nft.rs b/src/nft.rs deleted file mode 100644 index 7258257c20..0000000000 --- a/src/nft.rs +++ /dev/null @@ -1,88 +0,0 @@ -use super::*; - -const ORDINAL_MESSAGE_PREFIX: &[u8] = b"Ordinal Signed Message:"; - -#[derive(Serialize, Deserialize)] -pub(crate) struct Nft { - data: Vec, - metadata: Vec, - signature: Signature, - public_key: XOnlyPublicKey, -} - -#[derive(Serialize, Deserialize)] -struct Metadata { - ordinal: Ordinal, -} - -impl Nft { - pub(crate) fn mint(ordinal: Ordinal, data: &[u8], signing_key_pair: KeyPair) -> Result { - let data_hash = sha256::Hash::hash(data); - - let public_key = signing_key_pair.public_key(); - - let metadata = serde_cbor::to_vec(&Metadata { ordinal })?; - let metadata_hash = sha256::Hash::hash(&metadata); - - let mut engine = sha256::Hash::engine(); - engine.input(ORDINAL_MESSAGE_PREFIX); - // We use the metadata hash instead of the CBOR for compatibility with Coldcard signed messages - // which are limited to 240 chars. - engine.input(&metadata_hash); - engine.input(&data_hash); - - let message_hash = secp256k1::Message::from_slice(&sha256::Hash::from_engine(engine))?; - - let context = Secp256k1::new(); - - let signature = - context.sign_schnorr_with_rng(&message_hash, &signing_key_pair, &mut thread_rng()); - - Ok(Self { - metadata, - signature, - data: data.into(), - public_key, - }) - } - - pub(crate) fn data(&self) -> &[u8] { - &self.data - } - - pub(crate) fn encode(&self) -> Vec { - serde_cbor::to_vec(self).unwrap() - } - - pub(crate) fn issuer(&self) -> XOnlyPublicKey { - self.public_key - } - - pub(crate) fn data_hash(&self) -> sha256::Hash { - sha256::Hash::hash(&self.data) - } - - pub(crate) fn ordinal(&self) -> Result { - Ok(serde_cbor::from_slice::(&self.metadata)?.ordinal) - } - - pub(crate) fn verify(cbor: &[u8]) -> Result { - let nft = serde_cbor::from_slice::(cbor)?; - - let data_hash = sha256::Hash::hash(&nft.data); - - let metadata_hash = sha256::Hash::hash(&nft.metadata); - let mut engine = sha256::Hash::engine(); - engine.input(ORDINAL_MESSAGE_PREFIX); - engine.input(&metadata_hash); - engine.input(&data_hash); - - let message_hash = secp256k1::Message::from_slice(&sha256::Hash::from_engine(engine))?; - - Secp256k1::new() - .verify_schnorr(&nft.signature, &message_hash, &nft.public_key) - .context("Failed to verify NFT signature")?; - - Ok(nft) - } -} diff --git a/src/subcommand.rs b/src/subcommand.rs index 322bb4e492..d02f0a25be 100644 --- a/src/subcommand.rs +++ b/src/subcommand.rs @@ -5,13 +5,11 @@ mod find; mod index; mod info; mod list; -mod mint; mod name; mod range; mod server; mod supply; mod traits; -mod verify; mod wallet; #[derive(Debug, Parser)] @@ -21,13 +19,11 @@ pub(crate) enum Subcommand { Index, Info, List(list::List), - Mint(mint::Mint), Name(name::Name), Range(range::Range), Server(server::Server), Supply, Traits(traits::Traits), - Verify(verify::Verify), #[clap(subcommand)] Wallet(wallet::Wallet), } @@ -40,13 +36,11 @@ impl Subcommand { Self::Index => index::run(options), Self::Info => info::run(options), Self::List(list) => list.run(options), - Self::Mint(mint) => mint.run(), Self::Name(name) => name.run(), Self::Range(range) => range.run(), Self::Server(server) => server.run(options), Self::Supply => supply::run(), Self::Traits(traits) => traits.run(), - Self::Verify(verify) => verify.run(), Self::Wallet(wallet) => wallet.run(options), } } diff --git a/src/subcommand/mint.rs b/src/subcommand/mint.rs deleted file mode 100644 index 1c4cc99f19..0000000000 --- a/src/subcommand/mint.rs +++ /dev/null @@ -1,33 +0,0 @@ -use super::*; - -#[derive(Debug, Parser)] -pub(crate) struct Mint { - #[clap(long, help = "Read NFT contents from ")] - data_path: PathBuf, - #[clap(long, help = "Assign NFT to ")] - ordinal: Ordinal, - #[clap(long, help = "Sign NFT with WIF-formatted ")] - signing_key: String, - #[clap(long, help = "Write signed NFT metadata to ")] - output_path: PathBuf, -} - -impl Mint { - pub(crate) fn run(self) -> Result<()> { - let data = fs::read(&self.data_path) - .with_context(|| format!("Failed to read data from {}", self.data_path.display()))?; - - let private_key = PrivateKey::from_wif(&self.signing_key)?; - - let nft = Nft::mint( - self.ordinal, - &data, - KeyPair::from_secret_key(&Secp256k1::new(), private_key.inner), - )?; - - fs::write(&self.output_path, nft.encode()) - .with_context(|| format!("Failed to write NFT to {}", self.output_path.display()))?; - - Ok(()) - } -} diff --git a/src/subcommand/verify.rs b/src/subcommand/verify.rs deleted file mode 100644 index 899899cbee..0000000000 --- a/src/subcommand/verify.rs +++ /dev/null @@ -1,26 +0,0 @@ -use super::*; - -#[derive(Debug, Parser)] -pub(crate) struct Verify { - #[clap(help = "Read bech32-formatted NFT from ")] - input_path: PathBuf, -} - -impl Verify { - pub(crate) fn run(self) -> Result { - let encoded = fs::read(&self.input_path) - .with_context(|| format!("Failed to read NFT from `{}`", self.input_path.display()))?; - - let nft = Nft::verify(&encoded) - .with_context(|| format!("Failed to verify NFT at `{}`", self.input_path.display()))?; - - eprintln!("NFT is valid!"); - eprintln!("Ordinal: {}", nft.ordinal()?); - eprintln!("Issuer: {}", nft.issuer()); - eprintln!("Data hash: {}", nft.data_hash()); - - io::stdout().write_all(nft.data())?; - - Ok(()) - } -} diff --git a/tests/lib.rs b/tests/lib.rs index fc878fe3da..5cbf5b889a 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -41,7 +41,6 @@ mod index; mod info; mod list; mod name; -mod nft; mod range; mod server; mod state; diff --git a/tests/nft.rs b/tests/nft.rs deleted file mode 100644 index 6fee7129b9..0000000000 --- a/tests/nft.rs +++ /dev/null @@ -1,31 +0,0 @@ -use super::*; - -#[test] -fn mint_and_verify() { - let output = Test::new() - .write("data.txt", "foo") - .args(&[ - "mint", - "--ordinal", - "0", - "--signing-key", - "KysB4eR1DjAmbf1qkiznwgd4xPy8yj66gHF4dBJmhFraoL1gjqZd", - "--data-path", - "data.txt", - "--output-path", - "foo.nft", - ]) - .output(); - - Test::with_state(output.state) - .command("verify foo.nft") - .expected_stderr( - "NFT is valid! -Ordinal: 0 -Issuer: 1b7bb1348ae7a273e55644a920ecf4e5b7d8a5d0966c649e720601e73c737eb7 -Data hash: 2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae -", - ) - .expected_stdout("foo") - .run(); -} diff --git a/tests/test.rs b/tests/test.rs index 4875bc68e7..0fb4b167d5 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -145,9 +145,4 @@ impl Test { self.state.transaction(options); self } - - pub(crate) fn write(self, path: &str, contents: &str) -> Self { - fs::write(self.state.tempdir.path().join(path), contents).unwrap(); - self - } }