qpzm/Blockchain-2020Spring

200511 2주차 회의

qpzm opened this issue · 0 comments

qpzm commented

지용님께서 로컬에서 이더리움 테스트넷을 실행하고 스마트 컨트랙트를 배포하는 과정을 라이브 코딩으로 보여주셨다.

다음주 TODO

  • 지난주 과제: 글 작성 & 조회 스마트컨트랙트를 이어서 하자.

Getting started

토렌트 프로토콜만 준수하는 어떠한 프로그램도 토렌트 네트워크와 통신할 수 있다. 오늘은 go-ethereum 을 사용한다. 먼저 go-ethereum을 컴파일하자.

git clone https://github.com/ethereum/go-ethereum
make all

geth 명령어를 PATH에 추가하자. vi ~/.bashrc

export PATH="$HOME/ethereum/go-ethereum/build/bin/:$PATH"

정상적으로 추가되었는지 확인.

geth version

Puppeth를 사용하여 이더리움 네트워크 정의

아무 설정을 하지 않으면 mainnet에 붙는다. puppeth를 이용하면 대화형으로 새 이더리움 네트워크를 정의할 수 있다.

# go-ehtereum 폴더 루트에서
puppeth

합의 알고리즘

  • Ethash: proof-of-work, 실제 이더리움과 동일하게 해쉬 값을 맞춤. 확률적인 블록 생성
  • Clique: proof-of-authority, 정해진 채굴자가 일정 시간 간격마다 블록 생성

블록 생성 간격

15초: ethereum mainnet과 동일

Which accounts are allowed to seal?

Clique 방식이기 때문에 채굴자의 주소를 최소 하나는 정해야 한다.

pre-fund

Clique 방식은 블록 생성에 따른 보상이 없다. 따라서 이더리움의 개수가 증가하지 않는다. 트랜잭션 보낼 때 Gas가 들기 때문에 나한테 초기 이더리움을 줘야

chain/network ID

ethereum main net은 1을 사용하고 여기에 1을 입력하면 다른 노드가 우리 네트워크를 메인넷으로 오인할 수 있다. 1만 아니면 된다.

네트워크 실행 준비

다 끝나면 genesis/ 가 생성된다. genesis/devnet.json 의 키 중 몇 개만 보자.

  • eip155Block Ethereum Improvement Proposal 155의 약자. 신기능을 몇 번째 블록부터 실행할지 명시. 우리는 새로 네트워크를 생성하므로 0번으로 지정하면 된다.
  • difficulity 는 clique 합의 알고리즘에서는 의미없다. (난수를 맞추는 채굴이 아니므로)
geth --datadir ./data init genesis/devnet.json

네트워크 실행

geth 명령어로 네트워크를 실행하며 여러 옵션을 붙일 수 있다.

  • --syncmode "full" Genesis부터 모든 블록을 sync
  • --rpc rpc 호출 허용
  • --rpcaddr "0.0.0.0" 모든 주소 허용
  • --rpcport 8545
  • --rpcapi "eth, web3" 외부에서 접근가능한 namespace 명시
  • --allow-insecure-unlock
  • --unlock Comma separated accounts to unlock
  • --password password.txt
  • --networkid 9999

개인키 import

메타마스크의 개인키 내보내기를 이용해 블록을 서명할 개인키를 가져오자. 개인키 복사는 실제 이더리움 계정의 경우 메모리에 개인키가 저장되기 때문에 탈취 위험이 있다!

geth --datadir ./data account import my_private_key

geth --datadir ./data account new 로 새 개인키를 만들어도 된다.

Tip: 메타마스크에서 네트워크를 선택할 수 있다. 내 컴퓨터의 경우 로컬호스트, remote server의 경우 사용자 정의 RPC.

SNS 스마트 컨트랙트 예시

contract Forum is Ownable { // 1.
  mapping(address => uint[]) byAuthorIndex; // 2.
  string private endpoint; // 3.

  constructor() public {
    post memory p;
    posts.push(p); // 4.
  }
}
  1. 관리자 기능을 쓰기 위해 Ownable 상속
  2. 블록체인에 기록하는 것은 비싸다. 따라서 보통 내용만 저장하고 인덱스 데이터는 외부 서버에 다시 저장한다. 일단 테스트넷이기 때문에 이 기능을 smart contract에 넣는다. 스팀의 경우 SNS를 위해 출시되었기 때문에 이미 이 기능이 있다.
  3. ipfs에 배포한 주소를 스마트컨트랙트에 기록한다. Q. url이 차단 당하면? 파일 해쉬만 있으면 다른 노드를 이용해서 사이트에 접근할 수 있다.
  4. 모든 글은 빈 root의 댓글. 이유는 다음에 다루자.

배포

Remix에서 컴파일 후 배포. 글을 써도 최대 블록 생성 간격만큼의 시간 소요.