第一步需要从官网或者国内镜像下载Geth安装包
环境是win10,Windows要求必须是64位系统,下载geth客户端和钱包客户端
下载地址: https://geth.ethereum.org/downloads/
安装过程比较简单。同意协议后选择安装目录后下一步就可以。
启动测试
打开运行 打开CMD 命令窗口 切换至安装目录下。
测试运行命令 geth help 执行后输出geth帮助文档。可以根据帮助文档了解命令含义。
配置自己的创世块
配置自己的创世块是为了区分公有链,在安装目录下新建创始区块文件genesis.json,同一个网络节点群中创始区块必须相同,否则无法连通:
案例:
{
"config": {
"chainId": 1101,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {
"a4c042e10b87069d37d03a8414750c10e5fe2269":{ "balance": "3000000000000000000" }
},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "200",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
参数说明:
名称 含义
chainId 区块链网络id,在连接到其它网络节点时会用到,以太坊公网id是1,不同id的网络节点之间无法互相连接
homesteadBlock Homestead是以太坊的第二个主要版本,第一个是Frontier,这个值设置为“0”表示目前正在使用Homestead版本
eip155Block eip(ethereum improvement proposal),设置为“0”即可
eip158Block eip(ethereum improvement proposal),设置为“0”即可
alloc 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以不需要预置有币的账号,需要的时候再创建即可
coinbase 矿工的账号,随意填写即可
difficulty 设置当前区块的难度,如果难度过大,则挖矿时间会比较长,为节省算力和等待时间可设置较小值
extraData 随意填写,可以填写你的个性信息,但必须为十六进制的字符串
gasLimit 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为创建的是私有链,所以填最大
nonce 一个用于挖矿的64位随机数,可以随便填写。nonce和mixhash的设置需要满足以太坊黄皮书,4.3.4. Block Header Validity,(44)章节所描述的条件
mixhash 与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意它和nonce的设置需要满足以太坊黄皮书,4.3.4. Block Header Validity, (44)章节所描述的条件
parentHash 上一个区块的哈希值,因为是创世区块,所以这个值是0
timestamp 时间戳
创建数据存放目录
makdir data0
执行后在安装目录下创建了一个文件夹
初始化创始块
geth --datadir data0 init genesis.json
说明: --datadir 指定了应用目录
创建初始账户
geth account new --datadir data0
查看初始账户
geth account list --datadir data0
以上步骤为客户端安装 私链的创建
客户端启动控制台
geth --datadir data0 --networkid 18 console
说明:--networkid
网络id在连接到其他节点的时候会用到,以太坊公网的网络id是1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络id
接着会进入一个交互式Javascript执行环境,这些对象主要包括:
- eth:-- 包含一些跟操作区块链相关的方法
- net:-- 包含以下查看p2p网络状态的方法
- admin:-- 包含一些与管理节点相关的方法
- miner:-- 包含启动&停止挖矿的一些方法
- personal:-- 主要包含一些管理账户的方法
- txpool:-- 包含一些查看交易内存池的方法
- web3:-- 包含了以上对象,还包含一些单位换算的方法
geth console的使用
- eth.accounts:-- 查看所有私有链用户地址
- personal.newAccount("password"):-- 新建账户
- eth.getBalance(eth.accounts[0]):-- 通过账户地址查看账户余额(eth.accounts[0]可以替换为用户地址)
- miner.start(2):-- 开始挖矿,参数表示启动的线程数量,第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。如果返回的是null 也不代表挖矿失败。原因网络上说是版本问题。
- miner.stop():-- 停止挖矿
挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做coinbase,默认情况下coinbase是本地账户中的第一个账户,使用 - eth.coinbase:-- 获得本地账户的第一个用户
要想使挖矿奖励进入其他账户,通过miner.setEtherbase()将其他账户设置成coinbase即可: - miner.setEtherbase(eth.accounts[1])
-- 默认情况下,getBalance()返回值是wei,wei是以太币的最小单位,要查看有多少个以太币,可以使用如下换算: - web3.fromWei(eth.getBalance(eth.accounts[1]), 'ether');
- miner.start(1);admin.sleepBlocks(1);miner.stop() -- 成功挖到一次矿后就停止
启动命令说明
geth --datadir data0 --nodiscover --networkid 1101 console 2> data0\geth.log
--datadir 指定数据存放位置
--nodiscover 节点私有化不希望被其他节点发现
--networkid 指定节点id
console 打开控制台
2> 指定日志输出文件
geth --rpc --rpcaddr 127.0.0.1 --rpcport 10070 --rpcapi "personal,db,eth,net,web3" -datadir data0 --networkid 10001 console 2> data0\geth.log
--rpc 启动rpc
--rpcaddr 指定ip地址默认为 localhost
--rpcport 指定rpc调用端口
--rpcapi 指定rpc命令可以使用的api方法集合
--dev 开发模式
--dev.period 1 指定挖矿进程数
常用命令:
personal.newAccount(‘账户密码’):创建账户;
personal.unlockAccount():解锁账户;
eth.accounts:列出系统中的账户;
eth.getBalance(eth.accounts[0]):查看账户余额,返回值的单位是 Wei;
eth.blockNumber:列出当前区块高度;
eth.getTransaction():获取交易信息;
eth.getBlock():获取区块信息;
eth.coinbase:第一种查看矿工账户地址的方式,矿工账户默认是第一个账户
web3.eth.coinbase:第二种查看矿工账户地址的方式
miner.setEtherbase(eth.accounts[1]):设置eth.accounts[1]为矿工账户地址
miner.start(12):开始挖矿;12是挖矿使用的线程数,可以自己设定。挖矿之后再查询coinbase余额,就会发现奖励。
miner.stop():停止挖矿;
web3.fromWei():Wei 换算成以太币;
web3.toWei():以太币换算成 Wei;
txpool.status:交易池中的状态;
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(4,‘ether’)}):第一个账户向转第二个账户转4ether;0840
关于开发者模式的使用
开发者模式注意事项 开发者模式不可以设置初始化块。否则无法匹配密码启动。需要开发者模式自己创建相关信息。关于开发者初始账户的密码为空
开发者模式下会自动挖矿。
开发模式启动命令
makdir data1 创建一个新的文件夹,来存储开发者环境下的数据
geth --datadir data1 --networkid 18 --port 30303 --dev --dev.period 1 console 2> geth1.log
输出
Welcome to the Geth JavaScript console!
instance: Geth/v1.10.1-stable-c2d2f4ed/windows-amd64/go1.16
coinbase: 0x3e2656f512482fde10374057e08f1ab29b5bb65c
at block: 1 (Thu Mar 25 2021 14:52:58 GMT+0800 (CST))
datadir: D:\work\Geth\data1
modules: admin:1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
To exit, press ctrl-d
>
说明:以下操作都是基于开发者环境下操作。
查看当前块高度
>eth.blockNumber
1090
>
```这里验证了自动挖矿
账户操作
创建一个账户
personal.newAccount("123456") ,输入参数就是密码,账户地址保存在keystore目录下 。
> personal.newAccount("123456")
"0xce9e45438fa9c0a22ebddd784*******************"
>
注意:一定要输入字符串,否则会报错!
查询账户信息
personal.listAccounts ,读取的是本地keystore目录下的账户地址信息
> personal.listAccounts
["0x3e2656f512482fde10374057*******************", "0xce9e45438fa9c0a22ebddd78*******************"]
>
检查连接信息和Enode
查看连接状态
net.listening ,查看当前连接状态信息
> net.listening
true
>
查看对等节点连接数量
> net.peerCount
0
>
查看所连接的私有链( --networkid 18)
> net.version
"18"
>
查看自己的Enode
admin.nodeInfo ,把自己的Enode暴露出去,可以让别人添加你的节点,让别人连入你搭建的私有链网络
image.png
查看自己连接的节点
admin.peers ,这个命令可以查看自己连接了那些对端节点,这里仅仅是网络自发现的节点。
image.png
添加别人的节点
admin.addPeer("enode://xxx@ip:port") , admin.nodeInfo可以看字enode信息格式
转账
说明为开发环境下的转账操作
上边有查看账户信息的操作 按照上边提到的命令进行操作即可 以下是演示操作。
> eth.accounts
["0x3e2656f512482fde10374057e08f1ab29b5bb65c", "0xce9e45438fa9c0a22ebddd784b6ee625c6823527"]
> eth.getBalance(eth.accounts[0])
1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+77
> eth.getBalance(eth.accounts[1])
0
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(4,'enther')})
Error: This unit doesn't exists, please use the one of the following units{
"noether": "0",
"wei": "1",
"kwei": "1000",
"Kwei": "1000",
"babbage": "1000",
"femtoether": "1000",
"mwei": "1000000",
"Mwei": "1000000",
"lovelace": "1000000",
"picoether": "1000000",
"gwei": "1000000000",
"Gwei": "1000000000",
"shannon": "1000000000",
"nanoether": "1000000000",
"nano": "1000000000",
"szabo": "1000000000000",
"microether": "1000000000000",
"micro": "1000000000000",
"finney": "1000000000000000",
"milliether": "1000000000000000",
"milli": "1000000000000000",
"ether": "1000000000000000000",
"kether": "1000000000000000000000",
"grand": "1000000000000000000000",
"mether": "1000000000000000000000000",
"gether": "1000000000000000000000000000",
"tether": "1000000000000000000000000000000"
}
at web3.js:2135:15(31)
at web3.js:2190:63(10)
at <eval>:1:78(19)
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(4,'tether')})
"0x2acc8383acca1e1cdbaa0fe717eae51d9737024eec0cd10d46fbebcee0e382de"
> eth.getBalance(eth.accounts[0])
1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+77
> eth.getBalance(eth.accounts[1])
0
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x3e2656f512482fde10374057e08f1ab29b5bb65c
Passphrase:
true
> personal.unlockAccount(eth.accounts[1])
Unlock account 0xce9e45438fa9c0a22ebddd784b6ee625c6823527
Passphrase:
true
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(5,'ether')})
"0x87843c4238da1366618f50bd418dd69e058a08f4e03c51612a1ebe2eb1168ff1"
> eth.getBalance(eth.accounts[1])
0
> eth.getBalance(eth.accounts[0])
1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+77
>
上述代码中可以看出基本流程 先查询账户信息、查询额度、错误的转账单位提示所以单位信息、解除账户锁定、转账等操作。
上述中在执行过程中首先第一步是解锁转账人账户也就是第一个账户,然后在发送交易。发送完交易后,可以查看第二个账户上并没有转过来的4个以太币,这是为什么呢?因为没人挖矿,所以这笔交易并没有计入区块链,当有矿工挖矿计入区块链后,第二个账户才真正拿到这笔交易。如下图,说明这笔交易提交了,但是还在处理中。挖矿后,pending就为0了。
> txpool.status
{
pending: 3,
queued: 0
}
>
查看转账交易
eth.getTransaction("0x87843c4238da1366618f50bd418dd69e058a08f4e03c51612a1ebe2eb1168ff1"),参数为交易返回hash
{
blockHash: null,
blockNumber: null,
from: "0x3e2656f512482fde10374057e08f1ab29b5bb65c",
gas: 21000,
gasPrice: 1,
hash: "0x87843c4238da1366618f50bd418dd69e058a08f4e03c51612a1ebe2eb1168ff1",
input: "0x",
nonce: 2,
r: "0xc9d70307157a40e289d15e175fcfb3a87ca12bf0f905e248bc8759e1c7aacdc3",
s: "0x787ec2f9db235ffaa6d87ba1a69773f2e69edecba6beb14c3d576cdfb624d002",
to: "0xce9e45438fa9c0a22ebddd784b6ee625c6823527",
transactionIndex: null,
type: "0x0",
v: "0xa96",
value: 5000000000000000000
}
查看区块信息
下面就是一个典型的区块的数据结构,我们可以看到transactions字段中得知看当前块记录了几笔交易
eth.getBlock(22)
{
difficulty: 2,
extraData: "0xd883010a01846765746886676f312e31368777696e646f777300000000000000666d65acd5d11be7680f3ee23f16e6d6f74461fd7bb9c8ceb3ad637bb7e00c462bcbb5bf6464bbc1995cb8e12df300928b65ebb5b7f3f4dd08e2dccc6a0fda8900",
gasLimit: 11255480,
gasUsed: 0,
hash: "0xc29df7ac05babbed96728e09cbe49706db3232d98096e86ec763b15cf405412d",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x0000000000000000000000000000000000000000",
mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
nonce: "0x0000000000000000",
number: 22,
parentHash: "0x7431df223915f01fe0ba75a0daf1785385c8c4deed872ff1208fad966652d266",
receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 606,
stateRoot: "0x03e893386a4cac2d423660bd39d56e560499bb07cc6b31a171c35cf0c4923839",
timestamp: 1616655199,
totalDifficulty: 45,
transactions: [],
transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
uncles: []
}
网友评论