Blockchain 적용 예시

Posted by on June 26, 2019

Recently by the same author:


Python에서 Singleton 구현

You may find interesting:


Etherium 기본 개념


Blockchain 개요

블록체인 적용 예시

2019. 06. 26 (Wed)


Private Ethereum 구축

필요 도구

  • VirtualBox
  • Vagrant
  • VSCode


1. 가상 환경 구축

가상머신 실행

현재 directory에 vagrant 가상머신 설정
vagrant init


Vargrantfile 설정을 통한 가상머신 생성
Vagrant.configure("2") do |config|
  config.vm.define "eth01" do |eth01|
    eth01.vm.box = "ubuntu/bionic64"
    eth01.vm.hostname = "eth01"
    eth01.vm.network "private_network", ip: "192.168.56.121"
    eth01.vm.provider "virtualbox" do |eth01v|
      eth01v.memory = 4096
    end
  end
  config.vm.define "eth02" do |eth02|
    eth02.vm.box = "ubuntu/bionic64"
    eth02.vm.hostname = "eth02"
    eth02.vm.network "private_network", ip: "192.168.56.122"
    eth02.vm.provider "virtualbox" do |eth02v|
      eth02v.memory = 4096
    end
  end
end


생성한 가상머신 구동
vagrant up eth01(or eth02)
  • 각각의 bash에서 동시에 진행시 오류 발생


ssh로 가상머신 접속
vagrant ssh eth01


Geth(Got-ethereum client) 설치
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get install ethereum


설치 확인
geth version



2. Ethereum 환경 구축

private 이더리움 위한 genesis 블록 생성

가상 머신 내에서 수행
mkdir -p dev/eth_localdata
cd dev/eth_localdata

# genesis블록 생성 json
vi CustomGenesis.json


CustomGenesis.json
{
  "config": {
    "chainId": 921,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
  "alloc": {},
  "coinbase": "0x0000000000000000000000000000000000000000",
  "difficulty": "0x20",
  "extraData": "",
  "gasLimit": "0x47e7c5",
  "nonce": "0x0000000000000042",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp": "0x00"
 }


제네시스 블록

블록체인에서 최초로 생성되는 블록

앞에 연결되어있는 블록이 없다.


Geth 초기화
geth --datadir /home/vagrant/dev/eth_localdata init /home/vagrant/dev/eth_localdata/CustomGenesis.json


Geth 구동

geth console로 접근

geth --networkid 921 --maxpeers 2 --datadir /home/vagrant/dev/eth_localdata --port 30303 console
  • port 30303: 보통 이더리움에서 사용하는 port


eth02에서는 다른 port를 사용한다

geth --networkid 921 --maxpeers 2 --datadir /home/vagrant/dev/eth_localdata --port 30304 console

eth02도 동일하게 실행


노드 연결

노드 정보 확인
# eth01
> admin.nodeInfo.enode
"enode://.....@[xxx.xxx.xxx.xxx:30303]"


노드 접속
# eth02
> admin.addPeer("enode://.....@[xxx.xxx.xxx.xxx:30303]") # eth01 노드 정보


노드 연결 확인
# eth01
> admin.peers


계정 설정

이더리움 계정(EOA) 생성
# eth01
> personal.newAccount("test123") # 여기서 "test123"은 account의 비밀번호가 된다
"0xab835..."


생성된 계정 확인
> eth.accounts

이후 eth02에서도 동일하게 실행



3. 트랜잭션 작업

채굴

트랜잭션 생성을 위한 ETH 채굴
> miner.start(1)
true
  • percentage로 진행상황이 출력된다.
  • 하나의 채굴이 끝나야 종료 가능


채굴 종료
> miner.stop()
true


채굴 보상으로 획득한 ETH 잔액 확인
> eth.getBalance("계정id")
0...


트랜잭션 전송

트랜잭션 생성, 전송
# eth01
> eth.sendTransaction({from: "계정id", to: "받는 계정id", value: web3.toWei(1, "ether")})
  • 그러나 트랜잭션 전송시 인가받지 않은 유저일 경우 전송이 안 될 수 있다.


유저 인증
# 15000 mili second 이내에 list중 [0]번째에 있는 user를 인증
# <password>에는 계정 생성시 입력한 password를 삽입한다.
web3.personal.unlockAccount(web3.personal.listAccounts[0],"<password>", 15000)