Услуга безопасности контрактов предоставляет интерфейсы для проверки безопасности.
Данный интерфейс принимает Base64-кодированный архив zip с контрактами, распаковывает его внутренне, анализирует и возвращает результат проверки обратно клиенту.
Используйте этот интерфейс для проверки безопасности контракта.
Входные данные: Base64-кодированный архив zip с контрактами (контракты должны находиться в папке contracts
, имя файла должно совпадать с именем контракта, используйте "./xxx.sol"
для ссылок на контракты. Упакуйте папку в zip-архив, назвав его номером бизнес-процесса (appid
), затем закодируйте zip-архив в Base64).
Формат папки:
|- contracts
| |- Evidence.sol
| |- EvidenceFactory.sol
|- docs
| |- deploy.md
Выходные данные: информация о безопасности контракта (в формате JSON).
http://localhost:5007/WeBASE-Solidity-Security/scan
HTTP POST
1) Таблица входных параметров| Номер | Входной параметр | Тип | Обязательность | Примечание | | ----- | ----------------------- | ------ | ------------- | ------------------------------------ | | 1 | appid | String | Нет | Номер приложения, используется для разделения контрактов | | 2 | contractSource | String | Нет | Base64-кодированный архив zip с контрактами |2) Формат данных
{
"appid": "appid001",
"contractSource": "UEsDBBQAAAAAACizbFAAAAAAAAAAAAAAAAAKAAAAY29udHJhY3RzL1BLAwQUAAAACAAIiGVQuSZqBJ0AAABvAQAAGAAAAGNvbnRyYWN0cy9IZWxsb1dvcmxkLnNvbIWOMQvCMBCF90L/w43tUiS4FXcnFwc3IbRnCCQXSa6CSP+7sakYpNo33r33vXf1UlkJwRdda77DedNsG9GWReeIvewY9miMOzlv+kdZQFRgr0kBSYttuuANieGIfIi3KvvXSwax5LgM1LF2BAq5qmN5YBkjHnnwFOZE/VqQNH/yFeMXKUTSuylPotWfsTQNSJpgO/qNE6s88R84PgFQSwMEFAAAAAAAE7NsUAAAAAAAAAAAAAAAAAUAAABkb2NzL1BLAwQKAAAAAADjgGxQ1Qj/mQkAAAAJAAAADgAAAGRvY3MvZGVwbG95Lm1kIyBEZXBsb3kKUEsBAj8AFAAAAAAAKLNsUAAAAAAAAAAAAAAAAoAJAAAAAAAAAAQAAAAAAAAAGNvbnRyYWN0cy8KACAAAAAAAAEAGACqQxwMevjVAapDHAx6+NUBEu2Y9Xn41QFQSwECPwAUAAAACAAIiGVQuSZqBJ0AAABvAQAAGAAkAAAAAAAAACAAAAAoAAAAY29udHJhY3RzL0hlbGxvV29ybGQuc29sCgAgAAAAAAABABgAselMfMzy1QF9ieU0evjVAapDHAx6+NUBUEsBAj8AFAAAAAAAE7NsUAAAAAAAAAAAAAAAAAUAJAAAAAAAAAAQAAAA+wAAAGRvY3MvCgAgAAAAAAABABgAa0Sa9Xn41QFrRJr1efjVARPSmfV5+NUBUEsBAj8ACgAAAAAA44BsUNUI/5kJAAAACQAAAA4AJAAAAAAAAAAgAAAAHgEAAGRvY3MvZGVwbG95Lm1kCgAgAAAAAAABABgAIBTBN0X41QFrRJr1efjVAWtEmvV5+NUBUEsFBgAAAAAEAAQAfQEAAFMBAAAAAA=="
}
1) Выходные параметры
Номер | Выводящий параметр | Тип | Может быть пустым | Примечание |
---|---|---|---|---|
1 | code | Int | Нет | Код возврата, 0: нормально, другие: ошибки |
2 | message | String | Да | Ошибка |
3 | data | Json | Да | Результат проверки |
а. Пример нормального возврата результатов проверки
{
"code": 0,
"message": null,
"data": {
"детекторы": [
{
"элементы": [
{
"маппинг_источника": {
"начальная_колонка": 1,
"конечная_колонка": 24,
"используемый_filename": "/WeBASE-Solidity-Security/dist/contracts/appid001/contracts/HelloWorld.sol",
"относительный_filename": "contracts/HelloWorld.sol",
"начало": 0,
"длина": 23,
"короткий_filename": "contracts/HelloWorld.sol",
"является_зависимостью": false,
"строки": [
1
],
"абсолютный_filename": "/WeBASE-Solidity-Security/dist/contracts/appid001/contracts/HelloWorld.sol"
},
"название": "^0.4.2",
"тип": "pragma",
"специфичные_поле_типа": {
"инструкция": [
"solidity",
"^",
"0.4",
".2"
]
}
}
],
"влияние": "Информационное",
"уверенность": "Высокая",
"markdown": "Версионный pragma [^0.4.2](contracts/HelloWorld.sol#L1) позволяет использовать старые версии\n",
"описание": "Версионный pragma ^0.4.2 (contracts/HelloWorld.sol#1) позволяет использовать старые версии\n",
"идентификатор": "b93b7ce0902076867f801a1b62ad7557d0305767e196372ed38c0d7076440c1e",
"проверка": "solc-version"
}
]
}
}
```б. Пример аномального возврата результатов проверки
```json
{
"code": 203003,
"message": "Обратный отладочный трасс [самого последнего вызова]:\n Файл \"/usr/local/lib/python3.6/dist-packages/crytic_compile/platform/solc.py\", строка 309, в _run_solc\n ret = json.loads(stdout)\n Файл \"/usr/lib/python3.6/json/__init__.py\", строка 354, в loads\n return _default_decoder.decode(s)\n Файл \"/usr/lib/python3.6/json/decoder.py\", строка 339, в decode\n obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n Файл \"/usr/lib/python3.6/json/decoder.py\", строка 357, в raw_decode\n raise JSONDecodeError('Ожидаемое значение', s, err.value) from None\njson.decoder.JSONDecodeError: Ожидаемое значение: строка 1 столбец 1 (символ 0)\n\nПри обработке вышеупомянутой ошибки произошла другая ошибка:\n\nОбратный отладочный трасс (самого последнего вызова):\n"
}
Traceback (most recent call last):
В файле "__main__.py", строка 578, в функции main_impl
(slither_instances, results_detectors, results_printers, number_contracts) = process_all(filename, args, detector_classes, printer_classes)
В файле "/usr/local/lib/python3.6/dist-packages/slither/__main__.py", строка 60, в функции process_all
compilations = compile_all(target, **vars(args))
В файле "/usr/local/lib/python3.6/dist-packages/crytic_compile/crytic_compile.py", строка 1023, в функции compile_all
compilations.append(CryticCompile(filename, **kwargs))
В файле "/usr/local/lib/python3.6/dist-packages/crytic_compile/crytic_compile.py", строка 142, в конструкторе CryticCompile
self._compile(target, **kwargs)
В файле "/usr/local/lib/python3.6/dist-packages/crytic_compile/crytic_compile.py", строка 915, в функции _compile
self._platform.compile(self, target, **kwargs)
В файле "/usr/local/lib/python3.6/dist-packages/crytic_compile/platform/solc.py", строка 90, в функции compile
working_dir=solc_working_dir,
В файле "/usr/local/lib/python3.6/dist-packages/crytic_compile/platform/solc.py",
6/dist-packages/crytic_compile/platform/solc.py", строка 312, в функции _run_solc
raise InvalidCompilation(f"Неправильное компилирование solc {stderr}")
crytic_compile.platform.exceptions.InvalidCompilation: Неправильное компилирование solc /WeBASE-Solidity-Security/dist/contracts/appid003/contracts/HelloWorld.sol:6:16: Ошибка: ожидался ';' , но получен '('
functio get()constant returns(string){
^
contracts/HelloWorld.sol:6:16: Ошибка: ожидался ';' , но получен '('
functio get()constant returns(string){
^
**3. Возвратный код информации**| Код | сообщение | Описание |
| ---- | --------------------------------------------- | ------------------------------ |
| 0 | успех | Нормальное состояние |
| 103001 | система ошибки | Системное исключение |
| 103002 | параметр неваліден | Ошибка параметров |
| 203001 | В папке contracts нет файлов с расширением .sol | Отсутствие контрактов в папке contracts |
| 203002 | ошибка выполнения shell | Ошибка выполнения shell |
| 203003 | аномалия контракта | Аномалия проверки контракта |
## 3. Установка сервиса
### 3.1 Предварительные условия
| Программное обеспечение | Версия |
| ------------------------ | ------------------- |
| Java | JDK8 или выше |
| Python | 3.6+ |
| solc | 0.4.25 |
| slither | |
#### Установка slither
Установите slither через pip
```bash
pip install slither-analyzer
В зависимости от версий контрактов, требуемых для проверки, установите компилятор контрактов solc. В данном примере используется версия 0.4.25 контракта. После скачивания поместите его в каталог PATH.
curl -LO https://github.com/FISCO-BCOS/solidity/releases/download/v0.4.25/solc-linux.tar.gz
После распаковки скопируйте исполняемые файлы в каталог /bin.
Проверьте успешность установки командой:
slither --version
Выполните следующую команду:
git clone https://github.com/WeBankFinTech/WeBASE-Solidity-Security.git
Перейдите в директорию:
cd WeBASE-Solidity-Security
Используйте один из следующих методов для компиляции:
Метод 1: Если сервер уже имеет установленный Gradle версии 4.10 или выше
gradle build -x test
Метод 2: Если сервер не имеет установленного Gradle или версия ниже 4.10, используйте gradlew для компиляции
chmod +x ./gradlew && ./gradlew build -x test
После завершения сборки, скомпилированный код будет находиться в каталоге dist
в корневом каталоге WeBASE-Solidity-Security
.
Перейдите в каталог dist
и выполните следующие команды:
Запуск: bash start.sh
Остановка: bash stop.sh
Проверка: bash status.sh
Примечание: После запуска процесса сервиса, необходимо проверить логи для подтверждения нормального запуска. Если в логах присутствует указанное содержимое, значит сервис запущен правильно; если сервис работает некорректно, после изменения конфигураций, при попытке запустить сервис, который уже запущен, сначала выполните stop.sh
, затем start.sh
.```
...
Application() - основной запуск завершен успешно...
#### 3.2.3 Просмотр журнала
Просмотр в директории `dist`:
журнал сервиса: tail -f log/WeBASE-Solidity-Security.log
You can comment after Login
Inappropriate content may be displayed here and will not be shown on the page. You can check and modify it through the relevant editing function
If you confirm that the content does not involve inappropriate language/advertisement redirection/violence/vulgar pornography/infringement/piracy/false/insignificant or illegal content related to national laws and regulations, you can click submit to make an appeal, and we will handle it as soon as possible.
Comments ( 0 )