From 4da9459b140fb160cbd128f17e06840685a6d927 Mon Sep 17 00:00:00 2001 From: xjd Date: Wed, 22 Nov 2023 10:29:22 +0800 Subject: [PATCH] Init commit (#2) * Initial commit --- .github/workflows/rust.yml | 16 + .gitignore | 21 +- .vscode/settings.json | 4 + Cargo.lock | 109 + Cargo.toml | 18 + Cross.toml | 5 + Makefile | 21 + README.md | 18 + build/.gitkeep | 0 build/auth | Bin 0 -> 140696 bytes capsule.toml | 13 + ckb-typed-message/Cargo.toml | 11 + ckb-typed-message/README.md | 5 + ckb-typed-message/src/blake2b.rs | 18 + ckb-typed-message/src/lib.rs | 229 + ckb-typed-message/src/schemas/basic.rs | 3965 +++++++++++++++++ ckb-typed-message/src/schemas/blockchain.rs | 10 + ckb-typed-message/src/schemas/mod.rs | 3 + ckb-typed-message/src/schemas/top_level.rs | 365 ++ contracts/.gitkeep | 0 contracts/typed-message-lock-demo/Cargo.toml | 13 + contracts/typed-message-lock-demo/README.md | 27 + .../typed-message-lock-demo/src/entry.rs | 41 + .../typed-message-lock-demo/src/error.rs | 38 + contracts/typed-message-lock-demo/src/main.rs | 31 + deployment.toml | 27 + rust-toolchain | 1 + schemas/basic.mol | 70 + schemas/blockchain.mol | 119 + schemas/top_level.mol | 8 + tests/Cargo.lock | 1330 ++++++ tests/Cargo.toml | 9 + tests/src/lib.rs | 69 + tests/src/tests.rs | 119 + 34 files changed, 6721 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/rust.yml create mode 100644 .vscode/settings.json create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 Cross.toml create mode 100644 Makefile create mode 100644 README.md create mode 100644 build/.gitkeep create mode 100755 build/auth create mode 100644 capsule.toml create mode 100644 ckb-typed-message/Cargo.toml create mode 100644 ckb-typed-message/README.md create mode 100644 ckb-typed-message/src/blake2b.rs create mode 100644 ckb-typed-message/src/lib.rs create mode 100644 ckb-typed-message/src/schemas/basic.rs create mode 100644 ckb-typed-message/src/schemas/blockchain.rs create mode 100644 ckb-typed-message/src/schemas/mod.rs create mode 100644 ckb-typed-message/src/schemas/top_level.rs create mode 100644 contracts/.gitkeep create mode 100644 contracts/typed-message-lock-demo/Cargo.toml create mode 100644 contracts/typed-message-lock-demo/README.md create mode 100644 contracts/typed-message-lock-demo/src/entry.rs create mode 100644 contracts/typed-message-lock-demo/src/error.rs create mode 100644 contracts/typed-message-lock-demo/src/main.rs create mode 100644 deployment.toml create mode 100644 rust-toolchain create mode 100644 schemas/basic.mol create mode 100644 schemas/blockchain.mol create mode 100644 schemas/top_level.mol create mode 100644 tests/Cargo.lock create mode 100644 tests/Cargo.toml create mode 100644 tests/src/lib.rs create mode 100644 tests/src/tests.rs diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 0000000..5397910 --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,16 @@ +name: Rust + +on: [push, pull_request] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Run installation + run: make install + - name: Run CI + run: make ci + \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6985cf1..2eb9fd3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,11 @@ -# Generated by Cargo -# will have compiled files and executables -debug/ -target/ +# Rust +target +.cache/.cargo/* -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock +# C +contracts/c/build/* -# These are backup files generated by rustfmt -**/*.rs.bk - -# MSVC Windows builds of rustc generate these, which store debugging information -*.pdb +# others +build/* +!.gitkeep +.tmp/ diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3e6e763 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "rust-analyzer.cargo.target": "riscv64imac-unknown-none-elf" +} + diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..7fdeefa --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,109 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "blake2b-ref" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "294d17c72e0ba59fad763caa112368d0672083779cdebbb97164f4bb4c1e339a" + +[[package]] +name = "buddy-alloc" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f0d2da64a6a895d5a7e0724882825d50f83c13396b1b9f1878e19a024bab395" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "ckb-auth-rs" +version = "0.1.0" +source = "git+https://github.com/nervosnetwork/ckb-auth.git?rev=df6e9ef#df6e9ef0e7ef3c83b6165e1ba180bf5a84a882ad" +dependencies = [ + "ckb-std", + "hex", + "log", +] + +[[package]] +name = "ckb-standalone-types" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5c776d70eb4f60a22a3180857646d77b2da8d33c0c4a063ad9f6610fc94609f" +dependencies = [ + "blake2b-ref", + "cfg-if", + "molecule", +] + +[[package]] +name = "ckb-std" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a08518aa0fd4ce069d3ec80b63dcd3d6543ad3805ad1c0b4e1d8e4d38f8a9fc" +dependencies = [ + "buddy-alloc", + "cc", + "ckb-standalone-types", +] + +[[package]] +name = "ckb-typed-message" +version = "0.1.0" +dependencies = [ + "blake2b-ref", + "ckb-std", + "molecule", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "libc" +version = "0.2.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "molecule" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd9767ab5e5f2ea40f71ff4c8bdb633c50509052e093c2fdd0e390a749dfa3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "typed-message-lock-demo" +version = "0.1.0" +dependencies = [ + "blake2b-ref", + "ckb-auth-rs", + "ckb-std", + "ckb-typed-message", + "molecule", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..6a79e91 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,18 @@ +[workspace] +members = ["ckb-typed-message", "contracts/typed-message-lock-demo"] +exclude = ["tests"] + +[profile.release] +overflow-checks = true +opt-level = 3 +panic = 'abort' +strip = true +lto = true +debug-assertions = true + +[profile.dev] +strip = true +opt-level = 1 +debug = false +panic = 'abort' +debug-assertions = true diff --git a/Cross.toml b/Cross.toml new file mode 100644 index 0000000..278f31b --- /dev/null +++ b/Cross.toml @@ -0,0 +1,5 @@ +[build] +default-target = "riscv64imac-unknown-none-elf" + +[target.riscv64imac-unknown-none-elf] +image = "nervos/ckb-riscv-gnu-toolchain:focal-20230214" diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..74915ea --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ + + +all: + capsule build --release + +mol: + moleculec --language rust --schema-file schemas/basic.mol > ckb-typed-message/src/schemas/basic.rs + moleculec --language rust --schema-file schemas/top_level.mol > ckb-typed-message/src/schemas/top_level.rs + cargo fmt + +install: + rustup target add riscv64imac-unknown-none-elf + cargo install cross --git https://github.com/cross-rs/cross + wget 'https://github.com/nervosnetwork/capsule/releases/download/v0.10.2/capsule_v0.10.2_x86_64-linux.tar.gz' + tar zxvf capsule_v0.10.2_x86_64-linux.tar.gz + mv capsule_v0.10.2_x86_64-linux/capsule ~/.cargo/bin + cargo install moleculec@0.7.5 --locked + +ci: + capsule build --release + cd tests && cargo test && cd .. diff --git a/README.md b/README.md new file mode 100644 index 0000000..82c28c0 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# ckb-typed-message(PoC) +This project is a proof of concept that aims to demonstrate how to adopt typed +messages (similar to EIP-712) in scripts. It also includes extended witnesses to +simplify signing and DApp interoperability. + + +## Build +Build contracts: + +``` sh +capsule build +``` + +Run tests: + +``` sh +capsule test +``` diff --git a/build/.gitkeep b/build/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/build/auth b/build/auth new file mode 100755 index 0000000000000000000000000000000000000000..493f0a1c3b1f0df41bf8b0639247e2749f930870 GIT binary patch literal 140696 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 z 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 XB}cXN*PUv^^cpFj*}oCh2h0Bp0vyu~ literal 0 HcmV?d00001 diff --git a/capsule.toml b/capsule.toml new file mode 100644 index 0000000..969e0fd --- /dev/null +++ b/capsule.toml @@ -0,0 +1,13 @@ +# [rust] +# # path of rust contracts workspace directory, +# # a `Cargo.toml` file is expected under the directory. +# workspace_dir = "." + +# capsule version +version = "0.10.2 5e49142" +# path of deployment config file +deployment = "deployment.toml" + +[[contracts]] +name = "typed-message-lock-demo" +template_type = "Rust" diff --git a/ckb-typed-message/Cargo.toml b/ckb-typed-message/Cargo.toml new file mode 100644 index 0000000..8ab5b26 --- /dev/null +++ b/ckb-typed-message/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "ckb-typed-message" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +blake2b-ref = "0.3.1" +ckb-std = { version = "0.14.3", default-features = false, features = ["ckb-types", "calc-hash"] } +molecule = { version = "0.7.5", default-features = false } diff --git a/ckb-typed-message/README.md b/ckb-typed-message/README.md new file mode 100644 index 0000000..0706e7e --- /dev/null +++ b/ckb-typed-message/README.md @@ -0,0 +1,5 @@ + +This is a library used for writing scripts that are intended to support typed +messages on CKB. + + diff --git a/ckb-typed-message/src/blake2b.rs b/ckb-typed-message/src/blake2b.rs new file mode 100644 index 0000000..dbaf067 --- /dev/null +++ b/ckb-typed-message/src/blake2b.rs @@ -0,0 +1,18 @@ +pub use blake2b_ref::{Blake2b, Blake2bBuilder}; + +pub const CKB_PERSONALIZATION: &[u8] = b"ckb-default-hash"; + +pub fn new_blake2b() -> Blake2b { + Blake2bBuilder::new(32) + .personal(CKB_PERSONALIZATION) + .build() +} + +pub fn hash(bytes: &[u8]) -> [u8; 32] { + let mut hasher = new_blake2b(); + hasher.update(bytes); + + let mut hash = [0u8; 32]; + hasher.finalize(&mut hash); + hash +} diff --git a/ckb-typed-message/src/lib.rs b/ckb-typed-message/src/lib.rs new file mode 100644 index 0000000..47dd782 --- /dev/null +++ b/ckb-typed-message/src/lib.rs @@ -0,0 +1,229 @@ +#![no_std] +extern crate alloc; +pub mod blake2b; +pub mod schemas; + +use alloc::vec::Vec; +use blake2b::new_blake2b; +use ckb_std::{ + ckb_constants::Source, + error::SysError, + high_level::{load_input_since, load_tx_hash, load_witness}, +}; +use molecule::{ + error::VerificationError, + prelude::{Entity, Reader}, +}; +use schemas::{ + basic::SighashWithAction, + top_level::{ + ExtendedWitness, ExtendedWitnessReader, ExtendedWitnessUnion, ExtendedWitnessUnionReader, + }, +}; + +#[derive(Eq, PartialEq, Debug, Clone, Copy)] +pub enum Error { + Sys(SysError), + DuplicateAction, + MoleculeEncoding, + WrongSighashWithAction, +} + +impl From for Error { + fn from(e: SysError) -> Self { + Error::Sys(e) + } +} + +impl From for Error { + fn from(_: VerificationError) -> Self { + Error::MoleculeEncoding + } +} +/// +/// A single transaction must have only one SighashWithAction +/// +pub fn check_sighash_with_action() -> Result<(), Error> { + let mut i = 0; + let mut found = false; + loop { + match load_witness(i, Source::Input) { + Ok(witness) => { + if let Ok(r) = ExtendedWitnessReader::from_slice(&witness) { + if let ExtendedWitnessUnionReader::SighashWithAction(_) = r.to_enum() { + if found { + return Err(Error::DuplicateAction); + } else { + found = true; + } + } + } + } + Err(SysError::IndexOutOfBound) => break, + Err(e) => return Err(e.into()), + } + i += 1; + } + if found { + return Ok(()); + } else { + return Err(Error::WrongSighashWithAction); + } +} + +/// +/// Fetch the corresponding ExtendedWitness( Sighash or SighashWithAction) +/// Used by lock script with typed message support +/// +pub fn fetch_sighash() -> Result { + match load_witness(0, Source::GroupInput) { + Ok(witness) => { + if let Ok(r) = ExtendedWitnessReader::from_slice(&witness) { + match r.to_enum() { + ExtendedWitnessUnionReader::SighashWithAction(_) + | ExtendedWitnessUnionReader::Sighash(_) => return Ok(r.to_entity()), + _ => { + return Err(Error::MoleculeEncoding); + } + } + } else { + return Err(Error::MoleculeEncoding); + } + } + Err(e) => return Err(e.into()), + } +} + +/// +/// Search the only SighashWithAction from all witnesses. +/// +pub fn search_sighash_with_action() -> Result { + let mut i = 0; + let mut result = None; + // Look for the first SighashWithAction witness + while result.is_none() { + match load_witness(i, Source::Input) { + Ok(witness) => { + if let Ok(r) = ExtendedWitnessReader::from_slice(&witness) { + if let ExtendedWitnessUnionReader::SighashWithAction(s) = r.to_enum() { + result = Some(s.to_entity()); + } + } + } + Err(SysError::IndexOutOfBound) => break, + Err(e) => return Err(e.into()), + }; + i += 1; + } + if result.is_some() { + return Ok(result.unwrap()); + } else { + return Err(Error::WrongSighashWithAction); + } +} + +// +// Rule for hashing: +// 1. Variable length data should hash the length. +// 2. Fixed length data don't need to hash the length. +// +pub fn generate_skeleton_hash() -> Result<[u8; 32], Error> { + let mut hasher = new_blake2b(); + hasher.update(&load_tx_hash()?); + + let mut i = calculate_inputs_len()?; + loop { + match load_witness(i, Source::Input) { + Ok(w) => { + hasher.update(&(w.len() as u64).to_le_bytes()); + hasher.update(&w); + } + Err(SysError::IndexOutOfBound) => { + break; + } + Err(e) => return Err(e.into()), + } + i += 1; + } + + let mut output = [0u8; 32]; + hasher.finalize(&mut output); + + Ok(output) +} + +pub fn generate_final_hash(skeleton_hash: &[u8; 32], typed_message: &[u8]) -> [u8; 32] { + let mut hasher = new_blake2b(); + hasher.update(&skeleton_hash[..]); + hasher.update(&(typed_message.len() as u64).to_le_bytes()); + hasher.update(typed_message); + let mut output = [0u8; 32]; + hasher.finalize(&mut output); + return output; +} + +// Translated from https://github.com/nervosnetwork/ckb-system-scripts/blob/a7b7c75662ed950c9bd024e15f83ce702a54996e/c/common.h#L32-L66 +fn calculate_inputs_len() -> Result { + let mut lo = 0; + let mut hi = 4; + + // The code below can't handle the scenario when input length is zero. + let first_available = load_input_since(0, Source::Input); + if first_available.is_err() { + return Ok(0); + } + + loop { + match load_input_since(hi, Source::Input) { + Ok(_) => { + lo = hi; + hi *= 2; + } + Err(SysError::IndexOutOfBound) => { + break; + } + Err(e) => return Err(e), + } + } + + while (lo + 1) != hi { + let i = (lo + hi) / 2; + match load_input_since(i, Source::Input) { + Ok(_) => { + lo = i; + } + Err(SysError::IndexOutOfBound) => { + hi = i; + } + Err(e) => return Err(e), + } + } + + Ok(hi) +} + +/// +/// parse transaction with typed message and return 2 values: +/// 1. digest message, 32 bytes message for signature verification +/// 2. lock, lock field in SighashWithAction or Sighash. Normally as signature. +/// +pub fn parse_typed_message() -> Result<([u8; 32], Vec), Error> { + // Ensure that a SighashWitAction is present throughout the entire transaction + check_sighash_with_action()?; + // There are 2 possible values: Sighash or SighashWithAction + let witness = fetch_sighash()?; + let (lock, typed_message) = match witness.to_enum() { + ExtendedWitnessUnion::SighashWithAction(s) => (s.lock(), s.message()), + ExtendedWitnessUnion::Sighash(s) => { + let sighash_with_action = search_sighash_with_action()?; + (s.lock(), sighash_with_action.message()) + } + _ => { + return Err(Error::WrongSighashWithAction); + } + }; + let skeleton_hash = generate_skeleton_hash()?; + let digest_message = generate_final_hash(&skeleton_hash, typed_message.as_slice()); + let lock = lock.as_slice(); + Ok((digest_message, lock.to_vec())) +} diff --git a/ckb-typed-message/src/schemas/basic.rs b/ckb-typed-message/src/schemas/basic.rs new file mode 100644 index 0000000..b6ae6af --- /dev/null +++ b/ckb-typed-message/src/schemas/basic.rs @@ -0,0 +1,3965 @@ +// Generated by Molecule 0.7.5 + +use super::blockchain::*; +use molecule::prelude::*; +#[derive(Clone)] +pub struct String(molecule::bytes::Bytes); +impl ::core::fmt::LowerHex for String { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + use molecule::hex_string; + if f.alternate() { + write!(f, "0x")?; + } + write!(f, "{}", hex_string(self.as_slice())) + } +} +impl ::core::fmt::Debug for String { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + write!(f, "{}({:#x})", Self::NAME, self) + } +} +impl ::core::fmt::Display for String { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + use molecule::hex_string; + let raw_data = hex_string(&self.raw_data()); + write!(f, "{}(0x{})", Self::NAME, raw_data) + } +} +impl ::core::default::Default for String { + fn default() -> Self { + let v = molecule::bytes::Bytes::from_static(&Self::DEFAULT_VALUE); + String::new_unchecked(v) + } +} +impl String { + const DEFAULT_VALUE: [u8; 4] = [0, 0, 0, 0]; + pub const ITEM_SIZE: usize = 1; + pub fn total_size(&self) -> usize { + molecule::NUMBER_SIZE + Self::ITEM_SIZE * self.item_count() + } + pub fn item_count(&self) -> usize { + molecule::unpack_number(self.as_slice()) as usize + } + pub fn len(&self) -> usize { + self.item_count() + } + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + pub fn get(&self, idx: usize) -> Option { + if idx >= self.len() { + None + } else { + Some(self.get_unchecked(idx)) + } + } + pub fn get_unchecked(&self, idx: usize) -> Byte { + let start = molecule::NUMBER_SIZE + Self::ITEM_SIZE * idx; + let end = start + Self::ITEM_SIZE; + Byte::new_unchecked(self.0.slice(start..end)) + } + pub fn raw_data(&self) -> molecule::bytes::Bytes { + self.0.slice(molecule::NUMBER_SIZE..) + } + pub fn as_reader<'r>(&'r self) -> StringReader<'r> { + StringReader::new_unchecked(self.as_slice()) + } +} +impl molecule::prelude::Entity for String { + type Builder = StringBuilder; + const NAME: &'static str = "String"; + fn new_unchecked(data: molecule::bytes::Bytes) -> Self { + String(data) + } + fn as_bytes(&self) -> molecule::bytes::Bytes { + self.0.clone() + } + fn as_slice(&self) -> &[u8] { + &self.0[..] + } + fn from_slice(slice: &[u8]) -> molecule::error::VerificationResult { + StringReader::from_slice(slice).map(|reader| reader.to_entity()) + } + fn from_compatible_slice(slice: &[u8]) -> molecule::error::VerificationResult { + StringReader::from_compatible_slice(slice).map(|reader| reader.to_entity()) + } + fn new_builder() -> Self::Builder { + ::core::default::Default::default() + } + fn as_builder(self) -> Self::Builder { + Self::new_builder().extend(self.into_iter()) + } +} +#[derive(Clone, Copy)] +pub struct StringReader<'r>(&'r [u8]); +impl<'r> ::core::fmt::LowerHex for StringReader<'r> { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + use molecule::hex_string; + if f.alternate() { + write!(f, "0x")?; + } + write!(f, "{}", hex_string(self.as_slice())) + } +} +impl<'r> ::core::fmt::Debug for StringReader<'r> { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + write!(f, "{}({:#x})", Self::NAME, self) + } +} +impl<'r> ::core::fmt::Display for StringReader<'r> { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + use molecule::hex_string; + let raw_data = hex_string(&self.raw_data()); + write!(f, "{}(0x{})", Self::NAME, raw_data) + } +} +impl<'r> StringReader<'r> { + pub const ITEM_SIZE: usize = 1; + pub fn total_size(&self) -> usize { + molecule::NUMBER_SIZE + Self::ITEM_SIZE * self.item_count() + } + pub fn item_count(&self) -> usize { + molecule::unpack_number(self.as_slice()) as usize + } + pub fn len(&self) -> usize { + self.item_count() + } + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + pub fn get(&self, idx: usize) -> Option> { + if idx >= self.len() { + None + } else { + Some(self.get_unchecked(idx)) + } + } + pub fn get_unchecked(&self, idx: usize) -> ByteReader<'r> { + let start = molecule::NUMBER_SIZE + Self::ITEM_SIZE * idx; + let end = start + Self::ITEM_SIZE; + ByteReader::new_unchecked(&self.as_slice()[start..end]) + } + pub fn raw_data(&self) -> &'r [u8] { + &self.as_slice()[molecule::NUMBER_SIZE..] + } +} +impl<'r> molecule::prelude::Reader<'r> for StringReader<'r> { + type Entity = String; + const NAME: &'static str = "StringReader"; + fn to_entity(&self) -> Self::Entity { + Self::Entity::new_unchecked(self.as_slice().to_owned().into()) + } + fn new_unchecked(slice: &'r [u8]) -> Self { + StringReader(slice) + } + fn as_slice(&self) -> &'r [u8] { + self.0 + } + fn verify(slice: &[u8], _compatible: bool) -> molecule::error::VerificationResult<()> { + use molecule::verification_error as ve; + let slice_len = slice.len(); + if slice_len < molecule::NUMBER_SIZE { + return ve!(Self, HeaderIsBroken, molecule::NUMBER_SIZE, slice_len); + } + let item_count = molecule::unpack_number(slice) as usize; + if item_count == 0 { + if slice_len != molecule::NUMBER_SIZE { + return ve!(Self, TotalSizeNotMatch, molecule::NUMBER_SIZE, slice_len); + } + return Ok(()); + } + let total_size = molecule::NUMBER_SIZE + Self::ITEM_SIZE * item_count; + if slice_len != total_size { + return ve!(Self, TotalSizeNotMatch, total_size, slice_len); + } + Ok(()) + } +} +#[derive(Debug, Default)] +pub struct StringBuilder(pub(crate) Vec); +impl StringBuilder { + pub const ITEM_SIZE: usize = 1; + pub fn set(mut self, v: Vec) -> Self { + self.0 = v; + self + } + pub fn push(mut self, v: Byte) -> Self { + self.0.push(v); + self + } + pub fn extend>(mut self, iter: T) -> Self { + for elem in iter { + self.0.push(elem); + } + self + } + pub fn replace(&mut self, index: usize, v: Byte) -> Option { + self.0 + .get_mut(index) + .map(|item| ::core::mem::replace(item, v)) + } +} +impl molecule::prelude::Builder for StringBuilder { + type Entity = String; + const NAME: &'static str = "StringBuilder"; + fn expected_length(&self) -> usize { + molecule::NUMBER_SIZE + Self::ITEM_SIZE * self.0.len() + } + fn write(&self, writer: &mut W) -> molecule::io::Result<()> { + writer.write_all(&molecule::pack_number(self.0.len() as molecule::Number))?; + for inner in &self.0[..] { + writer.write_all(inner.as_slice())?; + } + Ok(()) + } + fn build(&self) -> Self::Entity { + let mut inner = Vec::with_capacity(self.expected_length()); + self.write(&mut inner) + .unwrap_or_else(|_| panic!("{} build should be ok", Self::NAME)); + String::new_unchecked(inner.into()) + } +} +pub struct StringIterator(String, usize, usize); +impl ::core::iter::Iterator for StringIterator { + type Item = Byte; + fn next(&mut self) -> Option { + if self.1 >= self.2 { + None + } else { + let ret = self.0.get_unchecked(self.1); + self.1 += 1; + Some(ret) + } + } +} +impl ::core::iter::ExactSizeIterator for StringIterator { + fn len(&self) -> usize { + self.2 - self.1 + } +} +impl ::core::iter::IntoIterator for String { + type Item = Byte; + type IntoIter = StringIterator; + fn into_iter(self) -> Self::IntoIter { + let len = self.len(); + StringIterator(self, 0, len) + } +} +#[derive(Clone)] +pub struct Address(molecule::bytes::Bytes); +impl ::core::fmt::LowerHex for Address { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + use molecule::hex_string; + if f.alternate() { + write!(f, "0x")?; + } + write!(f, "{}", hex_string(self.as_slice())) + } +} +impl ::core::fmt::Debug for Address { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + write!(f, "{}({:#x})", Self::NAME, self) + } +} +impl ::core::fmt::Display for Address { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + write!(f, "{}(", Self::NAME)?; + self.to_enum().display_inner(f)?; + write!(f, ")") + } +} +impl ::core::default::Default for Address { + fn default() -> Self { + let v = molecule::bytes::Bytes::from_static(&Self::DEFAULT_VALUE); + Address::new_unchecked(v) + } +} +impl Address { + const DEFAULT_VALUE: [u8; 57] = [ + 0, 0, 0, 0, 53, 0, 0, 0, 16, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + pub const ITEMS_COUNT: usize = 1; + pub fn item_id(&self) -> molecule::Number { + molecule::unpack_number(self.as_slice()) + } + pub fn to_enum(&self) -> AddressUnion { + let inner = self.0.slice(molecule::NUMBER_SIZE..); + match self.item_id() { + 0 => Script::new_unchecked(inner).into(), + _ => panic!("{}: invalid data", Self::NAME), + } + } + pub fn as_reader<'r>(&'r self) -> AddressReader<'r> { + AddressReader::new_unchecked(self.as_slice()) + } +} +impl molecule::prelude::Entity for Address { + type Builder = AddressBuilder; + const NAME: &'static str = "Address"; + fn new_unchecked(data: molecule::bytes::Bytes) -> Self { + Address(data) + } + fn as_bytes(&self) -> molecule::bytes::Bytes { + self.0.clone() + } + fn as_slice(&self) -> &[u8] { + &self.0[..] + } + fn from_slice(slice: &[u8]) -> molecule::error::VerificationResult { + AddressReader::from_slice(slice).map(|reader| reader.to_entity()) + } + fn from_compatible_slice(slice: &[u8]) -> molecule::error::VerificationResult { + AddressReader::from_compatible_slice(slice).map(|reader| reader.to_entity()) + } + fn new_builder() -> Self::Builder { + ::core::default::Default::default() + } + fn as_builder(self) -> Self::Builder { + Self::new_builder().set(self.to_enum()) + } +} +#[derive(Clone, Copy)] +pub struct AddressReader<'r>(&'r [u8]); +impl<'r> ::core::fmt::LowerHex for AddressReader<'r> { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + use molecule::hex_string; + if f.alternate() { + write!(f, "0x")?; + } + write!(f, "{}", hex_string(self.as_slice())) + } +} +impl<'r> ::core::fmt::Debug for AddressReader<'r> { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + write!(f, "{}({:#x})", Self::NAME, self) + } +} +impl<'r> ::core::fmt::Display for AddressReader<'r> { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + write!(f, "{}(", Self::NAME)?; + self.to_enum().display_inner(f)?; + write!(f, ")") + } +} +impl<'r> AddressReader<'r> { + pub const ITEMS_COUNT: usize = 1; + pub fn item_id(&self) -> molecule::Number { + molecule::unpack_number(self.as_slice()) + } + pub fn to_enum(&self) -> AddressUnionReader<'r> { + let inner = &self.as_slice()[molecule::NUMBER_SIZE..]; + match self.item_id() { + 0 => ScriptReader::new_unchecked(inner).into(), + _ => panic!("{}: invalid data", Self::NAME), + } + } +} +impl<'r> molecule::prelude::Reader<'r> for AddressReader<'r> { + type Entity = Address; + const NAME: &'static str = "AddressReader"; + fn to_entity(&self) -> Self::Entity { + Self::Entity::new_unchecked(self.as_slice().to_owned().into()) + } + fn new_unchecked(slice: &'r [u8]) -> Self { + AddressReader(slice) + } + fn as_slice(&self) -> &'r [u8] { + self.0 + } + fn verify(slice: &[u8], compatible: bool) -> molecule::error::VerificationResult<()> { + use molecule::verification_error as ve; + let slice_len = slice.len(); + if slice_len < molecule::NUMBER_SIZE { + return ve!(Self, HeaderIsBroken, molecule::NUMBER_SIZE, slice_len); + } + let item_id = molecule::unpack_number(slice); + let inner_slice = &slice[molecule::NUMBER_SIZE..]; + match item_id { + 0 => ScriptReader::verify(inner_slice, compatible), + _ => ve!(Self, UnknownItem, Self::ITEMS_COUNT, item_id), + }?; + Ok(()) + } +} +#[derive(Debug, Default)] +pub struct AddressBuilder(pub(crate) AddressUnion); +impl AddressBuilder { + pub const ITEMS_COUNT: usize = 1; + pub fn set(mut self, v: I) -> Self + where + I: ::core::convert::Into, + { + self.0 = v.into(); + self + } +} +impl molecule::prelude::Builder for AddressBuilder { + type Entity = Address; + const NAME: &'static str = "AddressBuilder"; + fn expected_length(&self) -> usize { + molecule::NUMBER_SIZE + self.0.as_slice().len() + } + fn write(&self, writer: &mut W) -> molecule::io::Result<()> { + writer.write_all(&molecule::pack_number(self.0.item_id()))?; + writer.write_all(self.0.as_slice()) + } + fn build(&self) -> Self::Entity { + let mut inner = Vec::with_capacity(self.expected_length()); + self.write(&mut inner) + .unwrap_or_else(|_| panic!("{} build should be ok", Self::NAME)); + Address::new_unchecked(inner.into()) + } +} +#[derive(Debug, Clone)] +pub enum AddressUnion { + Script(Script), +} +#[derive(Debug, Clone, Copy)] +pub enum AddressUnionReader<'r> { + Script(ScriptReader<'r>), +} +impl ::core::default::Default for AddressUnion { + fn default() -> Self { + AddressUnion::Script(::core::default::Default::default()) + } +} +impl ::core::fmt::Display for AddressUnion { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + match self { + AddressUnion::Script(ref item) => { + write!(f, "{}::{}({})", Self::NAME, Script::NAME, item) + } + } + } +} +impl<'r> ::core::fmt::Display for AddressUnionReader<'r> { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + match self { + AddressUnionReader::Script(ref item) => { + write!(f, "{}::{}({})", Self::NAME, Script::NAME, item) + } + } + } +} +impl AddressUnion { + pub(crate) fn display_inner(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + match self { + AddressUnion::Script(ref item) => write!(f, "{}", item), + } + } +} +impl<'r> AddressUnionReader<'r> { + pub(crate) fn display_inner(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + match self { + AddressUnionReader::Script(ref item) => write!(f, "{}", item), + } + } +} +impl ::core::convert::From