Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

大叔的爸爸
106 0 0
一.安装geth7 o' X$ {: ~, A& ]: }5 B

' f+ }. A7 |7 ~1 T    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror
8 E1 f& X) r' j- o! @' A" U/ U% W1 ]- r; m
    一直下一步就行。2 y, w! L! S' k4 O( L8 r6 `
  S4 X4 T9 a  _3 q' N6 s% E6 V0 I
    注意:安装的时候最好不要安装在带有空格的目录" {4 }' Z2 c0 p8 P/ |6 E" A

% i. U( n' \( p. D, g    二.准备配置文件
: w3 B2 K, W$ a+ }. T6 A( \
& `$ S' d- d' q! o    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:) y. }  G" O! J8 U

6 G. ?1 c) ^, p8 J6 D1 |4 z) }    解释一下各个参数的意思
, w- n- ?$ e/ f6 Q) ?6 |# E# ^7 v( ?
/ z9 z% r# k& H' b) P1 K7 ?9 v    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件
) G+ b0 S$ U' {$ V' [, d8 Q1 D% R# Q6 @, t
    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。
( n; v) w# w' E+ m2 w( c+ x
* B' \3 l1 z2 u( @9 o, u4 @+ ^    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。
" w9 M9 a9 x2 d; n( ?/ {. ~$ D0 d
1 [5 ^, x+ |, @, n+ b5 T$ ?( |    -alloc是预置账户的地址和账户预置的以太币数量。
0 I# K8 j* i1 Y! R8 f; q( m2 ^! m' E/ ~* g" ]" V
    -Coinbase矿工的账号,这里可以随便填: m+ z4 J6 y/ O# N( c9 W- V% S

# w5 J; y( |; i    -Timestamp设置创世块的时间戳,这里也填0x00就行3 {5 P# i- k  Y

" \, a% S; z9 P8 w: g7 W    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填07 z3 s2 ^$ W. Y3 E3 @$ u

2 H' Y. A3 k: X3 j$ u, H  `    -extraData附加信息,相当于个人说明,可以随便填。; U8 ~1 n% U0 Y+ m* U5 i7 C9 c% k
3 L6 O, _) j5 Y! g! K; y+ T
    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。0 o; f! z. _1 n$ P: a2 o1 |( ?7 w

9 \" z' j9 ^5 \! q! M8 t' Y    Config是配置文件,必须要写不然会爆一下错误。
# h" |: i+ ?( f7 T) v  C9 y' ]" M4 h; g2 |  b
    三.写入创世块
- s+ ]" }9 p+ c6 x; `3 c9 f7 s+ j  C1 C( e
    配置好以后执行以下命令写入创世块% \$ ^* R$ Y& H) A' q) S8 _7 H
, Q' \3 a# j9 b7 b2 N
    geth--datadirtestinitgenesis.json+ O6 d$ ^  ~0 J0 Z$ [/ b
' u- h+ M: ^0 c( k) V  u  `2 m! e
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
# t+ V5 @1 {+ l* l% s* m! G1 i
' h. h+ f  ]' T0 {; T+ k    创建成功回显是这样的
) U7 y% J0 _; \: P1 Q0 q: t% X; O8 L  m4 X. z+ v
    三.写入创世块
, g3 J  f: F- p6 Q' l
. w/ b' l! J9 x- Q+ N2 a    配置好以后执行以下命令写入创世块+ S9 P! h6 D  G0 x- ^) G2 M

3 u! @, `* Q" p5 Z1 p* j% v5 y    geth--datadirtestinitgenesis.json+ d+ ]& S! G* Z! T! h* y4 j
! [0 j3 H' y, X  W' `
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。: T! J0 d3 o0 ~' S! G- z9 q
4 ~& X) T3 {) h3 Q
    创建成功回显是这样的
5 d, x( s6 e( Y
% K, W' E) x5 t& Q) D    然后执行一下面命令启动私链。& K- W3 n  s8 G  m6 Y( A) v

# T, I0 n/ v! A4 y! @    geth--datadirtest--networkid1111--nodiscoverconsole
# H- t8 {* N/ @+ f5 r; ?# S9 e  F2 q" M( g, \1 d
    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点, v% f; f9 L9 g: q( G* B
; M& {  s/ X4 B
    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空
8 U: ^# }8 \5 ~3 e7 s5 t2 h: w8 `+ u& ?5 |) t+ u' G
    接下来我们创建两个密码为123456账户。
/ D8 l  J4 }, @6 L
/ s: P; |- Y3 H3 v% Q7 l% q) o7 A    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()
9 p4 O% b! O! s  w; O! |" {6 t
# Y2 [* m  V+ f+ U4 r6 w4 T    注意:此命令区分大小写。
5 H+ K; g" `4 h
9 M- n& g8 [0 S+ z2 d. L0 z    添加过后再查看就能看到我们刚刚创建的账户了. V" W# N. P( [# j& O& |3 _

: f% {. J( q0 j4 ]9 `! C    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0+ {: X4 u% a- g2 c: E) k& Y: r8 B% ?
) F( F1 k) G& t6 @2 [$ L" Y' a
    四、开始挖矿' M* x* v) `" M6 I" f- c. P( M$ f
$ L: ~2 @8 I: o1 X; ]& K) J
    使用miner.start()命令来启动挖矿。8 _! F! R: u$ i- X

( Z' o0 B; O( {2 |; O( Z    start()里面可设置线程,如:miner.start(5)表示五线程。: t' B6 [; p$ j/ r# B+ ]+ ^' b2 g- x4 Z

' T# B5 l5 J0 i' i! e: k- i" a    运行以后会被挖矿信息刷屏。2 s$ T, J% ?. o. Z$ N
8 @% a8 S' m8 V' r
    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。8 ]+ o* G. @6 B) q
7 I! F( o+ o& B+ P& q! q1 `6 T7 j0 E
    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的
1 Z+ m( V' R0 n9 J: M9 ^
/ @/ o" W3 h& G# n$ y+ q9 j    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。
1 v" t' l3 t; D5 k/ z% _% j( a( k" m; `4 Z5 T+ \8 X) Q/ X
    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
1 I) o* p9 t* {! Y  s
: {8 Q6 P; `( C- n. e2 Z% f    使用eth.coinbase查看账户地址- K6 t: w/ q2 Z, z
/ T* E* m: O% W5 y
    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。3 e7 U$ {' ?  l

* T" x8 M' m/ O    我们切换为0因为这个账户有钱方便做测试
/ Y( v6 y) X+ b# x' q5 j( _
4 k6 r1 x* @; J5 ?% Z    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。
( Q, g( P1 R$ B4 J7 [, A% u* D  [- S* |5 g, j
    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')! |7 O8 `" q3 Y# A
0 E! |3 R. ~8 s! h: o
    五.发送交易
+ e5 G( `# k! _2 R# ^+ s! ~6 n$ ^$ p/ ?) N: D' b
    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。
; d8 ?6 t" `& b! y2 @9 o) ^
+ U( V+ l2 F& ]$ R    发送一笔交易,从账户0中转移2个以太币到账户1中
% S) C' w, ?7 g2 p1 N
+ _0 u/ y9 X2 R: x5 u* s: }7 _* U    >amount=web3.toWei(2,'ether')" A; M5 J; R% O# p8 U

, J+ j6 G1 M6 f9 o    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
* a; H8 W, F. p& U5 A# {
, M/ N) i  u, R1 d! p    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount
/ u# r$ z" n) |2 L8 `- g' y+ }$ b7 @" q1 }+ G
    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。
, Z7 i/ A3 I( _, t5 \( C$ ?+ e8 P/ @: l. ~7 A- k+ k7 v1 |
    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。8 Q8 Q$ r# d) V3 m$ G8 B, d
; S4 |9 k' D$ R
    personal.unlockAccount(eth.accounts[0])" F1 b* Y( X* n( e- C$ C0 h

& l! D* t* a8 A7 {  U& {& _8 ^3 K7 S  h    然后执行转账操作。
0 y# s7 V1 u" x$ s! L  L9 k/ H. M) F' y! q
# y3 f5 M5 [: `# O' u3 ~/ s7 y    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。; }& C0 c1 s1 J

' O& G- Z4 V: ?( f  p! n4 R8 T    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…
9 ?- H" Y4 z/ Z( ]2 ~4 ^1 L
7 u3 t3 [: B0 p$ @0 q* c6 C9 ~    要让交易生效,我们就必须要挖矿,去处理这个块。
6 |, P9 {' x8 B3 D, f* _& C
* q7 N$ Z/ P" c; e    启动挖矿。& O: l# `1 Z) C0 P6 b7 ~/ ]
! X+ w. d' x/ S0 M9 I* U4 M
    miner.start(1);admin.sleepBlocks(1);miner.stop();
5 v* X6 X' s' n& |0 Y) z
4 T( q+ v* n, K    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。
" h  W$ A1 ]$ Z: r" F
1 A" U. K% Q' H4 M' `) I    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看7 M- N0 W6 v6 {' R& e

+ i; X0 @6 i% Q: |    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。6 i: z: |( S3 S; v2 f: I9 R# ^1 |

6 k. P1 s* T, B8 o" }+ s    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8- V% p& k2 |4 I; J4 E

/ ~! h3 n0 o: `& Y& J    六.查看交易和区块高度
  a5 I6 B% j# s( X! ?* |( c9 q! d1 \) S/ e
    可使用以下命令查看当前区块
1 ~/ a$ J* Q! d+ \8 V! }1 ]" n
5 ^8 G" o" Z1 P5 U    eth.blockNumber
% d* M4 `8 u* k4 Y6 r: P' S* ~+ |8 w% g- B- v
    使用以下命令可以通过区块高度查看交易信息
! ^% {  I* Y  F0 C; G; \/ l/ z& p( X
" K* c% R: t7 Y1 x& e; l3 S    eth.getBlock(需要查看的高度)
* W% ?2 k# X& B1 a# \" {7 U
& N7 t. L  _& x; A% h# ^1 \    也可以通过交易hash查看交易记录2 ~$ l% l7 E4 X. ^- a. J

& I7 Z/ |5 P# M1 Y    eth.getTransaction(“交易hash”)
3 e$ l2 F1 Q/ f6 l
6 C! E& u& F0 B+ g! \2 G" }) ]    七.连接其他节点* b+ u  h9 N. N' {) h4 U

% u$ V$ N  V9 G5 |    为什么要连接别的节点?) h8 N: y: a7 G& P

. s* e5 W6 P& \" p( P: Q9 s7 k2 N: y    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。
9 V$ {* {# I2 V0 r% W8 D' {! @' B7 d) V" e
    连接别的节点需要用到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: f' t% e) f) i( ]( I
( |8 O* F- P2 h  L4 r9 ]
    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了
/ _8 ^& S" U: z0 b
, x, [' M5 J1 o    命令:admin.addPeer("节点B的enode地址")9 J& H4 _  w) P6 l, {5 r# E4 x

3 d) I: ^0 Y1 h9 T) }    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:1 U% p3 O& k+ J3 [
8 t0 E4 o) I/ u- g
    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")6 U- l' Z, }  z! E- B3 ^. U
, w1 g+ d/ {/ n* D3 Y7 H
    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量
* Q4 [9 q* V: R3 u  y& U, g& P
8 f+ g. J; c& m- `: W" V+ H8 n# F: @    可以看到节点B已经同步了区块和交易记录
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4