From. 이더리움 공식 홈페이지
Ethereuim is a decentralized platform that runs smart contracts: applications that run exactly as programmed without any possibility of downtime, censorship, fraud or third party interference.이더리움이란 스마트 계약을 실행할 수 있는 플랫폼입니다. go, c++, python 등 다양한 언어로 이더리움을 구동할 수 있는 클라이언트가 개발되고 있으며 현재 가장 많이 사용되는 클라이언트가 go 언어로 개발된 go-ethereum (geth)입니다.
쉽게 생각하면 내 컴퓨터에서 이더리움 네트워크와 소통하기 위한 도구라고 생각하면 되겠다.
(소통 언어는 go언어다)
먼저 로컬 테스트넷에서 Geth
를 실행하기 위해
아래의 두 파일을 생성해야 한다.
데이터 디렉터리 생성
: 송수신한 블록 데이터와 계정 정보 저장
genesis.json
: 제네시스 블록 정보가 저장된 json 형태의 텍스트 파일
을 생성한다.
$ cd ~/go-ethereum
$ mkdir test_data # 데이터 디렉터리 생성
$ vim genesis.json # genesis.json 생성
$ geth --datadir test_data account new
$ geth --datadir test_data account list
위와 같이 Account가 확인 가능하면 잘 생성 된 것이다
vim으로 genesis.json을 열어서 파일을 편집한다
config
: 이더리움 관련 설정이 들어간다config.chainId
: 현재 chain을 구별하는 값이며, Chainlist.org에 들어가면 확인 가능하다. 또한, 유효한 데이터 전송을 악의적으로 반복시키거나 지연시키는 replay attack으로부터 보호해주는 역할을 한다.config.homesteadBlock
: homestead는 이더리움의 프론티어, 홈스테드, 메트로폴리스, 세레니티 중 두 번째 단계로, 0일 경우 true를 뜻한다.config.eip155Block
: EIP155는 chainId와 마찬가지로 replay attack을 막기 위한 설정이다.config.eip150Block
: IO가 많은 작업에 대한 가스 변경 비용을 위한 설정이다.config.eip158Block
: EIP158은 계정의 상태가 변경되고, 변경된 결과값으로 인해 계정의 nonce와 balance 값이 0이 되고 code와 storage가 빈 값이 되는 경우 해당 계정을 삭제한다.difficulty
: 채굴 난이도로, 값이 클수록 난이도가 상승하며, 낮을수록 난이도가 낮아진다.gasLimit
: 블록당 담을 수 있는 가스의 한도를 설정한다. 하나의 블록 안에 담을 트랜잭션 개수를 결정하는데 사용하는 옵션이다. 따라서 값이 클수록 트랜잭션을 많이 보낼 수 있다.alloc
: 제네시스 블록이 생성됨과 동시에, alloc에 등록된 주소로 이더를 할당한다.parentHash
: 부모 블록의 해시값을 넣는다. 제네시스 블록은 부모 블록이 없기 때문에 사용하지 않는다.coinbase
: 제네시스 블록 채굴 시 주어지는 보상과 보상을 받을 어카운트 주소이다. 마이너가 coinbase값을 설정하기 때문에 제네시스 블록에서는 상관없다.nonce, mixhash
: 블록체인 작업 증명을 위한 값이다.timestamp
: 해당 블록이 취득된 시점을 의미하는 값으로, 제네시스 블록은 0으로 설정해도 된다. - timestamp 값은 블록 간의 순서와 난이도를 조절하는 데 사용된다. 예를 들어 두 블록의 생성 시간이 짧다면 난이도가 쉬운 것이고,간격이 길다면 어려운 것이다.extraData
: 옵션 항목으로 최대 32바이트 공간이다.$ geth --datadir test_data init ./genesis.json
위의 빨간색 박스 문구가 뜨면 성공적으로 초기화 된 것이다.
tree를 설치해서 트리형태로 test_data 디렉터리 구조를 확인해보자
$ apt-get install tree -y
$ tree test_data
이더리움에서는 chaindata, lightchaindata, keystore등을 공통적으로 확인 할 수 있는데 각 폴더의 역할은 아래와 같다.
chaindata
: 블록체인 데이터가 저장된다. 별도의 옵션 없이 콘솔 모드 작동 시 이더리움 메인 네트워크에 풀노드 동기화 모드로 연결하기 때문에 저장된다.lightchaindata
: 블록체인 데이터가 저장된다. geth syncmode를 light로 지정하면 라이트 노드로 블록 헤더에서 중요한 데이터만 저장한다.keystore
: 어카운트의 개인 키를 저장한다.build/bin
: Geth 실행 파일이 저장된다.ethash
: DAG 파일이 저장된다. 마이너를 구동시키면 작업 증명을 위한 해시 문제를 해결하기 위해 최대 2GB 사이즈의 DAG 파일을 만들어 메모리를 할당한다.nodes
: 노드에 관한 정보가 저장된다.triecache
: 트리의 캐시를 저장한다.$ geth --networkid 8484 --nodiscover --datadir test_data -allow-insecure-unlock --http.addr 0.0.0.0 --http --http.port 8545 --http.corsdomain "*" --http.api="db,eth,net,web3,personal,web3,miner,admin" --miner.threads 1 console 2>> test_data/geth.log
정상적으로 실행되면 위와 같이 console이 실행되며 프롬트 표시 '>'가 나타난다
이더리움에는 두가지 종류의 계정이 있다
1.EOA
(Externally Owned Account)
2.CA
(Contract Account)
EOA
는 일반 지갑이라고 보면된다.CA
는 스마트 컨트랙스 배포를 위해 사용된다.
> personal.newAccount('패스워드')
> eth.accounts
이더리움을 채굴하고 보상받는 계정을 Etherbase라고 한다.
Etherbase는 eth.coinbase 변수에 저장한다. 기본적으로 eth.accounts[0]으로 설정되어 있다.
> miner.setEtherbase(personal.listAccounts[0])
> eth.coinbase
> eth.blockNumber
> eth.getBlock(blockNumber)
이제 Etherbase의 계정을 가지고 채굴을 해보자
채굴을 하기 위해서는 기본적으로 계정에 걸려있는 Lock을 풀어줘야한다.
> personal.listWallets[0].status
> personal.unlockAccount(eth.coinbase)
채굴을 시작한다
> miner.start(1) # 여기서 ()안은 스레드 개수이다.
위와 같이 null이 뜨면 정상이다.
> eth.mining # 채굴을 진행하고 있는지 확인
> eth.blockNumber # 가장 최근에 추가된 블록의 숫자
> miner.stop() # 채굴 종료
> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
> eth.sendTransaction({
from:eth.accounts[0],
to:eth.accounts[1],
value:web3.toWei(2,’ether’),
data:web3.toHex(”send message”)
})
from
: 발신자의 계정주소to
: 수신자의 계정주소value
: 전송할 금액data
: 전송할 메세지web3.toHex
: 인자로 주어진 값을 16진수로 변환한다.정상적으로 만들어지면 트랜잭션 해시가 생성됨
트랜잭션은 아직 채굴되지 않았기 때문에 pending상태일 것이다.
> eth.pendingTransactions
hash
부분을 보면 위에서 만들었던 트랜잭션의 해시가 들어가 있다.
채굴 후에 Pending상태를 확인하니 아무런 트랜잭션이 발견되지 않았다(트랜잭션 처리 완료).
0에서 1의 계정으로 돈을 보냈음으로 이제 1의 계정에서 Balance확인이 가능하다.
> eth.getTransaction("TxHash")
요즘 James Scholz 동영상 틀어놓고 같이 공부하는데
성장형 마인드셋
동기부여는 필요없다 그냥 습관으로 하는 것이다
기억합시다