Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

大叔的爸爸
109 0 0
一.安装geth
! ]- |; T' u. W6 x, _
4 H( ]8 R# }, C/ P5 t8 l    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror
( R  c, G2 p) I, }
/ e, N9 B; H3 r4 X" B* A    一直下一步就行。
: ^( c' T6 t- ?1 q) i) {6 e) R. O
    注意:安装的时候最好不要安装在带有空格的目录. k1 B( i- J' p! o: p3 g
9 R  \4 C9 f5 O7 I) R6 ~& j2 h& t
    二.准备配置文件
4 r4 l' m% i) N" J" ]. k8 W6 D2 @& e+ @# R
    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:3 u! u, Y9 ~& v  i" f% s
- p5 n4 v$ i# X  n+ ]) ~8 z
    解释一下各个参数的意思
4 |4 j% U3 w* h  k
# a, G# O8 _1 K4 ~    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件0 V( Y% e3 ]" X/ f0 m- \. f8 o

+ [  F# u0 _5 P+ L: V+ F  ]5 p    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。) a( B3 w$ ]* B( Y- O  C
6 @! a  j1 E# {: T# |
    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。6 B3 U; A7 q& m7 E

1 m- y: c) c& E. F    -alloc是预置账户的地址和账户预置的以太币数量。
% E% ^$ N: L! N; h3 J0 E" ~% W. {2 O! t/ i7 o5 ]* o
    -Coinbase矿工的账号,这里可以随便填" u! ~. B. _& l
+ A4 K3 v: L" ^. }) o
    -Timestamp设置创世块的时间戳,这里也填0x00就行
9 V1 }& S$ F: d  D# v
2 d0 K. t) O* E! x    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0' G2 f& i) |8 K# V- u6 G: g) u

$ e* c  ^) `4 O  J4 o    -extraData附加信息,相当于个人说明,可以随便填。
2 q$ c$ `0 D6 [( e
4 L( m+ K3 i6 l    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。0 u( `& t8 j& ^. a- J+ ?/ ?) ~

. `. A) s8 q: X  n& E. g    Config是配置文件,必须要写不然会爆一下错误。. N" n: M, N2 ^" ~4 m
' u& F1 O; b% r; p+ ?( p1 g% K" _
    三.写入创世块; u( w+ ^0 M' G& \

+ T& c1 o2 Z6 ]/ W    配置好以后执行以下命令写入创世块, U$ |' I8 u% \6 H6 p: a# W

4 h/ \1 E8 o' m7 L' @, f( W    geth--datadirtestinitgenesis.json
0 [" S* q* k$ ]" y0 k
7 a6 T2 a% X/ b    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。5 F- x; F3 k, ~) o# |' T
4 [5 c+ a2 \' Y  k+ W
    创建成功回显是这样的
' N% m9 t( Q  m; l! g% }) O5 N) _% y5 S. m; c6 a' |
    三.写入创世块4 e5 T3 F! q% B0 M" a' l) h
( B; p. E$ g; ^, }. y
    配置好以后执行以下命令写入创世块
" X, O0 `/ X1 Y! A* P, Y. j$ l% _  U9 K* F$ b/ v
    geth--datadirtestinitgenesis.json
7 r0 e8 _! g" s- f$ A+ o4 P  s
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
4 ]- U7 X' y% f5 j! Z- [  ~$ a" M2 Y  i" B& i7 E$ q  \% x/ s8 k
    创建成功回显是这样的
: p7 ]8 T5 }6 i; F  W, h1 N% f$ O! k) n6 S. d* E9 v
    然后执行一下面命令启动私链。* G' j% D: r/ ?( s) m1 ~% f8 u

1 f0 h9 o3 I& W6 N$ }    geth--datadirtest--networkid1111--nodiscoverconsole
  k. x! @4 h4 r% Y" ^- J1 y
/ y8 l5 U5 K" x5 ]    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点
) o. @8 Z1 m) O/ {9 K' t6 c! y) C
    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空3 t1 T: z8 `& r( h0 ]. R

$ O  z0 H1 k( L* {8 l% W9 l    接下来我们创建两个密码为123456账户。
1 B: w# Z7 ]2 U) b) l) P* Y, D- Y9 e1 `9 A5 C5 `
    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()
6 l4 q$ m7 t  F1 k$ C
  p7 c4 F1 I1 Q! n    注意:此命令区分大小写。
, |9 j' w% e0 ^) J; q2 D; K1 ]  T& N( N7 B
. P% \9 X3 j% ?! D4 i3 M  @0 `    添加过后再查看就能看到我们刚刚创建的账户了- Y' l. ~/ X( [! G5 f
4 @/ f6 b" j$ F; }5 s  `9 l3 A
    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0% A2 O' W, x# p+ i
* I% l5 r& L0 [- E- o
    四、开始挖矿2 G9 t7 K# W$ G, J- n
6 y& k- x7 w; R, k
    使用miner.start()命令来启动挖矿。! x* ]0 J$ V- [, n- \, f4 S
. u1 w! S7 E0 y
    start()里面可设置线程,如:miner.start(5)表示五线程。
( H0 n9 s) L7 I9 z. _( r3 z0 J, j+ E7 Y$ l' P" |
    运行以后会被挖矿信息刷屏。: ~2 q) ^# h  t' t& `
$ G9 W+ T& {4 I/ C# m7 s1 K& w
    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。' a% L% a5 \% X6 Q0 C
$ P4 V4 t( _! s$ @
    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的
& P. X, l) l# Q) A' h- n
! p/ a+ q! `4 e0 Q0 F    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。
5 t- a+ [* a" b: r/ S1 I, g
2 Q  C( O; U' H1 k- G* I    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
" a1 m* k7 z# m; s" b6 v* W$ S8 Q- ^5 y; ^5 k8 M# W
    使用eth.coinbase查看账户地址8 ^1 w& M  F7 E; I

$ l0 l" y: h5 w# U* z6 ^3 e    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。# ~+ z/ d% M" T2 u" ], K
3 i+ N$ A/ c; Z! ]( V
    我们切换为0因为这个账户有钱方便做测试8 H) i) [* N0 z1 _& |
' q; F0 ^$ F; C
    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。
( k# F( D" S, V8 O! ~% O
( [5 r  A* ~5 C# x7 B0 Y# n    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
5 P! m. b8 `& x" _
0 t7 z+ a! g' [& ~+ C$ i    五.发送交易
+ b, C; p" i+ _
) x9 P% ~) Y! ^6 d8 Y    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。, G* A1 }! y3 A: ~' @, ~+ d

: [; s  c1 i* P% f9 {! j- d0 \% a    发送一笔交易,从账户0中转移2个以太币到账户1中% y) }  Q$ K# o+ B

5 r+ ]0 t! b& \" s    >amount=web3.toWei(2,'ether')
/ o: ?8 L# x6 ^4 J% _0 y- C7 _% h" Y" u' k% o; `9 ~
    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}), w, f6 A* _# d  i

( P. N# H% ]+ J- ^& v    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount
2 }! ?5 v# m* z8 l0 o3 u) g7 ~
    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。
+ V' l2 b" L9 W- ?6 b' }$ A
# P3 s! Z5 N: D0 c+ J8 p    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。
. i9 Q" y6 L& o  L0 g5 H; j' B
    personal.unlockAccount(eth.accounts[0])
( h2 [0 m' R: v- `# J* `0 J2 U( `5 ?$ q9 [7 G/ X
    然后执行转账操作。
& O; Z0 M& h! p# F! H/ ^( K
- t9 ~) g! b4 l$ \5 H; o% o2 F    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。& i% V' Y5 C" @( P

' C2 W6 F! |& d    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…
: C0 O! @+ a5 c7 |8 q
( u; S8 c8 L/ D& R6 H: F& J    要让交易生效,我们就必须要挖矿,去处理这个块。
' y& L- M& D7 O+ T: k: P8 V% _' B- h! g6 K
    启动挖矿。
) O7 c+ B# Z' y8 ?0 R
" |) `+ \5 \. h( N' C    miner.start(1);admin.sleepBlocks(1);miner.stop();; O# l( g3 m' q

- O  f. g! K) e, `# j$ z$ j+ G    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。" h( d9 I9 a6 R) q9 @/ r, v* |

) M/ R* |3 T0 w& `; c    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看
" q& q$ F# K( \1 _5 o6 P' l7 C) e5 W4 H6 U
    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。
. W/ A& F6 e8 ~' Y' o* g) ?, E
    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8
/ \# x' d8 W+ i- b; z5 x) u
0 p0 T8 R/ n) F) g    六.查看交易和区块高度
% P$ `) k6 H% Y
5 E& D& i' B! T6 W* K) o/ O    可使用以下命令查看当前区块1 l' O% L; l+ c4 s3 A& h
: A& V1 i  O5 V9 H
    eth.blockNumber% Y2 T. _1 |- G# m' _+ Z  ~
' y9 R8 a; E8 w% j6 y* N
    使用以下命令可以通过区块高度查看交易信息8 {/ `$ W( k* g# ]

9 U( a8 V3 J" C( ]+ M    eth.getBlock(需要查看的高度)" z- f( _+ e& E2 p' c; I& G: Y
% Z( @& H7 M* @$ M% N9 O
    也可以通过交易hash查看交易记录
: U  X- }" _9 J, V. `
4 j' V- ?( r1 a) b+ A4 f    eth.getTransaction(“交易hash”)) g9 t: A6 c& Y: n& U: o) f
$ {- B" U9 a) W" H% c! }
    七.连接其他节点
: f* L* U" N2 O, _& f" c; t) x3 p8 h2 l7 D6 @+ l
    为什么要连接别的节点?
5 ~- @& D! V1 o0 @4 N6 Y7 e" F2 ]3 u" l; p' C% {8 M" a% [2 f
    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。6 W, P  y4 h& t, |) z, H3 ~: e

0 ^" [$ [: f" }2 c9 c    连接别的节点需要用到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
$ r5 |! d7 @" ?- G. p$ r4 g& l3 [2 l+ M$ n# j6 i8 \  l# u
    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了8 U; H4 j8 n! m% I, d9 T

' i( J' E  Q; U9 d( y    命令:admin.addPeer("节点B的enode地址")
, {1 |* Q+ y, P; x  Y: I. Y& `' k
    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:) o1 P  T3 e: H4 Q

! F( x2 Y. p. w5 x& `    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")
0 t5 _, j+ {4 M: }$ M! I
3 v; V7 v( r- Z+ w( z% c  {    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量. g, l/ t3 }( W- D+ O
- a5 {$ Q' v2 y! e2 a* g6 T$ `
    可以看到节点B已经同步了区块和交易记录
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4