# Анализ смартконтрактов ## Сбор Для сбора используется smart-contract-sanctuary-ethereum (ныне https://github.com/tintinweb/smart-contract-sanctuary-ethereum/tree/master/utils) - Скрипт собирает только 500 последних смартконтрактов Для сбора с mainnet ```bash= python download_etherscan.py -c etherscan.io ``` Смартконтракты будут в `../contracts/mainnet` Следующие операции производятся из `..` ## Получть версию solidity ```bash= cat contracts/mainnet/00/006dd3008e9f982aedb1ce815d359461e52b9c1c_CursedSudoPortraits.sol | grep pragma | cut -d' ' -f3 | tr -d ';^' | head -n1 ``` ## Фильтрация контрактов с балансом ```bash= cat contracts/mainnet/contracts.json | jq 'select(.balance != "0 Ether")' ``` ![](https://i.imgur.com/k9P0i14.png) ## Запуск slither для всех контрактов ```bash mkdir -p slither-results contracts=($(find ./contracts/mainnet -type f -name '*.sol')) for contract in $contracts do filename=$(basename $contract) solc_version=$(cat $contract | grep pragma | cut -d' ' -f3 | tr -d ';^' | head -n1 | tr -d '\r\n') solc-select install $solc_version solc-select use $solc_version echo $filename python3 -m slither $contract --json slither-results/$filename.json done ``` ## Запуск slither только для контрактов с балансом ```bash= mkdir -p slither-results contracts=($(find ./contracts/mainnet -type f -name '*.sol')) addresses_with_balance=($(cat contracts/mainnet/contracts.json| jq 'select(.balance != "0 Ether")|.address' | tr -d '"')) for contract in $contracts do filename=$(basename $contract) echo $filename address=$(echo $filename | sed 's/_.*$//g' | sed 's/^/0x/g') if [[ " ${addresses_with_balance[*]} " =~ " ${address} " ]]; then solc_version=$(cat $contract | grep pragma | cut -d' ' -f3 | tr -d ';^' | head -n1 | tr -d '\r\n') solc-select install $solc_version solc-select use $solc_version python3 -m slither $contract --json slither-results/$filename.json fi done ``` ## Выбираем только те контракты, которые были проанализированны успешно ```bash cat slither-results/*.json | jq 'select(.success)' ``` ## Ищем смартконтракты с определённым impact Impact - High: ```bash rg '"impact": "High"' slither-results ``` ![](https://i.imgur.com/pbzJnvq.png) Другой способ (экспорт в Markdown): ```bash= cat slither-results/*.json | jq -r 'select(.success)|.results.detectors[] | select(.impact=="High") | .description' | sed ':a;N;$!ba;s/\n\n/\n\n---\n\n/g' > slither-high.md ``` ![](https://i.imgur.com/nKJET3s.png) ## Поиск смартконтрактов не используюзих ERC20, ERC721 ```bash= rg --files-without-match '(ERC20)|(ERC721)' contracts/mainnet/ ``` Другой вариант (без ERC и BEP): ```bash= rg --files-without-match '(ERC)|(BEP)' contracts/mainnet/ ``` ## Декодируем конструкторы смартконтрактов (in progress) ```bash= contracts=($(find ./contracts/mainnet -type f -name '*.sol')) for contract in $contracts do filename=$(basename $contract) echo $filename address=$(echo $filename | sed 's/_.*$//g' | sed 's/^/0x/g') python3 get_constructor.py $address $contract done ```