Skip to content

Commit

Permalink
[bitcoin-move] Introduce BBNStakeSeal (#2743)
Browse files Browse the repository at this point in the history
* [bitcoin-move] Introduce BBNStakeSeal

* [bitcoin-move] Add BBNStakeSeal functions

* [types] Add bbn rust module

* add try_get_bbn_op_return_data_from_tx_bytes

* [bitcoin] Fix bbn

* Add tests to bbn

* implement bbn rust

* [bitcoin] Improve ScriptBuf and BitcoinAddress

* [bbm] fix and add tests

* fixup
  • Loading branch information
jolestar authored Oct 14, 2024
1 parent bfac5e7 commit 9cac05c
Show file tree
Hide file tree
Showing 16 changed files with 2,615 additions and 260 deletions.
73 changes: 73 additions & 0 deletions crates/rooch-framework-tests/src/tests/bbn_test.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// Copyright (c) RoochNetwork
// SPDX-License-Identifier: Apache-2.0

use crate::{
binding_test, bitcoin_block_tester::BitcoinBlockTester,
tests::bitcoin_data::bitcoin_tx_from_hex,
};
use moveos_types::{module_binding::MoveFunctionCaller, state_resolver::StateResolver};
use rooch_types::bitcoin::bbn::{BBNGlobalParams, BBNStakingInfo};
use tracing::{debug, warn};

// Test Babylon v3 transaction
#[tokio::test]
async fn test_block_864790() {
let _ = tracing_subscriber::fmt::try_init();

if cfg!(debug_assertions) {
warn!("test_block_864790 is ignored in debug mode, please run it in release mode");
return;
}

let mut tester = BitcoinBlockTester::new(864790).unwrap();
tester.execute().unwrap();
tester.verify_utxo().unwrap();
//TODO verify bbn tx
}

#[tokio::test]
async fn test_bbn_tx() {
let _ = tracing_subscriber::fmt::try_init();
//https://mempool.space/api/tx/a5daf25b85f82de6f93bc08c19abc3d45beeef3fd6d3dac69bf641c061bdcbec/hex
let tx_hex = "0200000000010499ba804a3414488a46292c42ff1f0f97442bab1ae23d2938dc8a74aa90f07a0800000000000000000003b49a402e959c792da224f49fd84b765043b48fe9744644a526ff9307765ab30000000000000000004cbc8d18517f2c14b0f08c3c8ef183be9d71d10ed63d2c73449c1b8722faccec0000000000000000000dcec7eb4d68bc0af0b923da4bc14c3d45979f7f17edad60e86544c1c07bebcb0000000000000000000300f469b302000000225120ed35a2a991b991c670ec4728df36e55bbf2f3b67f0182619a3e4473ff1879eda0000000000000000496a4762626e31003fc003f3c3f8e274a16b0aae4088ab533f51d4fa45b7af6edd7127ed173e9cb6609b4b8e27e214fd830e69a83a8270a03f7af356f64dde433a7e4b81b2399806fa004890d402000000002251203fc003f3c3f8e274a16b0aae4088ab533f51d4fa45b7af6edd7127ed173e9cb6014084c28ece72b1aa6da758204758013e64bd237cb9be82a861c1d8cf7f59bd2d5bb48fb0eb3e4ce65fd760a343916ff00ad933d49e82b2cf241e8dfa524d536432014006c15b6fee726bfce233b34677fef35a998384ebe8f50a9c858d80f78c4a9f7b081d996e8147096ceb7ad3e89bca79be22b2b2dc0ba9ab0d12ae859efa203c930140f41bb646a690d620c51c16134fce8d2d1e124becbc27361571530431817fd4a44cf4a3656b442254deb6ac893a53edd08acb8f8feeb45e04c221426f5de908f701403f01a045611e777e4a66c453e927c1c2307f4efae606458bd9f7415c9fd143d8e0d8445935795dc7e28c7edd00ef0996952a39a3f7142d721b0fba5cc0a62d6a15320d00";
let tx = bitcoin_tx_from_hex(tx_hex);

debug!(
"OP_RETURN data: {}",
hex::encode(tx.output[1].script_pubkey.as_bytes())
);
let binding_test = binding_test::RustBindingTest::new().unwrap();
let bbn_module = binding_test.as_module_binding::<rooch_types::bitcoin::bbn::BBNModule>();
let op_return_output_opt = bbn_module.try_get_bbn_op_return_ouput(tx.clone()).unwrap();
assert!(op_return_output_opt.is_some());
let op_return_output = op_return_output_opt.unwrap();
debug!("op_return_output: {:?}", op_return_output);
assert_eq!(op_return_output.op_return_output_idx, 1);
let bbn_global_params = binding_test
.get_object(&BBNGlobalParams::object_id())
.unwrap()
.unwrap()
.value_as::<BBNGlobalParams>()
.unwrap();
let bbn_global_param = bbn_global_params.get_global_param(1).unwrap();
let staking_info = BBNStakingInfo::build_staking_info(
&op_return_output.op_return_data.staker_pub_key().unwrap(),
&[op_return_output
.op_return_data
.finality_provider_pub_key()
.unwrap()],
&bbn_global_param.get_covenant_pks(),
bbn_global_param.covenant_quorum,
op_return_output.op_return_data.staking_time,
0,
)
.unwrap();
let staking_output_pk_script = staking_info.staking_output.script_pubkey;
let staking_output_opt = bbn_module
.try_get_bbn_staking_output(tx, &staking_output_pk_script)
.unwrap();
assert!(staking_output_opt.is_some());
let staking_output = staking_output_opt.unwrap();
debug!("staking_output: {:?}", staking_output);
assert_eq!(staking_output, 0);
}
1 change: 1 addition & 0 deletions crates/rooch-framework-tests/src/tests/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) RoochNetwork
// SPDX-License-Identifier: Apache-2.0

mod bbn_test;
mod bitcoin_data;
mod bitcoin_multisign_validator_tests;
mod bitcoin_test;
Expand Down
Binary file not shown.
16 changes: 16 additions & 0 deletions crates/rooch-types/src/address.rs
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,14 @@ impl BitcoinAddress {
Ok(addr)
}

pub fn pay_load_type(&self) -> BitcoinAddressPayloadType {
BitcoinAddressPayloadType::try_from(self.bytes[0]).unwrap()
}

pub fn pay_load(&self) -> &[u8] {
&self.bytes[1..]
}

pub fn script_pubkey(&self) -> Result<bitcoin::ScriptBuf> {
let bitcoin_address = self.to_bitcoin_address(network::Network::Bitcoin)?;
Ok(bitcoin_address.script_pubkey())
Expand Down Expand Up @@ -1402,4 +1410,12 @@ mod test {
let bitcoin_address = BitcoinAddress::from(script);
assert_eq!(BitcoinAddress::default(), bitcoin_address);
}

#[test]
fn test_p2pkh() {
let addr = BitcoinAddress::from_str("1QJVDzdqb1VpbDK7uDeyVXy9mR27CJiyhY").unwrap();
assert_eq!(addr.pay_load_type(), BitcoinAddressPayloadType::PubkeyHash);
let payload = addr.pay_load();
println!("test_p2pkh payload len: {}", payload.len());
}
}
Loading

0 comments on commit 9cac05c

Please sign in to comment.