今回は攻撃を回避するためのオークション用スマートコントラクトを実装していきます。
回避策
攻撃を回避するためにはどのような仕様にすればよいでしょうか。
入札(bid)と同時に返金を行うと、返金時に問題が発生し入札自体が失敗してしまうことがあるので、入札と返金の処理を分ける仕様にしてみたいと思います。
実装
入札と返金の処理を分けたコードは次の通りです。
[ソースコード]
1 | pragma solidity ^0.4.11; |
このコードのポイントは、bid部分と返金部分が独立し、もしwithdrawで失敗したとしてもその後の入札(bid)に影響を与えないことです。
まとめ
etherの返金は、送り先のコントラクトに悪意や実装の問題があると予期せぬ動作を引き起こされる可能性があります。
返金をするときは、他の処理とは独立させ返金専用の関数を作り、etherを取りにきてもらうのが安全だということになります。