Docker를 사용하여 개인 네트워크에서 Geth 실행

19850 단어 블록체인gethtech
Geth는 이더넷 클라이언트 중 하나입니다.
블록체인 응용 개발 교과서(리턴 에디션)
https://www.amazon.co.jp/dp/B079JYHZY3/
참고로 Docker를 사용하여 개인 네트워크에서Geth를 실행하고 발굴합니다.
책에는 Windows와 MacOS만 사용하기 때문에 Docker에서 사용하는 방법과
책에 적힌 메시지가 여러 개 낡았기 때문에 지금 행동법을 적으세요.

docker-compose에서 Geth 사용 가능

docker run 이동도 가능하지만 옵션 지정이 수월해지길 원해 사용했다dokcer-compose.
그림은 ethereum/client-go이니까 이걸로 해요.
https://hub.docker.com/r/ethereum/client-go/tags
version: "3"
services:
  app:
    image: ethereum/client-go
    entrypoint: "/bin/sh"
    tty: true
    volumes:
      - .:/geth
entrypoint: "/bin/sh"관하여ethereum/client-go의 entrypoint는ENTRYPOINT ["geth"]구성하다.
https://hub.docker.com/layers/client-go/ethereum/client-go/latest/images/sha256-f1d3acc0c2718db610baec236b77a7095dd395c333a979200a9d14ca2e93e3e3?context=explore
따라서 원형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에 적힌 것을 사용합니다.
https://github.com/ethereum/go-ethereum#operating-a-private-network chainId 적당히22.nonce도 적절한 값으로 설정했다.
초기화 명령은 다음과 같습니다.geth --datadir /geth/private_net/ init /geth/private_net/genesis.json datadir는 데이터를 저장할 때 사용할 디렉토리를 지정합니다.
https://geth.ethereum.org/docs/interface/command-line-options
지정되지 않았다면~/.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.logrpc 관련 명령의 명칭은 http로 바뀌었다.
https://github.com/ethereum/go-ethereum/pull/20935
또 수법을 찾지 못했지만targetgaslimitminer.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라서 바뀌었다)
매개변수에 대한 설명은 다음과 같습니다.
https://geth.ethereum.org/docs/interface/command-line-options
  • networkid
  • genesis.jsonchainId에 지정된 정수
  • 지정
  • nodiscover
  • Geth는 기본적으로 다른 노드에 연결하려고 시도합니다(다른 노드로부터의 연결도 수락됨). 따라서 비활성화
  • https://geth.ethereum.org/docs/interface/peer-to-peer#how-peers-are-found
  • datadir
  • Geth 초기화 시 지정된 디렉토리 지정
  • http 관련
  • 서버 이미지 구축
  • 이 글은 사용하지 않아도 문제없다
  • console 2
  • 로그의 출력
  • https://geth.ethereum.org/docs/interface/javascript-console
  • 실제로도 아래 오류 이외의 로그를 출력했기 때문에 파일 이름은 필요없습니다 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 버전.

    좋은 웹페이지 즐겨찾기