Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 21 additions & 9 deletions packages/vm/src/imports.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
//! Import implementations

use std::cmp::max;
use std::convert::TryInto;

use cosmwasm_crypto::{
Expand Down Expand Up @@ -27,10 +28,17 @@ use crate::sections::encode_sections;
use crate::serde::to_vec;
use crate::GasInfo;

const GAS_COST_SECP256K1_VERIFY_SIGNATURE: u64 = 100;
const GAS_COST_SECP256K1_RECOVER_PUBKEY_SIGNATURE: u64 = 100;
const GAS_COST_VERIFY_ED25519_SIGNATURE: u64 = 100;
const GAS_COST_BATCH_VERIFY_ED25519_SIGNATURE: u64 = GAS_COST_VERIFY_ED25519_SIGNATURE / 3;
// 1000 Cosmos SDK * 100 CosmWasm factor (~154 us in crypto benchmarks)
const GAS_COST_SECP256K1_VERIFY: u64 = 100000;

// Gas costs relative to secp256k1_verify cost
const GAS_COST_SECP256K1_RECOVER_PUBKEY: u64 = 105195; // 100_000 * 162 us / 154 us
const GAS_COST_ED25519_VERIFY: u64 = 40909; // 100_000 * 63 us / 154 us

// Gas costs relative to ed25519_verify cost
// From https://docs.rs/ed25519-zebra/2.2.0/ed25519_zebra/batch/index.html
const GAS_COST_ED25519_BATCH_VERIFY: u64 = GAS_COST_ED25519_VERIFY / 2;
const GAS_COST_ED25519_BATCH_VERIFY_ONE_PUBKEY: u64 = GAS_COST_ED25519_VERIFY / 4;

/// A kibi (kilo binary)
const KI: usize = 1024;
Expand Down Expand Up @@ -298,7 +306,7 @@ fn do_secp256k1_verify<A: BackendApi, S: Storage, Q: Querier>(
let pubkey = read_region(&env.memory(), pubkey_ptr, ECDSA_PUBKEY_MAX_LEN)?;

let result = secp256k1_verify(&hash, &signature, &pubkey);
let gas_info = GasInfo::with_cost(GAS_COST_SECP256K1_VERIFY_SIGNATURE);
let gas_info = GasInfo::with_cost(GAS_COST_SECP256K1_VERIFY);
process_gas_info::<A, S, Q>(env, gas_info)?;
Ok(result.map_or_else(
|err| match err {
Expand Down Expand Up @@ -328,7 +336,7 @@ fn do_secp256k1_recover_pubkey<A: BackendApi, S: Storage, Q: Querier>(
};

let result = secp256k1_recover_pubkey(&hash, &signature, recover_param);
let gas_info = GasInfo::with_cost(GAS_COST_SECP256K1_RECOVER_PUBKEY_SIGNATURE);
let gas_info = GasInfo::with_cost(GAS_COST_SECP256K1_RECOVER_PUBKEY);
process_gas_info::<A, S, Q>(env, gas_info)?;
match result {
Ok(pubkey) => {
Expand Down Expand Up @@ -358,7 +366,7 @@ fn do_ed25519_verify<A: BackendApi, S: Storage, Q: Querier>(
let pubkey = read_region(&env.memory(), pubkey_ptr, EDDSA_PUBKEY_LEN)?;

let result = ed25519_verify(&message, &signature, &pubkey);
let gas_info = GasInfo::with_cost(GAS_COST_VERIFY_ED25519_SIGNATURE);
let gas_info = GasInfo::with_cost(GAS_COST_ED25519_VERIFY);
process_gas_info::<A, S, Q>(env, gas_info)?;
Ok(result.map_or_else(
|err| match err {
Expand Down Expand Up @@ -403,8 +411,12 @@ fn do_ed25519_batch_verify<A: BackendApi, S: Storage, Q: Querier>(
let public_keys = decode_sections(&public_keys);

let result = ed25519_batch_verify(&messages, &signatures, &public_keys);
let gas_info =
GasInfo::with_cost(GAS_COST_BATCH_VERIFY_ED25519_SIGNATURE * signatures.len() as u64);
let gas_cost = if public_keys.len() == 1 {
GAS_COST_ED25519_BATCH_VERIFY_ONE_PUBKEY
} else {
GAS_COST_ED25519_BATCH_VERIFY
} * signatures.len() as u64;
let gas_info = GasInfo::with_cost(max(gas_cost, GAS_COST_ED25519_VERIFY));
process_gas_info::<A, S, Q>(env, gas_info)?;
Ok(result.map_or_else(
|err| match err {
Expand Down