//tips
//smart contract
echidnaでコントラクトtestをすべく。
設定方法を模索する。
https://github.com/crytic/echidna
Githubから直接ダウンロードする方法で試してみるか。
./echidna-test <src pass>
で検証が始められるよう。
Githubの使用方法を見ながら試していく。
https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna#echidna-tutorial
早速docker pull trailofbits/eth-security-toolboxを実行。
zsh: command not found: dockerが表示される。
Node.jsの中にdockerを入れるのではなく、dockerの中にnode.jsを入れなければいけないのでMacにdockerをインストールするところから開始。
Dockerの初期設定から始める。
その上でコマンド。
docker
docker pull trailofbits/eth-security-toolbox
今度はきちんと通った。これはvscodeのターミナルではなく、別のターミナルで実行している。多少の時間がかかる。
docker run hello-worldもきちんと表示された。
そこから下記を実行。
docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox
どこかで使い方を習得した方がよさそう。
/Users/a/aft-demo
echidna-test /Users/a/nft-demo/ArtCollectible.sol
ターミナルを使いやすくしたiterm2からダウンロード。さらにvscodeにdocker拡張機能をインストール。
docker run hello-worldをみながら何が起こっているのかを理解する。
これはhello-worldというコンテナ実行環境のセットを実行していることになる。
dockerのベースにはOSとアプリがあり、それをセットにし、実行可能なパッケージにしたのがコンテナと考えるとわかりやすそう。
docker runはクライアントからの実行命令で、これによりバックグラウンドで動作し続けるデーモンという形でdockerのホスト内に生成され、このデーモンがコンテナの保存庫であるレジストリから、必要な情報を引っ張ってくる。この際に取得される情報はOSとアプリというコンテナ作成のベース情報で、それをもとにデーモンがコンテナを生成し、コンテナ内容を実行する。
なので、dockerのレジストリに蓄えられる情報はコンテナを生成するための大元のOS+アプリの情報になることがわかる。
つまり、最初にOSとアプリ情報をdockerに渡しておかなければコンテナ生成および実行はできないことがわかる。
Dockerでアプリを作成し、実行する段階に移る。この際に、アプリケーションコードとdockerfileの作成登録が必要。これがコンテナの雛形になる。
下記によりコンテナの雛形imageと呼ばれるものを作成する。
docker image build 名前
この後にdocker image ls を押すことできちんと作成できているかを確認できる。
このimageをコンテナ化していく。
docker container run イメージ名など
docker container logs コンテナ名でログが確認できる。
これらを踏まえてどのように既存のコントラクトをチェックするコンテナ部分のみを走らせることができるのかを解明する。
docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox
ここまでは良いのだが、コマンドでlsをすると
building-secure-contracts etheno-examples not-so-smart-contracts rattle
が表示される。
cd /home/training
を実行することでついに自分のドキュメントに入れた。
cd nft-demo
cd contracts
echidna-test ArtCollectible.sol
この結果echidna-test: Couldn't compile given fileというエラーが発生。importが対応していないのか。
ERROR:CryticCompile:Invalid solc compilation Error: Source "@openzeppelin/contracts/token/ERC721/ERC721.sol" not found: File not found.
--> ArtCollectible.sol:4:1:
下記のコミュニティでのエラーケース集を確認していく。
solc-select use 0.5.11に合わせて指定をする必要があったのだろうかと調べていくとそうではなさそう。
そもそもimportは認識できないよう。コントラクトだけ分離して確認すべきか。ただ、継承の関係もあるどうするか。
https://github.com/crytic/crytic-compile/issues/150
下記関連エラー。
https://github.com/crytic/echidna/issues/311
https://bytemeta.vip/repo/crytic/echidna/issues/724
https://githubhot.com/repo/crytic/echidna/issues/642
参考使用ケース:
https://ventral.digital/posts/2021/12/21/fuzzing-complex-projects-with-echidna-sushi-bentobox