  Nowadays, more and more applications are developed for running on a
distributed ledger technology, namely dApps. The business logic of dApps is
usually implemented within smart contracts developed through Solidity, a
programming language for writing smart contracts on different blockchain
platforms, including the popular Ethereum. In Ethereum, the smart contracts run
on the machines of miners and the gas corresponds to the execution fee
compensating such computing resources. However, the deployment and execution
costs of a smart contract depend on the implementation choices done by
developers. Unappropriated design choices could lead to higher gas consumption
than necessary. In this paper, we (i) identify a set of 19 Solidity code smells
affecting the deployment and transaction costs of a smart contract, and (ii)
assess the relevance of such smells through a survey involving 34 participants.
On top of these smells, we propose GasMet, a suite of metrics for statically
evaluating the code quality of a smart contract from the gas consumption
perspective. An experiment involving 2,186 smart contracts demonstrates that
the proposed metrics have direct associations with deployment costs. The
metrics in our suite can be used for more easily identifying source code
segments that need optimizations.
