Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

大叔的爸爸
105 0 0
一.安装geth
2 T* r( ^! P) N$ P, g( X# C
1 I* o5 C6 c; A# P* s' s    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror) P2 S  y' P; [( I% A, H

1 n/ a- P4 x! {$ i, ]' `$ i    一直下一步就行。: V% c0 k) c% H( D3 C
5 y9 M8 [; [  s1 c/ C8 A
    注意:安装的时候最好不要安装在带有空格的目录
( S" I2 m. f3 {7 z
3 ?! h9 c$ W# p! m0 J  q: j8 d8 R4 _    二.准备配置文件
- c5 ~* a+ ]5 H! y8 Z/ H! w) p: J
    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:' U4 a$ N* i, P) j" D1 w1 P

% A  M7 ^* p( c9 N    解释一下各个参数的意思) i% b( H7 ?. p% Y3 G+ w
. L2 D& f6 g- I" m# {5 e: |' W9 u
    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件# _. Z; l, S: O  h6 u- N5 y/ W
+ V) C2 l6 a& P3 w
    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。
2 S: D; l% _& ?% X2 F# K5 F5 l# Z# y; j# `, o. G$ @
    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。4 d) X- o- I* {7 {
0 c! G; g, q  T1 d. Y9 @
    -alloc是预置账户的地址和账户预置的以太币数量。
5 s) Y. y2 G4 Z' F
) Z5 x" P# ]3 n  |    -Coinbase矿工的账号,这里可以随便填
( `2 C4 ^! M9 V$ g. j: @. S: c
9 L  }. t2 ]  n7 x7 F9 r    -Timestamp设置创世块的时间戳,这里也填0x00就行; }- a6 O9 m* ~# `! S
" c6 |0 g, }$ b4 u8 _: L
    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填02 X2 L2 C+ b$ g- i! r( T0 {! S
4 y' _9 a; }+ W7 I; u( u) m1 d
    -extraData附加信息,相当于个人说明,可以随便填。. O' N' x* P- J: F" U; k
) v/ r/ X3 L. f* E6 H
    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。8 x0 ]7 d; }' @1 a% D  u

1 V7 _, u" S0 v5 @    Config是配置文件,必须要写不然会爆一下错误。. `6 a6 E% |' S) [: W
$ Z1 g( p! z# J! N/ R# Y0 ~
    三.写入创世块
- q6 I! a4 a/ V3 x3 ]% V
6 d# X% A7 j; Z: _0 D    配置好以后执行以下命令写入创世块
1 `8 d0 A  L9 h  {5 c- {6 L3 Z5 F5 j. w6 h# Y
    geth--datadirtestinitgenesis.json% y+ K0 ^7 f- W/ z. I$ D
9 V6 r* P& O: I- J# X
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
3 M: a+ M/ L- G) I! l! }' `+ s$ p, p1 Y
    创建成功回显是这样的1 q$ r& V0 c$ q; c; D

& u: H5 Z3 N4 S; Z) ?/ u    三.写入创世块
1 h% ?; `& p( l4 q) ]1 q. a
) e2 }8 Q9 R" Q! l1 F" i    配置好以后执行以下命令写入创世块/ [! v- S7 {9 ?

* e- j+ H) Z! s+ d% }    geth--datadirtestinitgenesis.json
( t. p* t2 `6 p' P8 W' K2 h6 j$ O3 W5 S" z$ F3 ~& c. g
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
! w0 b3 k9 ?& T: ]4 N
' W% g+ `* O7 I) Y    创建成功回显是这样的* o4 G& t% [4 t
8 H7 r$ m/ ~  _; n$ `/ U9 V3 t3 C8 H
    然后执行一下面命令启动私链。' s6 z/ s+ ?8 T9 E

' R$ t- C2 X! x4 e, B    geth--datadirtest--networkid1111--nodiscoverconsole5 X4 M3 W8 c+ m2 J( W! f: q5 {
+ `- J+ \% N& A, h: e9 W9 s. E
    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点8 W1 C: _: a- O# }; [7 {' D9 |6 G

, D4 Q' D8 k8 p    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空/ y* a- ?, q# [+ g2 R, F

0 Z, }5 P/ v4 E" R. Y    接下来我们创建两个密码为123456账户。
' u' v8 |3 m8 `- a. [3 Q0 t  g5 H1 u2 p( ^7 M" u  `/ }3 P$ P% A7 b
    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()3 U- I3 g2 d8 c% u# G

0 T; U6 S( e& ]2 w# h    注意:此命令区分大小写。
( ]7 `& Q; c8 L, }7 n% Y, o( i5 r
: l( ~; \$ ]" W' p% D6 G    添加过后再查看就能看到我们刚刚创建的账户了2 H3 ]& e# r2 T/ u  D% c' N
3 d9 S0 B! ^3 ]! {* l
    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0& L5 \" H6 I+ [8 z  ~
0 }5 q0 A7 H' x2 P% D5 I& H
    四、开始挖矿
% ~; j6 R* ?; {& F  o+ ]) P
* ]5 v2 j/ ]" o5 X6 Y. |/ |    使用miner.start()命令来启动挖矿。4 u4 u4 ]% ^& ]9 W& L0 P

2 H, A/ ]7 Z8 j    start()里面可设置线程,如:miner.start(5)表示五线程。
0 \+ q" s  T2 l4 d6 v; O
' {, P1 b1 g$ W7 V1 L6 Y1 m    运行以后会被挖矿信息刷屏。) ^+ ~- Y8 x1 q* }# i) {2 e
( L$ B% d  `! m' T$ B8 q5 B* W
    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。
/ |+ B1 A3 ^- g' U" B5 o2 M; h+ C- C$ |6 T  ^. W
    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的$ v- Y6 U  ?/ i. f

6 ?  N9 w7 i: x& A/ i$ k+ V3 F    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。" u! B9 O3 g* `2 B
+ a) z; k/ o! R- U( n, B# U/ r8 V9 ?
    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
! G8 ~( R; X  i3 f/ a% e7 }5 O' i( n4 S$ R! F0 c' J: L2 M
    使用eth.coinbase查看账户地址+ J* s; p% }5 O. A$ F4 t

2 d4 l/ v0 o4 r/ C    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。" @! J3 J. t) N3 t
# S, ^6 w8 h' f# V; h- X7 a9 i# C: w
    我们切换为0因为这个账户有钱方便做测试1 Q7 l. H! J% T' x% D

' p" A& f7 @: G* @6 `    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。+ o$ w- T; E5 D6 g0 w, _3 J4 }7 ~- x: n

4 F7 g2 C9 _, L    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
  Z% I$ f0 m: O3 r) _
; Y' R5 c1 U- V3 T    五.发送交易
: r' C+ |: i' ~: I  A% v' V) ^: h+ j" E" ?+ h
    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。7 a* c; g8 V; F+ C! W9 Z

) ~% s9 T/ Y. ~1 O4 c    发送一笔交易,从账户0中转移2个以太币到账户1中  r+ V( }6 [7 |6 Q; D/ v2 b$ a8 G
- y5 m( P1 |" G) ]9 e& p; I
    >amount=web3.toWei(2,'ether')
+ X( l% j4 p& g7 z1 h% k' G# }6 v  j, C! }* r$ c2 a5 G; N
    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})4 l$ o* x, m# Z4 K5 [
+ _; Y/ W  a3 n( k4 }" t
    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount* A$ S9 p' Z5 d7 Z4 f9 x
3 K8 t6 y9 P+ s0 J6 S
    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。
, Q9 t8 ?0 e  K7 h& _7 I; o- b# a; }- V& ?
    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。) O- {3 N5 L1 H; W) A5 a

; [! _  X; E/ G# X/ A: W1 \    personal.unlockAccount(eth.accounts[0])
! g6 a8 v  h3 A+ r* K
. {2 B2 [# Y% o8 k& _1 c    然后执行转账操作。7 `# A, l2 h/ d9 E( k

" o+ j3 }- \- @' x    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。- W7 B' T1 \! I+ _# z! H/ j

4 r3 Y* I; z8 Z# |' x    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…
( z+ f2 N. k+ I; D/ S. a! ^, a* b' f; V  I/ H9 h4 K& d# O
    要让交易生效,我们就必须要挖矿,去处理这个块。
8 i& D( A: x' Q# {5 Q% t8 i3 X2 p, V- c
    启动挖矿。! F9 _2 ~5 o! U; ]8 y/ f
; i# ^2 U$ \8 S1 |. R
    miner.start(1);admin.sleepBlocks(1);miner.stop();
: E) i8 F# j* C. F) y! Q0 B7 N3 k. W) {' K9 T1 W0 i0 p
    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。
$ f9 q& v3 V! T, C5 k8 e# b* Q# h' b  q. E
    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看( _- ]' `; _7 C7 Z5 t$ ~
1 C& M# `1 Q! H9 V2 t! [% M
    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。
$ b4 V; C: {" R: x* l; I1 H' P3 [3 B. L+ s
    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8# y. r% T! _: n6 `
+ V' e' M$ U- w$ T4 `: N' T
    六.查看交易和区块高度
6 c- `( Y  f3 f1 K- M0 _9 ^& l4 v( j
5 _% _$ D) M/ {. l2 R$ H    可使用以下命令查看当前区块5 Q  K5 U$ p1 |" t7 M3 {
' g1 G2 u+ J. w% V' J# M% {
    eth.blockNumber
; J+ U( L, q; s) p8 Y5 a( k$ v% x* [2 i; M# C5 Z* G+ O
    使用以下命令可以通过区块高度查看交易信息
$ X8 E: B/ l! b/ y% p0 j( Y7 o4 b- }5 d
    eth.getBlock(需要查看的高度)3 d, y9 P( ]  A( q3 s* A# o
  n' m2 J* E$ L6 B6 d% l! D0 ~! _
    也可以通过交易hash查看交易记录
" u: C3 a1 d: B/ \+ w: C* o
! u8 u# R& z) V( }    eth.getTransaction(“交易hash”)
& i, I: ], E/ m6 ^2 Z
7 @! I5 ~$ u3 t, f* B, l    七.连接其他节点
3 @% R4 A  X" a1 X
. {* v- _" ?8 u, Z& E: m    为什么要连接别的节点?2 \# {. C8 V# ~. W0 q
. R  i* T* P; B8 X  Y0 ?4 H, \
    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。
1 z. u! J9 m# @! _
! J$ {) [6 J+ O& x    连接别的节点需要用到admin.addPeer()方法,连接的前提是必须保证网络相通,并且networkid要一致。比如:有两个节点,节点A和节点B,节点A的networkid是1111节点B的networkid是1108,那么这两个节点是连接不了的。想要两个节点之间实现连通networkid必须要一致,假设节点A和节点B的networkid都是1111,如果节点A要连接到节点B,首先还需要知道节点B的enode信息,enode可在JavaScriptconsole中查看到,查看命令为:admin.nodeInfo.enode0 N& _% j( G+ \4 ]  x: \
, \2 x. q1 ?* t7 _# n
    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了9 a3 m( e! x4 n& g0 Q# ?
/ \9 H! X/ P- @0 T4 e! E9 j3 n3 v. z
    命令:admin.addPeer("节点B的enode地址")
: D" ?2 y8 o% k% M1 l" h1 A/ a: |0 H5 u3 }9 O
    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:
3 D/ ~% r  h6 V/ i4 F) b$ ?$ j; v: G: _+ W& [) z
    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")2 O2 p, S# J4 M9 ?% w  R- w

/ {% F# Q  {- B1 x: U6 Y; |& P9 K    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量+ C8 m- {2 w" V! H9 p8 [5 Y

' v) }, Y. e" h# g$ j3 L9 w) {+ `, u    可以看到节点B已经同步了区块和交易记录
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4