Giter Site home page Giter Site logo

solidity-profiler's Introduction

solidity-profiler - Hackathon Submision

Sometimes it could be excruciating to find out most hungry lines of solidity code. It could happen because of wrong loop condition or overflow, and unclear. We've thought that Solidity profiler is missing part for the Ethereum development eco-system and decided to implement working prototype during hackathon using wide known tools.

Implementation

We've forked solidity coverage. And after did following fixes:

  • Bulk renaming to save compatibility with the original project.
  • Extend code coverage event with gasleft() value
  • Patch event procession and report generation step, to nicely render it with Istanbul code coverage utils that is a part of solidity coverage

Demo project

To demonstrate how profiler works we take our fork of ecsol project. On that fork we apply has gas optimization that was purposed by Vitalik. So, we were really curious to know the details of our gas optimization.

To get solidity profiler output on sample project do the following:

First, you need the following global dependencies installed:

npm install -g truffle
npm install -g ganache-cli

After clone repositories and perform npm i and npm run profiler

mkdir solidity-profiler-demo
cd solidity-profiler-demo

git clone https://github.com/k06a/solidity-profiler
cd solidity-profiler
npm i
cd ../

git clone -b feature/solidity-profiler https://github.com/1Address/ecsol
cd ecsol
npm i

npm run profiler

Discover report file in ecsol/coverage/index.html directory

Further Plans

Our hackathon soltion is just a proof of concept and we think that can improve it in the following way:

  • Display min/max/avg/median gas consumption for each line
  • Split complex lines to multiple lines with identation
  • Make a lot of other improvements and fixes on a long way to the production use ;-)

Original readme from forked repo:

Join the chat at https://gitter.im/k06a/solidity-profiler npm version CircleCI codecov Stories in Ready

Gas profiling for Solidity smart contracts

Let's optimize gas usage!

Install

$ npm install --save-dev solidity-profiler

Run

Option 1

$ ./node_modules/.bin/solidity-profiler

Option 2

$ $(npm bin)/solidity-profiler

Tests run significantly slower while profiler is being working. Your contracts are double-compiled and a 1 to 2 minute delay between the end of the second compilation and the beginning of test execution is possible if your test suite is large. Large Solidity files can also take a while to instrument.

  • Solidity fixtures / mocks / tests stored in the tests/ directory are no longer supported. If your suite uses native Solidity testing or accesses contracts via mocks stored in tests/ (a la Zeppelin), coverage will trigger test errors because it's unable to rewrite your contract ABIs appropriately. Mocks should be relocated to the root folder's contracts directory. More on why this is necessary at issue 146

Network Configuration

By default, solidity-profiler generates a stub truffle.js that accommodates its special gas needs and connects to a profiler-enabled fork of the ganache-cli client called testrpc-sc on port 8555. This special client ships with solidity-profiler - there's nothing extra to download. If your tests will run on truffle's development network using a standard truffle.js and ganache-cli instance, you shouldn't have to do any configuration or launch the coverage client separately. If your tests depend on logic or special options added to truffle.js you should declare a coverage network there following the example below.

Example

module.exports = {
  networks: {
    development: {
      host: "localhost",
      port: 8545,
      network_id: "*"
    },
    profiler: {
      host: "localhost",
      network_id: "*",
      port: 8555,         // <-- If you change this, also set the port option in .solprofiler.js.
      gas: 0xfffffffffff, // <-- Use this high gas value
      gasPrice: 0x01      // <-- Use this low gas price
    },
    ...etc...
  }
};

Options

You can also create a .solprofiler.js config file in the root directory of your project and specify additional options if necessary:

Example:

module.exports = {
    port: 6545,
    testrpcOptions: '-p 6545 -u 0x54fd80d6ae7584d8e9a19fe1df43f04e5282cc43',
    testCommand: 'mocha --timeout 5000',
    norpc: true,
    dir: './secretDirectory',
    copyPackages: ['zeppelin-solidity'],
    skipFiles: ['Routers/EtherRouter.sol']
};
Option Type Default Description
accounts Number 35 Number of accounts to launch testrpc with.
port Number 8555 Port to run testrpc on / have truffle connect to
norpc Boolean false Prevent solidity-profiler from launching its own testrpc. Useful if you are managing a complex test suite with a shell script
testCommand String truffle test Run an arbitrary test command. ex: mocha --timeout 5000. NB: Also set the port option to whatever your tests require (probably 8545).
testrpcOptions String --port 8555 options to append to a command line invocation of testrpc. NB: Using this overwrites the defaults so always specify a port in this string and in the port option
copyNodeModules Boolean false ⚠️ DEPRECATED use copyPackages instead ⚠️ Copies node_modules into the coverage environment. May significantly increase the time for coverage to complete if enabled. Useful if your contracts import solidity files from an npm installed package (and your node_modules is small).
copyPackages Array [] Copies specific node_modules packages into the coverage environment. May significantly reduce the time for coverage to complete compared to copyNodeModules. Useful if your contracts import solidity files from an npm installed package.
skipFiles Array ['Migrations.sol'] Array of contracts or folders (with paths expressed relative to the contracts directory) that should be skipped when doing instrumentation. Migrations.sol is skipped by default, and does not need to be added to this configuration option if it is used.
deepSkip boolean false Use this if instrumentation hangs on large, skipped files (like Oraclize). It's faster.
dir String . Solidity-profiler copies all the assets in your root directory (except node_modules) to a special folder where it instruments the contracts and executes the tests. dir allows you to define a relative path from the root directory to those assets. Useful if your contracts & tests are within their own folder as part of a larger project.
buildDirPath String /build/contracts Build directory path for compiled smart contracts

FAQ

Solutions to common issues people run into using this tool:

Example reports

Contribution Guidelines

Contributions are welcome! If you're opening a PR that adds features please consider writing some unit tests for them. You could also lint your submission with npm run lint. Bugs can be reported in the issues.

Contributors

solidity-profiler's People

Contributors

andresilva avatar area avatar artall64 avatar bingen avatar cag avatar celeduc avatar cgewecke avatar dimitarsd avatar e11io avatar eugeneiiim avatar gitter-badger avatar h3ph4est7s avatar k06a avatar maxsam4 avatar mseijas avatar pcowgill avatar phiferd avatar shrugs avatar sohkai avatar ukstv avatar vdrg avatar waffle-iron avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.