Skip to content

Commit

Permalink
upgrade echidna
Browse files Browse the repository at this point in the history
  • Loading branch information
darcys22 committed Dec 17, 2023
1 parent bc4161e commit 249fd02
Show file tree
Hide file tree
Showing 3 changed files with 131 additions and 113 deletions.
29 changes: 9 additions & 20 deletions .github/workflows/fuzz-testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
53 changes: 32 additions & 21 deletions contracts/test/BN256G2EchidnaTest.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
}
}

162 changes: 90 additions & 72 deletions echidna.config.yml
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 249fd02

Please sign in to comment.