golang ์ผ๋ก ๊ฐ๋ฐ๋ ์ปจํธ๋ํธ ๊ฐ๋ฐ ๋๊ตฌ(tool) ์
๋๋ค.
์ปจํธ๋ํธ ๊ฐ๋ฐ์ ์ํ ํ๋ก์ ํธ ์์ฑ์ ๋์์ฃผ๋ฉฐ, ํ
์คํธ๋ฅผ ์ํ ์๋ฎฌ๋ ์ด์
๊ณผ ์ ํธ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
# go 1.22
git clone https://github.com/bang9ming9/go-hardhat && cd go-hardhat
### bms: bang9ming9 solidity ###
# case1: /usr/local/bin ์ ๋น๋ํ๊ธฐ
sudo go build -o /usr/local/bin/bms .
# case2: ์ํ๋ ๊ฒฝ๋ก ๋น๋ ํ PATH ๋ฑ๋กํ๊ธฐ
go build -o <YOUEPATH>/bms .
echo 'export PATH=$PATH:<YOUEPATH>/bms' >> ~/.zshrc # or ~/.bashrc
mkdir my-contract && cd my-contract
bms init my-contract
go.mod ํ์ผ ์์ฑ๊ณผ ๋์์ contracts
, test
๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
contracts
๋๋ ํ ๋ฆฌ์๋ remapping.txt, .prettierrc ํ์ผ์ ์์ฑํฉ๋๋ค.
ํด๋น ํ์ผ์ VSCode ์ Solidity Extention ์์ ์ ์ฉํ๊ฒ ๋์ํฉ๋๋ค.
VSCode์์ editor.formatOnSave๋ฅผ true๋ก ์ค์ ํ๋ฉด ํ์ผ์ ์ ์ฅํ ๋ ์๋์ผ๋ก ์ฝ๋๊ฐ ํฌ๋งทํ ๋ฉ๋๋ค.
setting.json
{
...
"editor.formatOnSave": true,
...
}
test
๋๋ ํ ๋ฆฌ์๋ bms ๋ช
๋ น์ด์ go-hardhat ์ฝ๋ ๋ฒ์ ์ ์ผ์น์ํค๊ธฐ ์ํด base.go ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
ํ๋ก์ ํธ์ contracts
๋๋ ํ ๋ฆฌ์ ์๋ ๋ชจ๋ .sol ํ์ผ์ ์ฐพ์ ์ปดํ์ผํ ํ, golang ์ผ๋ก ๋ฐ์ธ๋ฉ ํฉ๋๋ค.
bms compile <solc-version>
compile
๋ช ๋ น์ด์๋ ์ฌ๋ฌ ๊ฐ์ง ์ต์ ์ด ์์ผ๋ฉฐ,bms compile -h
๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค.์๋ฅผ ๋ค์ด, OpenZeppelin ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ ์๊ณ ํด๋น ๋๋ ํ ๋ฆฌ๊ฐ
contracts
ํด๋์ ํฌํจ๋์ด ์๋ค๋ฉด,
--exclude ./contracts/openzeppelin-contracts
์ต์ ์ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ๋์์์ ์ ์ธํ ์ ์์ต๋๋ค.
import (
...
"testing"
"github.com/bang9ming9/go-hardhat/bms"
utils "github.com/bang9ming9/go-hardhat/bms/utils"
...
)
// ์๋ฎฌ๋ ์ด์
๋ฐฑ์ค๋ ์์ฑ
func ... (t *testing.T){
...
backend := bms.NewBacked(t)
...
}
// ํ
์คํธ ์ง๊ฐ ๊ฐ์ ธ์ค๊ธฐ
func ... (t *testing.T){
...
eoas := bms.GetEOAs(t, 10)
...
}
// ํธ๋์ญ์
์คํํ๊ธฐ
func ...(t *testing.T) {
...
backend := bms.NewBacked(t)
eoas := bms.GetEOAs(t, 10)
txs := utils.NewTxPool(backend)
// case: ๋จ์ผ ํธ๋์ญ์
์ฑ๊ณต
require.NoError(t, txs.Exec(utils.SendDynamicTx(backend, owner, &eoa.From, []byte{})))
// case: ํธ๋์ญ์
์ฑ๊ณต
for _, eoa := range eoas {
// TxPool.Exec ์ ํตํด ํธ๋์ญ์
๋ชฉ๋ก ์บ์ฑ
require.NoError(t, txs.Exec(utils.SendDynamicTx(backend, owner, &eoa.From, []byte{})))
}
// TxPool.AllReceiptStatusSuccessful ์์ ์๋ฌ๊ฐ ๋ฆฌํด๋์ง ์์๋ค๋ฉด ๋ชจ๋ ์ฑ๊ณตํ ํธ๋์ญ์
require.NoError(t, txs.AllReceiptStatusSuccessful(ctx))
// case: ์์๋๋ ํธ๋์ญ์
์คํจ
require.Error(t, txs.Exec(utils.SendDynamicTx(backend, owner, &eoa.From, []byte{})))
_, err := txs.Exec(utils.SendDynamicTx(backend, owner, &eoa.From, []byte{}))
t.Log(err) // err ์ ํตํด์ revert message ํ์ธ ๊ฐ๋ฅ
}