Ubuntu18.04搭建以太坊私有链

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/m0_43404744/article/details/98335930

一、本地环境

操作系统: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个区块:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_43404744/article/details/98335930
今日推荐