Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Window环境如何下搭建以太坊私链

大叔的爸爸
142 0 0
一.安装geth
- T3 c% _" q6 q* F3 Z
. j8 V1 j5 b% S1 M    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror
1 ]' ]+ \6 o, `/ O/ j9 E
% \* `/ n7 e& Z    一直下一步就行。
  L' L( K. q) h( r' H5 `1 W) L3 z+ z; K# A' N1 u: a0 C
    注意:安装的时候最好不要安装在带有空格的目录
7 |& I8 E1 q+ V/ l/ a- ~
3 E8 \! v3 f. h* q; g    二.准备配置文件
2 w5 Z8 @+ y/ S; @- W" {- Y9 J  h3 C# H3 _: N8 q3 B+ }6 Z1 X- z* D7 Y
    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:. x6 Z) f* p6 l9 H% ~/ ]$ C, x
0 E/ x. L8 f) W  B: n, |
    解释一下各个参数的意思
4 A7 Z1 a- P0 j  `$ Y( ^
- x. I, J0 w7 d3 ~( K    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件: @% Z5 H$ u5 M
+ d, q* V( [- `1 t' u- u
    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。) }# v2 m9 g2 K% D! _6 T) f& B+ F
$ W! v7 g# L7 u9 f
    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。+ s4 |, o$ g$ q6 ?7 n

) b) r. }4 ~* I8 {' z& g% U' G    -alloc是预置账户的地址和账户预置的以太币数量。
' r/ Z& \' e+ e" q1 `) M  S
+ j8 n. s$ e# S  b' U+ P$ q* ^    -Coinbase矿工的账号,这里可以随便填( I* Z8 r, b% P7 b/ o4 N2 A+ d& X
  Z: v/ P, x& O) d- f; R* d
    -Timestamp设置创世块的时间戳,这里也填0x00就行
9 N+ R8 L8 z& V% K; B# M* p* Y+ b, f4 u) L5 g! \
    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0
9 c3 i  q/ ~/ Q' K! b( E  b2 ~& D& h" f" g; e8 e' d
    -extraData附加信息,相当于个人说明,可以随便填。7 g. m# x: ^) _3 J& h

2 `& t1 w, h! V3 {5 t5 ?5 W    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。# A6 m+ L' S7 Z$ A
3 q  U4 ?: b/ M1 g/ o* I- _' i
    Config是配置文件,必须要写不然会爆一下错误。4 [1 C5 ?) Z- J/ C) J
$ Y  F8 W8 c8 `: m) x
    三.写入创世块
0 n4 M: s; Y& M7 x7 R" [( u3 J- I& p8 r7 z6 s$ l0 B1 \$ R8 X  G
    配置好以后执行以下命令写入创世块/ v" \1 H8 `' U! {6 u" U) [
2 l: G: R' c! K7 }0 L+ _! M
    geth--datadirtestinitgenesis.json
) i6 H" I1 a3 R) o6 i: p" R6 o7 q9 J0 T
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。0 O; }7 Q& K9 ]5 b8 d6 `  }

! e7 {' V& f- y. ~+ X7 g8 y' t    创建成功回显是这样的8 t$ v# ?. F; x6 v- A! i

8 N8 x5 E. }  X2 {: @    三.写入创世块
$ g# z- F2 g: L. |" a
! `6 v& H# f- Y* V: d    配置好以后执行以下命令写入创世块+ s# |6 Y# y* o: u4 H& @5 _

# F: |5 C* }) e# |, o1 \    geth--datadirtestinitgenesis.json# t& g; R* R8 M5 u8 w; w. n% P* s

, O' B% y. p" g% c. q2 l    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
9 a$ i' k1 [  V( i' ?1 y4 I
. R: G9 f2 C' B6 F) B    创建成功回显是这样的
* ^9 a" W4 v: U' V# X3 F9 j2 P$ u" x, V: J
    然后执行一下面命令启动私链。6 {' Z% A* N1 M, ?& m

0 t! B3 U3 V; r9 [    geth--datadirtest--networkid1111--nodiscoverconsole* P( {& o8 I7 H/ b3 l

/ a1 N4 s4 `2 M: n* J    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点" t, C$ y1 |: f. [# v! e, l

7 v! @, N1 ], J7 R    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空
! _% X3 b: L: D% J; N; h
! O- H0 g  u0 [) V, [; h+ g/ |; F% i* B    接下来我们创建两个密码为123456账户。9 \: v+ l# t7 M/ _0 `) O
7 v+ r# t% ?$ k/ p
    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()
9 h- U& m+ Y/ b8 \1 V( ]! G% B# R; t( j6 c) Q1 |1 n2 d" T' b
    注意:此命令区分大小写。/ u' B+ x# _% @' {' O1 [

8 y3 x8 Y$ \7 a6 U    添加过后再查看就能看到我们刚刚创建的账户了
6 Q' \' Z2 R' n; Z( d" _3 c  K4 h2 H0 [
    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0! v! G! b) Y0 n8 [$ u8 S
) {4 t( h3 ], U3 w: P0 G1 d/ j5 m% J
    四、开始挖矿$ J+ \/ D- M- U$ d' _& r
. F4 c: d% g) s6 \1 @
    使用miner.start()命令来启动挖矿。
) }0 n) h. P2 I4 X- O: N
1 U3 T- x+ X" x  K" J    start()里面可设置线程,如:miner.start(5)表示五线程。) o8 \) s2 ~3 B" l% \9 [
; h: f* ~4 S+ W+ Q- i" S
    运行以后会被挖矿信息刷屏。4 x( X9 X4 B6 _6 R) P7 [

( d: K2 `# A% a" J( ]. H  N' n& w( @    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。% }4 p, K6 a6 d* o
# L; T+ t" c% e8 m1 e2 P
    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的
6 J+ U0 F9 W1 k- k7 V
/ }+ F% G! }, G# Z2 h    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。
( D6 I4 Q" I, P/ ?1 ]! U5 W* y- x0 E, h
    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
# s/ E9 q& W& z" y; @! T( u
- u+ X. |% Z5 g- d; J4 P/ I    使用eth.coinbase查看账户地址* B+ H; l1 s* K& J1 y3 U: A$ N3 r6 |
/ f, Y& H' \5 ]% F9 {. H: X, r
    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。/ N0 Z2 S0 s% P, p- L4 N: \* x
& }) j( S& [0 j) d, P2 l& w
    我们切换为0因为这个账户有钱方便做测试
/ M8 H8 ^8 J6 ]: C: R9 V
) \# z% d$ {+ A0 E7 {2 B    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。( N$ X  S/ ~) J+ \5 d

* h! t5 L* q- G2 o    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')) o" K% F' @) q- P) M

) @8 G. r4 c0 U9 E+ ~" t    五.发送交易
* Q# O2 m) `) h
1 P" L/ ]9 ~, W8 p2 B/ D3 v    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。
2 ~/ Z) s# j; Y, ?* ^( ^1 o: V/ }" T$ Z  o) a: {' H/ d; @: @2 x/ A
    发送一笔交易,从账户0中转移2个以太币到账户1中
+ I3 P+ ^+ Y* o6 \  D% ]( v$ o! Y2 x3 S8 i- z8 a
    >amount=web3.toWei(2,'ether')& v( e% z/ G0 x. [0 B

5 O( c' b; t0 H0 X' f1 t1 x7 W. i/ R    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
' x! G$ x- E3 k& m7 u. r9 h; m. Q! p2 s7 }: P2 y, ]
    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount/ U4 h6 T% L4 u* u+ p4 N

7 ^% C5 J$ v" s. J) _. Z- G5 B2 O    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。) q' _7 |3 m5 I
# G# R+ F( k5 u' ^' l- m! _
    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。
! M: |" \1 x% |' G# ^  ]: |$ @
! g( F: C" j2 D; X5 T* f    personal.unlockAccount(eth.accounts[0])1 @! n0 b% |: \! k! j( T
$ {/ k) B/ M/ p* P% X3 _# G
    然后执行转账操作。, d& d6 b& |$ Z0 K4 U; Y% E/ s, X. h3 z

  e1 t! I8 e  X: n    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。8 ^2 k  o+ }8 l7 _9 \' w
0 b* W; d& C5 v: O2 L7 y
    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…0 _5 w3 W, \  |+ u2 L* b
. l( \! e: I# H1 [. v9 `
    要让交易生效,我们就必须要挖矿,去处理这个块。. e. k  L. S9 `/ l, [1 j( {3 t
- D8 Z& _( ^4 j: y3 ^
    启动挖矿。! D! U- ~2 x7 g8 E

+ p: j# R2 p- z    miner.start(1);admin.sleepBlocks(1);miner.stop();
/ e$ l, W! O  u' L! v; T/ T% y+ M) [( {+ k) r4 [. I9 k5 H& |/ w
    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。
) d2 k7 ^+ a1 D# E6 m' m, w- s6 X' z
    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看; A# F5 o9 \5 f  J; r1 ?( D" t
- n& N6 M* B5 C8 X
    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。; @  `1 b- [& n8 I$ Z! [

8 ^/ [% l7 Z4 y3 x, M    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=86 \5 A! V$ y* J8 C0 B. K

6 N6 x7 q" R4 ?+ e! e% Y    六.查看交易和区块高度
4 {1 L$ Q' g$ O7 O, Z9 U: H9 `# p
    可使用以下命令查看当前区块8 K& ]7 ^/ k% g* d8 e

. q( p/ S( t- l    eth.blockNumber% l1 U! J4 x8 t: e

& C; g/ x+ f" B) x+ I$ \5 v    使用以下命令可以通过区块高度查看交易信息
# ?9 l, g/ J- o! i
; u5 b! Q4 |' Q7 a3 I5 @. w0 v    eth.getBlock(需要查看的高度)
* A; O/ z: o( f& U# U) p8 j  E5 z/ w& }
    也可以通过交易hash查看交易记录% g. m" i. W: i
7 _4 F; `! Y7 @5 o0 g; w3 A, ]
    eth.getTransaction(“交易hash”). e  k. {& s; r, [, t9 t$ B5 z
+ l# Y( U4 \" I" B! A# [) V
    七.连接其他节点
* |; [. Y) V8 X) C4 H- m* T: o6 R' |" {& T
    为什么要连接别的节点?0 u0 X; A$ b" {7 R! l

" W  Q0 C" `! O$ }, d4 V9 F    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。
+ O$ t6 O$ A' q: X
5 l7 Z3 W1 [5 z# J$ H+ ^    连接别的节点需要用到admin.addPeer()方法,连接的前提是必须保证网络相通,并且networkid要一致。比如:有两个节点,节点A和节点B,节点A的networkid是1111节点B的networkid是1108,那么这两个节点是连接不了的。想要两个节点之间实现连通networkid必须要一致,假设节点A和节点B的networkid都是1111,如果节点A要连接到节点B,首先还需要知道节点B的enode信息,enode可在JavaScriptconsole中查看到,查看命令为:admin.nodeInfo.enode
0 L0 L2 ^. H* Z7 ~7 g) X3 T8 ?* ?7 H2 ^1 u1 M- N+ G
    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了( C6 a& t% ~" p% B5 @4 J
  ~% b' Q, Y8 d. g, r# ?
    命令:admin.addPeer("节点B的enode地址")7 F" j3 K0 M  f9 H, V( L
# [  f4 D' D5 x3 o( M  ~8 a( s
    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:+ I, S  x8 m1 k: `, ?

) w5 |4 D9 F0 L0 k9 i5 I9 g    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303"): B, ?, `/ y0 N0 a/ Y

7 {, t# U2 r2 b+ D    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量$ V8 _7 D" q1 I

( b! }6 b( m/ [    可以看到节点B已经同步了区块和交易记录
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4