https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu
- sudo apt-get install software-properties-common2 C, n( M, q9 A; m/ ^
- sudo add-apt-repository -y ppa:ethereum/ethereum1 F \, I& g$ a: M
- sudo apt-get update
- sudo apt-get install ethereum
初始化创世区块+ W, z0 q9 J% A5 y g. r2 m* t
https://github.com/ethereum/go-ethereum7 `$ Q7 W; c/ l& ^$ k0 L5 l% E
chainId不能为0,否则交易会报错: insufficient funds for gas*price+value
- cd home+ Q/ \9 _# a2 f& d7 z! c
- mkdir blockChain&& cd blockChain' Y' Q; V& ?3 |/ g$ ?
- vim genesis.json
- //摘自官网6 i; P: _# k% d$ O! o" T A" J7 k ?
- {
- "config": {( b0 r {( K7 Z) n& U
- "chainId": 14,; N1 V% U# b9 ]0 R. U" C! r$ J# n
- "homesteadBlock": 0,$ q3 P( ?8 X! H% F# ?
- "eip155Block": 0,
- "eip158Block": 0
- },+ L: l( R8 p9 Q, a
- "alloc" : {},- [8 }* l' f6 X# W/ r
- "coinbase" : "0x0000000000000000000000000000000000000000",5 v, k. n4 l: K4 ^; s- W3 [
- "difficulty" : "0x05000",
- "extraData" : "",( V" p# l6 Y0 _( [, ]' Y- z& |/ E
- "gasLimit" : "0x2fefd8",# M, o. `) w0 J9 C3 q9 T
- "nonce" : "0x0000000000000042",7 V0 |+ S$ G. l9 ~
- "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",( Q' b/ a# \) r& p& J
- "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",3 A0 J2 v7 i7 p
- "timestamp" : "0x00"
- }
官方文档中的chainId为0,应该修改为非0的值,不然会导致 insufficient funds for gas * price + value! S' G; J% Z. q3 s6 t( |' O
difficulty表示挖矿的难度值,官方文档中为0x20000,由于测试机器配置低,修改为0x05000。+ l& x) x6 u5 `$ X$ H" d0 N" X
geth --datadir /home/blockChain/data/00 init genesis.json, H0 N" n: d3 y$ ]: B3 M
geth --networkid 14 --nodiscover --datadir /home/blockChain/data/00 --rpc --rpcapi net,eth,web3,personal --rpcaddr ip_address console
/*) f. U( _" ]( i% z( @2 s$ D
--nodiscover 关闭p2p网络的自动发现,需要手动添加节点,这样有利于我们隐藏私有网络
--datadir 区块链数据存储目录
--networkid 网络标识,私有链取一个大于4的随意的值8 j3 o+ `2 \8 [) X. d
--rpc 启用ipc服务,默认端口号8545. ?8 ?8 i* o4 b. ]; c. [
--rpcapi 表示可以通过ipc调用的对象
--rpcaddr ipc监听地址,默认为127.0.0.1,只能本地访问
console 打开一个可交互的javascript环境
更多参数:https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options7 E. O+ o& h5 n' a9 T+ r. q
*/- ?4 [, ^1 |% s$ Y0 i' }1 ~
挖矿以及转账# U) m6 k4 `6 y4 B) n% X7 M
//创建coinbase账户
personal.newAccount("coinbase")
//查看账户列表
eth.accounts' e" i! |; _- k3 R! T( E% X
//开始挖矿7 s g! G! I1 r D' D: H
miner.start()( F, W7 n2 x3 }3 [7 ?0 G
//继续挖矿,不要停~ j( E, G% X# u- k* `' {6 w
挖矿一段时间之后,再打开一个shell通过ipc连接到刚才的服务; _: h( e" l4 Q$ a ^
geth attach ipc:/home/blockChain/data/00/geth.ipc
//查看coinbase账户余额; g% ]$ M4 o3 ?
baseAccount = eth.accounts[0]" l" O3 ]' ?- J0 W6 L' V5 b" q; Y, L
num = eth.getBalance(baseAccount)' Y" g& D" Z. c: ~# [' s# y& I
//换算单位为eth# N0 L) O* z8 a+ z8 R' D$ Y, |
web3.fromWei(num)
//新建一个账户* ?2 o: z9 Y1 y- q+ j: Z$ Z6 ~0 z2 T
personal.newAccount("account")
//查看新建账户的余额
account1 = eth.accounts[1]: v# v2 `1 X, j# y6 Y9 Q# K
eth.getBalance(account1)
//从coinbase账户转给account1账户1eth
personal.unlockAccount(baseAccount ,"coinbase")
eth.sendTransaction({from : baseAccount, to : account1 , value : web3.toWei(1,"ether")})" M8 h; R, v; z; ^8 P( g
//观察挖矿shell的输出,等待交易打包完成后,查询account1的账户余额
eth.getBalance(account1)
提交转账之后,观察挖矿shell的输出,会出现一条打包转账交易的记录,等待新的区块继续生成的时候,account1 账户的余额才会更新。 D: a# n6 a( M+ n# c8 @
如果交易很久之后才能被确认,很有可能是服务器性能不足导致的。
通过mist客户端访问私链8 t3 c3 R0 G2 c3 }
从以太坊爱好者或者官网,下载mist客户端:http://ethfans.org/wikis/Mist-Mirror4 [( E9 Y+ e d5 t9 e
安装完成之后,找到mist安装目录 C:\Program Files\Mist,双击mist启动。9 @8 o0 }* _" {: g4 ?" y% ]
然后打开cmd,并切换到mist目录,执行; D+ i9 M" D- M' v8 D* H, O5 H
mist --rpc http://ip_address:port
其中,ip_address是私链的服务器地址,port是该节点运行的端口号,默认为8545。+ l5 O/ u9 n9 o
如果不先运行一个mist程序,直接通过命令行连接私链的话,会报错 Couldn’t start swarm process.