Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

大叔的爸爸
156 0 0
一.安装geth
$ }" B! ]& |0 x5 }# k, Q1 W$ A) P0 q4 D$ j1 C8 u
    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror
; M2 |. I$ ]6 K  H% X1 m
2 @2 T) {) |5 u, _0 r3 B    一直下一步就行。! h* L$ k2 y3 X. h  R) k. _* Y

0 |" t& f7 h+ O$ T    注意:安装的时候最好不要安装在带有空格的目录; v7 E/ m) p% u5 S; Z4 m4 c

! X8 s7 O! R0 w& Y$ W    二.准备配置文件
- x/ G2 i4 t$ b8 O
  U1 S( S. s" e  B- m3 S( ^& Z- K    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:; ~1 Q2 u. d% \# {* ]6 g$ b
: k7 F- Z% a- R0 S" w
    解释一下各个参数的意思
* x: Z% l+ K" Q' n5 K  x- O
2 z* \- O' }- ^/ f' M1 ~# w4 D$ A    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件( A0 w  Z6 F( [

: A& I8 N7 L( j% O    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。8 Q! _5 i& L2 U: s8 v! L

0 E9 @+ r$ V1 k# {5 s8 M0 m) c    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。
2 T8 Z( ~5 j& P( G' s- g
: b+ Y. z3 e' h    -alloc是预置账户的地址和账户预置的以太币数量。# |# U2 P! G" G8 Y  \' {, n0 N

# |7 W% M0 Q$ `5 q5 t2 F    -Coinbase矿工的账号,这里可以随便填
! i& i  n) M/ i" M# q
1 c- m3 T# {# Q1 F) v    -Timestamp设置创世块的时间戳,这里也填0x00就行8 c. t* x% t# \( x
: q4 r* s; q( X8 \" A
    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0
/ i* J) G8 `7 q. k9 g% Q7 z1 m3 X5 M* z' u5 A. W
    -extraData附加信息,相当于个人说明,可以随便填。
" p3 n  ?1 N5 E" D
) d$ p  s3 [# r( p6 f. C    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。6 t+ C  x3 z. I" K. |6 ~* a2 _4 L8 z

6 P; ]+ l0 v% f9 i    Config是配置文件,必须要写不然会爆一下错误。, ~6 S7 D1 O, k- r$ q1 {5 d' |
/ X3 ~! V3 C2 B; P; E7 Q2 e5 c
    三.写入创世块: B4 v8 T3 V8 Y; B' q2 E
% g7 Q' a3 x7 ^4 \$ ]) H0 z9 W  t
    配置好以后执行以下命令写入创世块. l( B/ \* E; t1 u0 s# M; R

( l7 F8 I5 T4 C9 B" {    geth--datadirtestinitgenesis.json7 m9 a5 y% Y2 q9 ]( n! z
  |. u1 B+ h; |% I  V
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。2 G7 B" w$ o# X1 M1 @5 l) P, S5 @& N

! R3 }" i& d/ [& O8 T    创建成功回显是这样的
; g" {; k, C2 B4 h! l! m. F6 I
    三.写入创世块9 t5 d4 d! x( D- m" `
% v7 ]+ ~" E% c
    配置好以后执行以下命令写入创世块
' W; l& z4 X. e7 b
; G& D# x! c$ K8 T2 o    geth--datadirtestinitgenesis.json# Y8 w; {# q0 G6 c. O5 |+ A

' U0 b' [% p3 k2 C6 G    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
# o$ S; o" ?) E) @3 h) f5 H3 j7 N0 D6 X0 w
    创建成功回显是这样的! x1 _# c+ W/ @/ S
& K8 P2 i: y5 m; Z
    然后执行一下面命令启动私链。4 I' [% l3 h+ e" n$ v: F
( h  C' z4 s2 P' \! E4 G4 a! j* Z
    geth--datadirtest--networkid1111--nodiscoverconsole& ^7 v. `! w( P( w% M# U4 b
9 k% {8 }' `; v; q
    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点
' B! e& s- P: [5 `2 E& X7 b2 u8 x, z" @
    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空% L4 X2 ~! w; r$ B  F
" X0 n0 d2 q, \
    接下来我们创建两个密码为123456账户。$ F0 J, y' j% `9 r

0 Z' x; C6 I+ s; i( T    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()
' X0 r# H7 }! i4 ~# T0 r. n) G' P% J" z  B7 J
    注意:此命令区分大小写。
9 R: b! c3 ^4 l1 k8 B& Y5 N! b% `% h* n+ S: P# W' A
    添加过后再查看就能看到我们刚刚创建的账户了
" c9 V1 [( i. S1 W0 ]+ s& B
. Y! j7 t" i+ y* @    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为03 q6 H1 m# t# _7 P
1 N; ^3 [: O. Z
    四、开始挖矿% ^' r% @5 Q1 S
! R) I! Z: X, K- Q
    使用miner.start()命令来启动挖矿。5 U1 B, D. j% d- h1 y
/ R1 ]" M+ ^+ t* @+ q
    start()里面可设置线程,如:miner.start(5)表示五线程。0 Q5 @# A$ R- J6 n6 }
1 U2 d) S- z0 S# x6 ?. x* ]: r: v
    运行以后会被挖矿信息刷屏。
$ w" D7 h; \7 M0 G8 k: z9 x' j8 W; ?, \- I
    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。
6 J7 b% a9 e* s- V' C$ }6 P5 m
/ i. m6 T- {' \) D! _2 |9 H    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的
( B9 X& @/ F* ]: F7 g3 s$ q, `/ U8 M. x3 M
    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。$ d2 A1 C. |4 J+ J0 m

6 p4 v8 j( O) r1 `6 H( ?! a- `' H    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
1 ^$ E. J% _8 u
7 Z, [1 v# E/ _0 c, j' J/ [    使用eth.coinbase查看账户地址( `/ u% j# F3 X; I

9 }8 n* H, q; o7 Q, Y    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。
" n, l8 ?; T% h: s& d$ c% p/ R" Z$ C8 W: e! Z+ L' X. A3 S$ C
    我们切换为0因为这个账户有钱方便做测试
! g" A/ B# e/ I; n' m: |+ A9 g" }  G$ E" H; U6 L  @% q" Z
    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。7 T* K6 L4 [5 A; E! C8 @
% d$ ]) E( I' @! z6 `- R
    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')) N/ Z: y' ?  g, @7 L

2 D( l/ G% L+ g. y; C    五.发送交易& s5 B0 ?& o, z
0 B' x& R4 y: _$ a# C
    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。$ Y* z' q7 l' K* h8 C1 s; s8 }1 B/ F, f

* K2 J3 B$ N7 p2 w8 [    发送一笔交易,从账户0中转移2个以太币到账户1中
; E" x# x; N- \/ E% q% b& X  C) M1 V, T7 e( d* W( D6 ?/ I  ^
    >amount=web3.toWei(2,'ether'), K1 M, R$ y5 B2 ~$ Z" r4 C

6 u1 n" U, a, q% r3 q$ i% U, g$ Q% P    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}): s; H' E) T) d6 i% Q

6 a9 d1 U( @0 s, K0 S! M& o    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount+ W8 v/ H+ `0 _
2 W6 s" R& P" A6 A3 _
    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。
6 T8 o* ~: `# g& O4 P
  n8 y8 q4 `" j1 B    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。& {' c  }1 X% F& ?4 a% t

, r# |( G% D, D& U6 O    personal.unlockAccount(eth.accounts[0])( G) ]/ {( S! \

1 H0 _8 g, U7 P& S9 Y    然后执行转账操作。
4 ~, t0 q3 a# ]- c. P/ |6 S7 g, S# t7 S0 D* x- o
    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。4 X, r! f* v4 G8 ~9 M

+ @5 B) c7 v  V, ]9 I    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…/ O5 ^" V" d( k4 X

2 m+ m& M" `8 V4 P: _1 _    要让交易生效,我们就必须要挖矿,去处理这个块。
+ R' f* b$ t* E! T
4 `  a, q6 O, U& S    启动挖矿。
7 A! H' y3 J: @2 I4 B, s) H- \1 K% r
    miner.start(1);admin.sleepBlocks(1);miner.stop();% C  |: G$ F7 }) @7 ^
7 T3 ~$ C1 s, D  A* T
    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。9 S( y4 K% W) Z' A3 U1 P, p

  ~8 L! `4 A7 ~5 L% v- F, e/ F    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看! X; [3 e7 f! [8 ~8 @7 {

7 Z( s2 j9 n5 M3 U! o3 [    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。: r% L$ x) m: g! t, K. C

  o- I" M. J4 w  v: T6 }    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8, b* b+ C4 r; q

; j0 @( f3 K9 L( \# W6 ]4 p    六.查看交易和区块高度+ c8 a* R" D' h3 X0 g
7 {$ F3 U. t4 P% |
    可使用以下命令查看当前区块
4 X3 q, C" B; A! [# K; Z% h: ~* I2 K! s. U/ x; B( X1 o
    eth.blockNumber
2 J0 R) e% y+ ^4 O% D( f: j- V
3 p7 I9 h6 H  O2 H$ H: e: H    使用以下命令可以通过区块高度查看交易信息
6 n" L# L: ]( Z. ~9 t
8 V' u% S  A" S; V& Q    eth.getBlock(需要查看的高度)) Y6 m/ U' O3 M

+ T8 x: e0 P) p9 q1 ?    也可以通过交易hash查看交易记录
  f6 d5 K2 \, Y1 U2 h9 ~, c
0 P7 c& h& Y6 y2 Z* X( K    eth.getTransaction(“交易hash”)
6 [6 Q  u8 ^* g8 [. b! e
7 X. Q4 g: _2 Y2 O    七.连接其他节点
, t& P: C4 e6 F5 S) w. K
5 B" x, P5 \) x    为什么要连接别的节点?
# ^( [  S5 S) H0 H0 A0 ]2 ?7 I2 G# [: y, V, p. r7 E: g
    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。. H# W* c0 M" H! G) s/ B+ R& k1 _; m8 [

: j. P" |5 E' I' r    连接别的节点需要用到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! P/ g/ a7 S# O9 _: H

0 o4 e  e- |/ }    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了
( C3 R* [) C2 M
9 S" C2 S1 Z, t- I    命令:admin.addPeer("节点B的enode地址")
7 o+ P7 u( @+ N  y( y; t& ~4 C
- a, \: A9 }% a) H    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:0 {) n8 j7 q- J: n4 A3 w7 Z4 j
+ U# q, b8 J1 S! |) J
    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")' V/ `  F! ~& y$ _; w. D8 j

& d9 r6 z8 M  K: M8 y4 F    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量
) N7 a' F. x  H+ s
. K6 ~# J( J8 P5 S/ b    可以看到节点B已经同步了区块和交易记录
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4