Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

大叔的爸爸
161 0 0
一.安装geth
4 W$ q$ a1 r) s- }* D9 M8 b; U" n4 v0 g1 }. X7 _; H  H/ Z9 b
    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror
: N  s9 |1 @9 d8 G3 M; K8 h+ c2 D9 l% a' c3 o1 c! E
    一直下一步就行。
& ?% f( W4 p- H. z* j; I# p( Q/ m5 q$ Q9 m4 W. f4 y
    注意:安装的时候最好不要安装在带有空格的目录
# }2 X' T* d5 O% p- Q# @/ g$ D7 Y& p# a, f8 t; n' ]
    二.准备配置文件; v) k. |9 f6 b+ {. Q9 A; Y

) j$ q' M7 Y# C7 u/ F8 v8 D* r    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:7 N6 b% \& b" B
, o1 X/ ~4 J# K5 d/ E
    解释一下各个参数的意思
" X* P" k# \! J6 G3 @0 `2 R4 R7 N* G* C8 ~
    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件9 V4 H4 F9 _! i8 E' `( M

' r4 Q7 H, j# F+ l& r. U4 Y    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。/ D7 y  O1 m) p1 u1 P- h
+ D0 F$ S: Q7 }4 w
    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。3 }6 E4 G; c0 `- Y" r% c9 W

& }5 O! O" W/ Y& j% D# ~0 o4 v    -alloc是预置账户的地址和账户预置的以太币数量。
* L; V3 X# j! \+ C% I+ ^' ?, F  w& z3 U
    -Coinbase矿工的账号,这里可以随便填4 @& I+ i+ e+ @- n

1 M5 c, c/ T- u9 k    -Timestamp设置创世块的时间戳,这里也填0x00就行
& y6 W! _) V% z8 r: f, @) t. O* y" A3 G& w: q* o
    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0* j9 |- O! Z- U  {/ h- w
& u$ n. E$ ?9 D# @/ {0 T# }
    -extraData附加信息,相当于个人说明,可以随便填。5 y- }5 Q5 d* U% u

2 W/ V3 W: @+ ]: w5 }9 ^    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。6 O. B$ T" A' }- |

8 ?; _$ j! s+ q/ d* x    Config是配置文件,必须要写不然会爆一下错误。
% {  \* I  Z3 q* ]' J7 m
: n2 ^* J6 B! r9 u    三.写入创世块. @  ^- p, M1 i$ [8 C2 T  g

: U& g1 R4 K$ E' B! ]' B    配置好以后执行以下命令写入创世块
5 F+ q: i0 w& N/ w& ^& R- }$ ~* P( ~9 J4 x+ G/ u1 M
    geth--datadirtestinitgenesis.json
! p$ E7 t6 Y5 a3 b+ D! G9 V, ~& H0 e% u% Q! y4 s
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
# B9 H9 B. X3 y+ _2 ~" H  [& Q. m. y  x. |1 R! I' a) ]
    创建成功回显是这样的  A; e/ g0 U5 i% U( D: O' t3 V

' k$ h: H, k3 N  _$ }2 x    三.写入创世块. b. Q7 n2 g  s8 D& B2 g6 M

2 q: \; C9 g  D/ S. }6 E    配置好以后执行以下命令写入创世块1 a# V+ j, z6 w, I" H2 s' |9 P

& F) h4 D: z+ W7 U: T    geth--datadirtestinitgenesis.json4 v( O% h$ ?: y/ o9 \$ W
# X! J5 f2 c: \+ v7 v
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
* o( U4 W4 u( M* z3 U3 e- ]' b: |: n' e+ a
    创建成功回显是这样的
4 k: ]6 q2 W. I7 P3 U& ]9 z2 e. o5 }6 r9 {
    然后执行一下面命令启动私链。
. j2 S; Z% s  V
9 g5 U' q  P7 M    geth--datadirtest--networkid1111--nodiscoverconsole
7 l8 `7 y& h+ Y4 ~* a' ]( R$ b$ |. m* c% }* x% v$ m
    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点
7 M: X7 `6 s3 J5 j) k( X. Q1 s2 Q2 H- A& {$ X1 g
    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空
  T  @# T$ m# S/ T- `) j% H8 d0 ]; x
    接下来我们创建两个密码为123456账户。/ v5 h6 [0 ]2 t
! V2 @- u- n1 j7 B' s  i% ?: Y
    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()
" @7 T5 H9 d% {+ K2 Q, r
) K( N1 h! i! F4 ~$ l: F# @    注意:此命令区分大小写。6 V# A. I" m3 _
9 |8 O  s9 v/ i
    添加过后再查看就能看到我们刚刚创建的账户了
' C' d7 h7 Y. V' ~; u7 R& q$ @! J' p9 G- r- T$ h+ U+ w
    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0
8 i3 K* v3 w) L! z. C+ q# x. ~1 `0 {- c- `- `  U! \4 M1 h
    四、开始挖矿
4 X6 w  S! m: g4 p  V+ w! I/ M9 R" k1 D0 ^
    使用miner.start()命令来启动挖矿。
( f8 |  o: S8 c
0 N& j. x+ h; G1 n    start()里面可设置线程,如:miner.start(5)表示五线程。
9 G5 k4 i5 y3 X8 b+ E' ?( F( Z& M+ L3 `
    运行以后会被挖矿信息刷屏。: A( e( G+ y7 F1 Y5 s5 n
, @4 x: O: @/ p+ q6 [. g
    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。
9 P6 u  O- H$ C/ I+ T
  [# b7 m- y$ t; Q. Y, u& [4 @( M    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的  l: [4 m4 Z; w) Y3 l* N

2 Q& w1 Z9 C( l. G- A    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。# Z$ |& X: G: S, }5 D# l
7 ~3 x3 ]  t' Q$ A0 M, \2 S
    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
  L8 b8 m4 z) l# W4 `# Y5 j8 d4 K0 v! i" z' V" [
    使用eth.coinbase查看账户地址
6 k* w, y; S* F' V' z
- t, M0 K2 `& t    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。
7 v' a$ X$ m4 L+ W1 S
. P  g" z+ A! T& @4 ]    我们切换为0因为这个账户有钱方便做测试" D- N% g% G7 _) X) K: {
! s- ^# ]* @0 A& g- s) H. i
    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。
" d# |& \4 q* u: v% ]
5 y2 a: d4 H: f/ W" B    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
( M+ w$ O. X& ~+ W/ X. U- p/ Z, F  `8 B# B2 n; S$ K" |1 {
    五.发送交易
$ H. U: A' V, a: g; M4 z) d0 _) V; l# L
    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。
$ _6 T  @" K0 W
7 h! _/ X' n4 D! u    发送一笔交易,从账户0中转移2个以太币到账户1中
; I: d' \, m4 u& S9 f! P$ I  y
9 t% J0 F$ ~" Y  d& l" P    >amount=web3.toWei(2,'ether')
+ {) h$ Y% l5 ]  j" y2 |* p- C4 ]
  S. U6 B6 n5 U$ m6 }" U5 W" i+ d6 h    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})$ N' k* `/ Q4 H# T9 f3 d4 E

) V3 |  I) y8 t    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount
5 g9 @/ C1 O4 [* n5 F
8 p4 {; a* X; G! X: Z    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。
0 ]$ r- O2 W9 s2 m" K
3 G0 A& V0 c2 x* \    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。2 m5 B* t0 b2 j' P, T% x, E: }

0 ?9 N! J8 `: B# s    personal.unlockAccount(eth.accounts[0])$ ?. A9 r5 U" J0 N! V
( I2 G; G# y# x- A! N
    然后执行转账操作。
$ X1 `+ f) x: U- r3 x! {0 ^' d9 n9 s: |
    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。& Z, d  Q" L/ K& {" B; t

2 r! X) L" D/ H7 T  E    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…% y  c; ~) m  P2 z* O

5 n0 l# M5 f8 V* {    要让交易生效,我们就必须要挖矿,去处理这个块。/ [8 M% k1 w3 j2 v

9 I5 F/ z4 O' K, D; a( W+ r* o% G    启动挖矿。/ B: {! C( [& [
' E$ G) p$ D. U6 ~, w. u2 B' w. n) G
    miner.start(1);admin.sleepBlocks(1);miner.stop();
$ Q% T- ~1 W. P1 \4 F' o6 K# h" |0 W8 ]* L' o' }
    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。
$ j" Y3 I) }7 F! ]+ |" G: ~5 Y
5 z* g( Q. ^3 _) e. l# D6 D    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看3 ]( b3 i2 G! E
# ~8 ?( A6 ^3 Y  Y. j3 r
    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。3 r3 S1 `9 {: w/ y, q5 d# T
1 n" F( u7 X" D# z: `
    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8
4 ~6 m3 f: y5 S, j0 {! Q; Q& H& C9 ^4 ~1 ~7 d0 m" x
    六.查看交易和区块高度
: C( I7 b% v& n4 g* U9 ~, l6 C7 K& K3 W3 f0 Z7 ~
    可使用以下命令查看当前区块! W& k8 V2 x; t7 _

8 F. @4 z- i2 r! @    eth.blockNumber
' i& K2 B4 p( _- r
4 ]! {4 }! {' G- h. K    使用以下命令可以通过区块高度查看交易信息
5 v$ ~% @+ u0 N
$ k. |/ M! {& J. l( c. s    eth.getBlock(需要查看的高度)
: W! q+ s0 k9 C) o. n! L7 P5 h
    也可以通过交易hash查看交易记录' A0 L& |- {8 F) F9 T& V2 m6 a
* ~/ b4 Q3 E0 a7 I+ A6 \0 i4 W
    eth.getTransaction(“交易hash”)
9 V! \* x9 ^" ^/ u! u* A+ ?
+ O, ~+ l1 \, x6 n0 k    七.连接其他节点7 @* i( g. a% a3 c4 k) V* _7 P

, G4 o- h) W. z8 A2 d' W' r9 Q' P    为什么要连接别的节点?
5 \5 K& i9 s7 [+ _: H) `" E& w+ r6 L, w" f
    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。
  c+ i1 a3 C- J0 D8 i0 C# u! z2 q7 J; L# {
    连接别的节点需要用到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( z4 ?# j% u6 k) }- Z9 g% N
3 K) P; t; }4 h: F0 g
    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了/ i7 w, O* z( j) e6 D
- J, m0 i6 S9 p1 ~. |
    命令:admin.addPeer("节点B的enode地址")
3 s7 r* J! W2 J1 L# O3 p
* }, R0 C4 |3 G+ {6 H    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:
  V5 q+ t6 H( X' l
4 c7 k5 O- W6 s, {    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")
* E0 _! I; T- k5 M  T8 S
5 Y. @  @/ G( A4 f    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量
8 |" i/ P  g  L3 C3 _. W
; H3 C  {' m: r/ D/ @    可以看到节点B已经同步了区块和交易记录
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4