Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

大叔的爸爸
170 0 0
一.安装geth; |& s, ^/ a7 ~1 X% E6 [% }" O

+ F8 F5 x+ w5 b    官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror  T1 v3 u2 S$ M! _, P/ y

( t, R7 C9 e3 x, w& ~1 s8 W    一直下一步就行。+ s7 w1 ?7 s5 w' d
4 g9 k, \+ D: c. j2 q" M
    注意:安装的时候最好不要安装在带有空格的目录' y! y/ D$ O( j% _

" J$ f- {) l: `    二.准备配置文件3 V1 b1 p% _' G. `) e

- c' p" C! M1 N* l5 k8 A9 V    进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:
1 B% r6 t6 M; g" }9 X, B! t# A: S6 k' i' k
    解释一下各个参数的意思
$ {( g4 ]1 B, B0 U
+ y6 [/ G% ?0 W0 @; r6 ~/ h    Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件; I  N: {# E. f) X

. g: b: i; j  y: c, }' x- ]    Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。0 [; K: f. k2 W

( F8 c6 @; [; ^( O    Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。
' p2 p4 }& X# D) c' Q8 C0 K0 f" M. g8 k
    -alloc是预置账户的地址和账户预置的以太币数量。
- h( i0 \4 i6 f; o; a6 n
% `: ^& B+ [, J! W    -Coinbase矿工的账号,这里可以随便填
5 @1 Q9 g+ m3 i* A5 c. ]+ G( @  l9 n4 Z# r% v
    -Timestamp设置创世块的时间戳,这里也填0x00就行
+ v0 V; A1 [% o  G" I% x6 d  r2 ~, ^
    -Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0
9 L2 P- M8 P  _+ A5 q7 a* n; [8 N: ]: J: ?7 v
    -extraData附加信息,相当于个人说明,可以随便填。0 \; e- D; f5 |; T. B8 x

- `# u* P# D+ u- T  R) {" C    -gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。  ^7 {# U3 V7 l* K3 ^" f3 S

6 }+ e' T1 U. F4 J) [4 I5 j1 Q    Config是配置文件,必须要写不然会爆一下错误。
7 v$ E' I2 H2 f- V/ O1 X* x$ d2 n" y
    三.写入创世块
/ F+ P0 U  a* r# ?. g  d( N1 w" x& h9 r, F
    配置好以后执行以下命令写入创世块$ H1 p+ f2 @: S
3 f: a) R/ _0 C* D" n
    geth--datadirtestinitgenesis.json1 w8 e$ J3 ?. _# x8 [
! h# E  i1 e. S, S. T
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。) [2 [7 A- o/ Y8 l9 a# h
3 J9 G& Z9 |) L: b
    创建成功回显是这样的" c  K6 M5 O+ `) q2 K, M" Z
/ s$ N+ F9 {5 P  K
    三.写入创世块, I( }% i! C9 T$ h% Z
2 b: N5 x+ }/ V# k+ B
    配置好以后执行以下命令写入创世块
; e; Q5 U9 ^% i" t! p/ g5 ^# p$ m
    geth--datadirtestinitgenesis.json1 E3 I6 h: q7 V" u5 ~+ V
; I+ ~5 @7 T* ^; u
    命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。$ [% W+ k" {5 }) F0 G7 k
: Q$ m) u0 q/ b# {! d
    创建成功回显是这样的+ ^/ [( C- @5 t4 o4 S" i  k4 D
: A/ u6 B$ R! G  D$ N
    然后执行一下面命令启动私链。
) e* I! b4 c0 Y/ v% F  Q# O( G( v! _
4 _4 V( x/ ~0 S0 O0 t: X3 I    geth--datadirtest--networkid1111--nodiscoverconsole, B, |$ M' v6 z  q, |; o
- a9 Z+ ^3 O# N0 Z$ \8 K6 e
    console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点
4 {; W2 w5 p, H5 e
! t/ T# R5 _9 d& g9 |" E    使用eth.accounts查看现有的用户,我们没有添加用户,所以为空
6 J) |/ g" |- x+ t& f5 n; {4 n! v  Z5 E
    接下来我们创建两个密码为123456账户。. h. y: M4 a0 e0 }* ~
8 L( s& g: N8 d1 l' B! O
    创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()7 M4 h% t- _9 G; o
" p/ x0 u( W, P% ]. K6 N- S
    注意:此命令区分大小写。$ `( Z2 ?: n5 ^
1 y: i7 ^$ d! d2 v7 j, h2 J/ B
    添加过后再查看就能看到我们刚刚创建的账户了  ^+ \/ {9 b( i. d5 V; E* c% t

9 _% e) ^2 U; L6 \; N    使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为00 K, `- J# e+ a  F

1 l5 q+ S* J: X' `8 g1 y/ N    四、开始挖矿
6 z" }# N" b; x5 Z- P0 ]/ x5 w5 |6 n  f. [% ^
    使用miner.start()命令来启动挖矿。) [! m$ [$ P5 A4 e, I- {& ]

& s$ P( L( X! Y5 o6 d8 X, K    start()里面可设置线程,如:miner.start(5)表示五线程。  g. g9 u  h* e9 ^4 f# F3 S0 ]& O
# u2 ?4 d; l" ?
    运行以后会被挖矿信息刷屏。6 j9 D6 `1 i& M6 m6 H) @

9 N$ q+ i; G1 U6 O7 \- G    第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。+ y7 V8 s5 X$ q/ i
# p- e/ g7 e6 X9 j  ]* ?0 L9 T
    开始挖矿以后你的CPU会飚的很高,甚至会卡卡的
* [9 }/ P" P# E# y+ d' i3 T0 }: J1 Q  T/ v
    如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。
8 |5 f$ u  i8 \  g5 T5 n. t6 ?5 k) W: j
    挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。8 |; h# \$ ?8 o% N5 R5 c+ c# {' K
* T- M9 b" y$ e$ O7 t3 b4 s
    使用eth.coinbase查看账户地址
' k$ s* p& S( G; h9 ~' D6 _/ X, b
9 A7 V* b6 w" \( }    没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。
& P5 N; M! A* E0 Z& H9 }" W- r
* B* c) z: q8 k, z    我们切换为0因为这个账户有钱方便做测试0 E% X$ U8 X- G& F
) G  e, i' L/ ]4 [, b, {- g
    别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。9 t; f( B' C& z5 w/ E
6 u" n: r' M; @7 V* g! G, d( i- s
    web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
: ]* c2 i, }! y) O5 C7 [' n: B- A+ c: t
    五.发送交易% a5 N0 B& C3 s3 A4 B

5 u6 L' a. H9 F    先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。
) \+ q4 u7 z- y+ y: r) b! e4 Z3 ]2 d# F5 ?
    发送一笔交易,从账户0中转移2个以太币到账户1中
7 v/ D# G6 l; j4 t  n6 a0 O9 B9 q  W! U
    >amount=web3.toWei(2,'ether')" N4 q( C* g# V' }) K! B% n/ G: g) H

0 H  a7 c8 U8 W4 M, \    >eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})4 F0 o! J9 U! ?5 i6 f

) X9 c* T( e, k: [3 _$ U0 c    这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount; d# {! X5 y4 W6 |

9 J; e7 B& d/ _& R8 r. F% |! S3 V' ]* q    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。( H0 K* l( k# x. z+ `: S8 V
' a/ T' _- C4 w4 D. j) u. C
    执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。) u& v& f! e; L  X8 n8 R
8 |: ^1 s; _/ t4 z9 C. n
    personal.unlockAccount(eth.accounts[0])
  y5 Y/ s7 R5 }$ i- n: H* b% e0 i/ X3 d- ^5 H. _$ J4 p$ f6 G
    然后执行转账操作。" H- k+ o9 e3 _+ ^
) u1 @6 F5 O, c1 k) Y6 p
    回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。; N' D) v( A- T  T$ P& B9 T6 A3 l

7 r+ r. q& Z% |0 y4 c7 E) h    可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…
  G5 e4 [5 E4 L6 I
/ x2 {# r+ a+ {' @6 [% z5 \) I    要让交易生效,我们就必须要挖矿,去处理这个块。7 B4 I4 s3 Z' p: m$ s' E7 p

6 V. y/ K+ ^4 a& K5 R7 @    启动挖矿。
9 `; k( _7 }# X5 m; _" i' L2 ^0 r6 n* R) l2 i7 G% T) a
    miner.start(1);admin.sleepBlocks(1);miner.stop();
$ K: C2 v9 Q7 p% S- ~4 n+ o$ |) ?8 ?& X8 R- w
    这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。
. o* X! e. G" g$ A% s- z
/ b" ?% D: O2 o7 O7 B    当他返回为true的时候就说明挖完了。可以使用txpool.startus查看! e2 C/ `, m, E; o" E
$ u) o' B2 i( F9 q3 V# }+ Y6 R
    pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。8 J7 q& t, \9 x4 H& Y

' P) |/ U5 b8 C5 S4 q8 R: i2 v    账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8
( a7 O: \+ O2 Q/ t* \* x) T$ O1 t' O( [  d, D2 u( t
    六.查看交易和区块高度
7 k  S7 r  w8 E/ E& ^# C. W0 a7 ~. p+ G2 {% {/ X6 K
    可使用以下命令查看当前区块
5 s& {0 A: D& k3 G% ?4 p& C( E- _
$ K0 ]& A! l7 C. T0 D    eth.blockNumber% Y" {+ M, }; y3 L2 @
6 r* {* |4 [. ], T  x1 i- ^  Z8 p
    使用以下命令可以通过区块高度查看交易信息& f$ G! z& }3 J' g4 W

+ E7 Q6 X6 {2 \0 C% t2 b% B2 l7 c4 [    eth.getBlock(需要查看的高度)
2 ?% E; ]3 v' z, ?6 R: T5 K
5 y+ H& t; ]7 P5 g/ D' P4 l    也可以通过交易hash查看交易记录
1 R# q& H3 u3 y  R; y/ E* @: ~7 d' c( F0 E  N2 ^) _* ?4 T; K
    eth.getTransaction(“交易hash”)
5 _2 o+ z0 V! G! D/ e! B2 I- v
8 y5 ]9 U: {% X6 i6 j6 k. Z! O% z    七.连接其他节点: H0 t3 u1 P- F7 ~

& w% U( k- @# M$ ]# X( J    为什么要连接别的节点?
% a; i; u/ o% q7 I, q+ J: s3 N2 B% P  }5 g$ i' r
    因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。% D# {" S' Q. \) g2 a$ V6 S( }

( @- W6 d/ |2 m' r: _0 J* T3 c+ 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: o  g* G4 b9 s  z+ ^0 s! u; Y, l

. i3 P; q# ^2 q  M9 S    然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了* K& s; |3 c: }! d2 G

2 i. i" X* ]' }3 W6 V    命令:admin.addPeer("节点B的enode地址")7 z$ p4 V1 x7 B0 ?+ I1 u

0 g$ S  n: S/ W6 |    需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:5 M9 z/ `# e& a1 |

. A# S- z' x. s* D( M+ ]    admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")
2 S% }0 M1 I, K$ C' e; P) S- V0 ]6 A( w
    想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量
3 A2 M/ ^: ^: Z: C+ {
" ^: a1 w% q& z& L    可以看到节点B已经同步了区块和交易记录
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

大叔的爸爸 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4