Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

大叔的爸爸
155 0 0
一.安装geth
" h: Y- q+ ?6 `2 p5 N2 t9 @& K) A, A
    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror4 @1 s" ]8 O5 k5 @7 l7 Y' A
2 p# q- y3 M  q" }7 |  J. V
    一直下一步就行。! w4 B" ?$ s6 p! R% t; f, Z5 L

! y6 c, y+ n: o    注意:安装的时候最好不要安装在带有空格的目录
" o& e  i4 E7 R6 h4 w
& U% r5 U0 r- z    二.准备配置文件
, }$ \$ F( |. n* M% e2 z
8 K4 D+ T+ L. A( E& E) F    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:
. D. @6 U. m1 E! o. T5 A
( M9 F) A7 K0 o) x* W    解释一下各个参数的意思1 R; V( \) n% X$ H9 M- B2 f; t2 b

" Q( ~* G5 h/ p    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件
3 v+ S1 _$ @9 \" ?0 R* _4 |  w$ W; R6 {. ^+ d( Y; \
    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。
/ H% [; _. B# u$ ?
* k5 P6 G( Y5 E* ?    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。. ^0 r# X% |1 I

4 o/ j# d: O- z% h) M    -alloc是预置账户的地址和账户预置的以太币数量。
% X. [1 o8 {6 D: i5 k
) j6 o8 I$ l& m3 ]    -Coinbase矿工的账号,这里可以随便填
; g+ c# H2 @6 M( p4 {; e
) M& K/ j2 T  c9 n    -Timestamp设置创世块的时间戳,这里也填0x00就行" k' H+ [( l8 \3 @( b

4 k* D* ]8 }# J3 @6 `8 m' X    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0
2 r  I) z: L- b+ }; o5 N% f$ D
5 D+ A0 ?* z" r5 }8 q# J/ k    -extraData附加信息,相当于个人说明,可以随便填。0 l  U, [  m" ?# v" ]/ |! m
, B% g- h- ^$ A, F2 U
    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。: Y" H. u8 z* ]1 F: M, ]

1 L4 V5 ]# i" Q1 z  [    Config是配置文件,必须要写不然会爆一下错误。
1 U, [, e( ]! ?/ ^4 I. Y4 L' [5 t7 p! F; y( o, N/ v( W) M7 a  X
    三.写入创世块
: ^9 [& {2 d4 D) \6 C7 ^; O
2 h& s. k' E* ~% ^    配置好以后执行以下命令写入创世块
- @1 T" k. u2 p! T1 W8 {" p" ]9 i( f$ T9 `
    geth--datadirtestinitgenesis.json1 c5 ?0 {/ B4 Z$ _3 Q) k3 c
; ?+ @7 x( g  e, y5 q
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。% V# N; I0 G/ m& y5 I

& i9 c9 C1 Z! c- Q  S2 o" _7 i    创建成功回显是这样的
7 K9 t) w& y) P
5 a- j5 z7 Y% e7 l- O7 n    三.写入创世块
! F5 S+ U/ K1 K+ ^+ t) q6 \% p" s* w
    配置好以后执行以下命令写入创世块7 {7 B  \7 ?* F' [2 B

" F* P) ?/ L3 Y0 e  n    geth--datadirtestinitgenesis.json
5 C3 S# |' Q2 k% Y" }& a( u5 S2 F8 g: e) Y7 m$ d2 \- ?
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
% e! H3 ?0 j! v* t: \0 b! C7 C+ v
, ~. v+ K: z/ d$ |) k  c& b+ \    创建成功回显是这样的9 I6 U( ?; t3 M) a: K+ |3 R- E

3 H- J$ C) m! Q8 F) |  @    然后执行一下面命令启动私链。) @( t8 [2 Y, |6 U4 G3 S/ f
: v- X: B) O5 m9 o& F5 ~1 \" Y; t
    geth--datadirtest--networkid1111--nodiscoverconsole7 G  l; t" X5 ]& \
0 ?7 S8 \5 @8 Y, C: t( g
    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点
% m# x& s& J! r% v9 O* q8 ^) V1 p3 g
    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空. ?6 K- j& V) ~( V

2 l' A% y% h$ p) X" y2 K6 h3 j    接下来我们创建两个密码为123456账户。. s6 P& t9 O/ v* D6 C

! ?% k' V: x, M    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()1 V& q# l5 E! W: G

0 D+ b* w! r& o4 [$ A2 v  u8 O    注意:此命令区分大小写。. D; h0 t  A/ Q. I& d& m* x# t/ M
! {, h7 Y" ~2 V( o1 l0 f
    添加过后再查看就能看到我们刚刚创建的账户了
/ B7 _) ~/ V& j# h5 m
! t' j" T5 l* l2 u' t& }/ n7 _7 W    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0
" M0 z5 X- X: h2 u0 R% [5 W# K7 L
    四、开始挖矿% G# \, e6 A* j# p" [: a! b- U
" U2 I) o" v: K2 b7 c4 `2 ?
    使用miner.start()命令来启动挖矿。" d3 w% x* y+ a( h
  C7 T8 ?0 T2 s3 b- N9 t( ~' O
    start()里面可设置线程,如:miner.start(5)表示五线程。; S2 O. V1 @* X* y

: i7 D) T" Y4 l# J3 Y. Y5 N* G+ l( c    运行以后会被挖矿信息刷屏。8 ]  P& |* a% E- ^4 v( R6 c1 {, C

- F2 _! X. S# j+ P+ w2 g' c; C    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。
* P5 F+ @2 ~5 V' {+ a0 N; j6 P& x0 G9 o
    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的1 C& Z" {# p1 c/ J3 q: Z

9 {/ u$ r0 W; G3 i! d! |    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。
, i9 H2 L0 Z  `: L* m6 x/ b, Y5 O3 F2 u7 F: P
    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
$ o' z! [3 {0 L& M3 N3 j0 M& `. B, E( l, M, z: v7 l1 P
    使用eth.coinbase查看账户地址
( s9 R+ X: K" M; |2 C
& K1 }4 r% k. g; t# Y# D: s    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。6 y9 [, X3 i/ G) C

6 N0 H& r$ k& ~4 V6 u/ U    我们切换为0因为这个账户有钱方便做测试* C) E8 ^% u+ D* Y7 i9 |% ~

# m1 A6 D) r. Q  d2 R  u  e1 H    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。
# D( f3 w7 u, |% ~8 P
7 H; R/ o' X. a2 v' Y8 p' o* d6 C    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
5 I! S2 @+ Z; S* }7 X
9 V! d% s1 A. b& S    五.发送交易
$ y  c2 m. [, c# s' P
6 r! v) p1 N9 {9 J% V. ?    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。
5 ^9 x: n5 ]5 h& c/ N: k4 r/ P! I( h# H/ X; n1 n4 X; B" @
    发送一笔交易,从账户0中转移2个以太币到账户1中
$ |3 X3 U' S) _* ]
7 d3 V9 |5 k/ S3 G    >amount=web3.toWei(2,'ether')$ Q- r3 K8 U$ Z
: q" o" l+ K2 R: h
    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})/ q+ @8 v& Q2 c

: H) f# S2 V* F! B    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount
& R/ ?; b# B9 A8 J5 w( u0 G8 I% Z0 f" ^% T
    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。
2 X( F- C! Z9 f! r4 u- a5 W' x) `& T8 F. r9 z9 {
    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。
2 ]" K. E1 g& |+ C' ^- y1 M* `) ?+ i
    personal.unlockAccount(eth.accounts[0])6 \  B: B& R$ w- e! l' m
8 v+ B: Y7 y9 `( K, o* F# c7 T# v
    然后执行转账操作。7 p2 Z7 K2 L. _# O
- c0 Z9 i; A0 C
    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。7 G! {: `( ?5 b4 u- w1 Q
, R3 F) P8 f; L+ Q; H/ W
    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…& E8 [* w& _, B3 D( }9 q. _1 T

9 A3 {9 U, o0 u& K1 @+ p    要让交易生效,我们就必须要挖矿,去处理这个块。
- ]6 B1 R: m' T! k& T
9 w- D) f9 B4 C- r6 Y/ w  o    启动挖矿。
8 l5 b3 Q( \- ]; g& ~; \) T! m2 c* ^9 ^
    miner.start(1);admin.sleepBlocks(1);miner.stop();! X" J/ v+ ?2 _; q7 a1 M9 ^* |

% q- o- W% B! B3 M8 L    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。
8 X4 c; j9 f* O5 q$ A7 C0 w$ @1 d
' U7 K1 r# ]% `1 }/ M    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看
4 w7 o; \8 s0 w1 }) D4 Q  [
# c, |7 G& L* Y0 a: i    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。
" P! G! F7 y! a. @
$ `% {. {) {2 u! V6 W$ g7 ?- y    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8
' f, B0 {' U3 G0 d0 T3 L8 H: w
5 z3 T9 M( M" R% j    六.查看交易和区块高度
( y/ X) I6 c4 [/ P, n2 z7 p, }+ B6 J/ v# R" v2 F! ?9 d
    可使用以下命令查看当前区块) a/ Z/ _7 k  g% c. d$ l% \4 p& H

* `/ @& o) b9 y" T& d9 A    eth.blockNumber
$ R  r  R" h- _& Q* p
& V8 @6 }6 }- w2 j    使用以下命令可以通过区块高度查看交易信息
! z! ]" L+ }- \6 g' y9 _8 M) @# c. T& @8 m# {; B$ ?
    eth.getBlock(需要查看的高度)
1 A! `4 x2 \  v8 t8 Z4 o2 ~7 k2 h% q0 q& X
    也可以通过交易hash查看交易记录9 l3 T0 r  c( A
0 d3 F4 N* z' L+ S  u. D% y
    eth.getTransaction(“交易hash”)2 [' f% [: g  z" X
- c- L2 Z4 W$ M0 Q& V
    七.连接其他节点
0 \! u. C: a$ k9 m7 l% m. ~* e9 f% q4 D. ~: G5 R: R3 @8 O+ f  T
    为什么要连接别的节点?
5 G6 n: C* F9 [+ N4 ]
; V9 v8 \& l& a    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。
# t" p6 x! D. p4 }
- x. q& [: `3 u; J8 m0 b$ A* T+ b    连接别的节点需要用到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
: X0 n4 }! x% J8 _4 g2 a. V/ m3 j. u
    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了
' Z/ h) r2 G1 u% y  `
2 T& i( [( p& w" a% q    命令:admin.addPeer("节点B的enode地址")
3 e2 j0 F: L! O3 a' s+ D$ E
, Y. h7 `" O# x3 Y    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:
' P5 V* S6 g2 ]: D, y, I0 D' I6 e2 @$ v9 {7 g! `: [5 O+ J7 H
    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")" O9 z% r  e' J  [/ D+ Z, u6 a

3 A/ l/ W9 B6 e$ D) S    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量' Q+ Q7 I5 ?4 y. K
4 P# g4 E8 r; y
    可以看到节点B已经同步了区块和交易记录
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4