Try   HackMD

Gas Effiecient Smart Contract

  • Do not create contracts
  • Use fixed sized-type variables
    • use bytes32 instead of string or bytes
    • use uint256 instead of uint32
  • Minimize the frequency of data storage
    ​​// Avoid
    ​​function ttt() {
    ​​    a = 1;
    ​​    b = 2;
    ​​    .... // do something
    ​​    c = 3;
    ​​    d = 4
    ​​}
    ​​
    ​​// better
    ​​function ttt() {
    ​​    a = 1;
    ​​    b = 2;
    ​​    c = 3;
    ​​    d = 4;
    ​​    ... do something
    ​​}
    
    ​​// LOOP
    ​​uint cnt;
    ​​
    ​​// avoid
    ​​function ttt() {
    ​​    for(...) {
    ​​        cnt++;
    ​​    }
    ​​}
    ​​
    ​​// better
    ​​function ttt() {
    ​​    uint tmp = cnt;
    ​​    for(...) {
    ​​        tmp++;
    ​​    }
    ​​    cnt = tmp;
    ​​}
    
  • Data alignment (256 bits)
    ​​// Avoid
    ​​uint64 a;  --> x1
    ​​uint b     --> x2
    ​​byte c;    -|
    ​​uint64 d;  --> x3
    ​​
    ​​// better
    ​​uint64 a;   -|
    ​​uint64 d;    |
    ​​byte c;     --> x1
    ​​uint b;     --> x2
    
  • Batch execution
    • gas cost
      • standard tx: 21k
      • external call: 1.4k
    ​​// avoid
    ​​function ttt(address user);
    ​​
    ​​// better
    ​​function ttt(address[] users);
    ​​``
    
  • Short circuit rule
    ​​function a() --> cost 5k
    ​​function b() --> cost 20k
    ​​
    ​​// should
    ​​if (a() || b()) {
    ​​    ...
    ​​}
    
  • Use external for functions only accessed externally. (not public)

Miscs

  • data storage (SSTORE)
    • new: 20k (zero –> nonzero)
    • modify: 5k
    • delete: -15k (actual: -10k (-15k+5k) )
  • Instanbul hard fork
    • SLOAD: 200 –> 800
    • BALANCE: 400 –> 700
    • input data:
      • nonzero: 68 –> 16
      • zero: still 4
  • Interesting fact
    ​​function b() public  --> cost n
    ​​function a() public  --> cost n+22
    
    Function Name Optimization
tags note solidity