change: set NU5 mainnet activation height and current network protocol version (#4390)

* change: set NU5 mainnet activation height and minimum protocol version

* fix tests

* test if V5 coinbase expiry height is not bound by non-coinbase limit

* update get_blockchain_info snapshot for NU5

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
This commit is contained in:
Conrado Gouvea 2022-05-18 22:04:11 -03:00 committed by GitHub
parent 55822dda41
commit 9aaf0ed0ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 55 deletions

View File

@ -68,7 +68,7 @@ pub(super) const MAINNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)]
(block::Height(653_600), Blossom),
(block::Height(903_000), Heartwood),
(block::Height(1_046_400), Canopy),
// TODO: Add Nu5 mainnet activation height (#4115)
(block::Height(1_687_104), Nu5),
];
/// Fake mainnet network upgrade activation heights, used in tests.

View File

@ -279,9 +279,6 @@ async fn v5_transaction_is_rejected_before_nu5_activation() {
}
#[tokio::test]
// TODO: Remove `should_panic` once the NU5 activation height for mainnet has been
// defined.
#[should_panic]
async fn v5_transaction_is_accepted_after_nu5_activation_mainnet() {
v5_transaction_is_accepted_after_nu5_activation_for_network(Network::Mainnet).await
}
@ -571,7 +568,15 @@ async fn v4_coinbase_transaction_with_exceeding_expiry_height() {
service_fn(|_| async { unreachable!("State service should not be called") });
let verifier = Verifier::new(Network::Mainnet, state_service);
let block_height = block::Height::MAX;
// Use an arbitrary pre-NU5 block height.
// It can't be NU5-onward because the expiry height limit is not enforced
// for coinbase transactions (it needs to match the block height instead),
// which is what is used in this test.
let block_height = (NetworkUpgrade::Nu5
.activation_height(Network::Mainnet)
.expect("NU5 height must be set")
- 1)
.expect("will not underflow");
let (input, output) = mock_coinbase_transparent_output(block_height);
@ -1059,6 +1064,7 @@ async fn v5_coinbase_transaction_expiry_height() {
*new_transaction.expiry_height_mut() = new_expiry_height;
let result = verifier
.clone()
.oneshot(Request::Block {
transaction: Arc::new(new_transaction.clone()),
known_utxos: Arc::new(HashMap::new()),
@ -1075,6 +1081,29 @@ async fn v5_coinbase_transaction_expiry_height() {
transaction_hash: new_transaction.hash(),
})
);
// Test with matching heights again, but using a very high value
// that is greater than the limit for non-coinbase transactions,
// to ensure the limit is not being enforced for coinbase transactions.
let new_expiry_height = Height::MAX;
let mut new_transaction = transaction.clone();
*new_transaction.expiry_height_mut() = new_expiry_height;
let result = verifier
.clone()
.oneshot(Request::Block {
transaction: Arc::new(new_transaction.clone()),
known_utxos: Arc::new(HashMap::new()),
height: new_expiry_height,
time: chrono::MAX_DATETIME,
})
.await;
assert_eq!(
result.expect("unexpected error response").tx_id(),
new_transaction.unmined_id()
);
}
/// Tests if an expired non-coinbase V5 transaction is rejected.
@ -1170,52 +1199,6 @@ async fn v5_transaction_with_exceeding_expiry_height() {
);
}
/// Tests if a coinbase V5 transaction with an expiry height exceeding the
/// maximum is rejected.
#[tokio::test]
async fn v5_coinbase_transaction_with_exceeding_expiry_height() {
let state_service =
service_fn(|_| async { unreachable!("State service should not be called") });
let verifier = Verifier::new(Network::Mainnet, state_service);
let block_height = block::Height::MAX;
let (input, output) = mock_coinbase_transparent_output(block_height);
// This expiry height exceeds the maximum defined by the specification.
let expiry_height = block::Height(500_000_000);
// Create a coinbase V4 tx.
let transaction = Transaction::V5 {
inputs: vec![input],
outputs: vec![output],
lock_time: LockTime::unlocked(),
expiry_height,
sapling_shielded_data: None,
orchard_shielded_data: None,
network_upgrade: NetworkUpgrade::Nu5,
};
let result = verifier
.oneshot(Request::Block {
transaction: Arc::new(transaction.clone()),
known_utxos: Arc::new(HashMap::new()),
height: block_height,
time: chrono::MAX_DATETIME,
})
.await;
assert_eq!(
result,
Err(TransactionError::MaximumExpiryHeight {
expiry_height,
is_coinbase: true,
block_height,
transaction_hash: transaction.hash(),
})
);
}
/// Test if V5 coinbase transaction is accepted.
#[tokio::test]
async fn v5_coinbase_transaction_is_accepted() {

View File

@ -249,9 +249,7 @@ pub const USER_AGENT: &str = "/Zebra:1.0.0-beta.9/";
///
/// The current protocol version typically changes before Mainnet and Testnet
/// network upgrades.
//
// TODO: update to Nu5 mainnet (#4115)
pub const CURRENT_NETWORK_PROTOCOL_VERSION: Version = Version(170_050);
pub const CURRENT_NETWORK_PROTOCOL_VERSION: Version = Version(170_100);
/// The default RTT estimate for peer responses.
///

View File

@ -1,6 +1,5 @@
---
source: zebra-rpc/src/methods/tests/snapshot.rs
assertion_line: 177
expression: info
---
{
@ -33,6 +32,11 @@ expression: info
"name": "Canopy",
"activationheight": 1046400,
"status": "pending"
},
"c2d6d0b4": {
"name": "Nu5",
"activationheight": 1687104,
"status": "pending"
}
},
"consensus": {