Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

大叔的爸爸
140 0 0
一.安装geth
! F- A3 }+ D+ B4 u) f* H7 L7 B
' @$ ]. y" i1 @    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror
- T+ \! ?* y: `  }/ f+ @; E; \5 S8 X8 h3 d* w4 [  H- N( |  M
    一直下一步就行。; q; i0 g. s; I  I! q1 B% B

, F1 V( N  A% G3 ^. O    注意:安装的时候最好不要安装在带有空格的目录/ x: Y6 _" q  X3 z' ^

) w+ i3 m& e: s, t/ D7 L    二.准备配置文件
' g& H& p& D, r; e( i, e8 b; [! J$ W5 S+ [; U6 ?3 w/ O5 j
    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:
' [+ m5 v/ U% ~) Y1 G# {# }5 p/ z) ^6 r6 p$ W6 z
    解释一下各个参数的意思
" a2 N1 O  A* P' ~0 X; ]3 _! ]% O( J( i3 n0 q4 Q: X3 }3 w
    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件
3 O! R* d  Z6 B; b( X* C5 _4 D1 p. L  Y
    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。
, e! z9 C- h' z  F( @; S( x; s# c1 a5 _" o) b2 S; ?& G
    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。  [2 T) ]. S9 F- |: x$ g
, W) P) v/ s5 }# Q; ^  I5 c
    -alloc是预置账户的地址和账户预置的以太币数量。
3 {' }$ W" w0 H, s3 c! I2 p2 \7 E( s) i, ^! E9 B. ?5 a0 y+ E
    -Coinbase矿工的账号,这里可以随便填( u4 a7 F# F' R' R& P( V
6 x  r6 h) c# E7 r3 {9 c% t$ I
    -Timestamp设置创世块的时间戳,这里也填0x00就行
, P9 G- D- |$ u$ G5 u  N( [% H! Y; D5 H- s5 E# M
    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0
+ J, o8 u9 F' Q% M) P3 h" D9 o  d0 ^
    -extraData附加信息,相当于个人说明,可以随便填。
+ @' T! l+ Q5 z
6 @. M1 e, M2 F6 I! i; R7 I  V    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。4 A4 x7 I; j) Z

2 m) ^2 Y3 i0 i4 }    Config是配置文件,必须要写不然会爆一下错误。
' `" p4 I4 E5 r; W9 g
8 x( ^; I; }; R0 ?    三.写入创世块
* s  n4 g7 _" b( z, f7 c
  X1 ^% t6 R9 k0 `: C1 C! _    配置好以后执行以下命令写入创世块
# D# p" l4 _! W$ _0 r' \; c' ?9 O  b7 ?4 U3 Y$ G9 Q
    geth--datadirtestinitgenesis.json
9 e8 ]5 s4 U6 ^
2 ~' M& U8 l% S$ p( y, @3 {' t* [' ~, k( a    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。# _! }# B2 N9 P% P6 D& A* g0 F4 F

1 ^$ ]4 P1 h4 F) P( M* U    创建成功回显是这样的) i1 J4 ~$ F& m% L

9 s, P- ^* M' p! y0 @    三.写入创世块3 a, ]5 t( ]% r  h6 M0 i9 N
2 b% E+ O( p4 a7 W
    配置好以后执行以下命令写入创世块: B# P0 `3 i0 E% B% \9 x' t" B6 q
0 P' H% q% e' {
    geth--datadirtestinitgenesis.json' r8 e: m5 H7 q6 @% o, l( K4 Z3 e; J
) k7 A/ T  X7 x. A, w" N
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。- g5 P7 c9 ]( W1 O: r

6 n0 b" E5 |2 @, ?& D    创建成功回显是这样的
; e2 k. @. b! u2 j7 {4 I6 {7 l* |) X2 i8 q; W* n8 w8 C4 D
    然后执行一下面命令启动私链。
0 F3 r. s% v+ [; L6 e; ?/ G) p$ b3 M) N( V  u, X( L; q8 S
    geth--datadirtest--networkid1111--nodiscoverconsole: b2 m- r' `; ~3 w/ m. S- x+ A  i
* s4 G; v  o- T# k7 G5 G4 `
    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点3 b% D% j  J) F! Y

: R; A! Z7 t1 z5 ^    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空
9 O+ E) i  ]2 V  p
: m/ w' m! O5 m8 j: z    接下来我们创建两个密码为123456账户。
: t7 F# z6 f* E" Z) o) d/ S9 S3 m8 a9 U2 r
    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()2 |3 U( L( u$ M5 }. {& d

, L0 L8 `8 x( u1 x& v, B! e0 j    注意:此命令区分大小写。. Z! @& S( s3 N8 y
) q' `. F" G4 P+ Y
    添加过后再查看就能看到我们刚刚创建的账户了
) ]- k7 t: N# ^1 {1 z$ e5 ~+ I
' ?: w$ a( f. b! t( g    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0$ O& B  A) _* H7 G% |7 h6 R

' K, S# j' `" s$ Q    四、开始挖矿, V6 ~% K9 V2 y( v, _' j
/ k# E+ w* p  F) u, h
    使用miner.start()命令来启动挖矿。* o+ f3 @. @- z' B+ R$ p" H2 m! C

# ?, f6 x; E# d$ ?4 {  _    start()里面可设置线程,如:miner.start(5)表示五线程。
- t& q* X# h1 g& l" ~; I0 @' t
3 [9 q6 Z, h+ c" S4 O4 B* l    运行以后会被挖矿信息刷屏。  V$ }+ E1 v# F
0 J) V, F, N/ ?. r
    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。
( ^" @9 O! P4 {; E; Y1 u  u$ |# `$ o' f0 f% Q  R
    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的7 z" H! d5 W( O
5 V7 \% C, X9 A  w) X
    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。9 L/ D# v  u, T% l
$ i, E! ]# R1 u: l  ]7 P  A/ y
    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
6 X& E, m' i3 F0 |% Q3 G" p0 M5 h# A" j* t/ P% ]* _$ ~
    使用eth.coinbase查看账户地址+ z3 ]$ a' J% T9 w3 z# S. |  W
. w* F% V. u( [8 U' I/ z
    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。
- s( @7 ^  O. C- v$ O: F
2 {- l; r6 \& ~7 R    我们切换为0因为这个账户有钱方便做测试
; c6 _( v0 ?1 g4 y& a
" c8 x& f& a+ F$ @" `$ [9 ^# O+ p    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。4 R- H* V2 W+ g* r5 k' p4 g" s
4 c* W4 {- w! g
    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
, Z# q. t# t) c: _* E# ~7 F. ]7 k1 T/ N$ w( N- ?
    五.发送交易2 x! p' O4 H% o( \9 j. [7 @: F
0 Y7 m8 H  V1 ~" t: J, N
    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。
/ Q: W0 A' {% ~( c' _+ k+ m! b6 ?: z) U# w4 T
    发送一笔交易,从账户0中转移2个以太币到账户1中3 T* E! A! }  P2 R. |& w% m
2 p/ k9 _3 `, N* W4 s) V9 E
    >amount=web3.toWei(2,'ether')
- {0 q- p+ K" |# F( Y! q; H) D6 j9 J! t4 C8 h
    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}); f' Y- l& O" D; z0 n$ z
$ r4 p  {, g+ O1 k$ _2 x) R
    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount; W) p( E' I  J2 x. h

. d) D$ L4 W) t* q8 t+ x    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。1 S0 X$ A! L, s; y
$ `/ o: f& a( a# E8 ^
    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。
: c5 W& E3 t; _8 t, `' \7 G' _% l/ I
# T% L( J1 ]! J1 N6 `# P    personal.unlockAccount(eth.accounts[0])
/ f! ~) h7 {* l: ~. `0 ?$ I' c& G( ^5 S& W+ O/ n1 z$ S
    然后执行转账操作。
6 a, @; ?# r" w7 `6 j; P3 f
+ {0 K2 V0 W0 n* h- K; D" j    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。9 m; }% H% S4 h
' v6 n" V2 [3 H6 K
    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…" h$ O& e* [( Q3 z; j
8 _: t4 @5 l# U# r) l
    要让交易生效,我们就必须要挖矿,去处理这个块。
- V' Z( J% A% r! a! w1 m/ s& H3 ]7 B
    启动挖矿。* ~/ h/ w& O* }6 f) y
1 {2 x+ ]5 b+ o" s5 ?; a
    miner.start(1);admin.sleepBlocks(1);miner.stop();$ Y% C6 E: Q4 M# h( i/ d# t
4 f+ H* c- I1 `" i: t( G. f* ]
    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。& I' ?8 Q& S: O, \4 M8 u

/ l5 ~) |- V/ T7 t2 O( Y$ _    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看
. o% I/ ]; B3 O" q) t' l# D' H+ p0 z2 G7 d# T! Q) M8 Z/ T
    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。
# N' C9 b5 ?1 g0 k- B: t8 d7 [( q5 L+ B% R$ d; @5 h
    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8) l/ L$ A, T- [4 O

( f- F+ z3 d% R) A' y    六.查看交易和区块高度
. y) ^4 }8 D4 n/ H8 C7 d( f3 D
- ?! \6 d$ Y( m2 Y6 M" D    可使用以下命令查看当前区块
! u- `* ]8 ]+ L6 E1 J6 u1 x: u. |- k
    eth.blockNumber* @6 y% B% d1 E) n
3 W2 J/ x7 w, \7 W/ g
    使用以下命令可以通过区块高度查看交易信息
& k' K" @8 A$ }3 W
( W3 t+ V8 A: k! ~4 `1 G- R, n    eth.getBlock(需要查看的高度)
0 z3 T( W- W+ P9 j+ r4 N
3 B" a, h, Q" D& Y: L# n  v    也可以通过交易hash查看交易记录$ j% u  A( {) t' j- ]
0 r+ W  V" l  N
    eth.getTransaction(“交易hash”)( u0 ~% |' \- q" r/ i
( m, E7 }: K* T
    七.连接其他节点
" W) Q8 g* \) b  w& n; M  _6 D5 |, m/ U6 l' v% t# d$ v# ]
    为什么要连接别的节点?
0 i8 M# |& _6 X9 x. I3 T6 \: z' v* Q7 y  D; o8 o
    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。
; ^7 b% l: _" A. F0 B% q2 s9 C
+ D7 `* C3 ?( h! L5 ?+ A% M    连接别的节点需要用到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 b9 v; j8 r0 p: ^

$ q+ q& f$ ]' o- q9 c7 H. B7 K  B, p    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了  N# w# E/ T0 j! \; I5 Y
% m  H5 z0 ]7 S+ ]& L7 Q
    命令:admin.addPeer("节点B的enode地址"), I" s: W9 L* z' }7 p9 f
5 q  X  N! K5 R- ~
    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:
% l' w) V' ^6 J( S) {- M( P, s6 z. p3 r3 P/ G! {% [
    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")
) V) [: W  F4 `" \' o( Q5 [% F
. v# L8 y& A1 [& c1 m% Q    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量8 t$ ~; i) y" N
2 z* b/ ]3 h6 l
    可以看到节点B已经同步了区块和交易记录
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4