目录
1、github上进行克隆自己编译(不推荐很容易报错环境什么的)
2、直接使用二进制文件就是官网上他配置好的直接进行部署(推荐)
一、安装系统依赖
# 更新系统并安装基础工具
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表明是。 |
eip155Block | EIP155 [1] 是一个以太坊分叉提议,为了和以前的以太坊经典ETC 链条分叉而存在,我们私链不需要它,设为0。 |
eip158Block | EIP158 [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.log | Unix系统下的重定向,将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