go-ethereum: gas estimate
Smart contract gas fee
์ฐ๋ฆฌ๊ฐ ์ค๋งํธ ์ปจํธ๋ํธ์ ์ฝ๋๋ฅผ ์คํํ ๋, ํด๋น ์ฝ๋๋ EVM์์ ์คํ๋๊ณ gas estimate๋ฅผ ๊ฑฐ์น ๋ค, ํน์ ๊ฐ์ค๋น๊ฐ ์๋ชจ๋๋ค.
geth ํด๋ผ์ด์ธํธ๋ ๋ช ์ฐจ๋ก ์จ๋ณธ ์ ์ด ์์ผ๋ ์ฌ์ค ๊ฐ์ค๋น๊ฐ ์ ํํ๊ฒ ์ด๋ป๊ฒ ์ฑ ์ ๋๊ณ ์ด๋ป๊ฒ ์๋ชจ๋๋์ง์ ๋ํด์๋ ๋ชจ๋ฅธ๋ค.
๊ทธ๋ฌ๋ ๋ถ๋ช ํ ์ด๋๊ฐ์ ์ฝ๋๋ก ํด๋น ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ ๊ณณ์ด ์์ ๊ฒ์ด๋ค.
์ด์ ๋ํด์ go-ethereum ์ฝ๋๋ฅผ ๋ถ์ํ๋ฉด์ ์์๋ณด๋ ค๊ณ ํ๋ค.
์ฝ๋๊ฐ ์๋ ๋ฐฉ๋ํด์ ์ํ์ฐฉ์ค๊ฐ ๊ฝค ๋ง์๋ค.
์ฐ์ geth ํจํค์ง๋ฅผ ์ด์ฉํด์ gas estimate๋ฅผ ํ๋ ๋ถ๋ถ์ ๋ํด์ ์ฐพ์๋ดค๋ค.
gas estimate๋ฅผ ํ๋ ํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
var conn *ethclient.Client
var err error
// Dial rpc endpoint
if conn, err = ethclient.Dial(rpcEndpoint); err != nil {
return nil, err
}
conn.EstimateGas(context.Background(), ethereum.CallMsg{
...
})EstimatGas ํจ์์ definition์ ์ฐพ์๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
๋ด์ผํ ๋ถ๋ถ์ด ๊ต์ฅํ ๋ง๋ค. ์ฒ๋ฆฌ ๊ธธ๋ ํ ๊ฑธ์ ๋ถํฐ๋ผ๊ณ ํ๋๊น ํ๋ํ๋ ๋ฏ์ด๋ณด์.
hexutil์ ๋จ์ํ 16์ง์๋ฅผ ์ํด go-ethereum์์ ์ฌ์ฉํ๋ ํจํค์ง์ด๋ค.
Client ๊ฐ์ฒด ์์ฒด๋ ์๋์ ๊ฐ์ด ์๊ฒผ๋ค. ec.c ๋ถ๋ถ์ c๋ rpc client๋ฅผ ๋งํ๋ค.
rpc client๋ฅผ ํตํด์ CallContext๋ผ๋ ํจ์๋ฅผ ์คํํ๋ค.
ํด๋น ๋ฉ์๋๋ฅผ ๋ณด์.
์ฌ๊ธฐ์์ Client๋ rpc.Client์ด๋ค.
์ปจํ ์คํธ์ ๊ฒฐ๊ณผ๊ฐ, ๋ฉ์๋, ์ธ์๋ฅผ ๋ฐ์์ rpc ํธ์ถ์ ์๋ํ๋ค.
์ข ์ ์ EstimateGas ์์ CallContext๋ฅผ ํธ์ถํ ๋ result๋ก hex ๋ณ์์ ์ฃผ์๊ฐ์ ๋๊ฒผ๋ค.
๋ฐ๋ผ์ result์ ๊ฒฐ๊ณผ๊ฐ์ ๋ด๋ ๋ฐฉ์์ผ๋ก ์งํ์ด ๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ message๋ฅผ ํตํด์ ๊ฒฐ๊ตญ โeth_estimateGasโ ๋ผ๋ ๋ฉ์๋๋ฅผ ์คํํ๋ค๋ ๊ฒ์ธ๋ฐ, ๊ฒฐ๊ตญ ๊ฐ์ค๋น๋ฅผ estimateํ๋ ๋ก์ง์ ํด๋น ๋ฉ์๋์ ์์๊ฑฐ๋ผ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ์ฐพ์์ผํ๋ ๊ฒ์ โeth_estimateGasโ ์ ๊ตฌํ์ฒด์ด๋ค.
go-ethereum์ ethapi ํจํค์ง๋ฅผ ์ฐพ์๋ณด๋ฉด, ๋ค์ ๋ฉ์๋๋ฅผ ์ฐพ์ ์ ์๋ค.
๋ธ๋ก ๋๋ฒ/ํด์๋ฅผ ๋ฐ์์ DoEstimateGas ํจ์๋ฅผ ์คํํ๋ค.
DoEstimatsGas ์ญ์ ๊ฐ์ ํ์ผ์ ์์นํ๋๋ฐ, ํจ์๊ฐ ์ข ๊ธธ๋ค.
ํ๋ํ๋ ์ดํด๋ณด์.

lo, hi ๋ณ์๋ฅผ ๊ฐ๊ฐ ์ ์ธํ๊ณ , ์ฑ๊ณตํ์ ๋์ ์คํจํ์ ๋๋ก ๋๋์ด์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค.

args.From ์ด nil์ธ ๊ฒฝ์ฐ new(common.Address)๋ฅผ ํตํด์ ZeroAddress๋ฅผ ์์ฑํ๋ค.
์์ธ์ฒ๋ฆฌ๋ก ์๋ฌ๋ฅผ ๋ฐํํ๋๊ฒ ์๋๋ผ 0์ฃผ์๊ฐ์ ํ ๋นํ๊ณ ๊ทธ๋๋ก ์งํํ๋๋ฏ ํ๋ค.
๊ทธ ๋ค์ ๊ตฌ๋ฌธ์ ์กฐ๊ฑด๋ฌธ์ ํด์ํด๋ณด์.
args.Gas๊ฐ nil์ด ์๋๊ณ , args.Gas์ value๋ฅผ uint64๋ก ์บ์คํ
ํ์๋ params.TxGas๋ณด๋ค ๋๋ค๋ฉด
์ด๋ผ๋ ์กฐ๊ฑด์ด๋ค. ์ด์ฏค์์ ํจ์์ ํ๋กํ ํ์ ์ ๋ค์๋ณด์.
args๋ ํธ๋์ญ์
์ธ์์ด๋ค. params๋ ์ด๋์ ์์๊น? go-ethereum์ paramsํจํค์ง์ TxGas๋ผ๋ constant ๊ฐ์ด ์๋ค.

์ฃผ์์ ์ฐธ๊ณ ํ๋ฉด, ์ปจํธ๋ํธ ์์ฑ์ด ์๋ ํธ๋์ญ์ ์ ๋ํ ๊ธฐ๋ณธ ๊ฐ์ค๋น๋ก ์๊ฐํ ์ ์๋ค.
๊ทธ๋ฌ๋ payable์ ๋ถ๊ฐ๋ฅํ๋ค๋ ๋ป์ผ๋ก ๋ณด์ธ๋ค.
์๋ฌดํผ ๋์์์ ๋ค์ ์ดํด๋ณด์.

์ด์ ๋ ํ ๋ฒ์ ์ ์ ์๋ค. ํธ๋์ญ์ ์ธ์์ ๊ฐ์ค๊ฐ ๊ธฐ๋ณธ ๊ฐ์ค๋น (21,000)๋ณด๋ค ๋๋ค๋ฉด
hi(ํธ๋์ญ์ ์ด ์ฑ๊ณตํ์ ๋์ ๊ฐ์ค)๋ฅผ ํด๋น ๊ฐ์ค๋น๋ก ์ค์ ํ๋ผ๋ ๋ป์ด๋ค.
else โฆ ๊ตฌ๋ฌธ์ ํด๋น๋๋ ค๋ฉด args.Gas๊ฐ nil์ด๊ฑฐ๋, args.Gas๊ฐ params.TxGas๋ณด๋ค ๋ฎ์์ผ ํ๋ค.
๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ ํ์ฌ ๋ธ๋ก์ ๊ฐ์ ธ์ค๊ณ , ๋ธ๋ก์ GasLimit์ผ๋ก ์ ์ฉํ๋ค.

๋ฐฉ๊ธ ์์์ ํ ๊ฒ์ hi๋ฅผ ์ค์ ํ๋ ๊ฐ์ ์ด์๋ค. ์ด์ feeCap์ ์ค์ ํด์ผํ๋ค.
GasFeeCap: ํธ๋์ญ์ ์ ๋ํด ์ง๋ถํ๊ณ ์ ํ๋ ์ต๋ ๊ธ์ก (base fee + priority fee)
์ฒซ ๋ฒ์งธ if๋ฌธ์ ์ ์ฒด nil guard์ ๋ํ ๋ถ๋ถ์ด๊ณ , ๊ทธ ๋ค์์ ์ธ ๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋๋ค.
GasPrice๊ฐ nil์ด ์๋๋ค.
MaxFeePerGas๊ฐ nil์ด ์๋๋ค.
MaxPriorityFeePerGas๊ฐ nil์ด ์๋๋ค.
1๋ฒ์ ๊ฒฝ์ฐ์๋ feeCap์ด GasPrice๋ก ์ค์ ๋๋ค.
2๋ฒ์ ๊ฒฝ์ฐ์๋ Max ์ํ์ ์ด ์ค์ ๋์ด์์ผ๋ฏ๋ก ๊ทธ๋๋ก ์ค์ ํด์ค๋ค.
3๋ฒ์ ๊ฒฝ์ฐ์๋ 0์ผ๋ก ์ค์ ํ๋ค. (์์ํ์ง๋ง ์ผ๋จ ๋์ด๊ฐ๋ค)

๊ทธ ๋ค์ ์ญ์ญ ๋์ด๊ฐ์, from ์ฃผ์์ ์๊ณ ์ ๋น๊ตํด์ ๋ณ์๋ค์ ์ฌ ์ ๊ฒํ๋ ๋ก์ง์ธ๋ฏํ๋ค.
allowance๋ฅผ ์ค์ ํ๋ ๋ถ๋ถ์ ๋ณด๋ฉด ํ์ฌ ๊ณ์ ์ ์๊ณ ๋ฅผ feeCap์ผ๋ก ๋๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ allowance๊ฐ uint64 ๋ฒ์ ์ด์์ธ ๊ฒฝ์ฐ์๋ ์ฒดํฌ๋ฅผ ๋ฉ์ถ๋ค.
๊ทธ ๋ฐ์ ๋ณด๋ฉด hi๊ฐ gasCap๋ณด๋ค ๋์ ๊ฒฝ์ฐ์๋ gasCap์ผ๋ก ๋ค์ ์ค์ ํด์ค๋ค.
๊ฒฐ๊ตญ ์ฌ๊ธฐ๊น์ง์ ๋ก์ง์ ๋ชจ๋ ๊ฐ์ค ํ๋๋ฅผ ์ค์ ํด์ฃผ๋ ๋ก์ง์ด๋ค.
๊ทธ ๋ค์๋ถํฐ์ ๋ก์ง์ด ์ฐ๋ฆฌ๊ฐ ์ํ๋, ์ค์ ๋ก ์ฝ๋๋ฅผ ์คํ์์ผ์ ๊ฐ์ค๋น๋ฅผ ๊ณ์ฐํ๋ ๋ก์ง์ด ๋์จ๋ค.

๋งจ ์์์ ์ฐ์ allowance์ ๋ฒ์ ๋ด์์ ๊ฐ์ฅ ๋์ ๊ฐ์ค๋น๋ฅผ ์ฌ์ฉํด์ ์ฝ๋๋ฅผ ์คํํ๊ณ , ์คํจํ ๊ฒฝ์ฐ ๊ณง์ฅ ์๋ฌ๋ฅผ ๋ฐํํ๋ค.
๋ง์ฝ ์ฑ๊ณตํ ๊ฒฝ์ฐ์๋ ์ด๋ถํ์์ผ๋ก ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ค๋น๋ฅผ ์ฐพ๋๋ค.
์ฆ eth_estimateGas๋ ์ฝ๋๋ฅผ EVM ์์์ ์ฌ๋ฌ ๋ฒ ์ํํด๋ด์ผ๋ก์จ ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ค๋น๋ฅผ ์ฐพ์์ฃผ๋ ๊ฒ์ด๋ค.
์ด์ ๊ทธ๋ผ executeEstimate ํจ์๋ฅผ ๋ค์ถฐ๋ณด์.
์ผ๋จ ๋ก์ง๋ง ์ดํด๋ณด์.
doCall ํจ์๋ฅผ ์ด์ฉํด์ ์คํจ์ธ์ง ์๋์ง์ ๋ํ ๋ถ๋ถ๋ง ๋ฆฌํดํ๋ค.
doCall ํจ์๋ ๊น๋ณด์.
์ผ๋จ overrides.Apply(state) ํจ์๋ฅผ ์ถ์ธกํด๋ณด๊ฑด๋ฐ, ์๋ง ์ปจํธ๋ํธ์ ํ์ฌ ์ํ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๊น? ๋ผ๋ ์๊ฐ์ด ๋ ๋ค.
์๋ฌด๋๋ ๋ณด๊ธฐ์ข๊ฒ ๋น๋๊ฐ ๊ฒ ๊ฐ๋ค. ์ผ๋จ ์ํ๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ ๊ฒ ๊น์ง๋ ์ด๋ฆ์์ ์ถฉ๋ถํ ์ถ์ธกํ ์ ์์์ง๋ง, ์ปจํธ๋ํธ์ ์ํ๊ฐ ์๋๋ผ ๊ณ์ ์ ์ํ๋ฅผ ๋งํ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ ๋ค์์ timeout์ด ์ค์ ๋์ด ์์ผ๋ฉด Context WithTimeout์ผ๋ก, ์์ ๊ฒฝ์ฐ Context WithCancel ํจ์๋ก ์ปจํ ์คํธ์ cancel func๋ฅผ ์์ฑํด์ค๋ค.

๊ทธ ๋ค์ ์ฝ๋๋ก ๋์ด๊ฐ๋ณด์.

์ผ๋จ globalGasCap, header.BaseFee ๋ฅผ ์ฌ์ฉํด์ ๋ค์ด์จ ํธ๋์ญ์
argument๋ฅผ ๋ฉ์ธ์ง ํ์
์ผ๋ก ๋ง๋ค์ด์ค๋ค.
๊ทธ ์ดํ์ core.NewEVMBlockContext๊ฐ ๋ฐ๋ก ์๋ก์ด EVM ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ถ๋ถ์ด๋ค.
์ฌ๊ธฐ์ ์ผ๋จ Header ๊ตฌ์กฐ์ฒด๋ฅผ ์ดํด๋ณด๊ณ ๊ฐ์.
์ฃผ์์ ๋ณด๋ฉด, ์ด๋๋ฆฌ์์ ๋ธ๋ก ํค๋์ ๋ํ ๊ตฌ์กฐ์ฒด๋ผ๊ณ ๋์์๋ค.
๊ทธ ๋ค์์ NewChainContext ์ธ์๋ก backend(API ์ธํฐํ์ด์ค)์ ์ปจํ ์คํธ๋ฅผ ๋๊ธด๋ค.
์ด์ NewEVMBlockContext๋ฅผ ํ ๋ฒ ์ฝ๋๋ก ์ดํด๋ณด์.
author๊ฐ nil์ธ์ง ์๋์ง๋ก ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํ ๋ชจ์ต์ด ๋ณด์ด๋๋ฐ, ์์์ author์ nil์ ์ง์ด๋ฃ์๋ค.
๋ฐ๋ผ์ estimate๋ฅผ ํ ๋๋ ํญ์ author==nil ์กฐ๊ฑด์ ์ถฉ์กฑํ ๊ฒ์ด๋ค.
๋๋จธ์ง๋ ๋จ์ํ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ๋ฃ์ด์ฃผ๋ ๋ฏ ํ๋ค.
๊ทธ ์ดํ๋ก GetEvm, ApplyMessage ๋ฑ์ผ๋ก ์คํํ๋ค.
๊ฒฐ๊ตญ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ด ์๋ ๋ถ๋ถ์ด ๋๋ค.

๋๊ฐ๋ด๋ ApplyMessage๊ฐ ์ ๋ง ์์ฌ์ค๋ฝ๋ค. go-ethereum์์ ์ถ์ํ๋ฅผ ๋งค์ฐ ์ํด๋์ ํจ์๋ฅผ ๋ช ๋ฒ ํ๊ณ ๋ค์ด๊ฐ๋ค๋ณด๋ฉด ๋ค์ ๋ฉ์๋๋ฅผ ์ฐพ์ ์ ์๋ค.
๋๋์ด ๊ทธํ ๋ก ์ฐพ๋ ์คํ๋ถ ๊ตฌํ์ฒด์ด๋ค.

๋งจ ์์์ ๋ถํฐ ์ดํด๋ณด๋ฉด, 6๊ฐ์ง ์ปจ์ผ์์ค ์กฐ๊ฑด์ ๋ชจ๋ ์ถฉ์กฑํด์ผ ๋ฉ์ธ์ง๋ฅผ ์ ์ฉํ๋ค.

์๋ ์ฌ์ง์ ๋ณด๋ฉด, ์ปจํธ๋ํธ ์์ฑ์ธ ๊ฒฝ์ฐ์ ์๋ ๊ฒฝ์ฐ๋ก ๋๋์ด์ ๋ค์ ์คํ๋๋ค.

๊ทธ ๋ค๋ก๋ ๊ณ์ํด์ ์ถ์ํ๋ฅผ ํตํด ๊ฐ์ข ์์ธ์ฒ๋ฆฌ์, ์ํ DB์์ ํ์ฌ ์ํ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์ฝ๋๋ฅผ ์ปดํ์ผ ํ๋ ๋ฑ์ ์ฝ๋๋ค์ด ๋์จ๋ค.
๊ทธ๋ ๊ฒ ์คํํ ์ฝ๋์ ๊ฒฐ๊ณผ๊ฐ ๋ฑ์ด ์ฐจ๋ก๋ก ๋ฆฌํด๋๊ณ , ์คํ์ ์์๋ ๊ฐ์ค๊ฐ์ด ๋ฆฌํด๋๋ค.
์ต์ด์ ethClient.EstimateGas๋ก ๋ถํฐ ๊ฑฐ์ 10๊ฐ๊ฐ ๋๋ ์ธํฐํ์ด์ค๋ฅผ ์ง๋์ ๋๋ฌํ ์ ์์๋ค.
go-ethereum์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ๋๋ ๊ฒ์ ์ฝ๋ ์์ฒด์ ํ๋ฆฌํฐ๊ฐ ๋์ ๊ฒ๋ ์์ง๋ง, ๊ฐ์ธ์ ์ผ๋ก ๋ค์ 5๊ฐ์ง์ ์ฃผ๋ชฉ์ด ๋๋ค.
๊ด์ฌ์ฌ์ ๋ฐ๋ผ ์ธํฐํ์ด์ค๋ก ์ถ์ํ๋ฅผ ์ ํด๋ ๊ฒ ๊ฐ๋ค.
ํจ์ ํธ์ถ์ ํ์ํ ์ธ์๊ฐ ๋ง์์ง๋๋ผ๋ ์๋ก์ด ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ๊ฐ๋ ์ฑ์ ํด์น์ง ์๋๋ก ๊ฐ ๋ณ์๋ค์ ์ฃผ์ ํ๋๋ก ํ๋ค.
์์ธ์ฒ๋ฆฌ๊ฐ ๋งค์ฐ ์๊ฒฉํ๊ฒ ์ด๋ฃจ์ด์ก๋ค.
Getter, Setter๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๋ค.
ํจ์ ๋ด์์ ์ฌ์ฉํ ๋ณ์๋ค์
var ()๋ก ๋ฌถ์ด์ ์ ์ธ, ์ฃผ์์ ์ถ๊ฐํจ์ผ๋ก์จ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ ์์ผ๋ก ํจ์ ๋ด์์ ์งํ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์์ ๊ฐ๋ฅํ๊ฒ๋ ํ๋ค.
Last updated