Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

大叔的爸爸
171 0 0
一.安装geth* j% r4 k- b+ r
1 C* [4 m& k9 }& [0 |2 U
    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror! O4 N8 e8 G  k* {, X
1 I/ O3 o+ u' z4 {
    一直下一步就行。$ q. z! a0 H: i; D! `
0 a7 v( [" `3 N- W
    注意:安装的时候最好不要安装在带有空格的目录
( s4 w$ v% c5 l) c' [/ Q& c5 B! ?/ w, f4 a, Q, p8 L
    二.准备配置文件9 D# z2 W4 p" R; K' M' |

- q* p) Q) u5 d- d    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:
6 M1 ^) [+ P/ k6 i! ~! n: ]: S7 `1 h& ?3 }
    解释一下各个参数的意思
2 T! Q' E6 W* p; ^3 S. {2 \2 `. O/ _) p( Z5 {( S. ^1 F
    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件
1 k( z8 d$ Z- v8 [3 _
# X8 A) P- J9 Q5 B    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。  S. W5 ?# e/ Y3 T- @; \$ M
7 t( X! Z$ b2 x& R
    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。
- `, u! g$ L, k# `. G. o
7 Y+ `4 r6 I2 e* H    -alloc是预置账户的地址和账户预置的以太币数量。* h8 Z5 b8 ]6 ^: Y$ M2 Y9 B/ W

+ _' W2 t4 V) t/ |$ x    -Coinbase矿工的账号,这里可以随便填
: p# C8 @; \1 T! u
9 Y. m3 U8 {+ K) q3 o; M    -Timestamp设置创世块的时间戳,这里也填0x00就行* M" v9 t! b- n6 ]. `4 n

" u; X+ M6 G0 I" \9 e9 G0 n    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0, T+ U7 }" W4 x+ i% k3 K7 u
; `( U5 D" y- ~- N; I& L
    -extraData附加信息,相当于个人说明,可以随便填。
% ]8 x$ z% S, U5 E: k& X" x
4 s9 x9 d" L: t9 {4 C- `    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。, `# o! n9 x3 _

8 ~. r- N( z+ P, [& z' f    Config是配置文件,必须要写不然会爆一下错误。+ T% h5 p1 x& X( I9 W  B

! C5 ]" [1 i1 g9 A. v    三.写入创世块5 R) i: p7 I. R6 \
7 |; O% g! h7 @7 e+ b
    配置好以后执行以下命令写入创世块* Z. f/ h2 F! A  ~5 q8 M

9 ~- a+ e$ [% H    geth--datadirtestinitgenesis.json0 p  I. f: {8 h  d" j

. j  f. ]* w2 z" |- B2 i' y    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
7 D6 C4 X2 ~& E8 O8 `; ^! P! n. v2 G# a+ ~, a* f/ P, K/ `& {- O
    创建成功回显是这样的
, d3 K0 D0 N" E+ G9 Z; K$ `: }! g# u. w2 j; Q
    三.写入创世块
+ M/ }' T; J% l- x9 |
/ k- C/ V( g( C& A6 d6 C* f" h    配置好以后执行以下命令写入创世块
6 Y# O9 b& `3 d$ h. w
" a% S- W; K& r& u4 }0 G1 S5 W" [    geth--datadirtestinitgenesis.json1 J3 N8 ^6 w, R  A  L; }0 |
" X7 ~3 K" G8 j5 ?: Z: [( @
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。9 K% k& I% X3 M7 b
0 ^7 \9 L- H; }2 ]2 L, M
    创建成功回显是这样的
/ {. a; }9 N9 J4 O8 V0 U+ N0 l9 A8 E7 z' `4 ]: h: W9 {1 O
    然后执行一下面命令启动私链。8 ?& T4 T( N8 X/ p
, g/ f  ]7 O# @" _- L6 }
    geth--datadirtest--networkid1111--nodiscoverconsole+ t' `0 t+ n3 I0 H
9 s5 `7 y# \9 t& g
    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点2 [# x8 E" B) v* u
, M9 q: i! O. S" v
    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空
- \" u8 p1 Z1 G5 x# S
) `; i, A, b1 n% t7 H$ I" v    接下来我们创建两个密码为123456账户。. r$ D* u, ]/ X: O* r
% l* e% I2 I* I$ T' N( k/ Y
    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()
  L# T0 N+ ?- W4 Z+ r3 f& l! ~) }4 K2 D) c5 c# x3 j, X
    注意:此命令区分大小写。% f/ x! _# P/ O9 C, n% f, R: n
: n8 }; P4 M* @3 b7 C7 e
    添加过后再查看就能看到我们刚刚创建的账户了
- _; F/ s& n0 Z$ u9 A
) E1 `5 t5 R- @0 P* ?7 k    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0
# t4 K; z( v* o% p9 F" K; e6 a' }& t- [
    四、开始挖矿/ K. N. m. `6 V- e' H5 m: H: O

4 A7 K7 j, m6 x9 D( A$ X    使用miner.start()命令来启动挖矿。: w& ^9 m! c; n9 b9 ~- w9 P8 O

8 C/ {2 J, g: T9 u$ ^    start()里面可设置线程,如:miner.start(5)表示五线程。
( g' g2 G( J  p2 D: {+ W2 c1 F2 j  h5 F2 V: g) Z! D  J, g
    运行以后会被挖矿信息刷屏。+ ?7 h+ v, \, k9 V

! j8 ~# z6 L+ I7 N3 E    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。
+ ]* U6 ^+ R/ p
* L8 a3 w+ j9 j! y) b; ^    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的; ^9 g% l' V$ S5 J6 M3 F+ ?
2 I% l3 C7 L- O' L5 @! f3 W+ v
    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。/ n& N1 C# k/ l3 ?6 I% a5 U
2 T! F! G& V4 f
    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。# T( t# I7 N( z8 F7 I# l# l- R5 Z' X0 n( a
! Y- s) s+ f4 q
    使用eth.coinbase查看账户地址5 M. r  T2 p/ W* G) g$ h; v

, a! M9 E  N$ L    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。
& b3 V% w0 \- N- h  ?, f0 K( V8 Y% W
    我们切换为0因为这个账户有钱方便做测试* [" N* M) m% _) `+ m  Z) R

, o; M4 b! F8 d! a* M    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。
7 d% W% Y( q% m9 F
' F; r4 n3 b: `0 Y5 S6 F    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether'): a) t7 p7 L* W3 S
5 U3 w( f2 z' J0 g+ ^
    五.发送交易
. D: y; N; G; Q. l/ a$ T- z% I9 A% q# E+ Y- K! {
    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。, a: Z3 w$ Q1 l+ c) v2 Z& m
8 ?5 h) u  M/ G$ }2 \6 }9 O
    发送一笔交易,从账户0中转移2个以太币到账户1中- M7 v1 ^' a# A' }6 v* j; g
8 l  w3 ^& w2 h
    >amount=web3.toWei(2,'ether')8 A  M* P. ~( D
% G8 V  b* t9 E, Y& q* X% m
    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}); G" H+ f4 @& Q" F) K. `: P3 A9 m. s

) M9 e: B% S4 p& ?! F. W8 X    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount
# d4 C* N0 j1 ~* @8 N  m# x* l) ]  e1 {
    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。) ~* a( Y2 r3 r* k( G# Y
! [3 c1 I1 q$ j' \
    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。
% A3 L7 k9 r% o7 n) v2 O: D$ Q, _
    personal.unlockAccount(eth.accounts[0])& s$ Q  w0 b7 h
" G* ?3 h7 J& T( A7 U
    然后执行转账操作。
8 d8 b2 m3 C- `2 D% W. j# }) @8 Z0 m1 ?5 [- N  H7 [
    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。& J+ K8 g. T& i" c# v$ A$ x

! X( i7 \) i; w$ r" _    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…
' `- j+ b) `* L+ w8 |5 M
; R: n) _2 O, j! T9 S6 w- h    要让交易生效,我们就必须要挖矿,去处理这个块。6 R( r+ `2 ]1 V7 D
" A+ Z) R; A* _( j5 v
    启动挖矿。
* u) \& J, r8 Y. k( M
2 v& P8 a6 H" N* L7 e  ?    miner.start(1);admin.sleepBlocks(1);miner.stop();
( k, f1 \1 C7 Y" S- q- Y& G. e: f4 _0 n, h# o, r7 x
    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。
/ T* F; w# i3 h. p# |* d' c- D# t- V* L" f# a" e
    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看! b+ g1 T8 b/ X" w, a4 }, e
9 `9 X7 r3 H3 @: S8 i, h9 q- _
    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。
8 e- \7 c* M7 k4 b+ M. x, D1 }7 c6 X
    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=81 B# b. u( |0 X0 f; _0 C2 v' p

! j; Z9 x6 q% c$ u% e; r    六.查看交易和区块高度
/ R( y5 l, S' ~" p+ ^; S% C# v# _# u5 T- Z) l6 p
    可使用以下命令查看当前区块
' ^# @* Z/ K3 m6 Y0 W- h# ]8 b, Y( O2 l" |
    eth.blockNumber
. y6 ^! ^8 c  B! N9 B
2 A, c2 v1 D- C; j$ E3 g# [, ~) j    使用以下命令可以通过区块高度查看交易信息: B' q  ~% _8 f! D% h$ G
+ e# r9 y. k& P" S9 q( v
    eth.getBlock(需要查看的高度)
1 X/ d( A* ?- `7 d: q# v! W& w- F) x) |! [0 Y! j; `
    也可以通过交易hash查看交易记录7 h( h% |5 K2 J" M
3 B% S; v- S1 ]1 B# M
    eth.getTransaction(“交易hash”)
. r6 D# ^3 `; p) K+ G  @/ w- [
; k/ m& D: W  P; h; O5 C! Z    七.连接其他节点" g: w/ u4 L( w2 E, Y0 y0 p

: e" o) N: j* r5 R9 z# J) ~% M    为什么要连接别的节点?/ G: \* q( ^8 C/ L( F: |
- x7 v$ |+ G8 S1 W( o/ P3 T. L
    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。7 C. E* M/ B' ?. z/ v' S% ~

) l$ u- B: j! k0 n) J    连接别的节点需要用到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
% _1 b0 {" a1 j+ T
! l2 O1 t7 b* y! D. v    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了( b. q" Z3 @1 p2 ]8 X  M

0 {+ f6 ~% H( l) s1 ~# n6 \9 d4 Z    命令:admin.addPeer("节点B的enode地址")7 J+ ?1 U& ]$ D0 `9 w( `$ \( y

* h  k4 f" T5 t! W/ z1 |+ J    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:" u5 {+ n$ J- S9 Q$ w3 K

4 S! }8 z& a1 c0 T  _    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")9 r+ ^( R2 ^' x. F/ W4 L# a" K
! P" D/ H3 e% t( U$ o4 x( O3 Z8 X
    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量
1 U) F3 Y, {2 E, O- p, z
- U( y0 l, E3 I; J. i! u    可以看到节点B已经同步了区块和交易记录
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4