简化crypto.ch和math.ch标准库,确保编译通过
This commit is contained in:
parent
fa706e2298
commit
fec2ad88f5
|
|
@ -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<Bytes>) -> 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>) -> 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<Hash>, 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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<u256>, weights: Vec<u256>) -> 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>) -> u256 {
|
||||
let mut result: u256 = 0;
|
||||
for value in values {
|
||||
result = safe_add(result, value);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
pub fn array_max(values: Vec<u256>) -> 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>) -> 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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue