版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一、本地环境
操作系统:Ubuntu18.04
软件:geth
二、安装git
1.安装
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
2.验证
git --version //git version 2.22.0
三、安装geth
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum
geth help //查看是否安装成功
四、创建创世区块文件
1.创建私有链专用文件夹
mkdir /home/dong/Documents/private_chain
2.创建创世区块文件
创世区块文件是一个json格式的文件,一般命名为genesis.json,将其保存在private_chain目录下,其内容如下:
{
"config": {
"chainId": 520,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000005201314",
"difficulty" : "0x0001",
"extraData" : "0x0000000001",
"gasLimit" :"0xffffffff",
"nonce" : "0x0000000000000020",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
3.创世区块文件解析
名称 | 含义 |
---|---|
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 | 时间戳 |
4.如果想在创世区块中预置一些账户,可以在alloc参数中添加内容
"alloc":{
"0xccfc92450bb42cb0b8f5cbceef5f009e02ec0665":{
"balance":"1000000"
},
"0xccfc92450bb42cb0b8f5cbceef5f009e02ec0666":{
"balance":"2000000"
},
"0xccfc92450bb42cb0b8f5cbceef5f009e02ec0667":{
"balance":"3000000"
}
},
五、创世区块初始化
// --datadir:指定私链数据的存放目录。当要在同一计算机中创建其他私链节点时,可创建另外的文件夹,例如:another_node。
// 然后通过--datadir another_node来区分不同的私链节点,如果未设置--datadir,则会读取以太坊主网的数据,默认位置在/root/.ethereum中。
geth --datadir "/home/dong/Documents/private_chain/" init genesis.json
初始化信息截图
这时候会发现指定的目录下多了geth和keystore两个文件夹:
- geth保存的该链上的区块数据
- keystore保存的该链上的用户信息
六、启动私有链节点
geth --networkid 520 --datadir "/home/dong/Documents/private_chain/" --identity "kexin" --rpc --rpcport "8545" --rpcaddr "localhost" --port "30303" --nodiscover --allow-insecure-unlock --rpcapi "eth,net,web3,personal,admin,shh,txpool,debug,miner" console
参数 | 含义 |
---|---|
networkid | 网络ID,具有同一网络标识的区块原则上可以连接,id为1为以太坊主网络,1-4网络已经被以太坊自行占用,因此不能使用1-4作为自己的私有链网络ID |
datadir | 指定区块链数据的存储位置 |
identity | 区块链的标示,用于标示目前网络的名字 |
rpc | 启动rpc通信 |
rpcport | 指定 HTTP-RPC 服务监听端口号,默认为 8545 |
rpcaddr | HTTP-RPC 服务ip地址,默认为"localhost" |
port | 指定和其他节点连接所用的端口号(默认为30303) |
nodiscover | 关闭节点发现机制,防止加入有同样初始配置的陌生节点 |
rpcapi | 设置允许连接的rpc的客户端,一般为db,eth,net,web3 |
console | 启动命令行模式,可以在Geth中执行命令 |
七、简单的操作测试
1.创建账户
创建成功将返回账户地址address(相当于账户名)
personal.newAccount("kexin") //“kexin”是账户密码
2.查询账户
eth.accounts
查询到的账户地址是一个数组,可以用索引查看账户的地址:
还可以使用下列命令来查询账户:
personal.listAccounts
personal.listAccounts[0]
3.查询账户余额
eth.getBalance(eth.accounts[0]) // 通过eth.accounts[0]获取账户地址
eth.getBalance("0x99bcfb3127a4181ee5b1ac0a32ffa016cdc10829") // 直接给出账户地址
balance=web3.fromWei(eth.getBalance(eth.accounts[0]),"ether") // eth.accounts[index]会按传入的索引返回已有的账户, eth.getBalance(address)会返回账户的余额,余额是以wei为单位
4.查询矿工的账户地址
挖矿所得的奖励会进入矿工的账户。这个账户叫做 coinbase,默认情况下 coinbase 是本地账户中的第一个账户。
eth.coinbase // 第一种查看矿工的账户地址的方式,该地址默认为第一个账户地址
web3.eth.coinbase // 第二种查看方式
5.设置矿工的账户地址
矿工的账户地址即奖励地址
miner.setEtherbase(eth.accounts[1]) // 设置eth.accounts[1]为挖矿的账户地址
6.开始挖矿
start 的参数表示挖矿使用的线程数,第一次启动挖矿会先生成挖矿所需的 DAG 文件,这个过程有点慢。等进度达到 100% 后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。
miner.start(1)
7.停止挖矿
miner.stop()
8.查询矿工账户
eth.getBalance(eth.accounts[0]) // eth.getBalance()默认返回的单位是wei,1 ether = 1e18 wei
web3.fromWei(eth.getBalance(eth.accounts[0]),"ether") // 以ether作为单位,返回账户余额
9.连接其他节点
(1)查看自己的节点信息
admin.nodeInfo
(2)添加节点
在其他节点的命令行中输入:
admin.addPeer('enode://60e2b5181a59e263462d21abf4d2d4c8ea37ab9f5524a6de86ce9bb05d68623ae2397d460866fe875edb3a95a155fad695eff4ddae68b627f654aea3e55a860c@100.74.124.28:30303?discport=0')
(3)查看节点
如果添加成功,输入admin.peers
会显示出新添加的节点。
10.账户转账
账户eth.accounts[0]向账户eth.accounts[1]转账
(1)解锁eth.accounts[0]
personal.unlockAccount(eth.accounts[0],"kexin",0) // 参数分别为accounts[0]的地址、密码、解锁时长(秒为单位),0 代表解锁至程序退出。
(2)开始转账
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(4,'ether')})
// 这时如果立刻查询eth.accounts[1]的余额,会发现账户余额还是0,因为虽然我们发起了交易,但并没有矿工挖矿打包交易。
// 只有再次执行miner.start(),然后再查询eth.accounts[1]的余额,才会发现eth.accounts[1]的账户里面已经有金额了。
(3)查看等待被打包的交易
txpool.status // 查看交易池中等待被打包的交易
txpool.inspect.pending // 查看已提交但还未被处理的交易,pending表示已提交但还未被处理的交易
eth.getBlock("pending", true).transactions // 查看当前待确认交易
11.查看交易和区块
(1)查看当前区块总数
eth.blockNumber
(2) 根据执行eth.sendTransaction()时返回的hash值,查询提交转账申请时的信息
eth.getTransaction("0xf715f8a49a8692ab98966db1356d17bd3def642068c49782b153a1351ca40e10")
(3)根据执行eth.sendTransaction()时返回的hash值,查询一个交易的收据。
eth.getTransactionReceipt("0xf715f8a49a8692ab98966db1356d17bd3def642068c49782b153a1351ca40e10")
处于pending状态的交易,收据是不可用的。
(4)查询最新区块
eth.getBlock('latest')
(5)根据number或hash查询区块
eth.getBlock(number)
eth.getBlock(hash)
下面为查询第40个区块: