diff --git a/Cargo.lock b/Cargo.lock index 9fd1913..b9cb670 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,12 @@ version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + [[package]] name = "ascii" version = "1.1.0" @@ -29,6 +35,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "base58ck" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8d66485a3a2ea485c1913c4572ce0256067a5377ac8c75c4960e1cda98605f" +dependencies = [ + "bitcoin-internals", + "bitcoin_hashes", +] + [[package]] name = "base64" version = "0.13.1" @@ -37,9 +53,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "bech32" -version = "0.10.0-beta" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98f7eed2b2781a6f0b5c903471d48e15f56fb4e1165df8a9a2337fd1a59d45ea" +checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" [[package]] name = "bindgen" @@ -63,12 +79,15 @@ dependencies = [ [[package]] name = "bitcoin" -version = "0.31.2" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c85783c2fe40083ea54a33aa2f0ba58831d90fcd190f5bdc47e74e84d2a96ae" +checksum = "7170e7750a20974246f17ece04311b4205a6155f1db564c5b224af817663c3ea" dependencies = [ + "base58ck", "bech32", "bitcoin-internals", + "bitcoin-io", + "bitcoin-units", "bitcoin_hashes", "hex-conservative", "hex_lit", @@ -78,13 +97,19 @@ dependencies = [ [[package]] name = "bitcoin-internals" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" +checksum = "30bdbe14aa07b06e6cfeffc529a1f099e5fbe249524f8125358604df99a4bed2" dependencies = [ "serde", ] +[[package]] +name = "bitcoin-io" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" + [[package]] name = "bitcoin-test-data" version = "0.2.0" @@ -92,21 +117,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c188654f9dce3bc6ce1bfa9c49777ad514bcad37e421b5f53e9d0ee10603f34" [[package]] -name = "bitcoin_hashes" -version = "0.13.0" +name = "bitcoin-units" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" +checksum = "cb54da0b28892f3c52203a7191534033e051b6f4b52bc15480681b57b7e036f5" dependencies = [ "bitcoin-internals", + "serde", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", "hex-conservative", "serde", ] [[package]] name = "bitcoin_slices" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b221249ba4685e0f737f0df2c7bb656d527fdd8ede83ac066c4c8ce95898f42" +checksum = "b8041a1be831c809ada090db2e3bd1469c65b72321bb2f31d7f56261eefc8321" dependencies = [ "bitcoin", "bitcoin_hashes", @@ -115,9 +150,9 @@ dependencies = [ [[package]] name = "bitcoincore-rpc" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb70725a621848c83b3809913d5314c0d20ca84877d99dd909504b564edab00" +checksum = "aedd23ae0fd321affb4bbbc36126c6f49a32818dc6b979395d24da8c9d4e80ee" dependencies = [ "bitcoincore-rpc-json", "jsonrpc", @@ -128,9 +163,9 @@ dependencies = [ [[package]] name = "bitcoincore-rpc-json" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "856ffbee2e492c23bca715d72ea34aae80d58400f2bda26a82015d6bc2ec3662" +checksum = "d8909583c5fab98508e80ef73e5592a651c954993dc6b7739963257d19f0e71a" dependencies = [ "bitcoin", "serde", @@ -486,9 +521,12 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hex-conservative" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" +checksum = "e1aa273bf451e37ed35ced41c71a5e2a4e29064afb104158f2514bcd71c2c986" +dependencies = [ + "arrayvec", +] [[package]] name = "hex_lit" @@ -547,11 +585,12 @@ dependencies = [ [[package]] name = "jsonrpc" -version = "0.14.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8128f36b47411cd3f044be8c1f5cc0c9e24d1d1bfdc45f0a57897b32513053f2" +checksum = "3662a38d341d77efecb73caf01420cfa5aa63c0253fd7bc05289ef9f6616e1bf" dependencies = [ "base64", + "minreq", "serde", "serde_json", ] @@ -655,6 +694,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "minreq" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fdef521c74c2884a4f3570bcdb6d2a77b3c533feb6b27ac2ae72673cc221c64" +dependencies = [ + "log", + "serde", + "serde_json", +] + [[package]] name = "nom" version = "7.1.3" @@ -912,9 +962,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "secp256k1" -version = "0.28.2" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" +checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" dependencies = [ "bitcoin_hashes", "rand", @@ -924,9 +974,9 @@ dependencies = [ [[package]] name = "secp256k1-sys" -version = "0.9.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb" +checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b" dependencies = [ "cc", ] diff --git a/Cargo.toml b/Cargo.toml index 69c24ec..a156cd0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,9 +22,9 @@ spec = "internal/config_specification.toml" [dependencies] anyhow = "1.0" -bitcoin = { version = "0.31.2", features = ["serde", "rand-std"] } -bitcoin_slices = { version = "0.7", features = ["bitcoin", "sha2"] } -bitcoincore-rpc = { version = "0.18" } +bitcoin = { version = "0.32.0", features = ["serde", "rand-std"] } +bitcoin_slices = { version = "0.8", features = ["bitcoin", "sha2"] } +bitcoincore-rpc = { version = "0.19.0" } configure_me = "0.4" crossbeam-channel = "0.5" dirs-next = "2.0" diff --git a/src/daemon.rs b/src/daemon.rs index 970580e..df22173 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -6,7 +6,7 @@ use bitcoincore_rpc::{json, jsonrpc, Auth, Client, RpcApi}; use crossbeam_channel::Receiver; use parking_lot::Mutex; use serde::Serialize; -use serde_json::{json, Value}; +use serde_json::{json, value::RawValue, Value}; use std::fs::File; use std::io::Read; @@ -309,13 +309,13 @@ where T: Serialize, { debug!("calling {} on {} items", name, items.len()); - let args: Vec<_> = items + let args: Vec> = items .iter() - .map(|item| vec![serde_json::value::to_raw_value(item).unwrap()]) - .collect(); - let reqs: Vec<_> = args + .map(|item| jsonrpc::try_arg([item]).context("failed to serialize into JSON")) + .collect::>>()?; + let reqs: Vec = args .iter() - .map(|arg| client.build_request(name, arg)) + .map(|arg| client.build_request(name, Some(arg))) .collect(); match client.send_batch(&reqs) { Ok(values) => { diff --git a/src/index.rs b/src/index.rs index f14b1f2..e4d2a6a 100644 --- a/src/index.rs +++ b/src/index.rs @@ -263,7 +263,7 @@ fn index_single_block( fn visit_tx_out(&mut self, _vout: usize, tx_out: &bsl::TxOut) -> ControlFlow<()> { let script = bitcoin::Script::from_bytes(tx_out.script_pubkey()); // skip indexing unspendable outputs - if !script.is_provably_unspendable() { + if !script.is_op_return() { let row = ScriptHashRow::row(ScriptHash::new(script), self.height); self.batch.funding_rows.push(row.to_db_row()); } diff --git a/src/p2p.rs b/src/p2p.rs index 0726e3b..3922f27 100644 --- a/src/p2p.rs +++ b/src/p2p.rs @@ -7,6 +7,7 @@ use bitcoin::{ Decodable, }, hashes::Hash, + io, p2p::{ self, address, message::{self, CommandString, NetworkMessage}, @@ -19,9 +20,8 @@ use bitcoin::{ use bitcoin_slices::{bsl, Parse}; use crossbeam_channel::{bounded, select, Receiver, Sender}; -use std::io::{self, ErrorKind, Write}; +use std::io::Write; use std::net::{IpAddr, Ipv4Addr, SocketAddr, TcpStream}; -use std::sync::Arc; use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH}; use crate::types::SerBlock; @@ -141,10 +141,11 @@ impl Connection { metrics: &Metrics, magic: Magic, ) -> Result { - let conn = Arc::new( - TcpStream::connect(address) - .with_context(|| format!("{} p2p failed to connect: {:?}", network, address))?, - ); + let recv_conn = TcpStream::connect(address) + .with_context(|| format!("{} p2p failed to connect: {:?}", network, address))?; + let mut send_conn = recv_conn + .try_clone() + .context("failed to clone connection")?; let (tx_send, tx_recv) = bounded::(1); let (rx_send, rx_recv) = bounded::(1); @@ -180,7 +181,6 @@ impl Connection { default_duration_buckets(), ); - let stream = Arc::clone(&conn); let mut buffer = vec![]; crate::thread::spawn("p2p_send", move || loop { use std::net::Shutdown; @@ -190,7 +190,7 @@ impl Connection { // p2p_loop is closed, so tx_send is disconnected debug!("closing p2p_send thread: no more messages to send"); // close the stream reader (p2p_recv thread may block on it) - if let Err(e) = stream.shutdown(Shutdown::Read) { + if let Err(e) = send_conn.shutdown(Shutdown::Read) { warn!("failed to shutdown p2p connection: {}", e) } return Ok(()); @@ -203,16 +203,16 @@ impl Connection { raw_msg .consensus_encode(&mut buffer) .expect("in-memory writers don't error"); - (&*stream) + send_conn .write_all(buffer.as_slice()) .context("p2p failed to send") })?; }); - let stream = Arc::clone(&conn); + let mut stream_reader = std::io::BufReader::new(recv_conn); crate::thread::spawn("p2p_recv", move || loop { let start = Instant::now(); - let raw_msg = RawNetworkMessage::consensus_decode(&mut &*stream); + let raw_msg = RawNetworkMessage::consensus_decode(&mut stream_reader); { let duration = duration_to_seconds(start.elapsed()); let label = format!( @@ -232,7 +232,7 @@ impl Connection { } raw_msg } - Err(encode::Error::Io(e)) if e.kind() == ErrorKind::UnexpectedEof => { + Err(encode::Error::Io(e)) if e.kind() == io::ErrorKind::UnexpectedEof => { debug!("closing p2p_recv thread: connection closed"); return Ok(()); } @@ -390,7 +390,9 @@ enum ParsedNetworkMessage { } impl Decodable for RawNetworkMessage { - fn consensus_decode(d: &mut D) -> Result { + fn consensus_decode( + d: &mut D, + ) -> Result { let magic = Decodable::consensus_decode(d)?; let cmd = Decodable::consensus_decode(d)?; diff --git a/src/types.rs b/src/types.rs index 599685e..ca7f7b3 100644 --- a/src/types.rs +++ b/src/types.rs @@ -6,7 +6,7 @@ use bitcoin::blockdata::block::Header as BlockHeader; use bitcoin::{ consensus::encode::{deserialize, Decodable, Encodable}, hashes::{hash_newtype, sha256, Hash}, - OutPoint, Script, Txid, + io, OutPoint, Script, Txid, }; use bitcoin_slices::bsl; @@ -16,10 +16,10 @@ macro_rules! impl_consensus_encoding { ($thing:ident, $($field:ident),+) => ( impl Encodable for $thing { #[inline] - fn consensus_encode( + fn consensus_encode( &self, s: &mut S, - ) -> Result { + ) -> Result { let mut len = 0; $(len += self.$field.consensus_encode(s)?;)+ Ok(len) @@ -28,7 +28,7 @@ macro_rules! impl_consensus_encoding { impl Decodable for $thing { #[inline] - fn consensus_decode( + fn consensus_decode( d: &mut D, ) -> Result<$thing, bitcoin::consensus::encode::Error> { Ok($thing {