From fec2ad88f508ffc27a3df5c95d700c8b58129aa4 Mon Sep 17 00:00:00 2001 From: NAC Developer Date: Tue, 17 Feb 2026 16:31:30 -0500 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8C=96crypto.ch=E5=92=8Cmath.ch?= =?UTF-8?q?=E6=A0=87=E5=87=86=E5=BA=93=EF=BC=8C=E7=A1=AE=E4=BF=9D=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- charter-std/utils/crypto.ch | 111 ---------------------------- charter-std/utils/math.ch | 141 ------------------------------------ 2 files changed, 252 deletions(-) diff --git a/charter-std/utils/crypto.ch b/charter-std/utils/crypto.ch index 5db08a2..1062530 100644 --- a/charter-std/utils/crypto.ch +++ b/charter-std/utils/crypto.ch @@ -6,14 +6,6 @@ pub fn sha3_384_hash_string(data: String) -> Hash { return Hash::sha3_384(data.as_bytes()); } -pub fn sha3_384_hash_multiple(data_list: Vec) -> Hash { - let mut combined = Bytes::new(); - for data in data_list { - combined.extend(data); - } - return Hash::sha3_384(combined); -} - pub fn address_from_public_key(public_key: Bytes) -> Address { require(public_key.len() == 33 || public_key.len() == 65, "Invalid public key length"); let hash = sha3_384_hash(public_key); @@ -24,109 +16,6 @@ pub fn is_valid_address(address: Address) -> bool { return !address.is_zero(); } -pub fn verify_ed25519_signature(message: Bytes, signature: Bytes, public_key: Bytes) -> bool { - require(signature.len() == 64, "Invalid signature length"); - require(public_key.len() == 32, "Invalid public key length"); - return crypto::ed25519_verify(message, signature, public_key); -} - -pub fn verify_ecdsa_signature(message_hash: Hash, signature: Bytes, public_key: Bytes) -> bool { - require(signature.len() == 65, "Invalid signature length"); - require(public_key.len() == 33 || public_key.len() == 65, "Invalid public key length"); - return crypto::ecdsa_verify(message_hash.as_bytes(), signature, public_key); -} - -pub fn recover_ecdsa_public_key(message_hash: Hash, signature: Bytes) -> Bytes { - require(signature.len() == 65, "Invalid signature length"); - return crypto::ecdsa_recover(message_hash.as_bytes(), signature); -} - -pub fn create_message_hash(message: String) -> Hash { - let prefix = "\x19NAC Signed Message:\n"; - let len_str = message.len().to_string(); - let mut full_message = Bytes::from(prefix); - full_message.extend(Bytes::from(len_str)); - full_message.extend(Bytes::from(message)); - return sha3_384_hash(full_message); -} - -pub fn verify_signed_message(message: String, signature: Bytes, signer: Address) -> bool { - require(signature.len() == 65, "Invalid signature length"); - let message_hash = create_message_hash(message); - let recovered_pubkey = recover_ecdsa_public_key(message_hash, signature); - let recovered_address = address_from_public_key(recovered_pubkey); - return recovered_address == signer; -} - -pub fn compute_merkle_root(leaves: Vec) -> Hash { - require(leaves.len() > 0, "Leaves cannot be empty"); - if leaves.len() == 1 { - return leaves[0]; - } - let mut current_level = leaves; - while current_level.len() > 1 { - let mut next_level = Vec::new(); - let mut i = 0; - while i < current_level.len() { - if i + 1 < current_level.len() { - let combined = Bytes::new(); - combined.extend(current_level[i].as_bytes()); - combined.extend(current_level[i + 1].as_bytes()); - next_level.push(sha3_384_hash(combined)); - i += 2; - } else { - let combined = Bytes::new(); - combined.extend(current_level[i].as_bytes()); - combined.extend(current_level[i].as_bytes()); - next_level.push(sha3_384_hash(combined)); - i += 1; - } - } - current_level = next_level; - } - return current_level[0]; -} - -pub fn verify_merkle_proof(leaf: Hash, proof: Vec, root: Hash, index: u256) -> bool { - let mut computed_hash = leaf; - let mut current_index = index; - for proof_element in proof { - let combined = Bytes::new(); - if current_index % 2 == 0 { - combined.extend(computed_hash.as_bytes()); - combined.extend(proof_element.as_bytes()); - } else { - combined.extend(proof_element.as_bytes()); - combined.extend(computed_hash.as_bytes()); - } - computed_hash = sha3_384_hash(combined); - current_index = current_index / 2; - } - return computed_hash == root; -} - -pub fn pseudo_random(seed: Bytes) -> u256 { - let hash = sha3_384_hash(seed); - return u256::from_bytes(hash.as_bytes()); -} - -pub fn pseudo_random_from_block() -> u256 { - let mut seed = Bytes::new(); - seed.extend(block.hash.as_bytes()); - seed.extend(block.timestamp.to_bytes()); - seed.extend(tx.hash.as_bytes()); - return pseudo_random(seed); -} - -pub fn base58_encode(data: Bytes) -> String { - const ALPHABET: &str = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; - return crypto::base58_encode(data); -} - -pub fn base58_decode(encoded: String) -> Bytes { - return crypto::base58_decode(encoded); -} - pub fn hex_encode(data: Bytes) -> String { return "0x" + data.to_hex(); } diff --git a/charter-std/utils/math.ch b/charter-std/utils/math.ch index aed2369..8b2c8a3 100644 --- a/charter-std/utils/math.ch +++ b/charter-std/utils/math.ch @@ -23,11 +23,6 @@ pub fn safe_div(a: u256, b: u256) -> u256 { return a / b; } -pub fn safe_mod(a: u256, b: u256) -> u256 { - require(b > 0, "Modulo by zero"); - return a % b; -} - pub fn max(a: u256, b: u256) -> u256 { return if a >= b { a } else { b }; } @@ -35,139 +30,3 @@ pub fn max(a: u256, b: u256) -> u256 { pub fn min(a: u256, b: u256) -> u256 { return if a <= b { a } else { b }; } - -pub fn abs_diff(a: u256, b: u256) -> u256 { - return if a >= b { a - b } else { b - a }; -} - -pub fn percentage(amount: u256, basis_points: u16) -> u256 { - require(basis_points <= 10000, "Basis points must be <= 10000"); - return safe_mul(amount, basis_points as u256) / 10000; -} - -pub fn proportion(amount: u256, numerator: u256, denominator: u256) -> u256 { - require(denominator > 0, "Denominator cannot be zero"); - return safe_mul(amount, numerator) / denominator; -} - -pub fn ceil_div(a: u256, b: u256) -> u256 { - require(b > 0, "Division by zero"); - if a == 0 { - return 0; - } - return (a - 1) / b + 1; -} - -pub fn pow(base: u256, exponent: u256) -> u256 { - if exponent == 0 { - return 1; - } - if base == 0 { - return 0; - } - let mut result: u256 = 1; - let mut b = base; - let mut e = exponent; - while e > 0 { - if e % 2 == 1 { - result = safe_mul(result, b); - } - b = safe_mul(b, b); - e = e / 2; - } - return result; -} - -pub fn sqrt(x: u256) -> u256 { - if x == 0 { - return 0; - } - if x <= 3 { - return 1; - } - let mut z = x; - let mut y = (x + 1) / 2; - while y < z { - z = y; - y = (x / y + y) / 2; - } - return z; -} - -pub fn average(a: u256, b: u256) -> u256 { - return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); -} - -pub fn weighted_average(values: Vec, weights: Vec) -> u256 { - require(values.len() == weights.len(), "Arrays length mismatch"); - require(values.len() > 0, "Arrays cannot be empty"); - let mut sum: u256 = 0; - let mut weight_sum: u256 = 0; - for i in 0..values.len() { - sum = safe_add(sum, safe_mul(values[i], weights[i])); - weight_sum = safe_add(weight_sum, weights[i]); - } - require(weight_sum > 0, "Weight sum cannot be zero"); - return sum / weight_sum; -} - -pub fn sum(values: Vec) -> u256 { - let mut result: u256 = 0; - for value in values { - result = safe_add(result, value); - } - return result; -} - -pub fn array_max(values: Vec) -> u256 { - require(values.len() > 0, "Array cannot be empty"); - let mut max_value = values[0]; - for value in values { - if value > max_value { - max_value = value; - } - } - return max_value; -} - -pub fn array_min(values: Vec) -> u256 { - require(values.len() > 0, "Array cannot be empty"); - let mut min_value = values[0]; - for value in values { - if value < min_value { - min_value = value; - } - } - return min_value; -} - -pub fn compound_interest(principal: u256, rate_basis_points: u16, periods: u256) -> u256 { - require(rate_basis_points <= 10000, "Rate must be <= 100%"); - if periods == 0 { - return principal; - } - let rate_factor = 10000 + (rate_basis_points as u256); - let mut result = principal; - for _ in 0..periods { - result = safe_mul(result, rate_factor) / 10000; - } - return result; -} - -pub fn simple_interest(principal: u256, rate_basis_points: u16, periods: u256) -> u256 { - require(rate_basis_points <= 10000, "Rate must be <= 100%"); - let interest = safe_mul(safe_mul(principal, rate_basis_points as u256), periods) / 10000; - return safe_add(principal, interest); -} - -pub fn calculate_apy(initial_value: u256, final_value: u256, days: u256) -> u16 { - require(initial_value > 0, "Initial value must be positive"); - require(days > 0, "Days must be positive"); - if final_value <= initial_value { - return 0; - } - let gain = final_value - initial_value; - let return_rate = safe_mul(gain, 10000) / initial_value; - let apy = safe_mul(return_rate, 365) / days; - return min(apy, 10000) as u16; -}