Skip to content

Instantly share code, notes, and snippets.

@b00ris
Last active August 23, 2019 11:35
Show Gist options
  • Save b00ris/bb7745cef4c31d3e8ad3ebe4240bd5cf to your computer and use it in GitHub Desktop.
Save b00ris/bb7745cef4c31d3e8ad3ebe4240bd5cf to your computer and use it in GitHub Desktop.

Dappcon workshop: How to become ethereum core developer - https://git.io/fjN4L

Workshop goal

Impliment EIP-2028 Transaction data gas cost reduction

Requirements

Prepare enveiroment

For development

mkdir -p $GOPATH/src/github.com/ethereum
cd $GOPATH/src/github.com/ethereum
git clone --branch workshop --recursive --single-branch --depth=1 https://github.com/JekaMas/go-ethereum.git

For testing

  • build retesteth
git clone --branch master --single-branch --depth=1 https://github.com/ethereum/retesteth.git
cd retesteth
mkdir build
cd build
cmake ..
make -j4
cp retesteth/retesteth $GOPATH/bin/retesteth
cd ../../
  • build lllc
git clone --branch develop --single-branch https://github.com/ethereum/solidity.git
cd solidity/
git checkout 9709dfe0
mkdir build
cd build/
cmake ..
make lllc
cp lllc/lllc $GOPATH/bin/lllc
cd ../../

Implementation

  1. Add new constant to params/protocol_params.go Example: before
    TxDataNonZeroGas         uint64 = 68 

after

    TxDataNonZeroGas         uint64 = 68 
    TxDataNonZeroGasIstanbul uint64 = 16 
  1. Add new logic to core/state_transition.go Example: before
    if (math.MaxUint64-gas)/params.TxDataNonZeroGas < nz {
        return 0, vm.ErrOutOfGas
    }
    gas += nz * params.TxDataNonZeroGas

after

    txDataNonZeroGas := params.TxDataNonZeroGas
    if ctx.GetForkFlag(params.IsIstanbulEnabled) {
        txDataNonZeroGas = params.TxDataNonZeroGasIstanbul
    }

    if (math.MaxUint64-gas)/txDataNonZeroGas < nz {
        return 0, vm.ErrOutOfGas
    }
    gas += nz * txDataNonZeroGas
  1. check that it can build make geth

Testing

  1. Add default retesteth config(go-ethereum/tests/testdata/Retesteth) config from https://github.com/b00ris/retesteth_config if you don't have it

  2. Run geth in retesteth mode ./build/bin/geth retesteth --rpcport 8545

  3. Add new test to tests/testdata/src/GeneralStateTestsFiller/stExample(make a copy of add11Filler.json with your name(e.g. istambulgasFiller.json))

  4. Rename test name inside add11 -> your_test_name eg istambulgas

  5. Check that retesteth works well:

$ retesteth  -t GeneralStateTests/stExample -- --singletest istambulgas --testpath $GOPATH/src/github.com/ethereum/go-ethereum/tests/testdata/ --filltests
Running tests using path: "/Users/boris/go/src/github.com/ethereum/go-ethereum/tests/testdata/"
Running 1 test case...
Active client configurations: 'default '
Filter: 'istambulgas'
Running tests for config 'Ethereum GO on TCP' 2
Test Case "stExample": 
100%

*** No errors detected

Where: istambulgas - is your test name $GOPATH/src/github.com/ethereum/go-ethereum/tests/testdata/ - is a path to you test data

  1. Check that lllc works well
  • in pre section for 095e7baea6a6c7c4c2dfeb977efac326af552d87 account remove compiled contract code "code" : "0x6001600101600055"
  • uncomment "code" : "{ [[ 0 ]] (ADD 1 1) }",
  1. Define pre section of account
        "pre" : {
            "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
                "balance" : "1000000000000000000",
		        "code" : "{ [[0]] (GAS) }",
                "nonce" : "0",
                "storage" : {
                }
            },
            "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
                "balance" : "1000000000000000000",
                "code" : "0x",
                "nonce" : "0",
                "storage" : {
                }
            }
        },

To check gas used we need lllc code [[0]] (GAS) It put into the 095e7baea6a6c7c4c2dfeb977efac326af552d87 storage remaining gas. On Istanbul it should be greater by 52 (68-16).

Note: If you have a problem with lllc you could use compiled version - 0x5a600055, where:

5a - GAS
60 - PUSH1
00 - 0 (operand of PUSH1)
55 - SSTORE
  1. Add data to transaction (single non-zero byte)
        "data" : [
            "0x01"
        ],
  1. Add expected section
        "expect" : [
            {
                "indexes" : {
                    "data" : -1,
                    "gas" : -1,
                    "value" : -1
                },
                "network" : ["Constantinople"],
                "result" : {
                    "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
                        "storage" : {
                            
                        }
                    }
                }
            },
            {
                "indexes" : {
                    "data" : -1,
                    "gas" : -1,
                    "value" : -1
                },
                "network" : ["Istanbul"],
                "result" : {
                    "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
                        "storage" : {
                           
                        }
                    }
                }
            }
        ],

  1. Let's test
 retesteth  -t GeneralStateTests/stExample -- --singletest istambulgas --testpath /Users/boris/go/src/github.com/ethereum/go-ethereum/tests/testdata/ --filltests
Running tests using path: "/Users/boris/go/src/github.com/ethereum/go-ethereum/tests/testdata/"
Running 1 test case...
Active client configurations: 'default '
Filter: 'istambulgas'
Running tests for config 'Ethereum GO on TCP' 2
Test Case "stExample": 
100%
Error: istambulgas 0x095e7baea6a6c7c4c2dfeb977efac326af552d87 storage has more storage records then expected! (istambulgas)
Error: incorrect storage [0x00] = 0x05c832, expected [0x00] = 0 (istambulgas)
Error: CompareStates failed with errors: IncorrectStorage Network: Constantinople, TrInfo: d: 0, g: 0, v: 0, Test: istambulgas (istambulgas)

--------
TestOutputHelper detected 3 errors during test execution!
/Users/boris/workshop/retesteth/retesteth/TestOutputHelper.cpp:151: error: in "GeneralStateTests/stExample": 

*** 1 failure is detected in the test module "Master Test Suite"

--------
*** TOTAL ERRORS DETECTED: 3 errors during all test execution!
--------

  1. Add expected storage to expected section
  • for Constantinople
"storage" : {
    "0x00" : "0x05c832"
}

(0x05c832 == 378930 )

  • for Istanbul
"storage" : {
    "0x00" : "0x05c866"
}

0x05c866 == 378982

and 378982 - 378930 = 52

  1. And test it again
retesteth  -t GeneralStateTests/stExample -- --singletest istambulgas --testpath /Users/boris/go/src/github.com/ethereum/go-ethereum/tests/testdata/ --filltests
Running tests using path: "/Users/boris/go/src/github.com/ethereum/go-ethereum/tests/testdata/"
Running 1 test case...
Active client configurations: 'default '
Filter: 'istambulgas'
Running tests for config 'Ethereum GO on TCP' 2
Test Case "stExample": 
100%

*** No errors detected
  1. Profit!!! You became core ethereum developer. You first EIP is ready.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment