본 실습은 geth와 web3 공식 문서들을 바탕으로 재구성되었습니다.
# | tasks |
---|---|
1 | Geth 설치 / Test Network 접속 / Console 접속 |
2 | 계정 생성 / faucet / 송금 / 잔액 확인 |
3 | 스마트 컨트랙트 작성 / 컴파일 / 배포 |
- Geth 설치
- Test Network 접속
- Geth Console 접속
ssh root@주소
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
https://geth.ethereum.org/docs/install-and-build/installing-geth
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nodejs
sudo apt-get install npm
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install golang
sudo apt-get install npm
network | command |
---|---|
Main | geth console |
Ropsten | geth --ropsten |
Görli | geth --goerli |
network | command |
---|---|
Ropsten | geth --ropsten --syncmode "full" --rpc --signer=</usr/bin/clef>/clef.ipc |
Görli | geth --goerli --syncmode "light" --rpc --signer=</usr/bin/clef>/clef.ipc |
- sync를 full, fast, light로 바꿔가면서 차이점 파악
- [NOTICE] signer 주소는 다를 수 있으므로 clef 위치를 꼭 확인
- clef 위치 확인방법 >
clef
- 1.3에서 네트워크를 접속한 Terminal과 다른 Terminal에서 접속
network | commands |
---|---|
Main | geth attach |
Ropsten | geth attach /root/.ethereum/ropsten/geth.ipc |
Görli | geth attach /root/.ethereum/goerli/geth.ipc |
- [NOTICE] IPC endpoint는 다를 수 있으므로 1.33에서 꼭 확인
1.5. 접속된 네트워크의 IPC endpoint url과 Geth Console의 datadir 일치여부 확인
- 계정 생성
- 계정 확인
- Faucet
- 송금 (트랜잭션)
- 계정 잔액 확인
2.1. Test Network 및 Console 접속
Assignment 1 참고
web3.eth.accounts.create()
or
web3.eth.personal.newAccount()
https://web3js.readthedocs.io/en/v1.2.0/web3-eth-accounts.html#create
web3.eth.accounts
or
web3.eth.personal.listAccounts
- Görli: https://goerli-faucet.slock.it/
- Ropsten: https://faucet.dimensions.network/
- 가끔 faucet이 되지 않는 에러가 있으므로, 그럴 땐 다른 Test Network에서 시도
web3.eth.sendTransaction({from: personal.listAccounts[0], to: personal.listAccounts[1], value: web3.toWei(0.1, "ether")})
- 단위가 wei로 표시되지 않게 조심할 것
https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#sendtransaction
web3.eth.personal.unlockAccount(eth.accounts[0])
https://web3js.readthedocs.io/en/v1.2.0/web3-eth-personal.html#unlockaccount
- unlock을 하지 않으면 송금 불가능
web3.eth.sendTransaction({from: personal.listAccounts[0], to: personal.listAccounts[1], value: web3.toWei(0.1, "ether")})
-
web3.eth.getBalance(personal.listAccounts[0])
는 wei로만 확인가능 -
web3.fromWei(eth.getBalance(personal.listAccounts[0]), "ether")
는 ETH로 확인가능
web3.eth.getTransactionReveipt("/*2.6에서 출력된 트랜잭션 hash*/")
- blockHash, blockNumber, from, to, transactionHash 확인 https://web3js.readthedocs.io/en/v1.2.0/web3-eth.html#gettransactionreceipt
- Görli: https://goerli.etherscan.io
- Ropsten: https://ropsten.etherscan.io/
- 스마트 컨트랙트 작성
- 컴파일
- 배포
npm install -g solc
작성 조건
- 각각의 constant가 다음과 같은 값을 return하도록 할 것
- 입력:
beyond.showWhoWeAre()
// 출력:"We are Team BEYOND!"
- 입력:
beyond.cleaner("아무 값이나 입력해도 값이 나오지 않게")
// 출력:""
- 파일명: beyond.sol
// this is beyond.sol
pragma solidity 0.5.16;
contract teamBeyond {
string internal constant seeWhoWeAre = "We are Team BEYOND!";
string internal chainResult;
function beyond(string memory _chainResult) public {
chainResult = _chainResult;
}
function showWhoWeAre() external pure returns (string memory) {
return seeWhoWeAre;
}
function cleaner(string calldata _chainEntry) external view returns (string memory) {
// completely disregard the _chainEntry
return chainResult;
}
}
// ABI
solc --abi beyond.sol
// bytecode
solc --bin beyond.sol
Assignment 1 참고
bytecode = '0x/*STEP 3 결과 입력*/'
obj = JSON.parse('/*STEP 3 결과 입력*/')
- 본 guideline에서는 편의를 위해 변수를 위와 같은 이름으로 선언하여 계속 사용함
- JSON.parse 설치 (STEP 3에서 얻은 ABI는 string. 그러나 geth 콘솔에서 컨트랙트 생성할 때 parameter는 JS배열 > 파싱 필요)
참고자료
// web3 v0.x 문법 (공식 docs에 없음)
contractObj = web3.eth.contract(obj)
// web3 v1.x 문법
contractObj = new web3.eth.Contract(obj)
- 컨트랙트 객체를 만들어야 interact가 용이 (개별 스마트 컨트랙트에 json interface를 부여하기 때문: web3가 자동으로 low level인 ABI call을 RPC로 바꿔서 표기)
deployObj = {from:eth.coinbase, data: bytecode, gas:2000000}
Instance = contractObj.new(deployObj)
3.9 계정 unlock
- Transaction Hash 확인가능 (컨트랙트 생성 트랜잭션이기 때문)
- 컨트랙트는 배포되어 채굴된 이후에 주소 생성
- Etherscan에서 Transaction Hash로 검색하면, 해당 트랜잭션이 본인 계정 주소에서 보낸 'Contract Creation'임을 확인 가능
eth.getTransactionReceipt(Instance.transactionHash)
address = eth.getTransactionReceipt(Instance.transactionHash).contractAddress
beyond = contractObj.at(address)
beyond.showWoWeAre()
beyond.cleaner("아무거나 입력해서 확인")