Genesis 정보까지 모두 준비되었다. 이제 Node 를 실행하면 된다.
그런데 옵션으로 주어야 할게 쫌 있다. 좀 자질구레한것들이지만 Shell Script 로 만들어놓으면 편하기 때문에 MinGW 의 bash shell script 로 만들어놓는다.
▌실행 Script
내가 사용중인 Shell Script 는 다음과 같다. Wallet 의 Master Password 는 1111 이고 JSON-RPC 를 사용하기 위한 Session-Key 로는 0000 을 지정해주었다.
그리고 연결되는 Node 간의 시간차는 +- 13분 이내 이어야 한다. 시간을 잘 맞추고 시작하자.
[Linux]
./eth --config $ETH_HOME/res/config.json --master 1111 --json-rpc
--json-admin 0000 --admin-via-http --no-bootstrap --listen 30301
--remote "192.168.0.122" --port 30301 --db-path $ETH_HOME/db_goodjoon
--mining on --address "0047d27a61e384403d875239cbc462896044213e"
--verbosity 99 --json-rpc-port 8545 --ipc --upnp off $@
--json-admin 0000 --admin-via-http --no-bootstrap --listen 30301
--remote "192.168.0.122" --port 30301 --db-path $ETH_HOME/db_goodjoon
--mining on --address "0047d27a61e384403d875239cbc462896044213e"
--verbosity 99 --json-rpc-port 8545 --ipc --upnp off $@
[Windows]
.\eth.exe --config d:\ethereum\res\config.json --master 1111
--json-rpc --json-rpc-port 8545 --json-admin 0000 --admin-via-http
--listen 30301 --remote "192.168.0.60" --port 30301
--db-path d:\ethereum\db_goodjoon --verbosity 9
--admin-via-http -o full --upnp off %*
--json-rpc --json-rpc-port 8545 --json-admin 0000 --admin-via-http
--listen 30301 --remote "192.168.0.60" --port 30301
--db-path d:\ethereum\db_goodjoon --verbosity 9
--admin-via-http -o full --upnp off %*
--admin-via-http 옵션은 1.2.0 에서 새로생긴 옵션인데, JSON-RPC 를 통해 admin 기능을 실행할 수 있게 허용하겠단 이야기이다.
--no-bootstrap 으로, Peer Server 에 연결하지 않도록 하였으며
--remote 옵션으로 직접 연결할 Node 를 지정해주었다.
--db-path 로 기본 DB PATH 를 사용하지 않고 db_goodjoon 을 사용하도록 설정하였다.
console 옵션은 어차피 1.2.1 버전의 C++ eth 는 동작하지 않는다. 나중에 process 를 하나 더 띄워서 attach 해서 사용할것이기 때문에 console 옵션은 주지 않았다.
※ 뒤에서 언급하겠지만, 1.2.1 버전 오면서 Windows 의 버그와 Default 값의 동작이 더 심각해졌다. coinbase address 도 기본으로 안넣어주고, JSONRPC 포트도 지정해주지 않으면 -1 값이다. 그러나 아직도 --help 에는 8545 기본값으로 나온다. Geth 의 jsonrpcapi 옵션에서 볼수있었던 JSON RPC admin 기능을 위해 --admin-via-http 옵션도 생겨나고 했는데 그러면서 좀더 꼬이고있기도 하다. (새로 팀장 오고나서 팀을 "REBOOT" 하겠다고 했는데, 좀 잘 되었으면 좋겠다. Go 팀을 좀 봐라 쫌..)
▌실행 확인
(++)Ethereum 이 출력되고 이후 뭔가 좌르륵~ 나오고 있다면 일단 동작하는 것이다.
Ubuntu에서 실행중인 모습
korean44@ubuntu-svr:~/project/blockchain/webthree-umbrella/build/webthree/eth$ ./ethGoodJoon.sh
(++)Ethereum... 00:36:07.628|eth Reading /home/korean44/.web3/keys/152d7983-ac83-b2f9-159c-18ab7106fd83.json
⧎ ℹ 00:36:07.649|eth Id: ##e808dba2…... 00:36:07.684|eth Opened blockchain DB. Latest: #5df28093… (rebuild not needed)... 00:36:07.700|eth Opened state DB.
⧫ ◎ 00:36:07.702|eth startedWorking()
cpp-ethereum 1.2.1
By cpp-ethereum contributors, (c) 2013-2016.
See the README for contributors and credits.
Transaction Signer: XE50000000000000000000000000000000 (00000000-0000-0000-0000-000000000000 - 00000000)
Mining Beneficiary: XE8916H0DGVW3SIMF6X9AWCB8J6ZV5PWE6 (152d7983-ac83-b2f9-159c-18ab7106fd83 - 0047d27a)
Foundation: XE55PXQKKK4B9BYPBGT1XCYW6R5ELFAT6EM (00000000-0000-0000-0000-000000000000 - de0b2956)
ℹ 00:36:13.611|p2p UPnP device: http://192.168.0.1:3274/etc/linuxigd/gatedesc.xml [st: urn:schemas-upnp-org:device:InternetGatewayDevice:1 ]
⧎ ℹ 00:36:13.684|p2p Punched through NAT and mapped local port 30301 onto external port 15725 .
⧎ ℹ 00:36:13.684|p2p External addr: 211.222.99.134
⧎ ℹ 00:36:13.686|p2p p2p.started id: ##e808dba2…
⚡ 00:36:13.695|eth void dev::p2p::Host::start() 2091 ms
Node ID: enode://e808dba2f0d7eb464656e01be81317386af18b8a0c554c7f9fd78fcd0f1a008a584891aed201018444af50ede46faf6884750baa1f06eca9e9c706d827b931a3@211.222.99.134:15725
JSONRPC Admin Session Key: 0000
⧫ ℹ 00:36:13.738|eth Mining Beneficiary: @0047d27a…
⧫ ◎ 00:36:13.739|eth Rejigging seal engine...... 00:36:13.741|eth Generating seal on #ab31b73b… # 1
ℹ 00:36:13.743|miner0 Loading full DAG of seedhash: #00000000…
DAG 00:36:19.606|miner0 Generating DAG file. Progress: 0 %
⧫ ◎ 00:36:22.718|eth Since 2016-03-04 15:36:07.686Z (15): 15ticks
DAG 00:36:25.842|miner0 Generating DAG file. Progress: 1 %
DAG 00:36:32.097|miner0 Generating DAG file. Progress: 2 %
아마 Windows 에서는 아예 Console 에서 JavaScript Console 기능이 동작하지 않을 것이다. 버그이다. 이건 Frontier Release 이전부터 계속되어오는 문제이다.
수정하고싶은 생각도 없는듯 하고 암튼 Windows 는 C++ Ethereum의 대상이 아닌게 날이갈수록 확신이 든다.
※ Miner는 DAG 파일을 만드는데에 상당한 시간이 소요된다. 처음 1회만 실행되므로 참고 기다린다.
▌Console Attach
그래도 JavaScript Console 을 띄워서 보는게 가장 빠른 방법이므로 한번 해보도록 한다.
Linux 에서는
$ eth --session-key 0000 attach
만으로도 현재 실행중인 eth 에 attach 를 한다. Linux 에서는 console 이 잘 동작하므로 처음 실행할 때 마지막에 console 이라고 치면 되긴 하지만, 로그가 수없이 지나가므로 JavaScript API 를 실행시켜도 결과가 로그에 파묻힌다. 그래서 난 그냥 터미널 하나 더 띄워서 attach 시킨다.
Windows 는 1.2.1 버전 오더니 더 심각한 버그들이 발생한다.
$ eth --session-key 0000 attach --url "http://localhost:8545"
이렇게 url 까지 적어줘야 한다. default 가 먹히질 않는다.
암튼 Console 이 attach 되고나면 ">" 가 보인다. JavaScript Console 이다.
1.2.0 까지만 해도 안그랬던것 같은데, JavaScript API 를 Geth 와 I/F 를 맞추고있는 과정이라서 그런지 web3 만 치면 전체 object 들이 나와야 하지만 에러가 난다. 이건 Linux 나 Windows 나 모두 마찬가지이다.
그래서, web3.eth 객체를 살펴보면, 아래처럼 출력이 될 것이다.
> web3.eth
{
_requestManager: {
provider: {
send: [Function],
sendAsync: [Function]
},
polls: {
},
timeout: null,
send: [Function],
sendAsync: [Function],
sendBatch: [Function],
setProvider: [Function],
startPolling: [Function],
stopPolling: [Function],
reset: [Function],
poll: [Function]
},
getBalance: [Function],
getStorageAt: [Function],
getCode: [Function],
getBlock: [Function],
getUncle: [Function],
getCompilers: [Function],
getBlockTransactionCount: [Function],
getBlockUncleCount: [Function],
getTransaction: [Function],
getTransactionFromBlock: [Function],
getTransactionReceipt: [Function],
getTransactionCount: [Function],
call: [Function],
estimateGas: [Function],
sendRawTransaction: [Function],
sendTransaction: [Function],
sign: [Function],
compile: {
solidity: [Function],
lll: [Function],
serpent: [Function]
},
submitWork: [Function],
getWork: [Function],
coinbase: '0x0047d27a61e384403d875239cbc462896044213e',
getCoinbase: [Function],
mining: false,
getMining: [Function],
hashrate: 0,
getHashrate: [Function],
syncing: false,
getSyncing: [Function],
gasPrice: 50000000000',
getGasPrice: [Function],
accounts: ['0x0047d27a61e384403d875239cbc462896044213e'],
getAccounts: [Function],
blockNumber: 0,
getBlockNumber: [Function],
iban: [Function],
sendIBANTransaction: [Function],
defaultBlock: 'latest',
defaultAccount: undefined,
contract: [Function],
filter: [Function],
namereg: [Function],
icapNamereg: [Function],
isSyncing: [Function]
}
{
_requestManager: {
provider: {
send: [Function],
sendAsync: [Function]
},
polls: {
},
timeout: null,
send: [Function],
sendAsync: [Function],
sendBatch: [Function],
setProvider: [Function],
startPolling: [Function],
stopPolling: [Function],
reset: [Function],
poll: [Function]
},
getBalance: [Function],
getStorageAt: [Function],
getCode: [Function],
getBlock: [Function],
getUncle: [Function],
getCompilers: [Function],
getBlockTransactionCount: [Function],
getBlockUncleCount: [Function],
getTransaction: [Function],
getTransactionFromBlock: [Function],
getTransactionReceipt: [Function],
getTransactionCount: [Function],
call: [Function],
estimateGas: [Function],
sendRawTransaction: [Function],
sendTransaction: [Function],
sign: [Function],
compile: {
solidity: [Function],
lll: [Function],
serpent: [Function]
},
submitWork: [Function],
getWork: [Function],
coinbase: '0x0047d27a61e384403d875239cbc462896044213e',
getCoinbase: [Function],
mining: false,
getMining: [Function],
hashrate: 0,
getHashrate: [Function],
syncing: false,
getSyncing: [Function],
gasPrice: 50000000000',
getGasPrice: [Function],
accounts: ['0x0047d27a61e384403d875239cbc462896044213e'],
getAccounts: [Function],
blockNumber: 0,
getBlockNumber: [Function],
iban: [Function],
sendIBANTransaction: [Function],
defaultBlock: 'latest',
defaultAccount: undefined,
contract: [Function],
filter: [Function],
namereg: [Function],
icapNamereg: [Function],
isSyncing: [Function]
}
▌Block Sync 확인
현재 Difficulty 도 낮춰놓고, 블록 생성 간격도 13분에서 1분으로 맞추도록 조정하였다.
▌Windows 버전 => Linux / Mac OS X 으로 갈아타자
여태 Windows 버전을 Build 하고 소스 수정하고 해왔다. 그런데 Homestead 겨냥중인 1.2.1 버전 릴리즈 되면서 더이상 Windows 를 안쓰고싶게 만든다.
Frontier (1.0.1) 까지는 그나마 참고 쓸 수 있었으나 1.1.3 버전 부터였나 점점 되야하는 기능들이 Windows 에서 안돌더니 이제 Geth 와 I/F 맞춘다는 명목등을 이유로 작업을 하고있으면서 Windows 는 안그래도 뒷전인데 더 뒷전이 되어버렸다.
Windows 에서 못써먹겠다는 이유는 대략 이러하다.
1.0.1 => Contract 를 Create 하고 배포한 후 JSONRPC 건 JavaScript 건 call 을 2회 하면 그 다음부터는 무조건 0을 리턴한다. 재기동만이 정상화 방법이다. 그래서 Windows 에서는 Mining 시키고 Mac 이나 Linux 에 Contract call 을 해왔다.
1.1.3 => Windows 버전이 다른 Peer 와 Connect 할때 RLPx Handshake 시에 괜히 auth fail 이 난다. 그리고 이 시점 부터 다른 Platform 의 Miner 가 멈추고 아예 동작을 안한다. Windows 를 먼저 띄워놓고 다른 Platform 의 Peer 가 connect 을 하면 괜챦다.
1.2.0/1.2.1 => Windows 가 붙으면 auth fail 은 또 계속 난다. Miner 죽는 문제는 해결한듯 하다. 그런데 Geth 와 CLI 나 JS Console 이 아직 맞춰지지도 않았고 API 가 동작하지 않는것들도 있다.
그리고, DAG 도 버그가 있다. 어떤때는 hashrate 가 3,4 H/s 가 나온다. 계속 재실행 하다보면 언젠다 다시 정상 hashrate 가 나온다. 문제다.
위 이유로, 이후 진행은 Linux 로만 한다. Mac OS X 도 잘 지원되는 편이나 블로그 쓰는데 맥북까지 켜서 2대에서 끄적거리기가 싫다 ^^;; 그냥 VirtualBox 로 Linux 2대 켜놓고, shared folder 하나 만들어서 소스는 한군데에서 수정하고 빌드한 후 양쪽 VBox Guest (Ubuntu 15.10) 에서 실행시켜 테스트 하는 방향으로 가겠다. 뭐 필요하면 3대 4대 하거나 Instance 를 더 늘리던가 하겠다.
반응형
'Blockchain > Ethereum' 카테고리의 다른 글
Ethereum 응용 개발 - JSON RPC API 기본 (1) | 2016.03.20 |
---|---|
이더리움 Smart Contract - 개념 (1) | 2016.03.13 |
C+++ Ethereum, Private Network 구성하기 #2 - Genesis 정보 만들기 (0) | 2016.03.02 |
C+++ Ethereum, Private Network 구성하기 #1 (1) | 2016.02.26 |
C++ Ethereum - Windows 소스 빌드 / 빌드 및 오류해결 (0) | 2016.02.21 |