Window环境如何下搭建以太坊私链
大叔的爸爸
发表于 2022-12-6 19:45:56
155
0
0
2 t9 @& K) A, A
官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror4 @1 s" ]8 O5 k5 @7 l7 Y' A
2 p# q- y3 M q" }7 | J. V
一直下一步就行。! w4 B" ?$ s6 p! R% t; f, Z5 L
注意:安装的时候最好不要安装在带有空格的目录
二.准备配置文件
进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:
解释一下各个参数的意思1 R; V( \) n% X$ H9 M- B2 f; t2 b
Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件
$ W; R6 {. ^+ d( Y; \
Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。
Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。. ^0 r# X% |1 I
-alloc是预置账户的地址和账户预置的以太币数量。
-Coinbase矿工的账号,这里可以随便填
-Timestamp设置创世块的时间戳,这里也填0x00就行" k' H+ [( l8 \3 @( b
-Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0
-extraData附加信息,相当于个人说明,可以随便填。0 l U, [ m" ?# v" ]/ |! m
, B% g- h- ^$ A, F2 U
-gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。: Y" H. u8 z* ]1 F: M, ]
Config是配置文件,必须要写不然会爆一下错误。
' [5 t7 p! F; y( o, N/ v( W) M7 a X
三.写入创世块
配置好以后执行以下命令写入创世块
8 {" p" ]9 i( f$ T9 `
geth--datadirtestinitgenesis.json1 c5 ?0 {/ B4 Z$ _3 Q) k3 c
; ?+ @7 x( g e, y5 q
命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。% V# N; I0 G/ m& y5 I
创建成功回显是这样的
三.写入创世块
) q6 \% p" s* w
配置好以后执行以下命令写入创世块7 {7 B \7 ?* F' [2 B
geth--datadirtestinitgenesis.json
& a( u5 S2 F8 g: e) Y7 m$ d2 \- ?
命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。
创建成功回显是这样的9 I6 U( ?; t3 M) a: K+ |3 R- E
然后执行一下面命令启动私链。) @( t8 [2 Y, |6 U4 G3 S/ f
: v- X: B) O5 m9 o& F5 ~1 \" Y; t
geth--datadirtest--networkid1111--nodiscoverconsole7 G l; t" X5 ]& \
0 ?7 S8 \5 @8 Y, C: t( g
console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点
% v9 O* q8 ^) V1 p3 g
使用eth.accounts查看现有的用户,我们没有添加用户,所以为空. ?6 K- j& V) ~( V
接下来我们创建两个密码为123456账户。. s6 P& t9 O/ v* D6 C
创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()1 V& q# l5 E! W: G
注意:此命令区分大小写。. D; h0 t A/ Q. I& d& m* x# t/ M
! {, h7 Y" ~2 V( o1 l0 f
添加过后再查看就能看到我们刚刚创建的账户了
使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为0
2 u0 R% [5 W# K7 L
四、开始挖矿% G# \, e6 A* j# p" [: a! b- U
" U2 I) o" v: K2 b7 c4 `2 ?
使用miner.start()命令来启动挖矿。" d3 w% x* y+ a( h
C7 T8 ?0 T2 s3 b- N9 t( ~' O
start()里面可设置线程,如:miner.start(5)表示五线程。; S2 O. V1 @* X* y
运行以后会被挖矿信息刷屏。8 ] P& |* a% E- ^4 v( R6 c1 {, C
第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。
' {+ a0 N; j6 P& x0 G9 o
开始挖矿以后你的CPU会飚的很高,甚至会卡卡的1 C& Z" {# p1 c/ J3 q: Z
如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。
5 O3 F2 u7 F: P
挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
& `. B, E( l, M, z: v7 l1 P
使用eth.coinbase查看账户地址
没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。6 y9 [, X3 i/ G) C
我们切换为0因为这个账户有钱方便做测试* C) E8 ^% u+ D* Y7 i9 |% ~
别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。
web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
五.发送交易
先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。
/ P! I( h# H/ X; n1 n4 X; B" @
发送一笔交易,从账户0中转移2个以太币到账户1中
>amount=web3.toWei(2,'ether')$ Q- r3 K8 U$ Z
: q" o" l+ K2 R: h
>eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})/ q+ @8 v& Q2 c
这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount
5 w( u0 G8 I% Z0 f" ^% T
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。
! r4 u- a5 W' x) `& T8 F. r9 z9 {
执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。
- y1 M* `) ?+ i
personal.unlockAccount(eth.accounts[0])6 \ B: B& R$ w- e! l' m
8 v+ B: Y7 y9 `( K, o* F# c7 T# v
然后执行转账操作。7 p2 Z7 K2 L. _# O
- c0 Z9 i; A0 C
回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。7 G! {: `( ?5 b4 u- w1 Q
, R3 F) P8 f; L+ Q; H/ W
可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…& E8 [* w& _, B3 D( }9 q. _1 T
要让交易生效,我们就必须要挖矿,去处理这个块。
启动挖矿。
; \) T! m2 c* ^9 ^
miner.start(1);admin.sleepBlocks(1);miner.stop();! X" J/ v+ ?2 _; q7 a1 M9 ^* |
这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。
当他返回为true的时候就说明挖完了。可以使用txpool.startus查看
pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。
账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8
六.查看交易和区块高度
+ B6 J/ v# R" v2 F! ?9 d
可使用以下命令查看当前区块) a/ Z/ _7 k g% c. d$ l% \4 p& H
eth.blockNumber
使用以下命令可以通过区块高度查看交易信息
. T& @8 m# {; B$ ?
eth.getBlock(需要查看的高度)
8 Z4 o2 ~7 k2 h% q0 q& X
也可以通过交易hash查看交易记录9 l3 T0 r c( A
0 d3 F4 N* z' L+ S u. D% y
eth.getTransaction(“交易hash”)2 [' f% [: g z" X
- c- L2 Z4 W$ M0 Q& V
七.连接其他节点
% q4 D. ~: G5 R: R3 @8 O+ f T
为什么要连接别的节点?
因为:节点之间连接成功后,节点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
8 _4 g2 a. V/ m3 j. u
然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了
命令:admin.addPeer("节点B的enode地址")
需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:
$ v9 {7 g! `: [5 O+ J7 H
admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")" O9 z% r e' J [/ D+ Z, u6 a
想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量' Q+ Q7 I5 ?4 y. K
4 P# g4 E8 r; y
可以看到节点B已经同步了区块和交易记录
成为第一个吐槽的人