Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

大叔的爸爸
108 0 0
一.安装geth
# A5 A$ u( Q  E; o
4 C8 u2 |% ?4 Y& k# {    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror
5 {6 d9 z' w; z* P- R; Z# ~% i/ G
    一直下一步就行。
% p% {5 ~- p  j: ^
: J( X/ d. a1 g4 |/ T2 C- ^$ ^    注意:安装的时候最好不要安装在带有空格的目录1 @' ^, T1 z+ z, Q9 h5 L
7 T- V3 w: y- ^8 h1 V
    二.准备配置文件
' X5 I$ z( @8 w5 ^# l1 Y* U2 f0 c7 I# S! ^" U
    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:3 S5 K( T7 E2 j8 s: M4 f

5 R" Y6 u( v# R! _! H1 p6 D% A    解释一下各个参数的意思3 `5 @! o( B& h! i( E# c* B
* c. l3 ~  Q9 D6 c; W! J
    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件1 l/ e8 }# Q- \4 q' a

; {% `  r1 h9 f3 O: ]+ i. W- m% ?    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。
/ {  k9 b! C1 G4 d* k% Y4 w0 _2 i, t+ H" Y4 P3 r
    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。
$ D# \  s1 B, ]; ?  _$ \  |
/ o% l! ^$ f0 f) v2 o' F    -alloc是预置账户的地址和账户预置的以太币数量。4 f, N3 w  X( U, h
3 w& C0 U8 W, q; [& [
    -Coinbase矿工的账号,这里可以随便填0 v) |( q( f6 u0 ~# Y" f2 v+ Z
0 r1 a7 M' \  E! h
    -Timestamp设置创世块的时间戳,这里也填0x00就行
* j' ^% y! Y- G2 }, ~* l8 P
9 T) w7 v5 y7 I* ]) w% ~    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0
" q2 s6 |  ]: `$ Q) d
2 W5 E* F1 c/ f% N7 t- Y" F; X    -extraData附加信息,相当于个人说明,可以随便填。5 h9 l% P. y) e2 }; F" s

# ^7 ]6 R' k5 h; T9 g$ K    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。
# f8 W4 g+ ]+ A( ?# }
' Q8 m; |# P2 K# r- {    Config是配置文件,必须要写不然会爆一下错误。4 f& v+ s. s- C5 z5 T, s

% ^* r6 J. a! M  g! a" ~& t3 z" S    三.写入创世块: P! ~- c) q1 e3 U4 U

- ^+ g7 [4 B& N, D& Q- p8 {    配置好以后执行以下命令写入创世块) B" F& [  l' K$ M3 @

# f1 H; n* R, k" |) s    geth--datadirtestinitgenesis.json
/ A9 F, S  Q+ ]. n1 o9 z' E7 X: u+ p* b
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。7 {$ G6 b8 \0 h3 i  ^# H4 W
6 y+ e, I5 X- ^
    创建成功回显是这样的
% F$ S+ b) Z. k: }1 z
' X$ C: I% b* O% c; k$ ?0 u/ z" X7 [7 A    三.写入创世块0 g$ O9 O+ ]2 P3 l( r0 n" c. i
& \  [$ B4 E4 U" S7 K! q5 N
    配置好以后执行以下命令写入创世块6 v5 z2 K/ h3 p9 b( q
/ Y% n" d6 V' b8 F# g( W
    geth--datadirtestinitgenesis.json* l- ^+ H8 p8 G7 i: l  V" I
) R  N) F3 T( c3 O4 d  D# o/ ^
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
0 L$ t7 O6 [) Z
' ~/ @. o' R: ?5 b% D    创建成功回显是这样的" R: ^8 a1 o2 X, P4 ~0 K( A$ U

. t) V: R4 U7 d' C) A    然后执行一下面命令启动私链。
( B" i! f# w! U8 f0 e* u) ~( d. J1 L8 O, c* ]
    geth--datadirtest--networkid1111--nodiscoverconsole  r4 g% P6 V) V& c% d( y! _

+ h: F3 \5 l) ^# x1 o! J    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点# c* r7 ^5 _' @' U2 o0 }
0 w* Y/ ^; b& S1 y8 G2 J
    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空5 D" Q2 T5 b' |  H
, S+ H8 W' e- Q' d+ g
    接下来我们创建两个密码为123456账户。* Z  j) K, w& o5 v; s; h: I; Y; P7 G# g
$ L# Q' s. r/ x( d) a1 G% f: J! i
    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()7 M* [+ p* U- b7 T8 D

5 b. f$ X- S! O, Q& N- b    注意:此命令区分大小写。
  B3 F6 D% j: F! H  u2 ?5 J# z% q  Q& D! u+ x" m
    添加过后再查看就能看到我们刚刚创建的账户了
8 z) Y. A% z" |; B- R4 B# z- r  z6 ^- [/ H( v
    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0& i* E- i, g5 D  |1 A# X/ m7 p( ~

" h* [6 ]! c' u) j    四、开始挖矿0 V+ }6 X3 j) z8 ^) z
! M$ q7 ]( m! ], R2 ?$ D
    使用miner.start()命令来启动挖矿。0 y9 }* f* q0 l1 }6 E
$ ?  R0 }! d4 t4 \
    start()里面可设置线程,如:miner.start(5)表示五线程。
; n& E# O  G3 Z9 |% u( s3 ^  ?$ ]9 z! e5 l+ j
    运行以后会被挖矿信息刷屏。" Q9 L. O# ]" O; n7 `9 e/ V

. Z$ R% F* L1 z( i. C: x    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。
5 r. h0 a4 D# r+ c/ ^: {' E: p4 Z& X
    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的
; K4 Z  {" X+ B* q8 g6 N/ k8 S, X' k/ w9 B! h$ b" u9 D
    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。
9 ]/ G( {6 [( q7 H) ?# i1 c9 {2 z4 Z' n
    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
: ^2 T7 j+ V! K) t7 M9 V+ v" X
1 m5 w3 D. w5 J2 S# U6 S    使用eth.coinbase查看账户地址- P. x; P9 C, y$ g: }+ N' z- y

& X7 {% j/ j" I0 L8 u    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。
/ z: g$ F' @0 B0 p2 R" Q2 I% O1 \: i" F% Y+ O. {
    我们切换为0因为这个账户有钱方便做测试: P. L& U, C3 z
( |9 d' c9 T; M
    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。
: b4 I" K) t' ^+ B3 m' E& [
" Z) a+ Y. t2 Z8 _8 d    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
: F; P( l5 s4 m% \1 n! t  R7 F
2 Q) k/ B# @# E' g  _5 M; p% _0 R    五.发送交易
1 Z$ s) C0 z; _9 M& K/ o: ?+ G
+ A! x6 Z7 p$ H' {7 u+ J    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。
& G1 X! ~. M  B$ r* E
! \9 {+ o5 X! X8 x4 U    发送一笔交易,从账户0中转移2个以太币到账户1中* U6 F# C0 c! G/ [  C* H

/ g5 i: b" h; S# K( U0 P    >amount=web3.toWei(2,'ether')$ s: ?# [  p& Y

0 U, d7 `2 \( d7 c+ y: C    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
' r+ a7 U0 B2 q- ^  f$ i' L* o2 h; W2 L* D3 N
    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount( m$ _! a7 m' l
0 J. ^7 {4 l1 X5 x/ v) [
    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。8 A+ a6 {8 O) g: ?$ o! ?: K
- m  z, m$ ?1 k. `3 y
    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。
6 e4 r5 R% {5 m0 Y2 B: c. T% p- Z
. j  D0 x- R% b6 z- {    personal.unlockAccount(eth.accounts[0])" o0 \7 Q- j$ x. Y, Q9 t& M
7 \+ H( k- j  S1 T: g* f
    然后执行转账操作。4 _8 t# T: q% W' `* T

* w( o& V1 n( p2 L    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。
! x) \1 t. `0 l% k3 d. }- r# E4 Q' j- b% C+ V  y0 t+ K& a
    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…
$ Q$ J9 C, L7 Y* h* {$ ?* p# _: Q- e; A1 I7 m$ n4 [* T
    要让交易生效,我们就必须要挖矿,去处理这个块。
7 r+ x3 {2 S/ v6 K3 ^1 d# v( a0 s0 `/ ~8 w# c7 z" |
    启动挖矿。
) d& Q) E' D( g! z; e
* E5 }' e$ N0 Y" R9 E    miner.start(1);admin.sleepBlocks(1);miner.stop();
; p% S9 X$ R/ t/ E3 x6 `
: r# \: t0 i2 l4 c! F, `8 d+ ^    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。. T& {7 A# f9 F$ P6 K0 J
( J/ i, L. o: y4 P
    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看
5 T3 G7 J6 B  `
. E# M' |+ S0 |    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。( J5 P( y; J% m7 t/ Z: w
6 @( Z& o! E0 z5 w, R0 N" b
    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=81 D" [6 j4 _& {8 T% V
7 G) d! {7 C, o1 J0 u' V
    六.查看交易和区块高度8 j9 A2 l; q) M3 b

6 u/ ^! E  i: i: A! M    可使用以下命令查看当前区块8 G; J9 I, H. i8 T" j

# {: \+ P' p3 `- }1 v; @- F    eth.blockNumber
/ B" G/ V, a5 q! ^- w: j  I( q+ }; H0 H+ i) }
    使用以下命令可以通过区块高度查看交易信息9 [. v8 W9 X) i: M7 c4 V; ^+ O

& Z* f  e+ X9 I    eth.getBlock(需要查看的高度)% m. `7 a% C# F( ^6 q) @

9 e7 v7 ^5 |; V1 k% B  O8 W    也可以通过交易hash查看交易记录; R2 r. `( f7 k! M0 r

& g& V6 Z0 W7 U    eth.getTransaction(“交易hash”)4 p$ C0 y" l) N% ]% z5 U8 A4 Q% s

! Y5 `3 m4 v0 S- d0 p! J4 ~    七.连接其他节点
5 L# Y6 Q/ s" J4 V4 @
6 I) ~7 M$ u; H. M: x5 z    为什么要连接别的节点?
  a& g% Q: x7 j" C' w
8 `& X& P# Q$ W5 E    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。
" d. M, h0 y* @9 F' m% |+ C+ r, e$ N+ g3 H6 D2 b7 C1 @
    连接别的节点需要用到admin.addPeer()方法,连接的前提是必须保证网络相通,并且networkid要一致。比如:有两个节点,节点A和节点B,节点A的networkid是1111节点B的networkid是1108,那么这两个节点是连接不了的。想要两个节点之间实现连通networkid必须要一致,假设节点A和节点B的networkid都是1111,如果节点A要连接到节点B,首先还需要知道节点B的enode信息,enode可在JavaScriptconsole中查看到,查看命令为:admin.nodeInfo.enode1 ^' L( F- z9 D9 d' k" l5 a) |* c( E

1 ?8 h' ]% Q' ]5 X- W& @* |, K) {" W* P    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了; F6 j6 V) ^; N8 q8 q
8 x2 h- w4 A( e: a' K9 |
    命令:admin.addPeer("节点B的enode地址")+ b6 Z  u: D8 `" E

. S6 u5 J* B9 v" r! N    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:  E. R/ D9 f! h1 c( E; |4 l/ `* f

, S& M$ Q# ^. E- n3 P    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")& |5 j. J$ }* v7 p
, z+ ?% i! D9 _% \) W# l0 X( V7 x
    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量! d5 X+ J* w6 f( x

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

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4