Window环境如何下搭建以太坊私链
大叔的爸爸
发表于 2022-12-6 19:45:56
107
0
0
官网下载:https://ethfans.org/wikis/Ethereum-Geth-Mirror; {, Q5 k3 h' Y# Q, b( e/ m
一直下一步就行。
+ [0 I% s2 m0 v# Z! y1 d& g- K+ W
注意:安装的时候最好不要安装在带有空格的目录# C- R) u) J8 B2 p @7 e
二.准备配置文件
进入geth目录或你想要存放的目录,创建genesis.json文件(可自定义),文件内容如下:; t6 j# r9 c; I& E8 F s
解释一下各个参数的意思
) t# v( n% B9 ~, G# A) z. F" I% x( w* A
Nonce是一个64位的随机数,用于挖矿用的。他和mixhash的设置需要满足以太坊的官方条件1 R+ [" Z7 j3 {5 }( P1 F# ?9 V
Mixhash与Nonce配合用于挖矿,这是又上一个区块的一部分生成的hash。: f/ [ U2 i+ a4 P/ t: X" K& Q
Difficulty设置当前的难度,如果难度太大的话,cpu挖矿就很难,这里设置的小点,这样比较好挖。2 z9 ]% g2 z; C$ G
-alloc是预置账户的地址和账户预置的以太币数量。, v% m3 G- l! i: A0 y6 l. D% |7 ~0 i R
7 W8 U5 n+ l+ l
-Coinbase矿工的账号,这里可以随便填
-Timestamp设置创世块的时间戳,这里也填0x00就行* _5 {) e: L! c# [/ u. e9 R% B
9 q5 r+ v: X- ^9 h' O
-Parenthash上一个区块的hash值,我们的是创世块,上面没有区块所有填0. Y# v- o1 j( c
-extraData附加信息,相当于个人说明,可以随便填。
-gasLimit这个是GAS的消耗总量限制,我们的是私链,用于测试,填大点好。
- \8 n+ x& A3 k" y
Config是配置文件,必须要写不然会爆一下错误。
三.写入创世块
9 w* j6 l! [/ t$ A
配置好以后执行以下命令写入创世块1 m/ r# X! s! o- K0 Y; N1 h0 O
geth--datadirtestinitgenesis.json0 l+ i9 C! e+ R2 W! R" [/ w
) |* k7 U, U/ t/ @& R& l
命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。 s5 M- N; f4 D, H2 z2 w1 s
( @) H5 o8 L6 a1 E
创建成功回显是这样的
三.写入创世块
) c9 c" A( i0 j @, b" t& Q& K
配置好以后执行以下命令写入创世块
geth--datadirtestinitgenesis.json; K% f2 D. U$ g# i0 Z' H
7 K9 ]. w. k. E2 _7 g
命令中的--datadir选线后面跟着一个自定义目录,这里的意思是数据存储在test文件夹中,init表示初始化区块链,genesis.json是init命令的参数,是指定的配置文件。1 V4 v* M5 @6 K( W2 r' M) ]
) Q# e8 a' T: s4 Q6 F3 E
创建成功回显是这样的# j$ e. V7 e2 V
然后执行一下面命令启动私链。; D) M9 [0 E" U. t0 i* u+ T
* ]: U& W4 X" \& K4 \
geth--datadirtest--networkid1111--nodiscoverconsole
" E( W: v/ {3 B Y& M
console表示进入交互控制台,--datadir选项指定使用test数据目录,--networkid后面跟着数字,这里的1111表示这个私有链的网络ID为1111。以太网公网的网络ID是1。--nodiscover禁止节点发现手动添加节点) m- W4 n; b2 ~( \9 ~
9 }% D o8 Y5 M% _( H( P2 J
使用eth.accounts查看现有的用户,我们没有添加用户,所以为空
1 S4 `- e4 V6 [4 H: O
接下来我们创建两个密码为123456账户。4 f2 T3 F: ^* L1 t
创建账户的命令为:personal.newAccount(“密码”)或者personal.newAccount()
注意:此命令区分大小写。- v7 | x* j! E( j3 U; C. M% M7 c+ M
' ^8 Z& c* o/ p$ a; G# n
添加过后再查看就能看到我们刚刚创建的账户了# F- L7 e/ h# c- i, Q- Y2 \, a! C3 i5 m
使用eth.getBalance获取账户余额。刚刚创建的两个账户没有钱,所以为03 K* |+ _( z! u }! T
四、开始挖矿
使用miner.start()命令来启动挖矿。
start()里面可设置线程,如:miner.start(5)表示五线程。4 O$ _5 I# C: l* p
( `* w8 T/ t$ F' f% X4 Q8 a
运行以后会被挖矿信息刷屏。
第一次挖矿会先生成挖矿所需要的DAG文件,需要等这个进度100%以后才会开始挖。这个过程会很慢。
开始挖矿以后你的CPU会飚的很高,甚至会卡卡的6 I' Y; I/ x. K- S/ k- N+ t z7 n0 A
* v, M* a8 j9 k; W
如果字符被挖矿刷屏信息冲掉,没有关系的,只要输入完整的miner.stop()之后回车,即可停止挖矿。2 R7 w2 P4 t+ h+ S/ b! V7 R. n
挖到一个区块以后会有五个以太币作为奖励,挖矿的奖励会进入矿工的账户,这个账户默认是coinbase,默认情况下这个账户是本地账户中的第一个账户。
& U$ w5 H0 y" B6 V) ~4 @7 G
使用eth.coinbase查看账户地址
没挖矿前,coinbase账户的余额是0,挖到一个区块后会自动转到这个账户,如果想转到别的账户可以通过miner.setEtherbase(eth.accounts[下标])命令更换接收奖励的账户。
我们切换为0因为这个账户有钱方便做测试0 R4 C& @* p/ `, @
& ?- _, i' n3 s- K
别看这里那么多个0其实只有五个以太币。getBalance()返回值的单位是wei,wei是以太币中最小的单位,一个以太币等于10的18次方个wei。想要查看有多少个以太币,要用web3.fromWei()函数将返回值算成以太币。
web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
8 B" m' {0 i. F" i
五.发送交易
先查看一下我们两个账户的余额。账户0有五个以太币账户1为零个。/ Z' E5 Y" g; F) G: `3 v6 C% I
1 Y1 s3 H/ j, T3 i( L4 f* i
发送一笔交易,从账户0中转移2个以太币到账户1中! i f' T& y. g' ^: @+ i
0 R) o) n- H+ E6 M$ v4 I5 p
>amount=web3.toWei(2,'ether')* f) F4 ~+ ^ h
>eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}). Z! U. g+ ], a! t+ x6 u
这里amount=web3.toWei(2,'ether')是把两个以太币转换为wei赋值给amount
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})函数的第一个参数是发送者地址,第二个接收者的地址,第三个是转账的金额,以wei为单位。
执行报错是因为账户每过一段时间就会被锁住,要发起交易,需要先输入密码解锁账户,从那个账户发起的交易就要解锁那个账户。$ A% y9 }- |" h$ ~$ f f
" V2 _* W2 x& F. x
personal.unlockAccount(eth.accounts[0])( _ G- D# a5 n
! B% b8 i& A1 l+ d0 f
然后执行转账操作。( d$ l$ w' x B2 B+ o* [# O
回显这个说明交易已经提交到区块链里了,返回的hash值是交易hash,但是交易并未被处理。可以通过txpool.status来查看状态。
- ?7 X" Y1 f& J- O# _/ f. H: }! k
可以看到pending里有一条交易信息,pending的意思是已提交但还未被处理的交易。等待中…
1 _( c2 A; [( `1 a7 z
要让交易生效,我们就必须要挖矿,去处理这个块。* z# p0 i) H3 a6 @. `& W- k
, J& A' e4 Q. a
启动挖矿。5 ?/ q% M3 O1 ^: {( E
miner.start(1);admin.sleepBlocks(1);miner.stop();, P8 G! C! ~ ^4 E# X
这条命令的意思是启用一个线程来挖矿,挖到第一块区块就停止挖矿。
当他返回为true的时候就说明挖完了。可以使用txpool.startus查看" J! C, T( X4 D; X6 d% M% ]) L$ B
pending为0说明交易已经被处理了,可以通过以下命令查看账户余额。
) N0 }! ^* b" C* [9 u1 S- s- X4 O
账户1的余额已经有了我们刚刚用账户0转出的2个以太币了,账户0余额有8个以太币是因为刚刚我们挖矿的奖励3+5=8% O7 \2 b' g& ^$ ?0 \/ q- a8 v; P9 e3 R
5 C% P8 N: Y" r2 Z( e9 {. J, G
六.查看交易和区块高度
0 q5 Z; M% R) S; H
可使用以下命令查看当前区块* N# Q% l" T- P+ H2 S' R; ~4 P
eth.blockNumber% \& s9 r& X% ]6 K8 C
使用以下命令可以通过区块高度查看交易信息% P5 n* N! ~/ J) s/ ~5 t) n
eth.getBlock(需要查看的高度)
也可以通过交易hash查看交易记录) G8 p7 A/ d3 g
* r) q# V' Y k; g" J9 t5 b
eth.getTransaction(“交易hash”)
七.连接其他节点8 g- [; G' g! a) `5 n
D; }' T7 G- L( N$ E0 k W
为什么要连接别的节点?* w2 v, P9 _* q' X
, _/ y7 N6 Q+ F
因为:节点之间连接成功后,节点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
1 C7 |# V7 i& p) e' K; y9 S! U
然后在节点A的console中执行admin.addPeer()方法这样就可以连接到节点B了$ I* V8 f4 E V& \' x& Q, h# I0 @1 b
命令:admin.addPeer("节点B的enode地址")3 K6 J: i1 K/ f. o
需要注意的是@后面的0.0.0.0需要换成节点B的IP地址如:
admin.addPeer("enode://1dbfc88113b0b95ec96ba9666a37aef07aee8aa64fceaed077d7c0e7a17f7e8a7756832af6b2b7d286cc6f03bcf2a8d80ef815a175e468c13da808513cf66500@127.0.0.1:30303")
: W! @! B T9 j. a$ J
想查看是否连接上可以通过admin.peers查看连接到的其他节点的信息,通过net.peerCount可以查看到节点连接的数量
. j6 G/ a" J0 L3 p6 k$ G
可以看到节点B已经同步了区块和交易记录
成为第一个吐槽的人