Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Commit

Permalink
Implement EIP-2565 (option 2)
Browse files Browse the repository at this point in the history
  • Loading branch information
vorot93 committed May 23, 2020
1 parent eee06b3 commit 7cdba58
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 7 deletions.
29 changes: 26 additions & 3 deletions ethcore/builtin/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ struct Linear {
#[derive(Debug)]
struct ModexpPricer {
divisor: u64,
new_formula: bool,
}

impl Pricer for Linear {
Expand Down Expand Up @@ -180,7 +181,13 @@ impl Pricer for ModexpPricer {

let adjusted_exp_len = Self::adjusted_exp_len(exp_len, exp_low);

let (gas, overflow) = Self::mult_complexity(m).overflowing_mul(max(adjusted_exp_len, 1));
let complexity_formula = if self.new_formula {
Self::mult_complexity
} else {
Self::mult_complexity_new
};

let (gas, overflow) = (complexity_formula)(m).overflowing_mul(max(adjusted_exp_len, 1));
if overflow {
return U256::max_value();
}
Expand All @@ -205,6 +212,10 @@ impl ModexpPricer {
x => (x * x) / 16 + 480 * x - 199_680,
}
}

fn mult_complexity_new(x: u64) -> u64 {
((x / 64) + if x % 64 == 0 { 0 } else { 1 }) ^ 2
}
}

/// Pricing scheme, execution definition, and activation block for a built-in contract.
Expand Down Expand Up @@ -281,7 +292,19 @@ impl From<ethjson::spec::builtin::Pricing> for Pricing {
10
} else {
exp.divisor
}
},
new_formula: false,
})
}
ethjson::spec::builtin::Pricing::Modexp2(exp) => {
Pricing::Modexp(ModexpPricer {
divisor: if exp.divisor == 0 {
warn!(target: "builtin", "Zero modexp divisor specified. Falling back to default: 10.");
10
} else {
exp.divisor
},
new_formula: true,
})
}
ethjson::spec::builtin::Pricing::AltBn128Pairing(pricer) => {
Expand Down Expand Up @@ -1037,7 +1060,7 @@ mod tests {
#[test]
fn modexp() {
let f = Builtin {
pricer: btreemap![0 => Pricing::Modexp(ModexpPricer { divisor: 20 })],
pricer: btreemap![0 => Pricing::Modexp(ModexpPricer { divisor: 20, new_formula: false })],
native: EthereumBuiltin::from_str("modexp").unwrap(),
};

Expand Down
5 changes: 2 additions & 3 deletions ethcore/res/ethereum/foundation.json
Original file line number Diff line number Diff line change
Expand Up @@ -4827,10 +4827,9 @@
"0x0000000000000000000000000000000000000005": {
"builtin": {
"name": "modexp",
"activate_at": "0x42ae50",
"pricing": {
"modexp": {
"divisor": 20
"0x42ae50": {
"price": { "modexp": { "divisor": 20 } }
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion json/src/spec/builtin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,10 @@ pub enum Pricing {
},
/// Linear pricing.
Linear(Linear),
/// Pricing for modular exponentiation.
/// Pricing for modular exponentiation with original formula from EIP-198.
Modexp(Modexp),
/// Pricing for modular exponentiation that includes new formula from EIP-2565.
Modexp2(Modexp),
/// Pricing for alt_bn128_pairing exponentiation.
AltBn128Pairing(AltBn128Pairing),
/// Pricing for constant alt_bn128 operations
Expand Down

0 comments on commit 7cdba58

Please sign in to comment.