Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mihailjianu1/bitcoin crate upgrade+testnet4 all #3651

Draft
wants to merge 99 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
f2d1fcb
upgrade a few things
mihailjianu1 Nov 22, 2024
09d9688
more cahnges
mihailjianu1 Nov 29, 2024
d5586a0
update x
mihailjianu1 Dec 4, 2024
012d9fa
more upgrades
mihailjianu1 Dec 5, 2024
458cbdd
cargo adapter works
mihailjianu1 Dec 5, 2024
43b18b6
bazel adapter works
mihailjianu1 Dec 5, 2024
97cb30f
everything works.
mihailjianu1 Dec 6, 2024
2e9f3c4
make almost everything work
mihailjianu1 Dec 9, 2024
94a82ec
changes
mihailjianu1 Dec 12, 2024
f5a666e
Merge branch 'master' into mihailjianu1/bitcoin-crate-upgrade
mihailjianu1 Dec 13, 2024
b9983e0
cargo.lock
mihailjianu1 Dec 13, 2024
1f4ed12
Automatically updated Cargo*.lock
Dec 13, 2024
6b7fe3d
fix test + clippy
mihailjianu1 Dec 16, 2024
4db5fd2
Merge branch 'mihailjianu1/bitcoin-crate-upgrade' of https://github.c…
mihailjianu1 Dec 16, 2024
6f22775
cleanup
mihailjianu1 Dec 16, 2024
8994a73
lock
mihailjianu1 Dec 16, 2024
48329b3
typo
mihailjianu1 Dec 16, 2024
5921004
hex
mihailjianu1 Dec 16, 2024
6d7d9bf
fix
mihailjianu1 Dec 16, 2024
b361974
changes
mihailjianu1 Dec 16, 2024
e6c040a
ckbtc attempt
mihailjianu1 Dec 16, 2024
5c09388
revert minter
mihailjianu1 Dec 16, 2024
054c2dd
Merge branch 'master' into mihailjianu1/bitcoin-crate-upgrade
mihailjianu1 Dec 16, 2024
dd31d93
lock
mihailjianu1 Dec 16, 2024
97dcdc9
more changes
mihailjianu1 Dec 16, 2024
e89c829
Merge branch 'master' into mihailjianu1/bitcoin-crate-upgrade
mihailjianu1 Dec 16, 2024
623ae3d
lock
mihailjianu1 Dec 16, 2024
21945b4
clippy
mihailjianu1 Dec 16, 2024
e0666fe
remove test
mihailjianu1 Dec 16, 2024
74bc6e2
more fixes
mihailjianu1 Dec 16, 2024
ce76ebb
testnet4
mihailjianu1 Dec 17, 2024
d0cdee2
fix testnet4
mihailjianu1 Dec 19, 2024
8cf7919
cleanup
mihailjianu1 Dec 19, 2024
b321477
f
mihailjianu1 Dec 19, 2024
bd74a97
Merge branch 'mihailjianu1/bitcoin-crate-upgrade' into mihailjianu1/b…
mihailjianu1 Dec 19, 2024
add051d
patch
mihailjianu1 Dec 19, 2024
d331cc4
Merge branch 'master' into mihailjianu1/bitcoin-crate-upgrade
mihailjianu1 Dec 19, 2024
bf1f8a7
cargo.bazel.json.lock?
mihailjianu1 Dec 19, 2024
edb165c
Merge branch 'mihailjianu1/bitcoin-crate-upgrade' into mihailjianu1/b…
mihailjianu1 Dec 19, 2024
cc6aac8
remove useless dep
mihailjianu1 Dec 19, 2024
fde4393
remove todo
mihailjianu1 Dec 19, 2024
558edd3
remove debug
mihailjianu1 Dec 19, 2024
361c6dd
test
mihailjianu1 Dec 23, 2024
63b9ca7
add test back
mihailjianu1 Dec 23, 2024
d4ce592
Merge branch 'mihailjianu1/bitcoin-crate-upgrade' into mihailjianu1/b…
mihailjianu1 Dec 23, 2024
d7faee3
add tests
mihailjianu1 Dec 23, 2024
f1adf9d
add back header validation
mihailjianu1 Jan 13, 2025
a208fe6
cleanup
mihailjianu1 Jan 13, 2025
4d450eb
Merge branch 'mihailjianu1/bitcoin-crate-upgrade' into mihailjianu1/b…
mihailjianu1 Jan 13, 2025
61a0e2a
add checkpints
mihailjianu1 Jan 13, 2025
6966117
Merge branch 'master' into mihailjianu1/bitcoin-crate-upgrade
mihailjianu1 Jan 13, 2025
0cc726b
lock..
mihailjianu1 Jan 13, 2025
eed213e
Merge branch 'mihailjianu1/bitcoin-crate-upgrade' into mihailjianu1/b…
mihailjianu1 Jan 13, 2025
d359f9f
cargo.lock
mihailjianu1 Jan 14, 2025
0fcf954
cargo lock
mihailjianu1 Jan 14, 2025
335d3fa
cargo lock
mihailjianu1 Jan 14, 2025
dd4211a
remove todo
mihailjianu1 Jan 14, 2025
d938e93
clippy
mihailjianu1 Jan 14, 2025
1c74701
Merge branch 'mihailjianu1/bitcoin-crate-upgrade' into mihailjianu1/b…
mihailjianu1 Jan 14, 2025
ffa7529
Merge branch 'master' into mihailjianu1/bitcoin-crate-upgrade
mihailjianu1 Jan 14, 2025
3d7578d
Merge branch 'mihailjianu1/bitcoin-crate-upgrade' into mihailjianu1/b…
mihailjianu1 Jan 14, 2025
5454f5f
Automatically updated Cargo*.lock
Jan 14, 2025
1782158
Automatically updated Cargo*.lock
Jan 14, 2025
dd0576f
lock
mihailjianu1 Jan 14, 2025
602918d
Merge branch 'mihailjianu1/bitcoin-crate-upgrade+testnet4' of https:/…
mihailjianu1 Jan 14, 2025
c1020ce
bring pocket_idc testing back to .28 for now.
mihailjianu1 Jan 14, 2025
0bab1d0
bazel lock
mihailjianu1 Jan 14, 2025
f21beb9
Merge branch 'master' into mihailjianu1/bitcoin-crate-upgrade
mihailjianu1 Jan 14, 2025
4b58754
fuzzing lock
mihailjianu1 Jan 14, 2025
f8ede1d
Merge branch 'mihailjianu1/bitcoin-crate-upgrade' into mihailjianu1/b…
mihailjianu1 Jan 14, 2025
4c7cb97
Automatically updated Cargo*.lock
Jan 14, 2025
eab9921
keep one single secp
mihailjianu1 Jan 15, 2025
6f025ab
remove newer secp
mihailjianu1 Jan 15, 2025
a7c281d
Merge branch 'mihailjianu1/bitcoin-crate-upgrade+testnet4' of https:/…
mihailjianu1 Jan 15, 2025
f695b5a
remove secp
mihailjianu1 Jan 15, 2025
98a01a7
Merge branch 'master' into mihailjianu1/bitcoin-crate-upgrade
mihailjianu1 Jan 15, 2025
2a715ca
locks
mihailjianu1 Jan 15, 2025
dda2207
Merge branch 'mihailjianu1/bitcoin-crate-upgrade' into mihailjianu1/b…
mihailjianu1 Jan 16, 2025
553ff50
rstest
mihailjianu1 Jan 16, 2025
d631687
downgrade to 0.32.4
mihailjianu1 Jan 16, 2025
d445b92
Merge branch 'master' into mihailjianu1/bitcoin-crate-upgrade
mihailjianu1 Jan 21, 2025
e63b7b1
locks
mihailjianu1 Jan 21, 2025
bf80abc
lock
mihailjianu1 Jan 22, 2025
ed1f122
test
mihailjianu1 Jan 22, 2025
104b4cb
clippy
mihailjianu1 Jan 22, 2025
559a112
clipppy #2
mihailjianu1 Jan 22, 2025
93f202a
upgrade back to 0.32.5
mihailjianu1 Jan 22, 2025
a3101c0
reduce fuzing to 0_28
mihailjianu1 Jan 22, 2025
4035180
reverse fuzzer changes
mihailjianu1 Jan 22, 2025
586f9c7
Merge branch 'mihailjianu1/bitcoin-crate-upgrade' into mihailjianu1/b…
mihailjianu1 Jan 23, 2025
e1bd607
lock
mihailjianu1 Jan 23, 2025
41a9f9a
Merge branch 'master' into mihailjianu1/bitcoin-crate-upgrade
mihailjianu1 Jan 23, 2025
b54b65d
locks
mihailjianu1 Jan 23, 2025
10aa18a
Merge branch 'mihailjianu1/bitcoin-crate-upgrade' into mihailjianu1/b…
mihailjianu1 Jan 24, 2025
c14a8dd
Merge branch 'master' into mihailjianu1/bitcoin-crate-upgrade+testnet4
mihailjianu1 Jan 24, 2025
1b88e04
lock
mihailjianu1 Jan 24, 2025
dc03c44
Add all fixes
mihailjianu1 Jan 28, 2025
3c18330
add logging
mihailjianu1 Jan 28, 2025
5139a9e
reduce max reponse size
mihailjianu1 Jan 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
222 changes: 221 additions & 1 deletion Cargo.Bazel.Fuzzing.json.lock

Large diffs are not rendered by default.

276 changes: 275 additions & 1 deletion Cargo.lock

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,9 @@ if [ "${SOCKS_FILE}" != "" -a -e "${SOCKS_FILE}" ]; then
read_socks_proxy "${SOCKS_FILE}"
fi

BITCOIN_NETWORK='"testnet"'
DNS_SEEDS='"testnet-seed.bitcoin.jonasschnelli.ch",
"seed.tbtc.petertodd.org",
"seed.testnet.bitcoin.sprovoost.nl",
"testnet-seed.bluematt.me"'
BITCOIN_NETWORK='"testnet4"'
DNS_SEEDS='"seed.testnet4.bitcoin.sprovoost.nl",
"seed.testnet4.wiz.biz"'

if [ "$MAINNET" = true ]; then
BITCOIN_NETWORK='"bitcoin"'
Expand Down
32 changes: 22 additions & 10 deletions rs/bitcoin/adapter/src/blockchainmanager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ impl BlockchainManager {
};

let time_taken = request.sent_at.map(|i| i.elapsed()).unwrap_or_default();
trace!(
info!(
self.logger,
"Received block message from {} : Took {:?}sec. Block {:?}",
addr,
Expand All @@ -439,7 +439,10 @@ impl BlockchainManager {
);

match self.blockchain.lock().unwrap().add_block(block.clone()) {
Ok(()) => Ok(()),
Ok(()) => {
info!(self.logger, "Added block: {}", block_hash);
Ok(())
},
Err(err) => {
warn!(
self.logger,
Expand Down Expand Up @@ -535,6 +538,13 @@ impl BlockchainManager {
}
}

// Remove the requests that have timed out.
// If they are not removed, then all peers could be fully saturated and we can't send any requests.
for block_hash in retry_queue.iter() {
info!(self.logger, "Retrying getdata request for block: {}", block_hash);
self.getdata_request_info.remove(block_hash);
}

// If nothing to be synced, then there is nothing to do at this point.
if retry_queue.is_empty() && self.block_sync_queue.is_empty() {
return;
Expand All @@ -543,7 +553,7 @@ impl BlockchainManager {
let block_cache_size = self.blockchain.lock().unwrap().get_block_cache_size();

if block_cache_size >= BLOCK_CACHE_THRESHOLD_BYTES {
debug!(
info!(
self.logger,
"Cache Size: {}, Max Size: {}", block_cache_size, BLOCK_CACHE_THRESHOLD_BYTES
);
Expand All @@ -567,7 +577,9 @@ impl BlockchainManager {
});

// For each peer, select a random subset of the inventory and send a "getdata" request for it.
info!(self.logger, "sync_blocks: retry queue size: {}, sync queue {}:", retry_queue.len(), self.block_sync_queue.len());
for peer in peer_info {
info!(self.logger, "trying from peer: {}, requests: {}", peer.socket, requests_per_peer.get(&peer.socket).unwrap_or(&0));
// Calculate number of inventory that can be sent in 'getdata' request to the peer.
let requests_sent_to_peer = requests_per_peer.get(&peer.socket).unwrap_or(&0);
let num_requests_to_be_sent =
Expand All @@ -589,10 +601,10 @@ impl BlockchainManager {
}

if selected_inventory.is_empty() {
break;
continue;
}

trace!(
info!(
self.logger,
"Sending getdata to {} : Inventory {:?}",
peer.socket,
Expand Down Expand Up @@ -753,20 +765,20 @@ impl BlockchainManager {
}
}

// Prioritizes elements in sync_queue (as elements in retry_queue are vety likely bad blocks).
fn get_next_block_hash_to_sync(
is_cache_full: bool,
retry_queue: &mut LinkedHashSet<BlockHash>,
sync_queue: &mut LinkedHashSet<BlockHash>,
) -> Option<BlockHash> {
if !retry_queue.is_empty() {
return retry_queue.pop_front();
}

if is_cache_full {
return None;
}

sync_queue.pop_front()
if !sync_queue.is_empty() {
return sync_queue.pop_front();
}
retry_queue.pop_front()
}

#[cfg(test)]
Expand Down
5 changes: 4 additions & 1 deletion rs/bitcoin/adapter/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,11 @@ pub(crate) fn address_limits(network: Network) -> (usize, usize) {
match network {
Network::Bitcoin => (500, 2000),
Network::Testnet => (100, 1000),
//TODO(mihailjianu): revisit these values
Network::Testnet4 => (100, 1000),
Network::Signet => (1, 1),
Network::Regtest => (1, 1),
other => unreachable!("Unsupported network: {:?}", other),
_ => (500, 2000),
}
}

Expand All @@ -74,6 +76,7 @@ impl Config {
match self.network {
Network::Bitcoin => 8333,
Network::Testnet => 18333,
Network::Testnet4 => 48333,
_ => 8333,
}
}
Expand Down
27 changes: 20 additions & 7 deletions rs/bitcoin/adapter/src/get_successors_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use crate::{
//
// NOTE: Should be = the `MAX_RESPONSE_SIZE` defined in `replicated_state/bitcoin.rs`
// for pagination on the replica side to work as expected.
const MAX_RESPONSE_SIZE: usize = 2_000_000;
const MAX_RESPONSE_SIZE: usize = 1_000_000;

// Max number of next block headers that can be returned in the `GetSuccessorsResponse`.
const MAX_NEXT_BLOCK_HEADERS_LENGTH: usize = 100;
Expand All @@ -30,6 +30,12 @@ const MAX_BLOCKS_LENGTH: usize = 100;

const BLOCK_HEADER_SIZE: usize = 80;

// The maximum number of get blocks requests that can be in-flight at any given time.
// The number of blokcs outside of hte main chain easily exceeds 100 currently.
// Setting this to 100 would prevent the adapter from making progress,
// as it gets stuck on these blocks, whose requests timeout indefinitely.
const MAX_IN_FLIGHT_BLOCKS: usize = 1000;

// The maximum number of bytes the `next` field in a response can take.
const MAX_NEXT_BYTES: usize = MAX_NEXT_BLOCK_HEADERS_LENGTH * BLOCK_HEADER_SIZE;

Expand Down Expand Up @@ -96,7 +102,7 @@ impl GetSuccessorsHandler {
.processed_block_hashes
.observe(request.processed_block_hashes.len() as f64);

let response = {
let (blocks, next) = {
let state = self.state.lock().unwrap();
let anchor_height = state
.get_cached_header(&request.anchor)
Expand All @@ -115,17 +121,24 @@ impl GetSuccessorsHandler {
&request.processed_block_hashes,
&blocks,
);
GetSuccessorsResponse { blocks, next }
(blocks, next)
};
//extract the first MAX_NEXT_BLOCK_HEADERS_LENGTH and return them to the caller
let response_next = &next[..next.len().min(MAX_NEXT_BLOCK_HEADERS_LENGTH)];
let response = GetSuccessorsResponse {
blocks,
next: response_next.to_vec(),
};

self.metrics
.response_blocks
.observe(response.blocks.len() as f64);

if !response.next.is_empty() {
if !next.is_empty() {
// TODO: better handling of full channel as the receivers are never closed.
self.blockchain_manager_tx
.try_send(BlockchainManagerRequest::EnqueueNewBlocksToDownload(
response.next.clone(),
next.clone(),
))
.ok();
}
Expand Down Expand Up @@ -219,7 +232,7 @@ fn get_next_headers(

let mut next_headers = vec![];
while let Some(block_hash) = queue.pop_front() {
if next_headers.len() >= MAX_NEXT_BLOCK_HEADERS_LENGTH {
if next_headers.len() >= MAX_IN_FLIGHT_BLOCKS {
break;
}

Expand All @@ -237,7 +250,7 @@ fn get_next_headers(
fn are_multiple_blocks_allowed(network: Network, anchor_height: BlockHeight) -> bool {
match network {
Network::Bitcoin => anchor_height <= MAINNET_MAX_MULTI_BLOCK_ANCHOR_HEIGHT,
Network::Testnet | Network::Signet | Network::Regtest => true,
Network::Testnet | Network::Signet | Network::Regtest | Network::Testnet4 => true,
other => unreachable!("Unsupported network: {:?}", other),
}
}
Expand Down
6 changes: 3 additions & 3 deletions rs/bitcoin/adapter/src/rpc_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use ic_btc_service::{
BtcServiceSendTransactionRequest, BtcServiceSendTransactionResponse,
};
use ic_http_endpoints_async_utils::{incoming_from_nth_systemd_socket, incoming_from_path};
use ic_logger::{debug, ReplicaLogger};
use ic_logger::{debug, info, ReplicaLogger};
use ic_metrics::MetricsRegistry;
use std::convert::{TryFrom, TryInto};
use std::sync::{Arc, Mutex};
Expand Down Expand Up @@ -89,14 +89,14 @@ impl BtcService for BtcServiceImpl {
.start_timer();
let _ = self.last_received_tx.send(Some(Instant::now()));
let inner = request.into_inner();
debug!(self.logger, "Received GetSuccessorsRequest: {:?}", inner);
info!(self.logger, "Received GetSuccessorsRequest: {:?}", inner);
let request = inner.try_into()?;

match BtcServiceGetSuccessorsResponse::try_from(
self.get_successors_handler.get_successors(request).await?,
) {
Ok(res) => {
debug!(self.logger, "Sending GetSuccessorsResponse: {:?}", res);
info!(self.logger, "Sending GetSuccessorsResponse: {:?}", res);
Ok(Response::new(res))
}
Err(err) => Err(err),
Expand Down
1 change: 1 addition & 0 deletions rs/bitcoin/validation/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ DEV_DEPENDENCIES = [
"@crate_index//:csv",
"@crate_index//:hex",
"@crate_index//:proptest",
"@crate_index//:rstest",
]

MACRO_DEV_DEPENDENCIES = []
Expand Down
1 change: 1 addition & 0 deletions rs/bitcoin/validation/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ hex = { workspace = true }
[dev-dependencies]
csv = "1.1"
proptest = "0.9.4"
rstest = { workspace = true }
14 changes: 11 additions & 3 deletions rs/bitcoin/validation/src/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,18 @@ const TESTNET: &[(BlockHeight, &str)] = &[
(546, "000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70")
];

/// Bitcoin testnet checkpoints
#[rustfmt::skip]
const TESTNET4: &[(BlockHeight, &str)] = &[
(64000, "000000000deb369dca3115f66e208733066f44c8cc177edd4b5f86869e6355b5")
];

/// Returns the maximum difficulty target depending on the network
pub fn max_target(network: &Network) -> Target {
match network {
Network::Bitcoin => Target::MAX_ATTAINABLE_MAINNET,
Network::Testnet => Target::MAX_ATTAINABLE_TESTNET,
Network::Testnet4 => Target::MAX_ATTAINABLE_TESTNET,
Network::Regtest => Target::MAX_ATTAINABLE_REGTEST,
Network::Signet => Target::MAX_ATTAINABLE_SIGNET,
&other => unreachable!("Unsupported network: {:?}", other),
Expand All @@ -72,7 +79,7 @@ pub fn max_target(network: &Network) -> Target {
/// readjusted in the network after a fixed time interval.
pub fn no_pow_retargeting(network: &Network) -> bool {
match network {
Network::Bitcoin | Network::Testnet | Network::Signet => false,
Network::Bitcoin | Network::Testnet | Network::Signet | Network::Testnet4 => false,
Network::Regtest => true,
&other => unreachable!("Unsupported network: {:?}", other),
}
Expand All @@ -83,6 +90,7 @@ pub fn pow_limit_bits(network: &Network) -> CompactTarget {
CompactTarget::from_consensus(match network {
Network::Bitcoin => 0x1d00ffff,
Network::Testnet => 0x1d00ffff,
Network::Testnet4 => 0x1d00ffff,
Network::Regtest => 0x207fffff,
Network::Signet => 0x1e0377ae,
&other => unreachable!("Unsupported network: {:?}", other),
Expand All @@ -94,7 +102,7 @@ pub fn checkpoints(network: &Network) -> HashMap<BlockHeight, BlockHash> {
let points = match network {
Network::Bitcoin => BITCOIN,
Network::Testnet => TESTNET,
Network::Testnet4 => &[],
Network::Testnet4 => TESTNET4,
Network::Signet => &[],
Network::Regtest => &[],
_ => &[],
Expand All @@ -114,7 +122,7 @@ pub fn latest_checkpoint_height(network: &Network, current_height: BlockHeight)
let points = match network {
Network::Bitcoin => BITCOIN,
Network::Testnet => TESTNET,
Network::Testnet4 => &[],
Network::Testnet4 => TESTNET4,
Network::Signet => &[],
Network::Regtest => &[],
_ => &[],
Expand Down
Loading
Loading