Docker를 사용하여 개인 네트워크에서 Geth 실행
블록체인 응용 개발 교과서(리턴 에디션)
참고로 Docker를 사용하여 개인 네트워크에서Geth를 실행하고 발굴합니다.
책에는 Windows와 MacOS만 사용하기 때문에 Docker에서 사용하는 방법과
책에 적힌 메시지가 여러 개 낡았기 때문에 지금 행동법을 적으세요.
docker-compose에서 Geth 사용 가능
docker run
이동도 가능하지만 옵션 지정이 수월해지길 원해 사용했다dokcer-compose
.그림은
ethereum/client-go
이니까 이걸로 해요.version: "3"
services:
app:
image: ethereum/client-go
entrypoint: "/bin/sh"
tty: true
volumes:
- .:/geth
entrypoint: "/bin/sh"
관하여ethereum/client-go
의 entrypoint는ENTRYPOINT ["geth"]
구성하다.따라서 원형
docker-compose up
을 유지하면 geth의 네트워크가 시작됩니다.당분간 용기에서 geth 명령을 자유롭게 사용하고 싶어서요.
entrypoint: "/bin/sh"
docker-compose up
로 네트워크를 시작하지 않습니다.부팅
mbazuki:geth-sandbox hide$ docker-compose up
Recreating geth-sandbox_app_1 ... done
Attaching to geth-sandbox_app_1
컨테이너 입장mbazuki:geth-sandbox hide$ docker-compose exec app /bin/sh
/ # ls
bin etc home media opt root sbin sys usr
dev geth lib mnt proc run srv tmp var
/ #
/ # geth version
Geth
Version: 1.10.18-unstable
Git Commit: f94e23ca66eef8fdac2473ce99ca6ad57324aaa2
Architecture: amd64
Go Version: go1.18.1
Operating System: linux
GOPATH=
GOROOT=go
이렇게 하면 Docker 용기에서 geth
명령을 사용할 수 있다.Geth의 초기화
개인 네트워크는 하나의 블록도 없는 상태이다.
따라서 첫 번째 블록(Genesis block)을 만들고 초기화해야 합니다.
개인 네트워크 디렉터리
private_net
를 만들고 그 중에서 genesis.json
를 만듭니다.{
"config": {
"chainId": 22,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0
},
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x20000",
"extraData": "",
"gasLimit": "0x2fefd8",
"nonce": "0x00000000000000031",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
이곳은 책이면 항목이 더 적지만 변경되어 Giithub에 적힌 것을 사용합니다.chainId
적당히22
.nonce
도 적절한 값으로 설정했다.초기화 명령은 다음과 같습니다.
geth --datadir /geth/private_net/ init /geth/private_net/genesis.json
datadir
는 데이터를 저장할 때 사용할 디렉토리를 지정합니다.지정되지 않았다면
~/.ethereum
, 만들어진 것private_net/
을 지정한다.출력
/geth/private_net # geth --datadir /geth/private_net/ init /geth/private_net/genesis.json
INFO [05-02|06:43:33.332] Maximum peer count ETH=50 LES=0 total=50
INFO [05-02|06:43:33.332] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
WARN [05-02|06:43:33.465] Sanitizing cache to Go's GC limits provided=1024 updated=662
INFO [05-02|06:43:33.465] Set global gas cap cap=50,000,000
INFO [05-02|06:43:33.468] Allocated cache and file handles database=/geth/private_net/geth/chaindata cache=16.00MiB handles=16
INFO [05-02|06:43:33.583] Writing custom genesis block
INFO [05-02|06:43:33.583] Persisted trie from memory database nodes=0 size=0.00B time="27.7µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [05-02|06:43:33.613] Successfully wrote genesis state database=chaindata hash=119a56..09b937
INFO [05-02|06:43:33.613] Allocated cache and file handles database=/geth/private_net/geth/lightchaindata cache=16.00MiB handles=16
INFO [05-02|06:43:33.724] Writing custom genesis block
INFO [05-02|06:43:33.726] Persisted trie from memory database nodes=0 size=0.00B time="22.3µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [05-02|06:43:33.763] Successfully wrote genesis state database=lightchaindata hash=119a56..09b937
Successfully wrote genesis state
하면 성공합니다.private_net/
에서 geth/
와keystore/
가 생성되었다.Geth의 시작
책의 지령은 다음과 같다.
geth --networkid "10"--nodiscover --datadir ~/geth/private_net --rpc --rpcaddr "localhost"--rpcport "8545"--rpccorsdomain "*"--rpcapi "eth,net,web3,personal"--targetgaslimit "20000000"console 2>> ~/geth/private_net/error.log
rpc
관련 명령의 명칭은 http
로 바뀌었다.또 수법을 찾지 못했지만
targetgaslimit
도miner.gaslimit
로 바뀌었다.그래서 다음과 같다.
geth --networkid "22" --nodiscover --datadir /geth/private_net \
--http --http.addr "localhost" --http.port "8545" --http.corsdomain "*" \
--http.api "eth,net,web3,personal" --miner.gaslimit "20000000" \
console 2>> /geth/private_net/error.log
(목록은 이 글에서도/geth/private_net
라서 바뀌었다)매개변수에 대한 설명은 다음과 같습니다.
genesis.json
의 chainId
에 지정된 정수error.log
.INFO [05-02|07:26:09.346] Maximum peer count ETH=50 LES=0 total=50
INFO [05-02|07:26:09.349] Smartcard socket not found, disabling err="stat /run/pcscd/pcscd.comm: no such file or directory"
WARN [05-02|07:26:09.382] Sanitizing cache to Go's GC limits provided=1024 updated=662
시작출력
/geth # geth --networkid "22" --nodiscover --datadir /geth/private_net --miner.gaslimit "20000000" console 2>> /get
h/private_net/error.log
Welcome to the Geth JavaScript console!
instance: Geth/v1.10.18-unstable-f94e23ca/linux-amd64/go1.18.1
at block: 0 (Thu Jan 01 1970 00:00:00 GMT+0000 (UTC))
datadir: /geth/private_net
modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
To exit, press ctrl-d or type exit
>
Welcome to the Geth JavaScript console!
하면 성공합니다.계정 생성 및 발굴
위에서 Geth를 시작하면 콘솔이 시작되므로 명령을 직접 입력합니다.
다음은 책이니 간단히 쓰시오.
> personal.newAccount("hogehoge1234")
"0xdcfc0837e489ead966ecdb00abce38d72267c474"
> personal.newAccount("hoge")
"0xac5a53981b38eb63134dfee19934742542ef5874"
출력된 것은 계좌입니다.블록 생성 보수를 받는 동전 기반 계좌가 있습니다.
여기는 첫 번째로 만든 계좌를 책임집니다.
> eth.coinbase
"0xdcfc0837e489ead966ecdb00abce38d72267c474"
↑ 첫 번째 계좌와 동일 확인.파내다
처음에는 아직 블로킹을 하지 않았기 때문에
> eth.blockNumber
0
시작> miner.start(1)
null
첫 발굴 시작에 시간이 걸린다.몇 분 걸렸어요.
블록이 생성되었습니다.
> eth.blockNumber
82
동전 기반 계좌에는 보수로 받는 이더넷이 포함돼 있다.> eth.getBalance(eth.accounts[0])
178000000000000000000
처음에는 아무도 (또는 이 네트워크는 나 혼자만) 거래를 하지 않았는데 왜 제멋대로 차단망을 만들었을까.실제로 거래(거래)가 없어도 블록이 생성된다.
블록에 포함된 0에서 시작된 여러 개의 거래가 TransactionTree라고 불리는 트리 구조에 들어갔다.블록은 항상 시간의 추이에 따라 지속적으로 생성되기 때문에 네트워크 초기나 우연히 사용이 적은 경우에도 거래가 없을 수 있다.사무는 메시지 호출과 두 가지로 구성되어 있다.
가오장문.블록체인 응용개발 교과서(리턴 에디션).Kindle 버전.
Reference
이 문제에 관하여(Docker를 사용하여 개인 네트워크에서 Geth 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hid3/articles/5533d50b1d3de8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)