è¦é£ä¸ Ethereum å°±éè¦å®è£ Ethereum Nodeï¼å¨ééæåé¸æä½¿ç¨ Geth ä¾å®è£ Ethereum Nodeï¼æ¥ä¸ä¾å°±ä¾ä¸æ¥ä¸æ¥çå¸å¸æéº¼ä½¿ç¨ Gethï¼çè³å¦ä½ä½¿ç¨ Geth 便¶è¨èªå·±ç Ethereum ç§æéã
å®è£ç°å¢
é¦å
æåå¨ AWS ä¸éåå
©å° Ubuntu èæ¬æ©å¨ï¼è¨å¾é t2.mediumï¼2 vCPU, 4 GB RAMï¼éåè¦æ ¼ä»¥ä¸æè·å¾åï¼ç¡¬ç¢å¯ä»¥é 100 Gï¼Security Group å° TCP 30303 æéï¼Ethereum Node ä¹éæ¯ç¨ 30303 éå port 便ºéçã
æ¥ä¸ä¾ä½¿ç¨ä»¥ä¸æä»¤å®è£ Gethï¼
$ sudo apt-get install -y software-properties-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install -y ethereum
å
©å°èæ¬æ©å¨é½è¦å®è£ï¼æè©²å¹¾åéå°±å¯ä»¥è£å¥½äºã
ä½¿ç¨ Main Net
å®è£å® Geth ä¹å¾ï¼æåå°±å¯ä»¥éé Geth é£ä¸ Ethereum Network äºï¼æåå°±ä¾é£ä¸ Main Net ççï¼
$ geth
ä¸äºéåæä»¤ä¹å¾ï¼ä½ æè©²å¯ä»¥çå°ä¸äºè¨æ¯ï¼geth éå§åæ¥å¸³æ¬è³æå°ä½ çèæ¬æ©å¨äºï¼æåæéå¦ä¸å terminal é£ä¸åä¸å°èæ¬æ©å¨ï¼æåå¯ä»¥çå° geth å¨ä»¥ä¸ä½ç½®å»ºç«äºä¸äºè³æã
$ ls ~/.ethereum/
geth geth.ipc keystore
$ ls ~/.ethereum/geth/
chaindata ethash LOCK nodekey nodes transactions.rlp
$ du -hs ~/.ethereum
5.9M /home/xxx/.ethereum
$ du -hs ~/.ethereum/geth/chaindata
5.9M /home/xxx/.ethereum/geth/chaindata
ç¨å¾®èªªæä¸ä¸ï¼å¨ ~/.ethereum/ è³æå¤¾ä¸ç geth.ipc åªæå¨ geth æ£å¨å·è¡çæåææåºç¾ï¼éå°±æ¯æåä¹å說çè¦å¨æ¬æ©éé geth è Ethereum åäºåç管éï¼åºæ¬ä¸æåä¹åç Mist 乿¯ä½¿ç¨ geth.ipc ä¾è Ethereum åäºåã
å
¶ä¸ chaindata è³æå¤¾ä¸è¼äº Ethereum 帳æ¬è³æï¼å¦ææåæ³è¦éæ°åæ¥å¸³æ¬å¯ä»¥ç´æ¥åªé¤è£¡é¢çææè³æï¼è transactions.rlp ååæ¾äºå¨ local 端èéå°ä¸éæªè¢«ææè¨éå°å¸³æ¬ç交æè³æï¼nodekey åæ¯ä»£è¡¨éå°æ©å¨ç private keyï¼ç¨ä»¥å¨ Ethereum Network ä¸è¾¨å¥ä¸åçæ©å¨ï¼ethash 忝éç® proof-of-work å¿
é ç¢ççè³æå¤¾ã
å
¶å¯¦éæ¨£ä½ çæ©å¨å°±å·²ç¶é£ä¸ Ethereum Networkï¼ä¸¦æçº Ethereum ä¸çä¸ä»½åäºï¼ä½çå¾
Main Net 宿忥éè¦è±å¾ä¹
çæéï¼æåééå°±å
æå° Test Net ä¸ç¹¼çºç·´ç¿ï¼è«ä½¿ç¨ CTRL-C éé geth ç¨åºã
ä½¿ç¨ Test Net
æ¥ä¸ä¾è®æåé£ä¸ Test Net ççï¼Test Net æåå¥å âRopstenâï¼network id æ¯ 3 ï¼Main Net ç network id æ¯ 1ï¼ï¼Test Net æå¯è½æé¨èæéåä¸äºæ¹è®ï¼è«ä½¿ç¨ä»¥ä¸æä»¤é£ä¸ Test Netï¼
geth --testnet
忍£çï¼ä½ 乿çå°ä¸äºåæ¥è¨æ¯ï¼ä¸æ¨£æéå¦ä¸å terminal é£ä¸åä¸å°èæ¬æ©å¨ï¼æåå¯ä»¥çå° geth å¨ä»¥ä¸ä½ç½®å»ºç«äºä¸äºè³æã
$ ls ~/.ethereum/testnet
geth geth.ipc keystore
$ ls ~/.ethereum/testnet/geth
chaindata ethash LOCK nodekey nodes transactions.rlp
$ du -hs ~/.ethereum/testnet
112M /home/xxx/.ethereum/testnet
å
¶å¯¦èé£ä¸ Main Net æå»ºç«çè³æå¤§åå°ç°ï¼åªæ¯è®ææ¾å¨ ~/.ethereum/testnet éåè³æå¤¾åºä¸ãéç¶ Test Net 忥çéåº¦ææ¯ Main Net å¿«ä¸äºï¼ä½ä»ç¶éè¦è±ä¸æ®µæéæè½å®æåæ¥ï¼æå䏿¨£ä½¿ç¨ CTRL-C éé geth ç¨åºï¼æææå·²åæ¥ç Main Net å Test Net è³æé½åªé¤ï¼æåæ¹ä½¿ç¨å»ºç«èªå·±ç Private Net ä¾ç¹¼çºç·´ç¿ã
以䏿¯åªé¤åæ¥è³æçæä»¤ï¼
$ geth --testnet removedb / åªé¤æ¸¬è©¦éè³æ
$ geth removedb / åªé¤ä¸»éè³æ
建ç«èªå·±ç Private Net
è¦å»ºç«èªå·±ç Ethereum Private Net å
¶å¯¦å¾ç°¡å®ï¼åªè¦å
å®ç¾©å¥½ä»¥ä¸éå
©é
å°±è½å»ºç«èªå·±ç Private Netï¼
- Network idï¼æ±ºå®èªå·±ç network id æ¯ä»éº¼
- Genesis æªæ¡ï¼æ±ºå®èªå·±çåµä¸åå¡åå§å¸³æ¬è³æ
èç¶å
¶ä»æ©å¨è¦é£ä¸éå Private Netï¼å°±éè¦ç¨ä¸æ¨£ç network id åç¸åç genesis æªæ¡ï¼ä»£è¡¨åå§å
±èä¸è´ï¼ï¼å¦æ¤å°±è½å¤ é£ä¸éå Private Net äºï¼ç±æ¼ Private Net å¯è½è¼çºç¨çï¼æä»¥ä¸éå§å¯è½ééè¦æä¾å
¶ä» Peers çä½å給 geth æè½é£ä¸ Private Netï¼ã
åµä¸åå¡
æåæä½¿ç¨ Genesis æªæ¡å»ºç«æåçåµä¸åå¡ï¼éæ¯æ´æ¢åå¡éä¸ï¼å¯ä¸ç±äººé¡å
±è決å®çåå¡ï¼æåä¾çä¸ä¸ Genesis æªæ¡çæ ¼å¼ï¼
å
¶ä¸æ¯è¼éè¦çæ¯ chainIdï¼éåå°±æ¯æååå說ç network idï¼å¨ééæåè¨å®çº 42 ï¼the answer to life, the universe, and everythingï¼ï¼ä½ å¯ä»¥è¨æä»»ä½æ³è¦çæ¸åï¼ä½è«é¿é主éåç¥åçæ¸¬è©¦éï¼åºæ¬ä¸ 1â10 ç¡éä¸è¦ç¨ï¼ï¼è difficulty åå®ç¾©äº proof-of-work çé£åº¦ï¼ééè¨æ 0x400 å
¶å¯¦å°±ä»£è¡¨ 1024ï¼ä»£è¡¨éç®é£åº¦åªæ 1024ï¼è®æåç private chain 大ç´åªè¦ 10â15 ç§å°±è½ç¢çä¸ååå¡ã
å·è¡ Private Chain
æå使ç¨ä»¥ä¸å
§å®¹ï¼æ°å¢ Genesis æªæ¡ï¼å°æªåè¨çº genesis42.jsonï¼æ¾ç½®å¨ ~/chain/genesis42.json ï¼è«èªè¡æ°å¢ chain è³æå¤¾ï¼ï¼ç¶å¾æåä¹å¿
é å訴 geth éå private chain çè³æè¦æ¾å¨åªåè³æå¤¾ï¼æåå°±æ¾å¨ ~/.ethereum/net42 éåè³æå¤¾å¥½äºï¼è®æåä¾å°å·è¡æä»¤å¯«æ shell scriptï¼
#!/bin/bash
geth --datadir ~/.ethereum/net42 init ~/chain/genesis42.json
å°ä»¥ä¸å
§å®¹æ°å¢çºæªæ¡æ¾ç½®å¨ ~/chain/net42-init.sh ï¼éæ¯ private chain åå§åæéè¦å·è¡çæä»¤ï¼æ¯å Node åªè¦å·è¡ä¸æ¬¡å°±å¯ä»¥ã
#!/bin/bash
geth --datadir ~/.ethereum/net42 --networkid 42 console
å°ä»¥ä¸å
§å®¹æ°å¢çºæªæ¡æ¾ç½®å¨ ~/chain/net42-start.sh ï¼éåæä»¤æä½¿ private chain çéå Node è·èµ·ä¾ï¼æä»¥æ¯æ¬¡è¦è· Node æé½éè¦å·è¡éåæä»¤ï¼éè¦æ³¨ææåè¦å訴 geth æåè·ç networkid æ¯ 42ï¼éæ¨£æææ¥ä¸æåååè¨å®ç private chainï¼èæå¾ç console åæ¯è®æåé²å
¥ geth çå½ä»¤ä»é¢ã
è®æåå°ä¸é¢å
©å shell script è®çºå¯å·è¡æªï¼ä¸¦å·è¡éäºå·è¡æªï¼
$ cd ~/chain
$ chmod a+x net42-init.sh
$ chmod a+x net42-start.sh
$ ./net42-init.sh
$ ./net42-start.sh
å·è¡å®å¾ï¼æåæçå°æåé²å
¥ console å½ä»¤ä»é¢äºï¼åºæ¬ä¸éæ¯ Javascript consoleï¼æåå¯ä»¥ä¸ä¸äºæä»¤çµ¦ gethï¼è®æåä¾è©¦è©¦çä¸ä¸äºæä»¤å§ãæåå
輸å
¥ eth ï¼ç¶å¾æå
©ä¸ TABï¼ä½ æç¼ç¾ console æçµ¦åºä¸äºæä»¤å»ºè°ï¼å¦æä¸éå§è¼¸å
¥ 2 åç©ºæ ¼ï¼åæå
©ä¸ TABï¼åæå»ºè°æåºç¤çæä»¤ï¼å¦æä»éº¼æä»¤é½å¿è¨äºï¼ä¸å®è¦è¨å¾è¼¸å
¥ 2 åç©ºæ ¼ï¼åæå
©ä¸ TABï¼ãæå輸å
¥ççï¼
> eth.accounts
[]
é代表ååºéå Node ç帳èï¼ç®åæ²æä»»ä½å¸³èãæåå試ä¸ä¸å
¶ä»æä»¤ï¼
> eth.blockNumber
0
é代表æå忥ç private chain éæ²æä»»ä½åå¡ï¼æåå¯ä»¥çä¸ä¸éååå¡çè³æï¼æ³¨æï¼éé使ç¨äº ⦠çç¥äºä¸äºçå¯¦è³æï¼ï¼
> eth.getBlock(0)
{
difficulty: 1024,
extraData: "0x00",
gasLimit: 5000000,
gasUsed: 0,
hash: "...",
logsBloom: "...",
miner: "0x0000000000000000000000000000000000000000",
mixHash: "",
nonce: "0x0000000000000042",
number: 0,
parentHash: "...",
receiptsRoot: "...",
sha3Uncles: "...",
size: 506,
stateRoot: "...",
timestamp: 0,
totalDifficulty: 1024,
transactions: [],
transactionsRoot: "...",
uncles: []
}
æåä¾ççéå Node æ¯å¦æå¨æç¤¦ï¼
> eth.mining
false
ç®åæ²æå¨æç¤¦ï¼æåæª¢æ¥ä¸ä¸æ¯ä¸æ¯å¨æ£ç¢ºçéä¸ï¼
> net.version
"42"
çç¢ºå¨ 42 鿢éä¸ï¼æ¥ä¸ä¾çææ²æå
¶ä» peersï¼
> net.peerCount
0
ç®åéå Private chain ä¸ï¼æåç Node ä¸¦æ²æè·å
¶ä» Node æé£æ¥ã
帳è
æ¥ä¸ä¾æåéè¦ä¸å帳èç¨ä¾å¨éå private chain ä¸é¢èµ°è·³ï¼æåä¾åµå»ºä¸å帳èå§ï¼
> personal.newAccount()
Passphrase:
Repeat passphrase:
"0xe00f575ea205035ca9c530effa728202e5385cb2"
> eth.accounts
["0xe00f575ea205035ca9c530effa728202e5385cb2"]
> eth.coinbase
"0xe00f575ea205035ca9c530effa728202e5385cb2"
è«è¨å¾å¸³èç passphraseï¼æåå¨åä»»ä½äº¤ææï¼é½æéè¦ passphrase ä¾è§£é帳èï¼éæ¯çºäºä¿é帳èçå®å
¨æ§ï¼è§£éçæä»¤å¦ä¸ï¼
> personal.unlockAccount(eth.accounts[0])
Unlock account 0xe00f575ea205035ca9c530effa728202e5385cb2
Passphrase:
true
帳èå
¶å¯¦å°±æ¯éå帳èç public keyï¼ä¹å°±æ¯æåå¯ä»¥å
¬éç Ethereum 帳æ¶ä½åï¼è private key æåæåå¨ keystore 裡ï¼
$ ls ~/.ethereum/net42/keystore/
UTC--2018-09-17T09-31-22.219973375Z--e00f575ea205035ca9c530effa728202e5385cb2
Private key æç¨ä½ æè¼¸å
¥ç passphrase å å¯åå¨éå keystore æªæ¡è£¡ï¼å¦æè¦å份帳èå°å
¶ä»æ©å¨ä½¿ç¨ï¼é£å°±éè¦å份éäº keystoreï¼åå
¶æå°æçå¯ç¢¼ã
æåä¾ççéå帳èæå¤å° Etherï¼
> eth.getBalance(eth.accounts[0])
0
ç®åç¶ç¶æ¯æ²æä»»ä½ Etherï¼æä»¥æåéè¦æç¤¦ä¾ç²å Etherï¼
æç¤¦
é²è¡æç¤¦ææå°æå°ç Ether 給 eth.coinbase éå帳èï¼eth.coinbaseé è¨å°±æ¯eth.accounts[0] ï¼æåä¾æç¤¦å§ï¼
> eth.coinbase
"0xe00f575ea205035ca9c530effa728202e5385cb2"
> miner.start(1)
true
å
¶ä¸ miner.start(1) 就代表éå§æç¤¦ï¼è忏 1 å°±æ¯ä»£è¡¨è¦éå¹¾å process ä¾æç¤¦ï¼æåè¨æ 1 就好ï¼å çºæåæ¯èªå·±å¨æï¼æè·èªå·±ç«¶çï¼åæ¸è¶é«åèä¸ä¸å®è½è¶å¿«æå°åå¡ãèå¨ç¬¬ä¸æ¬¡å·è¡æç¤¦æï¼geth æä¸è¼ ethash æªæ¡ï¼éåæªæ¡å¾å¤§ï¼ä¹å æ¤éè¦è±ä¸äºæéï¼æä»¥æåè¦èå¿çå¾
ï¼çå° mined potential block çè¨æ¯ææä»£è¡¨ççéå§æç¤¦äºãï¼ï¼è«åæ¯åå¡ååä¾å§ï¼
éä¸é£åä¹å¾ï¼æååä¾çæç¤¦çµæï¼
> miner.stop() / 忢æç¤¦
true
> eth.blockNumber
7
> eth.getBalance(eth.accounts[0])
21000000000000000000
> eth.getBalance(eth.coinbase)
21000000000000000000
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")
21
æåçå°å塿¸è®æ 7ï¼ä¸å¸³è裡ç Ether è®æ 21 äºï¼æåæç¶ææåæå° Ether äºï¼
交æ
ç®åæåé½éæ²æåä»»ä½äº¤æï¼
> eth.getBlock(0).transactions.length
0
> eth.getBlock(7).transactions.length
0
æååéä¸å帳èä¾é²è¡ä¸ä¸å
©å帳èä¹éç交æï¼
> eth.mining
false
> personal.newAccount()
Passphrase:
Repeat passphrase:
"0x7a5005c95252e35d58e38f6dc5d2ac6e4b6f625b"
> eth.accounts
["0xe00f575ea205035ca9c530effa728202e5385cb2", "0x7a5005c95252e35d58e38f6dc5d2ac6e4b6f625b"]
> eth.getBalance(eth.accounts[1])
0
æåä¾éä¸äº Ether å°ç¬¬ 2 å帳èï¼
> web3.toWei(5, "ether")
"5000000000000000000"
> eth.sendTransaction({ from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether") })
Error: authentication needed: password or unlock
éææåæçå° console å ±é¯ï¼éæ¯å çºæåéæ²æ unlock 帳èï¼å¨ from ç帳èéè¦ unlockï¼to ç帳èä¸éè¦ unlockï¼æä»¥æåéè¦ unlock eth.accounts[0] ï¼
> personal.unlockAccount(eth.accounts[0])
Unlock account 0xe00f575ea205035ca9c530effa728202e5385cb2 Passphrase:
true
> var txHash = eth.sendTransaction({ from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether") })
> txHash "0x9f494ebc7b9ad6e6a9abd36798c6d04dcd7e883acf553a99e581b8550ec16178"
æåå¯ä»¥æåéåºäº¤æäºï¼è®æåçä¸ä¸äº¤æçè©³ç´°è³æï¼
> eth.getTransaction(txHash)
{
blockHash: "...",
blockNumber: null,
from: "0xe00f575ea205035ca9c530effa728202e5385cb2",
gas: 90000,
gasPrice: 20304857463,
hash: "0x9f494ebc7b9ad6e6a9abd36798c6d04dcd7e883acf553a99e581b8550ec16178",
input: "0x",
nonce: 0,
r: "...",
s: "...",
to: "0x7a5005c95252e35d58e38f6dc5d2ac6e4b6f625b",
transactionIndex: null,
v: "0x78",
value: 5000000000000000000
}
æåå¯ä»¥çå°éå交æçè©³ç´°è³æä¸ï¼blockNumber æ¯ nullï¼é代表交æéæªç¢ºèªï¼å¦ææåæ¥çäº¤ææ¶æï¼
> eth.getTransactionReceipt(txHash)
null
åå³å¾å° nullï¼æåçç第 2 åå¸³èæ¯å¦ææ¶å° Etherï¼
> eth.getBalance(eth.accounts[1])
0
ä»ç¶æ¯ 0 Etherï¼æä»¥ç¬¬ 2 ç帳èéæ²ææ¶å° Etherï¼æåéè¦å°æç¤¦æéï¼é樣æ°ç交ææè½å¨æ°çæç¤¦åå¡è£¡è¢«ç¢ºèªï¼
> miner.start(1)
true
/ çå¾
æç¤¦å®æå¹¾ååå¡ä¹å¾
> miner.stop()
true
> eth.getBalance(eth.accounts[1])
5000000000000000000
> eth.getTransaction(txHash)
{
blockHash: "...",
blockNumber: 8,
from: "0xe00f575ea205035ca9c530effa728202e5385cb2",
gas: 90000,
gasPrice: 20304857463,
hash: "0x9f494ebc7b9ad6e6a9abd36798c6d04dcd7e883acf553a99e581b8550ec16178",
input: "0x",
nonce: 0,
r: "...",
s: "...",
to: "0x7a5005c95252e35d58e38f6dc5d2ac6e4b6f625b",
transactionIndex: null,
v: "0x78",
value: 5000000000000000000
}
æåå¯ä»¥çå°ç¬¬ 2 åå¸³èæ¿å° 5 Ether äºï¼èéå交æç blockNumber ä¹è®æäº 8ï¼æ¥ä¸ä¾æåççäº¤ææ¶æï¼
> eth.getTransactionReceipt(txHash)
{
blockHash: "...",
blockNumber: 8,
contractAddress: null,
cumulativeGasUsed: 21000,
from: "0xe00f575ea205035ca9c530effa728202e5385cb2",
gasUsed: 21000,
logs: [],
logsBloom: "...",
status: "0x1",
to: "0x7a5005c95252e35d58e38f6dc5d2ac6e4b6f625b",
transactionHash: "...",
transactionIndex: 0
}
æåå¯ä»¥çå°äº¤ææ¶æçè©³ç´°è³æäºï¼å
¶ä¸ç status 代表交æçæ
æ³ï¼0x1 代表交æå®æï¼å¦ææ¯ 0x0 就代表交æç¼çé¯èª¤äºã
以䏿åå·²ç¶å¸æäºå¦ä½èªå·±æ¶ Private Chainï¼å¦ä½èªå·±æç¤¦ï¼å¦ä½å¨èªå·±ç Private Chain ä¸å交æäºï¼å¾ç°¡å®å§ï¼
Private Chain é£çµå
¶ä» Node
ç¾å¨æ¶ä¸å Private Chain å°æåä¾èªªä¸æ¯åé¡äºï¼ä¸éç¾å¨æ´å Private Chain åªæä¸å Nodeï¼æéº¼èå
¶ä» Node é£çµå¢ï¼
æåä¸éå§æéäºå
©å° AWS æ©å¨ï¼ç®åé½å¨å
¶ä¸ä¸å°ç·´ç¿ï¼å¦å¤ä¸å°ç¾å¨ä¹ä»¿é ä¹åçæ¥é©è£å¥½ç°å¢ï¼ä½¿ç¨ç¸åç Genesis.jsonï¼ä¸å®è¦ä¸æ¨¡ä¸æ¨£ï¼æªæ¡å»ºç«ãéå Private Chainï¼ä¸¦å»ºç«å¥½ä¸å帳èï¼ç¶å¾å
ä¸è¦é²è¡æç¤¦ã
ç¾å¨æåå
©å Node æ¯åéçï¼ä¸¦ä¸ç¥éå½¼æ¤çåå¨ï¼
Node 1 > admin.peers
[]
Node 2 > admin.peers
[]
使¥ç blockNumberï¼
Node 1 > eth.blockNumber
16
Node 2 > eth.blockNumber
0
æåæç¼ç¾ Node 1 æ 16 ååå¡äºï¼ä½ Node 2 éæ²æä»»ä½åå¡ãæåå¨ Node 1 åå¾ Node çä½åç¸éè³è¨ï¼
Node 1 > admin.nodeInfo.enode
"enode:/cf2d54937d2e7ee080e69ecde67352837fd8230482fea2cc34ec756e2f36c10608d2cdbb66f7788c84a0069c162f043fa1f660a942dddf8fcdf9d74de87061b4@[::]:30303"
æåå°enode:/cf2d54937d2e7ee080e69ecde67352837fd8230482fea2cc34ec756e2f36c10608d2cdbb66f7788c84a0069c162f043fa1f660a942dddf8fcdf9d74de87061b4@[::]:30303 ä¸ç [::] æ¹æ Node 1 ç Private IPï¼çèµ·ä¾å¯è½æåï¼enode:/cf2d54937d2e7ee080e69ecde67352837fd8230482fea2cc34ec756e2f36c10608d2cdbb66f7788c84a0069c162f043fa1f660a942dddf8fcdf9d74de87061b4@172.31.22.132:30303ï¼ç¶å¾å¨ Node 2 å å
¥éå Peerï¼
Node 2 > admin.addPeer("enode:/cf2d54937d2e7ee080e69ecde67352837fd8230482fea2cc34ec756e2f36c10608d2cdbb66f7788c84a0069c162f043fa1f660a942dddf8fcdf9d74de87061b4@172.31.22.132:30303")
ä¹å¾æåæ¥çï¼
Node 1 > eth.blockNumber
16
Node 2 > eth.blockNumber
16
æåç¼ç¾ eth.blockNumber è®æä¸æ¨£äºï¼å¦ææ¥çå
¶ä¸æ¯ååå¡çè³æä¹æç¼ç¾ä¸æ¨¡ä¸æ¨£ï¼æåæåå°å¤å Node é£ä¸èªå·±å»ºç«ç Private Chain 並è®å¸³æ¬å¨å¤å Node 忥äºï¼çç¥å¥ï¼
çµèª
å¨éä¸ç¯æç« 䏿åä»ç´¹äº geth çä¸äºåºç¤ç¨æ³ï¼æåç¥éå¦ä½é£ä¸ Main Netï¼å¦ä½é£ä¸ Test Netï¼è䏿åä¹å¸æäºå¦ä½èªå·±æ¶è¨åå¡éï¼å»ºç«èªå·±ç Private Netï¼æåå¯ä»¥å»ºç«å¸³èãè§£é帳èãé²è¡æç¤¦ãé²è¡äº¤æï¼ä¸¦æ¥ç交æè©³ç´°è³æï¼æå¾å¸æå°å¤å Node é£ä¸èªå·±å»ºç«ç Private Netï¼å»ºç«ä¸å宿´çå
±è系統ã叿éäºï¼åºæ¬ä¸å°±å¯ä»¥å°èå¬äººäºå¢ï¼