
(대부분 컨트랙트 검수에 대한 내용)
강의 영상 : https://www.youtube.com/watch?v=gvtKAmS8-S4
강의 자료 : https://github.com/PatrickAlphaC/denver-security


web3 관련 해킹이 작년에만 200M를 넘어섰고, 대부분 감사를 받지 않은 컨트랙트였다고 한다.


web3보안은 개발자라면 반드시 챙겨야 하는 덕목이자, 기본 역량이다.

web3 audit, security에 관한 report를 제공하는 웹 사이트 : https://solodit.xyz/
컨트랙트 코드를 작성하고 바로 감사 업체에 맡기는 것이 아니라, 자체적으로 테스트는 돌려보고 와야 한다.

web3 감사에 대한 직무도 소개해줬는데, 고급인력이라고 한다.

이 분야에서 일하고 싶으면 EVM에 대한 해박한 지식, 배우려는 의지가 중요하다고 한다.
(해커는 항상 새로운 방법을 들고 오기 때문에)



이제 Audit 과정을 알아보자. (검수, 감사 뭐라고 칭해야 될지 모르겠다)

크게 두 가지 방법으로 검수를 할 수 있다.

실력을 늘리고 싶으면, 계속 엉덩이 붙이고 보고 또 보란다.

테스트 스위트는 여러 가지가 있다.
우리 해커톤 팀도 곧 정해야 하는데,
대표적으로 hardhat, foundry가 있다.
추후에 다시 자세히 정리하겠지만,
hardhat : js,ts 기반 테스트 작성 가능, 대중화 높음
foundry : 모든 걸 sol 언어로 커버, 스마트 fuzzer 제공, 빠름
특징이 있다.


Static Analysis :
Static analysis는 소프트웨어 개발에서 사용되는 정적 분석 기법입니다. 이 기법은 소스 코드를 실행하지 않고도 코드의 구조, 문법, 의존성 등을 분석하여 잠재적인 오류나 문제를 찾아내는 것을 목표로 합니다.
정적 분석은 코드를 분석하는 과정에서 다양한 도구와 기법을 활용합니다. 예를 들어, 코드의 문법적인 오류를 검사하는 것, 변수의 정의되지 않은 사용을 찾아내는 것, 잠재적인 버그 패턴을 식별하는 것 등이 있습니다. 이러한 분석은 소스 코드의 구조를 이해하고, 일반적인 프로그래밍 원칙과 관련된 오류를 탐지하는 데 도움을 줍니다.
정적 분석은 코드의 복잡성을 낮추고, 버그를 사전에 찾아내어 소프트웨어의 품질을 향상시키는 데 도움이 됩니다. 또한, 코드 리뷰나 테스트 전에 오류를 발견하고 수정함으로써 개발자의 생산성을 향상시키는 데에도 도움이 됩니다.
일반적으로 정적 분석은 IDE(통합 개발 환경), 빌드 도구, 자동화된 품질 보증 도구 등에서 사용됩니다. 이러한 도구들은 코드를 분석하여 잠재적인 문제를 식별하고, 개발자에게 경고 또는 오류 메시지를 제공하여 코드 품질을 향상시키는 데 도움을 줍니다.
fuzz testing이란 테스트를 할 때 무작위 값을 넣어 취약점을 찾는 방법이다.
이전에 foundry 강의에서 했었듯 foundry는 smart fuzzer 기능을 제공한다.
예를 들어 어떤 함수가 uint256을 받는다고 했으면, fuzzer는 0~2**256값 중 에러가 날 만한 값들을
ㅈㄴ 때려 넣어서 테스팅을 할 수 있다.
(hardhat에서는 제공하지 않는 기능이기에, foundry가 괜찮아 보이는데?)

Stateful Fuzz Testing이란 stateless의 반대로,
테스팅 할 함수를 띡! 테스팅하고 테스트 성공! 이러고 끝나는 것이 아니라,
여러 함수를 선행시켜서 state를 유지시키고 함수를 실행해 testing을 하는 경우다.


코드를 보자.

doMoreMathAgain이란 함수를 테스트하고 싶다면, 저 함수만 fuzz테스트를 돌린다면
항상 테스트를 통과할 것이다.
상단에 선언된 myValue가 1 고정이니까, 무조건 res는 1이상이 나올 것 아닌가?
그러니까 0이 안 나오지.
그런데 누군가 changeValue로 myValue를 0으로 바꾸고 doMoreMathAgain을 돌린다면?
0이 나오니까 테스팅이 실패할 것이다.
결론적으로 이를 테스트하기 위해 stateful test가 필요한 것이다.
아래가 일반 fuzz test고

이 아래가 stateful fuzz test 코드다.
자세히는 나도 모르겠지만, 차이점은
targetContract를 사용한다는 점이다.





시간이 엄청 든다고 한다. (신경 쓰지 말라는 말투로 들리는데?)

AI Tools? 좋은지 모르겠다. sucks 란다

