Window环境如何下搭建以太坊私链
大叔的爸爸
发表于 2022-12-6 19:45:56
140
0
0
官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror
8 X8 h3 d* w4 [ H- N( | M
一直下一步就行。; q; i0 g. s; I I! q1 B% B
注意:安装的时候最好不要安装在带有空格的目录/ x: Y6 _" q X3 z' ^
二.准备配置文件
; [! J$ W5 S+ [; U6 ?3 w/ O5 j
进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:
/ z) ^6 r6 p$ W6 z
解释一下各个参数的意思
3 _! ]% O( J( i3 n0 q4 Q: X3 }3 w
Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件
( X* C5 _4 D1 p. L Y
Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。
; s# c1 a5 _" o) b2 S; ?& G
Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。 [2 T) ]. S9 F- |: x$ g
, W) P) v/ s5 }# Q; ^ I5 c
-alloc是预置账户的地址和账户预置的以太币数量。
2 \7 E( s) i, ^! E9 B. ?5 a0 y+ E
-Coinbase矿工的账号,这里可以随便填( u4 a7 F# F' R' R& P( V
6 x r6 h) c# E7 r3 {9 c% t$ I
-Timestamp设置创世块的时间戳,这里也填0x00就行
! Y; D5 H- s5 E# M
-Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0
% M) P3 h" D9 o d0 ^
-extraData附加信息,相当于个人说明,可以随便填。
-gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。4 A4 x7 I; j) Z
Config是配置文件,必须要写不然会爆一下错误。
三.写入创世块
配置好以后执行以下命令写入创世块
' ?9 O b7 ?4 U3 Y$ G9 Q
geth--datadirtestinitgenesis.json
命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。# _! }# B2 N9 P% P6 D& A* g0 F4 F
创建成功回显是这样的) i1 J4 ~$ F& m% L
三.写入创世块3 a, ]5 t( ]% r h6 M0 i9 N
2 b% E+ O( p4 a7 W
配置好以后执行以下命令写入创世块: B# P0 `3 i0 E% B% \9 x' t" B6 q
0 P' H% q% e' {
geth--datadirtestinitgenesis.json' r8 e: m5 H7 q6 @% o, l( K4 Z3 e; J
) k7 A/ T X7 x. A, w" N
命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。- g5 P7 c9 ]( W1 O: r
创建成功回显是这样的
6 {7 l* |) X2 i8 q; W* n8 w8 C4 D
然后执行一下面命令启动私链。
3 M) N( V u, X( L; q8 S
geth--datadirtest--networkid1111--nodiscoverconsole: b2 m- r' `; ~3 w/ m. S- x+ A i
* s4 G; v o- T# k7 G5 G4 `
console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点3 b% D% j J) F! Y
使用eth.accounts查看现有的用户,我们没有添加用户,所以为空
接下来我们创建两个密码为123456账户。
) o) d/ S9 S3 m8 a9 U2 r
创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()2 |3 U( L( u$ M5 }. {& d
注意:此命令区分大小写。. Z! @& S( s3 N8 y
) q' `. F" G4 P+ Y
添加过后再查看就能看到我们刚刚创建的账户了
使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0$ O& B A) _* H7 G% |7 h6 R
四、开始挖矿, V6 ~% K9 V2 y( v, _' j
/ k# E+ w* p F) u, h
使用miner.start()命令来启动挖矿。* o+ f3 @. @- z' B+ R$ p" H2 m! C
start()里面可设置线程,如:miner.start(5)表示五线程。
运行以后会被挖矿信息刷屏。 V$ }+ E1 v# F
0 J) V, F, N/ ?. r
第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。
u$ |# `$ o' f0 f% Q R
开始挖矿以后你的CPU会飚的很高,甚至会卡卡的7 z" H! d5 W( O
5 V7 \% C, X9 A w) X
如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。9 L/ D# v u, T% l
$ i, E! ]# R1 u: l ]7 P A/ y
挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
0 M5 h# A" j* t/ P% ]* _$ ~
使用eth.coinbase查看账户地址+ z3 ]$ a' J% T9 w3 z# S. | W
. w* F% V. u( [8 U' I/ z
没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。
我们切换为0因为这个账户有钱方便做测试
别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。4 R- H* V2 W+ g* r5 k' p4 g" s
4 c* W4 {- w! g
web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
# ~7 F. ]7 k1 T/ N$ w( N- ?
五.发送交易2 x! p' O4 H% o( \9 j. [7 @: F
0 Y7 m8 H V1 ~" t: J, N
先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。
! b6 ?: z) U# w4 T
发送一笔交易,从账户0中转移2个以太币到账户1中3 T* E! A! } P2 R. |& w% m
2 p/ k9 _3 `, N* W4 s) V9 E
>amount=web3.toWei(2,'ether')
! q; H) D6 j9 J! t4 C8 h
>eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}); f' Y- l& O" D; z0 n$ z
$ r4 p {, g+ O1 k$ _2 x) R
这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount; W) p( E' I J2 x. h
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。1 S0 X$ A! L, s; y
$ `/ o: f& a( a# E8 ^
执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。
personal.unlockAccount(eth.accounts[0])
' c& G( ^5 S& W+ O/ n1 z$ S
然后执行转账操作。
回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。9 m; }% H% S4 h
' v6 n" V2 [3 H6 K
可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…" h$ O& e* [( Q3 z; j
8 _: t4 @5 l# U# r) l
要让交易生效,我们就必须要挖矿,去处理这个块。
1 m/ s& H3 ]7 B
启动挖矿。* ~/ h/ w& O* }6 f) y
1 {2 x+ ]5 b+ o" s5 ?; a
miner.start(1);admin.sleepBlocks(1);miner.stop();$ Y% C6 E: Q4 M# h( i/ d# t
4 f+ H* c- I1 `" i: t( G. f* ]
这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。& I' ?8 Q& S: O, \4 M8 u
当他返回为true的时候就说明挖完了。可以使用txpool.startus查看
' H+ p0 z2 G7 d# T! Q) M8 Z/ T
pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。
: t8 d7 [( q5 L+ B% R$ d; @5 h
账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8) l/ L$ A, T- [4 O
六.查看交易和区块高度
可使用以下命令查看当前区块
6 E1 J6 u1 x: u. |- k
eth.blockNumber* @6 y% B% d1 E) n
3 W2 J/ x7 w, \7 W/ g
使用以下命令可以通过区块高度查看交易信息
eth.getBlock(需要查看的高度)
也可以通过交易hash查看交易记录$ j% u A( {) t' j- ]
0 r+ W V" l N
eth.getTransaction(“交易hash”)( u0 ~% |' \- q" r/ i
( m, E7 }: K* T
七.连接其他节点
6 D5 |, m/ U6 l' v% t# d$ v# ]
为什么要连接别的节点?
9 x. I3 T6 \: z' v* Q7 y D; o8 o
因为:节点之间连接成功后,节点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.enode0 b9 v; j8 r0 p: ^
然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了 N# w# E/ T0 j! \; I5 Y
% m H5 z0 ]7 S+ ]& L7 Q
命令:admin.addPeer("节点B的enode地址"), I" s: W9 L* z' }7 p9 f
5 q X N! K5 R- ~
需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:
. p3 r3 P/ G! {% [
admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")
想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量8 t$ ~; i) y" N
2 z* b/ ]3 h6 l
可以看到节点B已经同步了区块和交易记录
成为第一个吐槽的人