Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

大叔的爸爸
107 0 0
一.安装geth) v, b$ q! ?$ j/ ?" @

1 p; |6 U+ Q5 U( r  D5 Z9 V    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror; {, Q5 k3 h' Y# Q, b( e/ m

) Q- a- I3 }4 P9 C/ L% z: p    一直下一步就行。
* ?9 d7 H7 G0 W+ [0 I% s2 m0 v# Z! y1 d& g- K+ W
    注意:安装的时候最好不要安装在带有空格的目录# C- R) u) J8 B2 p  @7 e

: W6 f1 Y3 `5 R2 p9 ?6 z    二.准备配置文件
* N) b- |' b9 P/ N
; r: R+ @3 p7 L" y9 O, t    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:; t6 j# r9 c; I& E8 F  s

; W* i% J- V) e8 A2 s7 y    解释一下各个参数的意思
4 L. t4 q$ ^. c# N) t# v( n% B9 ~, G# A) z. F" I% x( w* A
    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件1 R+ [" Z7 j3 {5 }( P1 F# ?9 V

1 r& O0 @' |0 j; ]3 Y    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。: f/ [  U2 i+ a4 P/ t: X" K& Q

6 O; E1 \! f9 N- W/ B7 W# [    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。2 z9 ]% g2 z; C$ G

0 @: b7 i! ]9 W4 v- `9 ~0 [    -alloc是预置账户的地址和账户预置的以太币数量。, v% m3 G- l! i: A0 y6 l. D% |7 ~0 i  R
7 W8 U5 n+ l+ l
    -Coinbase矿工的账号,这里可以随便填
  b7 \$ T& x8 N2 R9 C& a  V
( I1 _( B9 U0 S3 H  k    -Timestamp设置创世块的时间戳,这里也填0x00就行* _5 {) e: L! c# [/ u. e9 R% B
9 q5 r+ v: X- ^9 h' O
    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0. Y# v- o1 j( c

& E  S4 B* n) X0 B9 a    -extraData附加信息,相当于个人说明,可以随便填。
, b/ c. r4 d( Z& d" ?) d; y) g  G
4 n" m2 r) Z( s3 R8 E  q% X5 m    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。
; p+ H; u& |. [6 M8 m; L6 k) ^- \8 n+ x& A3 k" y
    Config是配置文件,必须要写不然会爆一下错误。
" C6 a3 n$ {2 }9 H2 H5 ?5 B4 }+ U
; I1 I+ ]; ^( n4 M: @$ y    三.写入创世块
& a+ z: `5 V% p& H! q& m9 w* j6 l! [/ t$ A
    配置好以后执行以下命令写入创世块1 m/ r# X! s! o- K0 Y; N1 h0 O

; c1 u, S8 Z+ [9 G    geth--datadirtestinitgenesis.json0 l+ i9 C! e+ R2 W! R" [/ w
) |* k7 U, U/ t/ @& R& l
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。  s5 M- N; f4 D, H2 z2 w1 s
( @) H5 o8 L6 a1 E
    创建成功回显是这样的
( p  O/ q& H0 ^
$ C3 m) K$ ?. }8 o, D4 n+ F    三.写入创世块
9 Q+ }/ J- v2 a0 X; e7 j) c9 c" A( i0 j  @, b" t& Q& K
    配置好以后执行以下命令写入创世块
* C) H- a* X9 q. C* U; q) f* c
0 Y# g, [! k* j    geth--datadirtestinitgenesis.json; K% f2 D. U$ g# i0 Z' H
7 K9 ]. w. k. E2 _7 g
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。1 V4 v* M5 @6 K( W2 r' M) ]
) Q# e8 a' T: s4 Q6 F3 E
    创建成功回显是这样的# j$ e. V7 e2 V

6 ^  d* P" z, T( Q& b0 O    然后执行一下面命令启动私链。; D) M9 [0 E" U. t0 i* u+ T
* ]: U& W4 X" \& K4 \
    geth--datadirtest--networkid1111--nodiscoverconsole
) I4 v# v; {+ X9 v" E( W: v/ {3 B  Y& M
    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点) m- W4 n; b2 ~( \9 ~
9 }% D  o8 Y5 M% _( H( P2 J
    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空
" H  Y  q2 e" |. T. M4 i3 a1 S4 `- e4 V6 [4 H: O
    接下来我们创建两个密码为123456账户。4 f2 T3 F: ^* L1 t

6 h& w6 w- I" U2 g* }: p    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()
- I7 u6 w: U3 F4 P2 W5 o, v: v
" R5 w, P- \8 `- A- g" G/ G3 l    注意:此命令区分大小写。- v7 |  x* j! E( j3 U; C. M% M7 c+ M
' ^8 Z& c* o/ p$ a; G# n
    添加过后再查看就能看到我们刚刚创建的账户了# F- L7 e/ h# c- i, Q- Y2 \, a! C3 i5 m

  T6 r' N5 O# [- Z    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为03 K* |+ _( z! u  }! T

6 D( g: Q& O6 i/ u- }- D    四、开始挖矿
- B- F: ?/ G% W8 ]+ S3 ?
, G6 ?* S- G) T& X- q2 r$ {    使用miner.start()命令来启动挖矿。
" F* V. O4 m, W! Z0 u
! j2 r: K; X0 ]  M7 s' `+ h  p1 u    start()里面可设置线程,如:miner.start(5)表示五线程。4 O$ _5 I# C: l* p
( `* w8 T/ t$ F' f% X4 Q8 a
    运行以后会被挖矿信息刷屏。
# {; x3 H( l; n$ l  {9 e
; J. V% T2 {9 |" Z    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。
# S( g. ~$ H. _1 h; O) l
6 h$ f4 M" @3 u    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的6 I' Y; I/ x. K- S/ k- N+ t  z7 n0 A
* v, M* a8 j9 k; W
    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。2 R7 w2 P4 t+ h+ S/ b! V7 R. n

# x5 w' ~% e, l/ T7 t    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
4 l: ]9 ^( q) d& U$ w5 H0 y" B6 V) ~4 @7 G
    使用eth.coinbase查看账户地址
$ f6 {7 n6 b& A7 \) y0 `
! H" N3 w5 A/ e7 W$ k, O0 S/ b    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。
& J. ~9 m6 a' u% L; F) q, Q
- S; O3 a6 j" [" C- z6 X    我们切换为0因为这个账户有钱方便做测试0 R4 C& @* p/ `, @
& ?- _, i' n3 s- K
    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。
* D2 \, L$ F+ q1 V; U; T/ R
6 D% w0 Y+ E* s% e$ n' ~' x    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
( i! M. a. I& T* q$ b! q8 B" m' {0 i. F" i
    五.发送交易
1 P7 V6 C# _$ ^; x/ J& |' x
" I) s. Y# G! U/ O9 }3 P! K8 y! f    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。/ Z' E5 Y" g; F) G: `3 v6 C% I
1 Y1 s3 H/ j, T3 i( L4 f* i
    发送一笔交易,从账户0中转移2个以太币到账户1中! i  f' T& y. g' ^: @+ i
0 R) o) n- H+ E6 M$ v4 I5 p
    >amount=web3.toWei(2,'ether')* f) F4 ~+ ^  h

, @. v# j7 j8 ?" a    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}). Z! U. g+ ], a! t+ x6 u

, r( B1 v" E2 Q* H5 O    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount
  d0 L8 _: L5 X' Z5 d
7 [- X* v7 }; P6 [, A    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。
4 G) H# F. I& ~
, X  f" }$ c7 K/ C( X6 l0 I    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。$ A% y9 }- |" h$ ~$ f  f
" V2 _* W2 x& F. x
    personal.unlockAccount(eth.accounts[0])( _  G- D# a5 n
! B% b8 i& A1 l+ d0 f
    然后执行转账操作。( d$ l$ w' x  B2 B+ o* [# O

7 x( J: f) I# m    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。
& C5 N/ v( B& E& ~; J% L, ?( G7 x3 ~- ?7 X" Y1 f& J- O# _/ f. H: }! k
    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…
& ?7 y8 k" t( g6 H" d1 _( c2 A; [( `1 a7 z
    要让交易生效,我们就必须要挖矿,去处理这个块。* z# p0 i) H3 a6 @. `& W- k
, J& A' e4 Q. a
    启动挖矿。5 ?/ q% M3 O1 ^: {( E

) s8 k/ @( _' U" l/ x' y8 A    miner.start(1);admin.sleepBlocks(1);miner.stop();, P8 G! C! ~  ^4 E# X

& z& s5 O; |6 n0 M    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。
- ?& J4 B. \6 a5 h1 Q% Q- c
. h( l  g) U1 Z6 ^9 V    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看" J! C, T( X4 D; X6 d% M% ]) L$ B

3 J2 B, f1 S/ u' L+ [    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。
% ~6 D& O2 c8 ]# U8 a) N0 }! ^* b" C* [9 u1 S- s- X4 O
    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8% O7 \2 b' g& ^$ ?0 \/ q- a8 v; P9 e3 R
5 C% P8 N: Y" r2 Z( e9 {. J, G
    六.查看交易和区块高度
* u# y8 R. o6 U$ L0 q5 Z; M% R) S; H
    可使用以下命令查看当前区块* N# Q% l" T- P+ H2 S' R; ~4 P

5 W6 @5 Y- a( [" a: {8 R7 Y    eth.blockNumber% \& s9 r& X% ]6 K8 C

2 G) x9 Y( [1 S$ O3 B    使用以下命令可以通过区块高度查看交易信息% P5 n* N! ~/ J) s/ ~5 t) n

; B% [: C6 g3 a0 @8 v& p$ P    eth.getBlock(需要查看的高度)
) @3 s- z; G% I7 M
3 A9 \) s. q8 e+ ~* w- Z" o    也可以通过交易hash查看交易记录) G8 p7 A/ d3 g
* r) q# V' Y  k; g" J9 t5 b
    eth.getTransaction(“交易hash”)
1 l: m" l) c' i( ~: s
  e) ]7 v% F* B/ _    七.连接其他节点8 g- [; G' g! a) `5 n
  D; }' T7 G- L( N$ E0 k  W
    为什么要连接别的节点?* w2 v, P9 _* q' X
, _/ y7 N6 Q+ F
    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。
9 ?( Q4 f, R, T' P6 }3 m
( B' x1 V: y! T/ T4 A    连接别的节点需要用到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
9 Q, s: @0 l6 B1 C7 |# V7 i& p) e' K; y9 S! U
    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了$ I* V8 f4 E  V& \' x& Q, h# I0 @1 b

* e+ F: L. v; X+ ^    命令:admin.addPeer("节点B的enode地址")3 K6 J: i1 K/ f. o

) `! Z/ c, ~, w! h3 E    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:
/ s1 b- [7 T' L3 S
( e2 [. p# c9 t$ T4 h9 e0 L: l    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")
  w2 b9 [* l# `9 J: W! @! B  T9 j. a$ J
    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量
3 e5 |4 @7 ^- f: P. j6 G/ a" J0 L3 p6 k$ G
    可以看到节点B已经同步了区块和交易记录
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4