Window环境如何下搭建以太坊私链
大叔的爸爸
发表于 2022-12-6 19:45:56
142
0
0
官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror
一直下一步就行。
# A' N1 u: a0 C
注意:安装的时候最好不要安装在带有空格的目录
二.准备配置文件
3 C# H3 _: N8 q3 B+ }6 Z1 X- z* D7 Y
进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:. x6 Z) f* p6 l9 H% ~/ ]$ C, x
0 E/ x. L8 f) W B: n, |
解释一下各个参数的意思
Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件: @% Z5 H$ u5 M
+ d, q* V( [- `1 t' u- u
Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。) }# v2 m9 g2 K% D! _6 T) f& B+ F
$ W! v7 g# L7 u9 f
Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。+ s4 |, o$ g$ q6 ?7 n
-alloc是预置账户的地址和账户预置的以太币数量。
-Coinbase矿工的账号,这里可以随便填( I* Z8 r, b% P7 b/ o4 N2 A+ d& X
Z: v/ P, x& O) d- f; R* d
-Timestamp设置创世块的时间戳,这里也填0x00就行
* Y+ b, f4 u) L5 g! \
-Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0
b2 ~& D& h" f" g; e8 e' d
-extraData附加信息,相当于个人说明,可以随便填。7 g. m# x: ^) _3 J& h
-gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。# A6 m+ L' S7 Z$ A
3 q U4 ?: b/ M1 g/ o* I- _' i
Config是配置文件,必须要写不然会爆一下错误。4 [1 C5 ?) Z- J/ C) J
$ Y F8 W8 c8 `: m) x
三.写入创世块
- I& p8 r7 z6 s$ l0 B1 \$ R8 X G
配置好以后执行以下命令写入创世块/ v" \1 H8 `' U! {6 u" U) [
2 l: G: R' c! K7 }0 L+ _! M
geth--datadirtestinitgenesis.json
) o6 i: p" R6 o7 q9 J0 T
命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。0 O; }7 Q& K9 ]5 b8 d6 ` }
创建成功回显是这样的8 t$ v# ?. F; x6 v- A! i
三.写入创世块
配置好以后执行以下命令写入创世块+ s# |6 Y# y* o: u4 H& @5 _
geth--datadirtestinitgenesis.json# t& g; R* R8 M5 u8 w; w. n% P* s
命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
创建成功回显是这样的
9 j2 P$ u" x, V: J
然后执行一下面命令启动私链。6 {' Z% A* N1 M, ?& m
geth--datadirtest--networkid1111--nodiscoverconsole* P( {& o8 I7 H/ b3 l
console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点" t, C$ y1 |: f. [# v! e, l
使用eth.accounts查看现有的用户,我们没有添加用户,所以为空
接下来我们创建两个密码为123456账户。9 \: v+ l# t7 M/ _0 `) O
7 v+ r# t% ?$ k/ p
创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()
# R; t( j6 c) Q1 |1 n2 d" T' b
注意:此命令区分大小写。/ u' B+ x# _% @' {' O1 [
添加过后再查看就能看到我们刚刚创建的账户了
" _3 c K4 h2 H0 [
使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0! v! G! b) Y0 n8 [$ u8 S
) {4 t( h3 ], U3 w: P0 G1 d/ j5 m% J
四、开始挖矿$ J+ \/ D- M- U$ d' _& r
. F4 c: d% g) s6 \1 @
使用miner.start()命令来启动挖矿。
start()里面可设置线程,如:miner.start(5)表示五线程。) o8 \) s2 ~3 B" l% \9 [
; h: f* ~4 S+ W+ Q- i" S
运行以后会被挖矿信息刷屏。4 x( X9 X4 B6 _6 R) P7 [
第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。% }4 p, K6 a6 d* o
# L; T+ t" c% e8 m1 e2 P
开始挖矿以后你的CPU会飚的很高,甚至会卡卡的
如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。
1 ]! U5 W* y- x0 E, h
挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
使用eth.coinbase查看账户地址* B+ H; l1 s* K& J1 y3 U: A$ N3 r6 |
/ f, Y& H' \5 ]% F9 {. H: X, r
没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。/ N0 Z2 S0 s% P, p- L4 N: \* x
& }) j( S& [0 j) d, P2 l& w
我们切换为0因为这个账户有钱方便做测试
别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。( N$ X S/ ~) J+ \5 d
web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')) o" K% F' @) q- P) M
五.发送交易
先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。
/ }" T$ Z o) a: {' H/ d; @: @2 x/ A
发送一笔交易,从账户0中转移2个以太币到账户1中
$ o! Y2 x3 S8 i- z8 a
>amount=web3.toWei(2,'ether')& v( e% z/ G0 x. [0 B
>eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
9 h; m. Q! p2 s7 }: P2 y, ]
这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount/ U4 h6 T% L4 u* u+ p4 N
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。) q' _7 |3 m5 I
# G# R+ F( k5 u' ^' l- m! _
执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。
personal.unlockAccount(eth.accounts[0])1 @! n0 b% |: \! k! j( T
$ {/ k) B/ M/ p* P% X3 _# G
然后执行转账操作。, d& d6 b& |$ Z0 K4 U; Y% E/ s, X. h3 z
回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。8 ^2 k o+ }8 l7 _9 \' w
0 b* W; d& C5 v: O2 L7 y
可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…0 _5 w3 W, \ |+ u2 L* b
. l( \! e: I# H1 [. v9 `
要让交易生效,我们就必须要挖矿,去处理这个块。. e. k L. S9 `/ l, [1 j( {3 t
- D8 Z& _( ^4 j: y3 ^
启动挖矿。! D! U- ~2 x7 g8 E
miner.start(1);admin.sleepBlocks(1);miner.stop();
) r4 [. I9 k5 H& |/ w
这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。
6 m' m, w- s6 X' z
当他返回为true的时候就说明挖完了。可以使用txpool.startus查看; A# F5 o9 \5 f J; r1 ?( D" t
- n& N6 M* B5 C8 X
pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。; @ `1 b- [& n8 I$ Z! [
账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=86 \5 A! V$ y* J8 C0 B. K
六.查看交易和区块高度
, Z9 U: H9 `# p
可使用以下命令查看当前区块8 K& ]7 ^/ k% g* d8 e
eth.blockNumber% l1 U! J4 x8 t: e
使用以下命令可以通过区块高度查看交易信息
eth.getBlock(需要查看的高度)
8 j E5 z/ w& }
也可以通过交易hash查看交易记录% g. m" i. W: i
7 _4 F; `! Y7 @5 o0 g; w3 A, ]
eth.getTransaction(“交易hash”). e k. {& s; r, [, t9 t$ B5 z
+ l# Y( U4 \" I" B! A# [) V
七.连接其他节点
: o6 R' |" {& T
为什么要连接别的节点?0 u0 X; A$ b" {7 R! l
因为:节点之间连接成功后,节点B就会同步节点A的区块,同步完成以后,任意一台节点挖矿成功后另外的节点也会自动同步区块,节点中的任意一个节点发起的交易,另外一个节点也会收到这笔交易的信息。有两个以上的节点才是真正的区块链。
连接别的节点需要用到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
* ?7 H2 ^1 u1 M- N+ G
然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了( C6 a& t% ~" p% B5 @4 J
~% b' Q, Y8 d. g, r# ?
命令:admin.addPeer("节点B的enode地址")7 F" j3 K0 M f9 H, V( L
# [ f4 D' D5 x3 o( M ~8 a( s
需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:+ I, S x8 m1 k: `, ?
admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303"): B, ?, `/ y0 N0 a/ Y
想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量$ V8 _7 D" q1 I
可以看到节点B已经同步了区块和交易记录
成为第一个吐槽的人