Centos7安装geth,搭建部署以太坊私有链

目录

一、安装系统依赖

二、安装cmake

三、按照golang

四、按照部署geth

1、github上进行克隆自己编译(不推荐很容易报错环境什么的)

2、直接使用二进制文件就是官网上他配置好的直接进行部署(推荐)

五、 防火墙及网络时间同步

六、 私有链搭建

七、geth启动后相关简单操作


一、安装系统依赖

# 更新系统并安装基础工具
sudo yum update -y
sudo yum install -y git gcc-c++ make wget

二、安装cmake

智能合约的编译需要使用cmake 

wget https://cmake.org/files/v3.15/cmake-3.31.5.tar.gz
//网太慢的话建议先本地官网下载对应版本在移到虚拟机中去
tar zxvf cmake-3.15.2.tar.gz
mv cmake-3.15.2 /usr/local/
cd /usr/local/cmake-3.15.2
./bootstrap
gmake
gmake install

三、按照golang

 以太坊大部分语言是golang和java,

# 下载Go 1.20+,同样网不好的话建议本地下载对应版本后移到虚拟机中
wget https://golang.org/dl/go1.21.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz

# 配置环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
source ~/.bashrc

# 验证安装
go version  # 应输出:go version go1.21.0 linux/amd64

四、按照部署geth

1、github上进行克隆自己编译(不推荐很容易报错环境什么的)

可以选择直接克隆go-ethereum

也可以去github上本地下载他的zip包然后移到虚拟机中再解压 (东西都下到/usr/local/中去了记得把解压后的移到这个目录下)

cd /usr/local
git clone https://github.com/ethereum/go-ethereum.git  
cd go-ethereum/
make all
echo "export PATH=$PATH:/usr/local/go-ethereum/build/bin" >> /etc/profile
source /etc/profile

make all的时候如果出现DNS域名错误的问题,各种方法解决不了可以采用下面的强制解析

强制解析mirrorlist.centos.rog

echo "152.19.134.191 mirrorlist.centos.org" | sudo tee -a /etc/hosts

 make all出现

// for(size_t i = 0; i < DST_len; i++) dst[i] = DST[i]; ^ /root/go/pkg/mod/github.com/supranational/blst@v0.3.14/bindings/go/blst.go:42:10: note: use option -std=c99 or -std=gnu99 to compile your code util.go:47: exit status 1 exit status 1 make: *** [all] Error 1

是GCC版本太低,换个高版本匹配的再进行make all

 如何换呢,因为我用的是centos7,它只能gcc 4.8.5版本,不接受更高而且官方已经对7停止服务了。所以得下面三条指令。

yum install centos-release-scl
sudo yum install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash

但是缺点是,他是把9装到了一个环境中,每次使用需要启动一下那个环境,但是如果想永久的可以修改 /etc/profile

echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
source /etc/profile

 直接将配置文件进行修改,这样后面每次打开都是9.

2、直接使用二进制文件就是官网上他配置好的直接进行部署(推荐)

直接go-ethereum官网上:Downloads | go-ethereum

下载你对应的版本,然后直接解压

1、下载官方包
wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.15.2-c8c62daf.tar.gz
2、解压
tar -zxvf geth-linux-amd64-1.15.2-c8c62daf.tar.gz 
3、进入geth-linux-amd64-1.15.2-c8c62daf
cd geth-linux-amd64-1.15.2-c8c62daf/
4、快速同步到网络的当前状态
./geth console
5、
source /etc/profile

提示,因为 geth1.11以上版本,当执行personal等指令时会出现异常,这是因为新版本的geth已经取消的personal等模块。出于安全考虑默认禁止了HTTP通道解锁账户,为了操作方便,降级下载了1.10.26版本的geth客户端,解压压缩包。

五、 防火墙及网络时间同步

  • 开启网络时间同步
systemctl enable ntpd 
systemctl start ntpd
  •  开启防火墙  

开启防火墙,打开Geth使用的8087和30303端口

systemctl start firewalld
firewall-cmd --zone=public --add-port=8087/tcp --permanent
firewall-cmd --zone=public --add-port=30303/tcp --permanent

以上步骤完成后geth的安装部署就已经完成了,每次启动直接geth就好

六、 私有链搭建

建立一个新的目录privatechain用于后续文件存放

mkdir privatechain
cd privatechain

创建并编写genesis.json配置文件

vim genesis.json

{
  "config": {
    "chainId": 999,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "berlinBlock": 0,
    "ethash": {}
  },
  "difficulty": "1",
  "gasLimit": "8000000",
  "alloc": {
    "7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
    "f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
  }
}

创世配置就是供以太坊私有链第一次启动时所使用,创世区块是最特殊的区块,它没有前一个区块,因为它自己是第一个块。上面的内容是保存在genesis.json文件中的。

必填
chainId自定义私链的网络ID,不同的网络ID无法互联通讯,以太坊公链ID 为1,我们设置为999以防止与网络中其他私链冲突。后续多节点的时候id必须相同才能相连
homesteadBlock是否为HomeStead版本的区块,设置为0表明是。
eip155BlockEIP155 [1] 是一个以太坊分叉提议,为了和以前的以太坊经典ETC 链条分叉而存在,我们私链不需要它,设为0。
eip158BlockEIP158 [2] 是一个以太坊分叉提议,为了解决之前以太坊空账户造成效率低下的协议漏洞而分叉,我们私链不需要它,设为0。
difficulty设置当前区块难度,若难度过大挖矿就很慢,我们设置较小值。
gasLimit单一区块最大 gas 消耗上限,用来限制能够打包进入块的交易数量与信息总和,我们在学习中可以设置为最大。
选填
coinbase打包该块的矿工的奖励地址,因为是创世块,可设为0地址。
extraData打包该块时矿工记录的笔记。
nonce打包该块时矿工挖矿所用到的Ethash输入参数nonce。
mixHash与nonce配合用于挖矿,创世区无前一个区块,可不填。
parentHash前一个区块头的哈希值,创世区块无前一个区块,设为0。
timestamp打包该块的时间戳,符合Unix Timestamp标准,设为0。
alloc创世时各账户分配以太币的数量,不想分配则忽略。

接下来对创世区块进行初始化

进入 privatechain 目录,执行初始化。

geth init --datadir ./data genesis.json

成功标志:“Successfully wrote genesis state”

 data用于存储后续区块链的文件信息

目录变化为:

root:rungeth yk$ tree data/
data/
├── geth
│   ├── chaindata
│   │   ├── 000001.log
│   │   ├── CURRENT
│   │   ├── LOCK
│   │   ├── LOG
│   │   └── MANIFEST-000000
│   └── lightchaindata
│       ├── 000001.log
│       ├── CURRENT
│       ├── LOCK
│       ├── LOG
│       └── MANIFEST-000000
└── keystore

程序自动新建了 geth 目录。 该目录存放了区块链的所有运行时产生的区块链数据、日志、世界状态并随着区块链增长而占据更多存储硬盘空间。 它内部的两个子目录存储了具体的区块链数据。 db 目录下还有一个 keystore 目录。该目录下保存了各个账户的私钥的加密后的文件, 与我们学习过的 资料篇:Keystore 与私钥保存 相对应。只有在签名的时候用户才会解锁 keystore 执行签名操作。

创建挖矿账户

geth account new --datadir data

口令不能忘 

在我们现在的环境下,需要启动一个 Geth 节点来接入私链网络(实际上也是这个私链网络的唯一一个节点),负责在创世块后挖出第一个块。该节点也是我们与以太坊私链通信的节点服务器。下面我们来启动这样一个节点。

geth --datadir ./data --networkid 999  --http --http.addr 0.0.0.0 --http.vhosts "*" --http.api "db,net,eth,web3,personal" --http.corsdomain "*" --snapshot=false --mine --miner.threads 1 --allow-insecure-unlock  console 2> 1.log
参数解释
datadir指定之前初始化的数据目录文件
networkid配置成与配置文件config内的chainId相同值,代表加入哪个网络,私链就自己随意编号即可
http代表开启远程调用服务,这对我们很重要
http.port远程服务的端口,默认是8545
http.api远程服务提供的远程调用函数集
http.corsdomain指定可以接收请求来源的域名列表(浏览器访问,必须开启)
allow-insecure-unlock新版本增加的选项,允许在Geth命令窗口解锁账户
mine开启挖矿
miner.threads设置挖矿的线程数量
miner.threads设置挖矿的线程数量
console进入管理台
2> 1.logUnix系统下的重定向,将Geth产生的日志输出都重定向到1.log中,以免刷日志影响操作

geth版本不同,指令可能会有些许差异,请自行注意

启动后会显示:

Welcome to the Geth JavaScript console!

instance: Geth/v1.10.11-stable/darwin-amd64/go1.17.1
at block: 0 (Thu, 01 Jan 1970 08:00:00 CST)
 datadir: /Users/yk/ethdev/yekai1003/rungeth/data
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

> 

七、geth启动后相关简单操作

查看当前存在的账户

eth.accounts

创建账户

> personal.newAccount("yourpassword")
"0x70aea0aea5bf9568a650598dfef44d6d3cca209a"
> eth.accounts
["0x70aea0aea5bf9568a650598dfef44d6d3cca209a"]

启动挖矿,括号里是矿工也就是挖矿的线程数量,null并不是代表错误

> miner.start(1)
null

查看账户余额

> eth.getBalance(eth.accounts[0])
95000000000000000000

再创建一个账户

> personal.newAccount("yourpassword2")
"0xd56f07dc185c32f0367469b353c6cae711fa4a46"

两个账户分别别名acc0,acc1

> acc0=eth.accounts[0]
"0x70aea0aea5bf9568a650598dfef44d6d3cca209a"
> acc1=eth.accounts[1]
"0xd56f07dc185c32f0367469b353c6cae711fa4a46"

解锁账户1

> personal.unlockAccount(acc0)
Unlock account 0x70aea0aea5bf9568a650598dfef44d6d3cca209a
Password: 
true

转账给账户2,括号里是ether的数量

> eth.sendTransaction({from:acc0,to:acc1,value:web3.toWei(10)})
"0x0ccfda6137ca5c9095f03498404223ae08910d811ab7b1a7497abe3834f9fae9"

退出geth是输入exit或者直接ctrl+d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值