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

Implement EIP-2565 (option B) #11728

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
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
29 changes: 26 additions & 3 deletions ethcore/builtin/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ struct Linear {
#[derive(Debug)]
struct ModexpPricer {
divisor: u64,
new_formula: bool,
}

impl Pricer for Linear {
Expand Down Expand Up @@ -194,7 +195,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_new
} else {
Self::mult_complexity
};

let (gas, overflow) = (complexity_formula)(m).overflowing_mul(max(adjusted_exp_len, 1));
if overflow {
return U256::max_value();
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(gas / self.divisor as u64).into() --> min((gas / self.divisor as u64).into(),100)

This sets a minimum gas price of 100

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI this is a couple rows down but it wouldn't let me comment on it for some reason

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

EIP has been updated to set the minimum gas price at 200

Expand All @@ -219,6 +226,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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replace 64 with 8 to represent limbs in bytes rather than bits per most recent EIP update

}
}

/// Bls12 pairing price
Expand Down Expand Up @@ -407,7 +418,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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
10
3

} else {
exp.divisor
},
new_formula: true,
})
}
ethjson::spec::builtin::Pricing::AltBn128Pairing(pricer) => {
Expand Down Expand Up @@ -1360,7 +1383,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
17 changes: 14 additions & 3 deletions ethcore/res/ethereum/foundation.json
Original file line number Diff line number Diff line change
Expand Up @@ -4827,10 +4827,21 @@
"0x0000000000000000000000000000000000000005": {
"builtin": {
"name": "modexp",
"activate_at": "0x42ae50",
"pricing": {
"modexp": {
"divisor": 20
"0x42ae50": {
"price": {
"modexp": {
"divisor": 20
}
}
},
"0x7fffffffffffff": {
"info": "EIP 2565 transition at block X",
"price": {
"modexp2": {
"divisor": 20

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"divisor": 20
"divisor": 3

}
}
}
}
}
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 @@ -104,8 +104,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