Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

大叔的爸爸
119 0 0
一.安装geth
! f# C- Y  b! \) X! `8 W; h  F: ^
6 _7 I& K8 B" R6 `) V8 n2 R0 u    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror3 Z; S2 j6 g- G" ?6 Y) L

, D) F# L1 x: e% N" Q0 Z    一直下一步就行。
4 p& P$ \8 p$ f$ y# q5 N
: x  B/ V* j1 A* j3 F, o    注意:安装的时候最好不要安装在带有空格的目录) i& z: ~$ q" U, j1 g3 D) P

& q$ e0 F4 b( t$ R    二.准备配置文件
( Q7 |: j4 ~3 T* G, n- \2 q, v, m9 Y6 c: K
    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:6 q$ R: H' ~0 T+ _; D9 t- b

, `2 v! {* X5 U0 B+ ^+ o; Y    解释一下各个参数的意思
4 S9 g1 W+ I% |5 k0 H0 _8 e+ a# d4 I) u0 y) q) W. ~
    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件) S6 q6 B; @2 b( p( r+ M& @

  z. V" _* P2 \1 r9 i/ j    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。9 x& R. f" P  a& w

2 u* S8 J) j5 z4 T9 [1 l1 K# s1 l    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。, n# k7 n' s/ W+ u8 `
; y: F0 W' l! s% W
    -alloc是预置账户的地址和账户预置的以太币数量。' G0 \) d+ I+ _1 C
8 c& K. R9 H1 ^: S1 u2 P! ?
    -Coinbase矿工的账号,这里可以随便填9 Q( ]; N" D: X. y# S# g# H

! M5 x; _' W, H    -Timestamp设置创世块的时间戳,这里也填0x00就行
6 y9 `5 R' A  u6 p- x. q
7 ?9 w* s; C. g1 M+ J2 T    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0  y" m% ~9 {- k  A
" A" `$ B8 h, X
    -extraData附加信息,相当于个人说明,可以随便填。/ _2 }  r& Q* B, \1 t  P

  }7 m' H+ r# F! N' o    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。
( j8 K6 |* q) C0 S* a( N" }- E6 b& W9 a
    Config是配置文件,必须要写不然会爆一下错误。0 m9 z- [" k* _5 j; V* O

: X" Y# G% t" B/ R! V( ?) J+ ^    三.写入创世块
, \8 s' \+ \% d2 q+ y. i& E1 S" @+ L2 {* G& w  S
    配置好以后执行以下命令写入创世块
6 s; ]: n) c- z/ d, b& D( o9 i; F% h  P$ l# z( G
    geth--datadirtestinitgenesis.json% U3 K8 r5 j- I7 O$ }  R  ~! O' l5 e2 h: o
1 X0 Q, x5 q/ z) s: H$ b
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
8 ~! Y# s4 b2 s
/ N9 r, v2 r2 S- e- ~8 ]4 h2 q    创建成功回显是这样的
9 l# e/ @) y- A/ G$ I
8 y! b4 c; J) Z) c& N8 t0 f    三.写入创世块
0 A3 f. X  l* x9 z6 k; ^7 L- d6 V5 o
    配置好以后执行以下命令写入创世块" C- ^$ B. f  N" F- }5 l8 I8 W

1 I4 h. J) I" a$ n2 ]# l# `    geth--datadirtestinitgenesis.json
( R9 Z: y3 V/ k
1 z' s7 J2 o4 o: ?* }3 {. q; V    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。+ @" O9 A" n6 T# {3 j0 `
0 u) a9 ]0 O0 r5 h9 H
    创建成功回显是这样的
3 t& ^0 N/ p2 H( @* N2 E3 e- ~! @  \! @
    然后执行一下面命令启动私链。
, `6 r. E6 u+ }1 l& v, d2 u8 t* `/ U) m3 n& c
    geth--datadirtest--networkid1111--nodiscoverconsole; c' ?0 n, ~/ j
  ^3 i, v! c" W+ ]  Y2 o6 B4 n* f4 k/ W
    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点
# ~/ n' L: D7 l
, i$ @3 c+ z% b( e& e    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空" E! q4 P" ]+ m+ e; Q. ]- |
: P, r; q7 v9 \% U9 I9 ?3 J
    接下来我们创建两个密码为123456账户。
  r1 ^5 n& J6 F4 q3 u8 n8 U  g* {+ @* s- }2 k: E" j
    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()
8 J. E% M7 k- f( H9 h4 J) V0 y7 C1 P+ E% d' l
    注意:此命令区分大小写。
3 t) S' e5 i9 e# _. u( Z; x
) N: }# x' }, `' c    添加过后再查看就能看到我们刚刚创建的账户了
! F! e) o, T# F, E+ Q1 d0 n4 h7 O1 G- q* R: _7 L
    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0
$ A) f: [1 k2 Q8 c' ~* ?% f. h  _2 P9 N% S; P3 p! Z* Y
    四、开始挖矿, X6 A" }. B+ n: S3 ?
, s8 l( `# h  Q6 y
    使用miner.start()命令来启动挖矿。
! f- V) Q8 U" _2 a& w8 R/ L. A2 T7 |9 s/ S) H) v. Z0 [$ m
    start()里面可设置线程,如:miner.start(5)表示五线程。  b) P$ U1 y0 k1 Y8 k* X( j

( M" E% X; X5 w/ ]6 w    运行以后会被挖矿信息刷屏。
1 y2 i" _1 Y, J+ H/ V- X+ S' K- w6 m. {) g8 o; d( K
    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。7 g* \/ {8 i( _/ i+ T. d
. E8 [6 G0 @7 k1 k# |0 \8 m
    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的
3 j4 M5 e) n3 {& {5 f7 l; J
) b) p$ u$ q  p! }  u/ J& r4 m' k    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。
0 K( N6 {1 a- l! K( L0 ?
9 ~% W. d* m+ b# Q: U' X    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
: _! `' g+ o  v% a% A: c5 _4 S+ Z# s; N9 J* J  P2 R+ Q" X
    使用eth.coinbase查看账户地址
$ A" r9 e: h; C' K9 s7 u- s9 h& M
    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。/ H( _$ q  T' B/ J

$ I# k& B2 R" ^- N# I' c2 {! E- C    我们切换为0因为这个账户有钱方便做测试
  d, }1 q) V3 }4 g6 M( `' g! q
- y* P0 G& g+ X  }! k/ L    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。- i- u* ?$ d1 m
! c0 Q4 {1 l' m* L3 |" A( u+ n& z
    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
/ m- f+ K8 E3 L& J
: y5 X) J0 [2 R; z' {+ q% @    五.发送交易# G1 y: }# r! H( }

" M) O8 V; d. q% j9 T" k+ N4 W    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。
; A& X; S5 _$ j$ _& h: u& ~; L) u1 S
! H( ?5 J3 x* ]* Q$ H. S    发送一笔交易,从账户0中转移2个以太币到账户1中. q  N0 m/ J6 v: z" A# y" }
1 x. C9 Z, d) i( A; Q% k% K
    >amount=web3.toWei(2,'ether')& h9 f' O% U  J# U; F9 s, ~
0 A  g: Q8 C% q! b! Q% p+ \7 r$ t
    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
5 Q& W; t1 ?- C$ |# H4 p
: t+ t# K, J& m5 [/ m4 k    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount0 |0 T" l, i/ z2 ~

, g% I3 h1 ~* i    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。
) T% m! ]. n. x" c5 M
1 p- X% Q9 ?6 o9 }3 c- j# l2 A, x" z    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。
8 ^3 {: W" a& n, ?: t1 a8 D. N
! k& I( q; R- P    personal.unlockAccount(eth.accounts[0])4 }9 J6 H' Z6 s$ W
  g* H; K* Y* s; Q# k3 }
    然后执行转账操作。+ k  D  O/ a  ]; G" J. ]

& j# n  O  ]3 b" a0 d7 V1 s    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。
$ T5 O5 L( P5 ?4 `, P4 d1 h1 t, P. U+ i) [$ O
    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…
% w! {) @5 L7 O4 z% k4 ~% i
+ Y$ W9 O$ C9 C- U# t; H% w    要让交易生效,我们就必须要挖矿,去处理这个块。
5 @# k/ u. I2 H3 F, W5 z, R0 U; m' Z' o7 x1 i* B, u5 V
    启动挖矿。+ `& t4 c* x( t+ I8 B, i, V6 B2 b

, b: W* F7 k/ c" C# i7 n    miner.start(1);admin.sleepBlocks(1);miner.stop();2 U+ C% `- f! w+ c

. P* C; n+ T' W' D* a    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。9 N  S! N' r) I; M9 P: `3 v3 @

3 K) c; W% a; J8 y" C# ?! E3 p    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看( s1 @6 v0 b/ X6 |
. i& A6 c+ z. @  I+ c: G9 N+ C; a
    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。
9 u3 \/ x2 P# Y5 R. y+ A% t
8 g) J9 M# `; Z8 t* b    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8) e+ Z1 f% |5 @! A
6 T; a# A2 D) X) a/ e6 y6 D
    六.查看交易和区块高度! E8 R7 I, \. [
" P: p& ~" I( Y0 X, f
    可使用以下命令查看当前区块* ~6 M4 \9 s1 d! S
& s- o9 m5 \  D. `" r
    eth.blockNumber
! U" Z+ f- ]% e: T7 |8 ~1 ~; b* z4 O3 x/ A& ~# h
    使用以下命令可以通过区块高度查看交易信息
4 m/ L! P& r+ b9 `7 \$ \2 t7 r" i9 c% D
    eth.getBlock(需要查看的高度)" s" @  y  m/ g
% @% |3 ^" m- I/ p. _
    也可以通过交易hash查看交易记录
# V+ H4 k$ O( _' \. X
( R$ w$ Z& e, s: j2 y    eth.getTransaction(“交易hash”)
+ s5 y9 u& P) q& |* m$ o5 |2 s8 }
    七.连接其他节点
- I6 O- b. v0 j( l" F  n/ p/ L3 a
$ ^4 h4 T* D$ D' ?3 M    为什么要连接别的节点?" z( j" q2 z5 Z1 ?
' I" |6 o5 E6 [' b, O- Y2 i1 k/ R8 [
    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。
! m) U5 h2 w4 C' d# X; p5 v. X* F" ^1 b( x& S
    连接别的节点需要用到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
# |. K* q3 y  |% F. i4 R
, R. s4 ~8 c- ~% [    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了
5 }/ r+ E) `6 _5 u( X+ E2 m; i8 h* l0 ?9 h
    命令:admin.addPeer("节点B的enode地址")
) C0 A5 }5 t+ j
: ?/ U! B  T' d' r# S    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:; U5 D* E" U2 d5 p

0 T" q8 u' o( w% ~9 ]( J+ G2 o+ I    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")
* v: e" |2 U8 W! X# W
( Y# f) w- q, t, \# T    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量4 Y3 i6 a. l; C: F) I3 c9 M8 C
1 o7 g$ G8 \& ^( z
    可以看到节点B已经同步了区块和交易记录
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4