Dappcon workshop: How to become ethereum core developer - https://git.io/fjN4L
Impliment EIP-2028 Transaction data gas cost reduction
- clone geth from
workshop
branch - https://github.com/JekaMas/go-ethereum/tree/workshop (there are some simplifications related to hardforks for workshop purposes)
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
- 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 ../../
- Add new constant to
params/protocol_params.go
Example: before
TxDataNonZeroGas uint64 = 68
after
TxDataNonZeroGas uint64 = 68
TxDataNonZeroGasIstanbul uint64 = 16
- 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
- check that it can build
make geth
-
Add default retesteth config(go-ethereum/tests/testdata/Retesteth) config from
https://github.com/b00ris/retesteth_config
if you don't have it -
Run geth in retesteth mode
./build/bin/geth retesteth --rpcport 8545
-
Add new test to
tests/testdata/src/GeneralStateTestsFiller/stExample
(make a copy of add11Filler.json with your name(e.g. istambulgasFiller.json)) -
Rename test name inside
add11
->your_test_name
egistambulgas
-
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
- Check that lllc works well
- in
pre
section for095e7baea6a6c7c4c2dfeb977efac326af552d87
account remove compiled contract code"code" : "0x6001600101600055"
- uncomment
"code" : "{ [[ 0 ]] (ADD 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
- Add data to transaction (single non-zero byte)
"data" : [
"0x01"
],
- 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" : {
}
}
}
}
],
- 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!
--------
- Add expected storage to expected section
- for Constantinople
"storage" : {
"0x00" : "0x05c832"
}
(0x05c832
== 378930
)
- for Istanbul
"storage" : {
"0x00" : "0x05c866"
}
0x05c866
== 378982
and 378982 - 378930 = 52
- 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
- Profit!!! You became core ethereum developer. You first EIP is ready.