스마트 컨트렉트(contract 계약), 은 미리 프로그래밍 한 작동로직을 

암호화폐에 넣어놔서 특정 조건 (어떤 계약 체결등)을 트리거로 로직을 발현시켜 놓은 장치 입니다.

 

이 코딩은 솔리디티라는 언어를 통해서 만드는데, 

이 솔리디티 언어는 어떠한거고 어떻게 만드는지 부터 시작해 보고자 합니다.

 

우선 솔리디티 프로그래밍을 하려면 remix 라는 IDE(visual stduio, 이클립스 같은 툴)가 필요합니다.

 

로컬에서 docker를 사용해서 IDE를 다운받아 봅시다

https://github.com/ethereum/remix-ide

 

GitHub - ethereum/remix-ide: Documentation for Remix IDE

Documentation for Remix IDE. Contribute to ethereum/remix-ide development by creating an account on GitHub.

github.com

여기서 소개 하는것과 같이 파워쉘에서 아래와 같이 도커 이미지를 받고, 실행시켜 줍니다.

docker pull remixproject/remix-ide:latest
docker run -p 8080:80 remixproject/remix-ide:latest

그리고 http://localhost:8080 를 크롬같은곳에서 실행하면 아래와 같이 브라우저가 뜹니다.

여기서 test.sol 파일을 만들어 줍시다.

파일 탐색기에 contracts 눌러서 그 위의 문서 아이콘을 눌러 새 파일을 만들 수 있습니다.

소스는 아래와 같이 작성합니다.

pragma solidity >=0.5.0 <0.7.0;
contract HelloWorld {
    function get() public pure returns (string memory) {
        return 'Hello Go-Ethereum Contract';
    }
}

이제 컴파일을 해줍니다.

컴파일은 아래와 같이 하되, pragma 의 컴파일 버전에 주의 해서 선택해 줘야 합니다.

컴파일 버튼 눌렀으면 결과가 나오는데 밑에 

ABI 와 Byteencode 를 살펴 봅시다.

ABI
Bytecode

이제 이렇게 프로그래밍된것을 배포 해야 하는데요

컴파일 밑 아이콘 눌러 보시면 

Deploy(배포) & Run Transactions 이 나옵니다.

여기서 account, cas value 등을 설정한뒤 deploy 를 누르면 됩니다.

 

이제 이걸 우리 프라이빗 geth 서버에 붙게 해봅시다.

geth 설정 파일에 보면 http 랑 api 허용등을 설정하는 옵션이 있는데, 저기로 붙으면 됩니다.

만약 연결이 안되면 geth node 띄울때 문제가 있으니까, 설정을 체크해보록 합시다.

 

이제 보면 어떤 계좌에 활성화 시킬지,

얼마에 할지, 수수료는 얼마인지 그런것들 설정하고, deploy(배포)를 눌러 주면 됩니다.

이전 포스트 대로 연습한 것을 main node라 치고

다른 PC에 node 를 만들어서 연결해 봅시다.

 

지금 main node 는 제가 사정상 대만에 있는 PC고,

sub node 는 한국에 있는 PC입니다.

 

sub node 설정은 

https://rosagigantea.tistory.com/672?category=1025993 

 

이더리움 네트워크 구성하기. (초기 설정 및 진입)

docker image 를 통해서 기본 환경 설정은 끝났습니다. 이제 genesis 블록이라는 블록체인의 최초 블록을 설정해 줘야 합니다. 제 PC상 D드라이브의 Works\Go-Ethereum 이 Home 디렉토리(폴더)입니다. 여기서 g

rosagigantea.tistory.com

여기까지 같은 genesis.json 을 사용하여 만들어 줍니다.

 

네트워크 port 포워딩을 해줘야 하는데,

공유기 마다 설정이 다르니, 이부분은 적당히 처리 하셔야 합니다.

뚫어 주실땐, TCP(Listen) 과, UDP(Discovery) 를 둘다 해주시는게 좋습니다.

윈도우 방화벽도 예외처리 해줍시다

인바운더로 udp, tcp 30303 을 뚫었습니다.

 

sub node 쪽 환경설정은 조금 다르게 처리 했습니다.

nat extip 로 밖에서 받아주는 ip를 설정해 줘야하고

이 PC에는 랜카드가 3개가 설치 되어 있어서 공유기로 설정된 고정 IP와 port 를 제대로 docker 쪽에 연결 할 수 있도록 

설정해 줘야 합니다.

 

서버를 띄우면 눈치 채셨겠지만

이부분을 찾거나

admin.nodeInfo.enode 로 확인 할 수 있습니다.

저 문자열을 마우스로 긁으면 복사해 올 수 있는데

이제 main node 쪽에 와서

admin.addPeer("붙여넣기") 로 넣어 줍니다.

이후 admin.peers 를 하면 연결 된것을 확인할 수 있습니다.

작년에 포스트한 것처럼

https://rosagigantea.tistory.com/647?category=916510 

 

미국 주식 투자 하기

제 생각도 그렇고 누구도 동의 하겠지만, 현재 세계최강은 미국입니다. 중국이 쫏아오고 몇년후면 미국을 뛰어 넘는다 이야기를 하지만, 군사력이나 경제력에서는 아직 압도적으로 미국이 위라

rosagigantea.tistory.com

미국은 현재 세계 최강대국이고

4차산업의 메카며, 이 4차 산업은 전세계 연결된 인터넷(아직 인류 절반만 사용하지만)을 통해

엄청난 수익을 얻고 있습니다.

 

그래서 은행이자보단 높은 수익을 원하되, 그나마 안전하게 먹고 싶을때 사용하는것이

현재 한국 주식시장에서 팔고 있는 미국 ETF를 적립식으로 구입하는 방법입니다.

실제 아래와 같이 구글 시트로 

월급중 50만원을 6년 전부터 꾸준히 매월 1일, 그날 종가로 구입을 했다고 치면,

총 투입금액 3600만원으로, 주식 가치금액은 8700만원이 됩니다. 

총 5100만원을 이득을 봤다는 거죠.

만약 적금을 들었다고 쳤을때, 2% 정도가 평균인데, 그 경우

총 4000만원으로 미국 ETF 주식으로 넣었을 경우에 비하면 4700만원이나 적은 금액입니다.

 

물론 결과론적으로 미국 주식이 저렇게 오르니까 그렇게 말 할 수 있는거다

만약 카카오를 대신 샀으면 몇억이다 할 수 있지만,

어디까지나 안전하게 꾸준히 은행보단 많이 먹기위한 

좋은 방법중 하나로 소개 시켜 드립니다.

(이거 계산한 이유도, 퇴직연금 투자 성과 보니 화가 나서 직접해보면 어떨까로 계산해 본거에요)

 

이제 계좌를 만들어 보도록 하겠습니다.

personal.newAccount('암호') 로 계좌 3개 만들어 봤습니다.

밑에 0x 는 지갑 주소 입니다.

 

이제 채굴을 해서 계좌에 돈을 넣어야 합니다.

miner.start(1)  이렇게 하면 첫번째 계좌에 쓰레드 1개 사용해서 채굴을 시작합니다.

그럼 visual code 내 터미널에서 로그상 채굴이 찍힘니다.

실제 채굴중인지는 eth.mining으로 확인 할 수 있습니다.

이 로그는 docker log 창에서도 똑같이 나옵니다.

블록이 생성되면 아래와 같이 로그가 나옵니다.

geth_container  | INFO [11-27|12:43:22.308] 🔗 block reached canonical chain          number=16 hash=b27bfc..25690b
geth_container  | INFO [11-27|12:43:22.309] 🔨 mined potential block                  number=23 hash=5a72f6..ba3f91

블록이 생성되면, 채굴을 잠시 중단해 보고 miner.stop()

account에 돈이 쌓였는지 확인해 봅시다.

eth.accounts 로 여기서 만들어진 계좌를 확인 할 수 있고

eth.getBalance 로 그 계좌의 금액을 확인 할 수 있습니다.

이제 돈이 많은 0번계좌에서 1번 계좌로 조금 이체해 줘봅시다.

명령어는 

eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value: '1000000000'})

이렇게 사용합니다.

sendTr 정도 쓰다가 탭키를 누르면 자동완성 됩니다.

옵션에 대해서는 

https://programtheblockchain.com/posts/2017/12/29/how-ethereum-transactions-work/를 참고바랍니다.

 

How Ethereum Transactions Work

[This blog post explains a little bit about how transactions work in Ethereum, but it is not necessary for learning Solidity programming. We write it for those of you who’d like a little deeper understanding of what is going on when a transaction is atte

programtheblockchain.com

위에 그냥 해보니까 lock이 걸린 계좌라고 안된다고 하네요

lock 을 풀려면 

personal.unlockAccount(eth.accounts[0]) 과 같이 지정해 줍니다.

그런데 명령어를 실행 시켰는데, 돈은 그대로 있네요

 

이건 지금 트랜젝션 pool 에 등록만 했고,

아직 채굴작업이 진행되지 않아서 이동이 안되어 있는 상태인 것입니다.

트랜젝션 풀을 확인해 봅시다.

eth.pendingTransactions 으로 확인이 가능합니다.

이제 마이닝을 다시 시작해 보고 로그상 채굴이 됬다면

트렌젝션 풀을 확인해 봅시다.

마이닝을 중단하고 이동이 됬는지 확인해 봅니다.

 

추가 정보는 아래의 사이트에서 확인 할 수 있습니다.

https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html

docker image 를 통해서 기본 환경 설정은 끝났습니다.

이제 genesis 블록이라는 블록체인의 최초 블록을 설정해 줘야 합니다.

제 PC상 D드라이브의 Works\Go-Ethereum 이 Home 디렉토리(폴더)입니다.

여기서 geth_data 란 디렉토리를 만들고

그 안에 genesis.json 파일을 만듭니다. 

파일 IDE 는 범용으로 사용하기 편한 Visual Code 를 사용하였습니다.

genesis.json 파일 내용

{
  "config": {
        "chainId": 70701,
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x100",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}

이런식으로 작성하면 됩니다.

설정중에 수정할 만한 것은, chainId (블록체인id), difficulty (채굴 난이도), gasLimit (거래 수수료) 정도입니다.

 

이제 docker 를 이용해서 초기화를 해줍니다.

보통 docker run 명령어로 

docker run -v ${pwd}/eth_data:/root/.ethereum ethereum/client-go init /root/.ethereum/genesis.json

처럼 사용하는데, 보기 불편하니 설정파일로 처리해 봅시다.

docker-compose 를 사용하면, docker를 사용할때 뒤에 run 뒤에 저 복잡해 보이는 파라메터를
좀더 보기 편하게 할 수 있습니다.

 

홈 디렉토리에 geth-init.yml 파일로 아래와 같이 만들어 줍니다.

# 초기화 작업 실행은 아래 명령어로
# docker-compose -f ./geth-init.yml [up/down]
version: '2'
services:
  init:
    image: ethereum/client-go
    command: init /root/.ethereum/genesis.json
    volumes:
      - ./geth_data:/root/.ethereum

이렇게 보니 좀더 보기 편하실거라 생각합니다.

-v 옵션은 volumes, 실제 윈도우 탐색기로 보이는 폴더랑, docker 내부(리눅스) 디렉토리를 마운트 해주는 설정 입니다.

-v ${pwd}/geth_data 를 /root/.ethereum 에 연결하라 란 거고. 콜론(:)으로 구분하고 있죠.

compose.yml 파일의 자세한 옵션은

https://docs.docker.com/compose/compose-file/compose-file-v2/

 

Compose file version 2 reference

 

docs.docker.com

 

그 다음 image 이름 요 전 포스트에서 docker로 image 다운 받은 그 이름 입력이고, 뒤에 init 부터는 명령어 입니다.

 

실행은 VC 내부 터미널 (기본 power shell) 에서 위에 주석(맨앞에 #)으로 처리한 명령어를 입력해 줍니다.

docker-compose -f .\geth-init.yml up

초기화가 되었으니, image app 는 다시 내려줍니다.

docker-compose -f .\geth-init.yml down

아까 volumes 로 마운트 된곳 폴더를 보면 여러 파일들이 생성되어 있음을 알 수 있습니다.

이제 genesis 블록 초기화 설정은 되었으니

node 모드로 띄어 보도록 합시다.

 

docker로 하면 설정이 많으니, docker-compose 를 이용합니다.

geth-node.yml 파일을 아래와 같이 작성합니다.

version: '2'
services:
  geth:
    image: ethereum/client-go
    container_name: geth_container
    command: --networkid=456 --port=30303 --maxpeers=10 --http --http.addr="0.0.0.0" --http.port=8545 --http.corsdomain="*" --http.api="admin, debug, web3, eth, txpool, personal, ethash, miner, net"
    volumes:
      - ./geth_data:/root/.ethereum:rw
    ports:
      - "30303:30303" # peer 연결용
      - "30303:30303/udp" # peer 연결용
      - "8545:8545"   # remix 연결용

명령라인에 여러 옵션들이 있는데 옵션에 대해선

https://geth.ethereum.org/docs/interface/command-line-options

https://pmgreviewer.tistory.com/10?category=890514 이부분을 참고 하면 좋을거 같습니다.

대충, 네트워크id 456번으로 지정하고,

peer 연결에 사용할 listen port 로 30303 을 사용하고 (그래서 ports: 로 30303을 뚫었습니다. 8545는 웹에 연결할건데 이건 나중에 보죠), 

 

다른 여러 예제들 보면 --rpc 옵션을 지정하게 되어 있는데,

최근 버전에는 rpc 옵션이 삭제되서 이대로 사용하면, 도커가 실행이 안됩니다.

rpc 옵션에 대해서는 http 로 대체 되었는데, 옵션 내용은 아래와 같습니다.

추가로 http.addr=0.0.0.0 으로 지정했는데, 도커에서 저렇게 해줘야 host(윈도OS)에서 localhost 에 접속이 가능합니다.

API AND CONSOLE OPTIONS:
  --ipcdisable                        Disable the IPC-RPC server
  --ipcpath value                     Filename for IPC socket/pipe within the datadir (explicit paths escape it)
  --http                              Enable the HTTP-RPC server
  --http.addr value                   HTTP-RPC server listening interface (default: "localhost")
  --http.port value                   HTTP-RPC server listening port (default: 8545)
  --http.api value                    API's offered over the HTTP-RPC interface
  --http.rpcprefix value              HTTP path path prefix on which JSON-RPC is served. Use '/' to serve on all paths.
  --http.corsdomain value             Comma separated list of domains from which to accept cross origin requests (browser enforced)
  --http.vhosts value                 Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. (default: "localhost")
  --ws                                Enable the WS-RPC server
  --ws.addr value                     WS-RPC server listening interface (default: "localhost")
  --ws.port value                     WS-RPC server listening port (default: 8546)
  --ws.api value                      API's offered over the WS-RPC interface
  --ws.rpcprefix value                HTTP path prefix on which JSON-RPC is served. Use '/' to serve on all paths.
  --ws.origins value                  Origins from which to accept websockets requests
  --graphql                           Enable GraphQL on the HTTP-RPC server. Note that GraphQL can only be started if an HTTP server is started as well.
  --graphql.corsdomain value          Comma separated list of domains from which to accept cross origin requests (browser enforced)
  --graphql.vhosts value              Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. (default: "localhost")
  --rpc.gascap value                  Sets a cap on gas that can be used in eth_call/estimateGas (0=infinite) (default: 50000000)
  --rpc.evmtimeout value              Sets a timeout used for eth_call (0=infinite) (default: 5s)
  --rpc.txfeecap value                Sets a cap on transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap) (default: 1)   
  --rpc.allow-unprotected-txs         Allow for unprotected (non EIP155 signed) transactions to be submitted via RPC
  --jspath loadScript                 JavaScript root path for loadScript (default: ".")
  --exec value                        Execute JavaScript statement
  --preload value                     Comma separated list of JavaScript files to preload into the console

 

 

geth | Part_5 번외편_geth 실행 시, 옵션

Geth 실행 옵션 geth를 실행 할 때 필요한 옵션의 종류에 어떤것들이 있는지 알아보도록 하겠습니다. geth help를 치면, 아래와 같은 결과창을 볼 수 있습니다. * 훨씬 더 많습니다. 그 중 자주 쓰이

pmgreviewer.tistory.com

 

이렇게 실행시키면 VC내 터미널도 그렇고 윈도우 도커에서도 로그가 계속 남고 있음을 확인 할 수 있습니다.

이제 이 내부에 접근해서 ethereum 프로그램에 들어가서 계좌 생성이니, 마이닝이니 여러가지 해봅시다.

여기까지 제대로 실행이 되고 있으면

docker ui 창에서 run 이라고 뜰테고 위에 

CLI (Command Line Interface) 즉. 터미널을 열어 봅시다.

뭔가 리눅스 스러운 창이 떳네요. 리눅스 명령어 쳐보면

geth 프로그램이 돌고 있음을 확인 할 수 있습니다.

이제 여기서 위와같이 geth attach 로 프로그램 관리자 콘솔 모드로 집입해 봅시다.

 

+ Recent posts