Skip to content

Commit

Permalink
common: added EIP config directory, EIP2537 values, new paramByEIP() …
Browse files Browse the repository at this point in the history
…parameter accessor function and associated tests
  • Loading branch information
holgerd77 committed Sep 4, 2020
1 parent f7684aa commit 94e3e5d
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 0 deletions.
47 changes: 47 additions & 0 deletions packages/common/src/eips/EIP2537.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{
"name": "EIP2537",
"comment": "BLS12-381 precompiles",
"url": "https://eips.ethereum.org/EIPS/eip-2537",
"status": "Draft",
"gasConfig": {},
"gasPrices": {
"Bls12381G1AddGas": {
"v": 600,
"d": "Gas cost of a single BLS12-381 G1 addition precompile-call"
},
"Bls12381G1MulGas": {
"v": 12000,
"d": "Gas cost of a single BLS12-381 G1 multiplication precompile-call"
},
"Bls12381G2AddGas": {
"v": 4500,
"d": "Gas cost of a single BLS12-381 G2 addition precompile-call"
},
"Bls12381G2MulGas": {
"v": 55000,
"d": "Gas cost of a single BLS12-381 G2 multiplication precompile-call"
},
"Bls12381PairingBaseGas": {
"v": 115000,
"d": "Base gas cost of BLS12-381 pairing check"
},
"Bls12381PairingPerPairGas": {
"v": 23000,
"d": "Per-pair gas cost of BLS12-381 pairing check"
},
"Bls12381MapG1Gas": {
"v": 5500,
"d": "Gas cost of BLS12-381 map field element to G1"
},
"Bls12381MapG2Gas": {
"v": 110000,
"d": "Gas cost of BLS12-381 map field element to G2"
},
"Bls12381MultiExpGasDiscount": {
"v": [[1, 1200], [2, 888], [3, 764], [4, 641], [5, 594], [6, 547], [7, 500], [8, 453], [9, 438], [10, 423], [11, 408], [12, 394], [13, 379], [14, 364], [15, 349], [16, 334], [17, 330], [18, 326], [19, 322], [20, 318], [21, 314], [22, 310], [23, 306], [24, 302], [25, 298], [26, 294], [27, 289], [28, 285], [29, 281], [30, 277], [31, 273], [32, 269], [33, 268], [34, 266], [35, 265], [36, 263], [37, 262], [38, 260], [39, 259], [40, 257], [41, 256], [42, 254], [43, 253], [44, 251], [45, 250], [46, 248], [47, 247], [48, 245], [49, 244], [50, 242], [51, 241], [52, 239], [53, 238], [54, 236], [55, 235], [56, 233], [57, 232], [58, 231], [59, 229], [60, 228], [61, 226], [62, 225], [63, 223], [64, 222], [65, 221], [66, 220], [67, 219], [68, 219], [69, 218], [70, 217], [71, 216], [72, 216], [73, 215], [74, 214], [75, 213], [76, 213], [77, 212], [78, 211], [79, 211], [80, 210], [81, 209], [82, 208], [83, 208], [84, 207], [85, 206], [86, 205], [87, 205], [88, 204], [89, 203], [90, 202], [91, 202], [92, 201], [93, 200], [94, 199], [95, 199], [96, 198], [97, 197], [98, 196], [99, 196], [100, 195], [101, 194], [102, 193], [103, 193], [104, 192], [105, 191], [106, 191], [107, 190], [108, 189], [109, 188], [110, 188], [111, 187], [112, 186], [113, 185], [114, 185], [115, 184], [116, 183], [117, 182], [118, 182], [119, 181], [120, 180], [121, 179], [122, 179], [123, 178], [124, 177], [125, 176], [126, 176], [127, 175], [128, 174]],
"d": "Discount gas costs of calls to the MultiExp precompiles with `k` (point, scalar) pair"
}
},
"vm": {},
"pow": {}
}
5 changes: 5 additions & 0 deletions packages/common/src/eips/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { eipsType } from './../types'

export const EIPs: eipsType = {
EIP2537: require('./EIP2537.json'),
}
23 changes: 23 additions & 0 deletions packages/common/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { buf as crc32Buffer } from 'crc-32'
import { chains as chainParams } from './chains'
import { hardforks as hardforkChanges } from './hardforks'
import { EIPs } from './eips'
import { Chain } from './types'

interface hardforkOptions {
Expand Down Expand Up @@ -196,6 +197,28 @@ export default class Common {
return value
}

/**
* Returns a parameter corresponding to an EIP
* @param topic Parameter topic ('gasConfig', 'gasPrices', 'vm', 'pow')
* @param name Parameter name (e.g. 'minGasLimit' for 'gasConfig' topic)
* @param eip Name of the EIP (e.g. 'EIP2537')
*/
paramByEIP(topic: string, name: string, eip: string): any {
if (!(eip in EIPs)) {
throw new Error(`${eip} not supported`)
}

const eipParams = EIPs[eip]
if (!(topic in eipParams)) {
throw new Error(`Topic ${topic} not defined`)
}
if (eipParams[topic][name] === undefined) {
throw new Error(`${topic} value for ${name} not found`)
}
let value = eipParams[topic][name].v
return value
}

/**
* Returns a parameter for the hardfork active on block number
* @param topic Parameter topic
Expand Down
4 changes: 4 additions & 0 deletions packages/common/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ export interface Chain {
bootstrapNodes: BootstrapNode[]
}

export interface eipsType {
[key: string]: any
}

export interface GenesisBlock {
hash: string
timestamp: string | null
Expand Down
25 changes: 25 additions & 0 deletions packages/common/tests/params.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,31 @@ tape('[Common]: Parameter access', function (t: tape.Test) {
st.end()
})

t.test('EIP param access, paramByEIP()', function (st: tape.Test) {
const c = new Common('mainnet')
let f = function () {
c.paramByEIP('gasPrices', 'Bls12381G1AddGas', 'NOT_SUPPORTED_EIP')
}
let msg = 'Should throw for using paramByEIP() with a not supported EIP'
st.throws(f, /not supported$/, msg)

f = function () {
c.paramByEIP('notExistingTopic', 'Bls12381G1AddGas', 'EIP2537')
}
msg = 'Should throw for using paramByEIP() with a not existing topic'
st.throws(f, /not defined$/, msg)

f = function () {
c.paramByEIP('gasPrices', 'Bls12381G1AddGas_WITH_SPELLING_MISTAKE', 'EIP2537')
}
msg = 'Should throw for using paramByEIP() if value was not found'
st.throws(f, /not found$/, msg)

msg = 'Should return Bls12381G1AddGas gas price for EIP2537'
st.equal(c.paramByEIP('gasPrices', 'Bls12381G1AddGas', 'EIP2537'), 600, msg)
st.end()
})

t.test('Custom chain usage', function (st: tape.Test) {
const mainnetCommon = new Common('mainnet')

Expand Down

1 comment on commit 94e3e5d

@github-actions
Copy link

Choose a reason for hiding this comment

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

Benchmark

Benchmark suite Current: 94e3e5d Previous: 0175b95 Ratio
Block 9422905 1973 ops/sec (±4.54%) 1936 ops/sec (±4.82%) 0.98
Block 9422906 1994 ops/sec (±5.89%) 1898 ops/sec (±6.58%) 0.95
Block 9422907 1832 ops/sec (±9.08%) 1925 ops/sec (±1.30%) 1.05
Block 9422908 1979 ops/sec (±1.83%) 1644 ops/sec (±9.80%) 0.83
Block 9422909 1977 ops/sec (±1.16%) 1866 ops/sec (±1.31%) 0.94
Block 9422910 1908 ops/sec (±1.40%) 1849 ops/sec (±1.50%) 0.97
Block 9422911 1417 ops/sec (±16.50%) 1857 ops/sec (±0.97%) 1.31
Block 9422912 1868 ops/sec (±1.49%) 1856 ops/sec (±1.87%) 0.99
Block 9422913 1873 ops/sec (±1.06%) 1248 ops/sec (±17.21%) 0.67
Block 9422914 1851 ops/sec (±2.04%) 1776 ops/sec (±1.83%) 0.96

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.