use serde::{Deserialize, Serialize};
mod broadcast;
mod channel_actor_data;
mod channel_open;
mod invoice;
mod network;
mod payment;
mod timed_result;
#[cfg(feature = "cch")]
mod cch;
#[cfg(feature = "watchtower")]
mod watchtower;
pub trait StoreSample: Serialize + for<'de> Deserialize<'de> + Sized {
const STORE_PREFIX: u8;
const TYPE_NAME: &'static str;
fn samples(seed: u64) -> Vec<Self>;
fn verify_samples_roundtrip(seed: u64) {
let samples = Self::samples(seed);
assert!(
!samples.is_empty(),
"{}: samples() must return at least one sample",
Self::TYPE_NAME
);
for (i, sample) in samples.iter().enumerate() {
let bytes = bincode::serialize(sample).unwrap_or_else(|e| {
panic!("{} sample {}: serialize failed: {}", Self::TYPE_NAME, i, e)
});
let _roundtrip: Self = bincode::deserialize(&bytes).unwrap_or_else(|e| {
panic!(
"{} sample {}: deserialize failed: {}",
Self::TYPE_NAME,
i,
e
)
});
}
}
fn sample_bytes(seed: u64) -> Vec<Vec<u8>> {
Self::samples(seed)
.iter()
.map(|s| bincode::serialize(s).expect("serialization should not fail"))
.collect()
}
}
pub fn deterministic_hash(seed: u64, index: u32) -> [u8; 32] {
use ckb_hash::blake2b_256;
let mut input = Vec::with_capacity(12);
input.extend_from_slice(&seed.to_le_bytes());
input.extend_from_slice(&index.to_le_bytes());
blake2b_256(&input)
}
pub fn deterministic_seckey(seed: u64, index: u32) -> secp256k1::SecretKey {
let mut hash = deterministic_hash(seed, index);
hash[0] = ((hash[0] % 254) + 1) as u8;
secp256k1::SecretKey::from_slice(&hash).expect("deterministic_seckey should always be valid")
}
pub fn deterministic_pubkey(seed: u64, index: u32) -> crate::Pubkey {
let sk = deterministic_seckey(seed, index);
let pk = secp256k1::PublicKey::from_secret_key(secp256k1::SECP256K1, &sk);
pk.into()
}
pub fn deterministic_privkey(seed: u64, index: u32) -> crate::Privkey {
let sk = deterministic_seckey(seed, index);
sk.into()
}
pub fn deterministic_hash256(seed: u64, index: u32) -> crate::Hash256 {
deterministic_hash(seed, index).into()
}
pub fn deterministic_ecdsa_signature(seed: u64, index: u32) -> crate::protocol::EcdsaSignature {
use secp256k1::{Message, SECP256K1};
let sk = deterministic_seckey(seed, index);
let message = Message::from_digest_slice(&deterministic_hash(seed, index.wrapping_add(1000)))
.expect("32 bytes");
let signature = SECP256K1.sign_ecdsa(&message, &sk);
crate::protocol::EcdsaSignature(signature)
}
pub fn deterministic_schnorr_signature(seed: u64, index: u32) -> secp256k1::schnorr::Signature {
use secp256k1::{Keypair, SECP256K1};
let sk = deterministic_seckey(seed, index);
let keypair = Keypair::from_secret_key(SECP256K1, &sk);
let msg_bytes = deterministic_hash(seed, index.wrapping_add(2000));
SECP256K1.sign_schnorr_no_aux_rand(&msg_bytes, &keypair)
}
pub fn deterministic_xonly_pubkey(seed: u64, index: u32) -> secp256k1::XOnlyPublicKey {
use secp256k1::{Keypair, SECP256K1};
let sk = deterministic_seckey(seed, index);
let keypair = Keypair::from_secret_key(SECP256K1, &sk);
secp256k1::XOnlyPublicKey::from_keypair(&keypair).0
}
pub fn deterministic_outpoint(seed: u64, index: u32) -> ckb_types::packed::OutPoint {
use ckb_types::prelude::Pack;
let hash = deterministic_hash(seed, index);
let tx_hash: ckb_types::packed::Byte32 = hash.pack();
ckb_types::packed::OutPoint::new(tx_hash, 0)
}
pub fn deterministic_recoverable_signature(
seed: u64,
index: u32,
) -> secp256k1::ecdsa::RecoverableSignature {
use secp256k1::{Message, SECP256K1};
let sk = deterministic_seckey(seed, index);
let message = Message::from_digest_slice(&deterministic_hash(seed, index.wrapping_add(3000)))
.expect("32 bytes");
SECP256K1.sign_ecdsa_recoverable(&message, &sk)
}
pub fn deterministic_pub_nonce(seed: u64, index: u32) -> musig2::PubNonce {
let hash = deterministic_hash(seed, index);
let sec_nonce = musig2::SecNonceBuilder::new(hash).build();
sec_nonce.public_nonce()
}