From 249fd021d74147e3e008f26cf9c3f52e6369e1e7 Mon Sep 17 00:00:00 2001 From: Sean Darcy Date: Mon, 18 Dec 2023 08:11:29 +1100 Subject: [PATCH] upgrade echidna --- .github/workflows/fuzz-testing.yml | 29 ++--- contracts/test/BN256G2EchidnaTest.sol | 53 +++++---- echidna.config.yml | 162 ++++++++++++++------------ 3 files changed, 131 insertions(+), 113 deletions(-) diff --git a/.github/workflows/fuzz-testing.yml b/.github/workflows/fuzz-testing.yml index e305c87..6273e63 100644 --- a/.github/workflows/fuzz-testing.yml +++ b/.github/workflows/fuzz-testing.yml @@ -27,27 +27,16 @@ jobs: path: "**/node_modules" key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} - - name: Set up Python 3.8 - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - name: Install node dependencies run: yarn install --frozen-lockfile - - name: Install pip3 - run: | - python -m pip install --upgrade pip - - - name: Install slither - run: | - pip3 install slither-analyzer + - name: Compile contracts + run: npx hardhat compile - - name: Install echidna - run: | - sudo wget -O /tmp/echidna-test.tar.gz https://github.com/crytic/echidna/releases/download/v1.6.0/echidna-test-v1.6.0-Ubuntu-18.04.tar.gz - sudo tar -xf /tmp/echidna-test.tar.gz -C /usr/bin - sudo chmod +x /usr/bin/echidna-test - - - name: Run ${{ matrix.testName }} - run: echidna-test . --contract ${{ matrix.testName }} --config echidna.config.yml + - name: Run Echidna + uses: crytic/echidna-action@v2 + with: + solc-version: 0.8.20 + files: . + contract: ${{ matrix.testName }} + config: echidna.config.yml diff --git a/contracts/test/BN256G2EchidnaTest.sol b/contracts/test/BN256G2EchidnaTest.sol index 71163b8..4c05c2a 100644 --- a/contracts/test/BN256G2EchidnaTest.sol +++ b/contracts/test/BN256G2EchidnaTest.sol @@ -5,30 +5,41 @@ import "../BN256G2.sol"; contract BN256G2EchidnaTest { // Test the ECTwistAdd function - function checkECTwistAdd( - uint256 pt1xx, uint256 pt1xy, - uint256 pt1yx, uint256 pt1yy, - uint256 pt2xx, uint256 pt2xy, - uint256 pt2yx, uint256 pt2yy - ) public { - (uint256 sumXx, uint256 sumXy, uint256 sumYx, uint256 sumYy) = BN256G2.ECTwistAdd( - pt1xx, pt1xy, pt1yx, pt1yy, - pt2xx, pt2xy, pt2yx, pt2yy - ); - assert(BN256G2.IsOnCurve(sumXx, sumXy, sumYx, sumYy)); - } + /*function checkECTwistAdd(*/ + /*uint256 pt1xx, uint256 pt1xy,*/ + /*uint256 pt1yx, uint256 pt1yy,*/ + /*uint256 pt2xx, uint256 pt2xy,*/ + /*uint256 pt2yx, uint256 pt2yy*/ + /*) public {*/ + /*(uint256 sumXx, uint256 sumXy, uint256 sumYx, uint256 sumYy) = BN256G2.ECTwistAdd(*/ + /*pt1xx, pt1xy, pt1yx, pt1yy,*/ + /*pt2xx, pt2xy, pt2yx, pt2yy*/ + /*);*/ + /*assert(BN256G2.IsOnCurve(sumXx, sumXy, sumYx, sumYy));*/ + /*}*/ // Test the ECTwistMul function - function checkECTwistMul( - uint256 s, - uint256 pt1xx, uint256 pt1xy, - uint256 pt1yx, uint256 pt1yy - ) public { - (uint256 mulXx, uint256 mulXy, uint256 mulYx, uint256 mulYy) = BN256G2.ECTwistMul( - s, pt1xx, pt1xy, pt1yx, pt1yy - ); - assert(BN256G2.IsOnCurve(mulXx, mulXy, mulYx, mulYy)); + /*function checkECTwistMul(*/ + /*uint256 s,*/ + /*uint256 pt1xx, uint256 pt1xy,*/ + /*uint256 pt1yx, uint256 pt1yy*/ + /*) public {*/ + /*(uint256 mulXx, uint256 mulXy, uint256 mulYx, uint256 mulYy) = BN256G2.ECTwistMul(*/ + /*s, pt1xx, pt1xy, pt1yx, pt1yy*/ + /*);*/ + /*assert(BN256G2.IsOnCurve(mulXx, mulXy, mulYx, mulYy));*/ + /*}*/ + + bytes private message; + BN256G2.G2Point Hm; + + function setMessage(bytes calldata _message) public { + message = _message; + Hm = BN256G2.hashToG2(BN256G2.hashToField(string(message))); } + function echidna_always_hashable() public returns (bool) { + return BN256G2.IsOnCurve(Hm.X[1], Hm.X[0], Hm.Y[1], Hm.Y[0]); + } } diff --git a/echidna.config.yml b/echidna.config.yml index 64a761d..2cb8af1 100644 --- a/echidna.config.yml +++ b/echidna.config.yml @@ -1,74 +1,92 @@ -#format can be "text" or "json" for different output (human or machine readable) -format: 'text' -#checkAsserts checks assertions -checkAsserts: true +#select the mode to test, which can be property, assertion, overflow, exploration, optimization +testMode: "property" +#check if some contract was destructed or not +testDestruction: false +#psender is the sender for property transactions; by default intentionally +#the same as contract deployer +psender: "0x10000" +#prefix is the prefix for Boolean functions that are properties to be checked +prefix: "echidna_" +#propMaxGas defines gas cost at which a property fails +propMaxGas: 8000030 +#testMaxGas is a gas limit; does not cause failure, but terminates sequence +testMaxGas: 8000030 +#maxGasprice is the maximum gas price +maxGasprice: 0 +#testLimit is the number of test sequences to run +testLimit: 50000 +#stopOnFail makes echidna terminate as soon as any property fails and has been shrunk +stopOnFail: false +#estimateGas makes echidna perform analysis of maximum gas costs for functions (experimental) +estimateGas: false +#seqLen defines how many transactions are in a test sequence +seqLen: 100 +#shrinkLimit determines how much effort is spent shrinking failing sequences +shrinkLimit: 5000 #coverage controls coverage guided testing coverage: false -# #psender is the sender for property transactions; by default intentionally -# #the same as contract deployer -# psender: "0x00a329c0648769a73afac7f9381e08fb43dbea70" -# #prefix is the prefix for Boolean functions that are properties to be checked -# prefix: "echidna_" -# #propMaxGas defines gas cost at which a property fails -# propMaxGas: 8000030 -# #testMaxGas is a gas limit; does not cause failure, but terminates sequence -# testMaxGas: 8000030 -# #maxGasprice is the maximum gas price -# maxGasprice: 100000000000 -# #testLimit is the number of test sequences to run -# testLimit: 50000 -# #stopOnFail makes echidna terminate as soon as any property fails and has been shrunk -# stopOnFail: false -# #estimateGas makes echidna perform analysis of maximum gas costs for functions (experimental) -# estimateGas: false -# #seqLen defines how many transactions are in a test sequence -# seqLen: 100 -# #shrinkLimit determines how much effort is spent shrinking failing sequences -# shrinkLimit: 5000 -# #contractAddr is the address of the contract itself -# contractAddr: "0x00a329c0648769a73afac7f9381e08fb43dbea72" -# #deployer is address of the contract deployer (who often is privileged owner, etc.) -# deployer: "0x00a329c0648769a73afac7f9381e08fb43dbea70" -# #sender is set of addresses transactions may originate from -# sender: ["0x10000", "0x20000", "0x00a329c0648769a73afac7f9381e08fb43dbea70"] -# #balanceAddr is default balance for addresses -# balanceAddr: 0xffffffff -# #balanceContract overrides balanceAddr for the contract address -# balanceContract: 0 -# #solcArgs allows special args to solc -# solcArgs: "" -# #solcLibs is solc libraries -# solcLibs: [] -# #cryticArgs allows special args to crytic -# cryticArgs: [] -# #quiet produces (much) less verbose output -# quiet: false -# #initialize the blockchain with some data -# initialize: null -# #whether ot not to use the multi-abi mode of testing -# multi-abi: false -# #benchmarkMode enables benchmark mode -# benchmarkMode: false -# #timeout controls test timeout settings -# timeout: null -# #seed not defined by default, is the random seed -# #seed: 0 -# #dictFreq controls how often to use echidna's internal dictionary vs random -# #values -# dictFreq: 0.40 -# maxTimeDelay: 604800 -# #maximum time between generated txs; default is one week -# maxBlockDelay: 60480 -# #maximum number of blocks elapsed between generated txs; default is expected increment in one week -# # timeout: -# #campaign timeout (in seconds) -# # list of methods to filter -# filterFunctions: [] -# # by default, blacklist methods in filterFunctions -# filterBlacklist: true -# #directory to save the corpus; by default is disabled -# corpusDir: null -# # constants for corpus mutations (for experimentation only) -# mutConsts: [100, 1, 1] -# # maximum value to send to payable functions -# maxValue: 100000000000000000000 # 100 eth +#format can be "text" or "json" for different output (human or machine readable) +format: "text" +#contractAddr is the address of the contract itself +contractAddr: "0x00a329c0648769a73afac7f9381e08fb43dbea72" +#deployer is address of the contract deployer (who often is privileged owner, etc.) +deployer: "0x30000" +#sender is set of addresses transactions may originate from +sender: ["0x10000", "0x20000", "0x30000"] +#balanceAddr is default balance for addresses +balanceAddr: 0xffffffff +#balanceContract overrides balanceAddr for the contract address +balanceContract: 0 +#codeSize max code size for deployed contratcs (default 24576, per EIP-170) +codeSize: 0x6000 +#solcArgs allows special args to solc +solcArgs: "" +#solcLibs is solc libraries +#solcLibs: ["BN256G2"] +#cryticArgs allows special args to crytic +#cryticArgs: [] +cryticArgs: ["--compile-libraries '(BN256G2,0x1f)'", "--hardhat-ignore-compile"] +#quiet produces (much) less verbose output +quiet: false +#initialize the blockchain with some data +initialize: null +#initialize the blockchain with some predeployed contracts in some addresses +deployContracts: [["0x1f", "BN256G2"]] +#deployContracts: [] +#initialize the blockchain with some bytecode in some addresses +deployBytecodes: [] +#whether ot not to fuzz all contracts +allContracts: false +#timeout controls test timeout settings +timeout: null +#seed not defined by default, is the random seed +#seed: 0 +#dictFreq controls how often to use echidna's internal dictionary vs random +#values +dictFreq: 0.40 +maxTimeDelay: 604800 +#maximum time between generated txs; default is one week +maxBlockDelay: 60480 +#maximum number of blocks elapsed between generated txs; default is expected increment in one week +# timeout: +#campaign timeout (in seconds) +# list of methods to filter +filterFunctions: [] +# by default, blacklist methods in filterFunctions +filterBlacklist: true +# enable or disable ffi HEVM cheatcode +allowFFI: false +#directory to save the corpus; by default is disabled +corpusDir: null +# list of file formats to save coverage reports in; default is all possible formats +coverageFormats: ["txt","html","lcov"] +# constants for corpus mutations (for experimentation only) +mutConsts: [1, 1, 1, 1] +# maximum value to send to payable functions +maxValue: 100000000000000000000 # 100 eth +# URL to fetch contracts over RPC +rpcUrl: null +# block number to use when fetching over RPC +rpcBlock: null +# number of workers +workers: 1