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 ๊ฐ’์ด ์žˆ๋‹ค.

๊ฐ์ข… constant๊ฐ’. ์ด์ œ ๊ตฌ๊ธ€๋ง ํ•˜์ง€๋ง๊ณ  ์ด๊ฑฐ ๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์ฃผ์„์„ ์ฐธ๊ณ ํ•˜๋ฉด, ์ปจํŠธ๋ž™ํŠธ ์ƒ์„ฑ์ด ์•„๋‹Œ ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๊ฐ€์Šค๋น„๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ payable์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋œป์œผ๋กœ ๋ณด์ธ๋‹ค.

์•„๋ฌดํŠผ ๋Œ์•„์™€์„œ ๋‹ค์‹œ ์‚ดํŽด๋ณด์ž.

์ด์ œ๋Š” ํ•œ ๋ฒˆ์— ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์ธ์ž์˜ ๊ฐ€์Šค๊ฐ€ ๊ธฐ๋ณธ ๊ฐ€์Šค๋น„ (21,000)๋ณด๋‹ค ๋†’๋‹ค๋ฉด

hi(ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณตํ–ˆ์„ ๋•Œ์˜ ๊ฐ€์Šค)๋ฅผ ํ•ด๋‹น ๊ฐ€์Šค๋น„๋กœ ์„ค์ •ํ•˜๋ผ๋Š” ๋œป์ด๋‹ค.

else โ€ฆ ๊ตฌ๋ฌธ์— ํ•ด๋‹น๋˜๋ ค๋ฉด args.Gas๊ฐ€ nil์ด๊ฑฐ๋‚˜, args.Gas๊ฐ€ params.TxGas๋ณด๋‹ค ๋‚ฎ์•„์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํ˜„์žฌ ๋ธ”๋ก์„ ๊ฐ€์ ธ์˜ค๊ณ , ๋ธ”๋ก์˜ GasLimit์œผ๋กœ ์ ์šฉํ•œ๋‹ค.

feeCap์„ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋ณด์ธ๋‹ค.

๋ฐฉ๊ธˆ ์œ„์—์„œ ํ•œ ๊ฒƒ์€ hi๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฐ€์ •์ด์—ˆ๋‹ค. ์ด์ œ feeCap์„ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค.

GasFeeCap: ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•ด ์ง€๋ถˆํ•˜๊ณ ์ž ํ•˜๋Š” ์ตœ๋Œ€ ๊ธˆ์•ก (base fee + priority fee)

์ฒซ ๋ฒˆ์งธ if๋ฌธ์€ ์ „์ฒด nil guard์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ด๊ณ , ๊ทธ ๋‹ค์Œ์€ ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋‰œ๋‹ค.

  1. GasPrice๊ฐ€ nil์ด ์•„๋‹ˆ๋‹ค.

  2. MaxFeePerGas๊ฐ€ nil์ด ์•„๋‹ˆ๋‹ค.

  3. 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๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.

timeout > 0 or zero

๊ทธ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ€๋ณด์ž.

์ผ๋‹จ globalGasCap, header.BaseFee ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋“ค์–ด์˜จ ํŠธ๋žœ์žญ์…˜ argument๋ฅผ ๋ฉ”์„ธ์ง€ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

๊ทธ ์ดํ›„์— core.NewEVMBlockContext๊ฐ€ ๋ฐ”๋กœ ์ƒˆ๋กœ์šด EVM ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์ผ๋‹จ Header ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ดํŽด๋ณด๊ณ  ๊ฐ€์ž.

์ฃผ์„์„ ๋ณด๋ฉด, ์ด๋”๋ฆฌ์›€์˜ ๋ธ”๋ก ํ—ค๋”์— ๋Œ€ํ•œ ๊ตฌ์กฐ์ฒด๋ผ๊ณ  ๋‚˜์™€์žˆ๋‹ค.

๊ทธ ๋‹ค์Œ์€ NewChainContext ์ธ์ž๋กœ backend(API ์ธํ„ฐํŽ˜์ด์Šค)์™€ ์ปจํ…์ŠคํŠธ๋ฅผ ๋„˜๊ธด๋‹ค.

์ด์ œ NewEVMBlockContext๋ฅผ ํ•œ ๋ฒˆ ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด์ž.

author๊ฐ€ nil์ธ์ง€ ์•„๋‹Œ์ง€๋กœ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๋ชจ์Šต์ด ๋ณด์ด๋Š”๋ฐ, ์œ„์—์„œ author์— nil์„ ์ง‘์–ด๋„ฃ์—ˆ๋‹ค.

๋”ฐ๋ผ์„œ estimate๋ฅผ ํ•  ๋•Œ๋Š” ํ•ญ์ƒ author==nil ์กฐ๊ฑด์„ ์ถฉ์กฑํ•  ๊ฒƒ์ด๋‹ค.

๋‚˜๋จธ์ง€๋Š” ๋‹จ์ˆœํžˆ ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๋“ฏ ํ•˜๋‹ค.

๊ทธ ์ดํ›„๋กœ GetEvm, ApplyMessage ๋“ฑ์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

๊ฒฐ๊ตญ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์ด ์•„๋ž˜ ๋ถ€๋ถ„์ด ๋œ๋‹ค.

์ฝ”๋“œ๋ฅผ ์‹คํ–‰

๋ˆ„๊ฐ€๋ด๋„ ApplyMessage๊ฐ€ ์ •๋ง ์˜์‹ฌ์Šค๋Ÿฝ๋‹ค. go-ethereum์—์„œ ์ถ”์ƒํ™”๋ฅผ ๋งค์šฐ ์ž˜ํ•ด๋†”์„œ ํ•จ์ˆ˜๋ฅผ ๋ช‡ ๋ฒˆ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋‹ค๋ณด๋ฉด ๋‹ค์Œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

๋“œ๋””์–ด ๊ทธํ† ๋ก ์ฐพ๋˜ ์‹คํ–‰๋ถ€ ๊ตฌํ˜„์ฒด์ด๋‹ค.

preCheck

๋งจ ์œ„์—์„œ ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด๋ฉด, 6๊ฐ€์ง€ ์ปจ์„ผ์„œ์Šค ์กฐ๊ฑด์„ ๋ชจ๋‘ ์ถฉ์กฑํ•ด์•ผ ๋ฉ”์„ธ์ง€๋ฅผ ์ ์šฉํ•œ๋‹ค.

4-6 condition

์•„๋ž˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด, ์ปจํŠธ๋ž™ํŠธ ์ƒ์„ฑ์ธ ๊ฒฝ์šฐ์™€ ์•„๋‹Œ ๊ฒฝ์šฐ๋กœ ๋‚˜๋‰˜์–ด์„œ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค.

๋ถ„๊ธฐ์ฒ˜๋ฆฌ

๊ทธ ๋’ค๋กœ๋„ ๊ณ„์†ํ•ด์„œ ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ๊ฐ์ข… ์˜ˆ์™ธ์ฒ˜๋ฆฌ์™€, ์ƒํƒœ DB์—์„œ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ ํ•˜๋Š” ๋“ฑ์˜ ์ฝ”๋“œ๋“ค์ด ๋‚˜์˜จ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ์‹คํ–‰ํ•œ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๊ฐ’ ๋“ฑ์ด ์ฐจ๋ก€๋กœ ๋ฆฌํ„ด๋˜๊ณ , ์‹คํ–‰์— ์†Œ์š”๋œ ๊ฐ€์Šค๊ฐ’์ด ๋ฆฌํ„ด๋œ๋‹ค.

์ตœ์ดˆ์˜ ethClient.EstimateGas๋กœ ๋ถ€ํ„ฐ ๊ฑฐ์˜ 10๊ฐœ๊ฐ€ ๋„˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€๋‚˜์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

go-ethereum์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ๋А๋‚€ ๊ฒƒ์€ ์ฝ”๋“œ ์ž์ฒด์˜ ํ€„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์€ ๊ฒƒ๋„ ์žˆ์ง€๋งŒ, ๊ฐœ์ธ์ ์œผ๋กœ ๋‹ค์Œ 5๊ฐ€์ง€์— ์ฃผ๋ชฉ์ด ๋๋‹ค.

  1. ๊ด€์‹ฌ์‚ฌ์— ๋”ฐ๋ผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”๋ฅผ ์ž˜ ํ•ด๋‘” ๊ฒƒ ๊ฐ™๋‹ค.

  2. ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ํ•„์š”ํ•œ ์ธ์ž๊ฐ€ ๋งŽ์•„์ง€๋”๋ผ๋„ ์ƒˆ๋กœ์šด ๊ตฌ์กฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ฐ€๋…์„ฑ์„ ํ•ด์น˜์ง€ ์•Š๋„๋ก ๊ฐ ๋ณ€์ˆ˜๋“ค์„ ์ฃผ์ž…ํ•˜๋„๋ก ํ–ˆ๋‹ค.

  3. ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋งค์šฐ ์—„๊ฒฉํ•˜๊ฒŒ ์ด๋ฃจ์–ด์กŒ๋‹ค.

  4. Getter, Setter๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ–ˆ๋‹ค.

  5. ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋“ค์„ var ()๋กœ ๋ฌถ์–ด์„œ ์„ ์–ธ, ์ฃผ์„์„ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ์•ž์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ง„ํ–‰๋  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์˜ˆ์ƒ ๊ฐ€๋Šฅํ•˜๊ฒŒ๋” ํ•œ๋‹ค.

Last updated