200511 2주차 회의
qpzm opened this issue · 0 comments
지용님께서 로컬에서 이더리움 테스트넷을 실행하고 스마트 컨트랙트를 배포하는 과정을 라이브 코딩으로 보여주셨다.
다음주 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 명시- JSON-RPC Server | Go Ethereum 참고
- web3.js 클라이언트의 web3.eth.getBalance 함수는 네트워크 서버의 eth_getBalance 함수를 호출한다.
--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.
}
}
- 관리자 기능을 쓰기 위해
Ownable
상속 - 블록체인에 기록하는 것은 비싸다. 따라서 보통 내용만 저장하고 인덱스 데이터는 외부 서버에 다시 저장한다. 일단 테스트넷이기 때문에 이 기능을 smart contract에 넣는다. 스팀의 경우 SNS를 위해 출시되었기 때문에 이미 이 기능이 있다.
- ipfs에 배포한 주소를 스마트컨트랙트에 기록한다. Q. url이 차단 당하면? 파일 해쉬만 있으면 다른 노드를 이용해서 사이트에 접근할 수 있다.
- 모든 글은 빈 root의 댓글. 이유는 다음에 다루자.
배포
Remix에서 컴파일 후 배포. 글을 써도 최대 블록 생성 간격만큼의 시간 소요.