栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

基于美图技术团队开源的DPos共识机制以太坊私链搭建(非Docker版)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于美图技术团队开源的DPos共识机制以太坊私链搭建(非Docker版)

1. 安装Go

上传go的安装包到/data/blockchian文件夹

tar -zxvf go1.16.5.linux-amd64.tar.gz
cd go

修改环境变量

vi /etc/profile
export GOROOT=/data/blockchain/go #GOROOT是系统上安装Go软件包的位置。
export GOPATH=/data/blockchain/GOPATH #GOPATH是工作目录的位置。一般用于下载Go的第三方依赖包,类似于maven仓库自己在指定的文件夹里创建。
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
source /etc/profile
# 测试Go的版本
go version 

重新安装的话需要删除go、GOPATH文件夹,然后再走一遍上面的流程安装

2. 安装以太坊客户端Geth(官方基于POW的,版本是1.10.5-stable)
  1. 上传geth的源码文件到/data/blockchain,并解压

    unzip go-ethereum-master.zip
    
    # 更新依赖
    apt-get install -y build-essential
    
    cd go-ethereum-master
    
    # 设置go依赖的代理,不然报超时异常(这一条命令不行的话使用下面两条)
    go env -w GOPROXY=https://goproxy.cn
    
  2. 构建

    make geth
    
  3. 构建成功后将bin文件复制到/usr/local/bin

    cp build/bin/geth /usr/local/bin
    
  4. 配置环境变量

    vi /etc/profile
    export PATH=$PATH:/data/blockchain/go-ethereum-master/build/bin
    source /etc/profile
    
    # 验证
    geth version
    
2.1 初始化节点

在/data/blockchain/privatechain创建两个文件夹data0,data1两个节点的数据存储位置

mkdir data0 data1

两个节点互连创世块文件必须一样

初始化第一个节点

cd /data/blockchain/privatechain

geth --datadir data0 init first.json

初始化第二个节点

geth --datadir data1 init first.json

first.json文件示例

{
	"config": {
		"chainId": 1001,
		"homesteadBlock": 0,
		"eip150Block": 0,
		"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
		"eip155Block": 0,
		"eip158Block": 0,
		"byzantiumBlock": 0,
		"constantinopleBlock": 0,
		"petersburgBlock": 0,
		"istanbulBlock": 0,
		"ethash": {}
	},
	"alloc": {},
	"coinbase": "0x0000000000000000000000000000000000000000",
	"difficulty": "0x20000",
	"extraData": "",
	"gasLimit": "0x2fefd8",
	"nonce": "0x0000000000000042",
	"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
	"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
	"timestamp": "0x00"
}

创世配置参数说明:

  • nonce:64位随机数,用于挖矿
  • timestamp:创世块的时间戳
  • parentHash:上一个区块的hash值,因为是创世块,所以这个值是0
  • mixHash:与nonce配合用于挖矿,由上一个区块的一部分生成hash
  • extraData:附加信息,任意填写
  • gasLimit:对GAS的消耗总量限制,用来限制区块能包含的交易信息总和
  • difficulty:难度值,越大越难
  • coinbase:矿工账号,第一个区块挖出后将给这个矿工账号发送奖励的以太币
  • alloc:预设账号以及账号的以太币数量,测试链挖矿比较容易可以不配置
  • chainId:指定了独立的区块链网络ID,不同ID网络的节点无法互相连接
2.2 创建Coinbase账户

先进入控制台

geth --datadir "./data0" console

创建账户

personal.newAccount()

根据提示输入两次密码即可生成账户地址,这个地址记录一下,下面启动节点的时候要用到

节点2依次执行上述操作

生成完账户后,删除data0和data1文件夹下的geth,history文件夹和geth.ipc文件,只保留keystore

2.3 启动节点

新版本使用的是http旧版本使用的是rpc,命令变化具体可查看命令提示 geth --help

参数详解

  • –unlock: 解锁以太坊内部账户,就是前面创建的账户
  • –password: 解锁以太坊内部账户密码,必须是文件形式的密码
  • –allow-insecure-unlock: 允许以不安全的方式解锁账户,不可在主网上这样设置,否则会出现安全问题
  • –http:启动Http服务
  • –http.addr:Http服务地址
  • –http.port:Http服务端口
  • –http.api:Http服务的API支持
  • –http.corsdomain:Http服务允许跨域
  • –datadir:节点数据存储位置
  • –port:P2P端口号,用于节点互连
  • –networkid: 主网配置为 1 ,其他3、4、5都是以太坊坊社区部署的测试网络,我们是建立自己的私链,定义为1001
  • –nodiscover: 是否主动扫描P2P节点
  • –rpc.allow-unprotected-txs:允许不受保护的交易

第一个节点启动

nohup geth --unlock "0xd6c82ab0a8e0dbd37f4352cce79f11739f7dccbd" --password ./password.txt --allow-insecure-unlock --http --http.addr=0.0.0.0 --http.port 8545 --http.corsdomain "*" --http.api "eth,net,web3,personal,web3" --datadir "./data0" --port 30303 --networkid 1001 --nodiscover --rpc.allow-unprotected-txs >/dev/null 2>./geth0.log &

进入以太坊控制台

geth attach ipc:data0/geth.ipc

第二个节点启动

nohup geth --unlock "0xa60c73c77a3756ffeb3c73f08e71f26e7b6d2bb4" --password ./password.txt --allow-insecure-unlock --http --http.addr=0.0.0.0 --http.port 8546 --http.corsdomain "*" --http.api "eth,net,web3,personal,web3" --datadir "./data1" --port 30304 --networkid 1001 --nodiscover --rpc.allow-unprotected-txs >/dev/null 2>./geth1.log &
geth attach ipc:data1/geth.ipc

第二个节点的http.port、port、日志geth1.log都不一样

2.4 互连节点

第一个节点连接第二个,有一方连接即可

# 先查看第二个节点的连接信息
admin.nodeInfo.enode
# 信息如下,复制
enode://c09eb6b390a3ef856bca49c72c50a0cf25ecdb83a58b4e63489308511f01295d823f53c63251b74aba16efe56f123d2df5ea113ba923f326811f2dab93b87075@127.0.0.1:30306

第一个节点添加第二个节点

admin.addPeer("enode://b0737a6fd9c8b980f7b3d235b0b29273edbcb56e6c18317a1a5b53a7cbeb19cc357a8ec7fee82545c0af5781f8e72414365dac092b1350a250c4aea5b295f8ff@192.168.0.106:30306")

@后的IP地址换成真实IP地址,?后的字符串删除

3. 安装以太坊客户端Geth(美图技术团队开源的基于DPos共识机制的,版本是1.7.4-stable)
  1. 上传美图技术团队的Geth的源码文件到/data/blockchain,并解压

    unzip go-ethereum-master.zip
    
    # 更新依赖
    apt-get install -y build-essential
    
    # 更改文件夹名,防止和官方以太坊客户端重名
    mv go-ethereum-master/ go-ethereum-meitu
    cd go-ethereum-meitu
    
    # 设置go依赖的代理,不然报超时异常(这一条命令不行的话使用下面两条)
    go env -w GOPROXY=https://goproxy.cn
    
  2. 为了方便测试,我们需要将节点最大验证器数修改一下,这样便于我们进行简单测试
    修改consensus/dpos/dpos.go文件的maxValidator

// 新值
maxValidatorSize = 21
// 旧值
maxValidatorSize = 3
  1. 构建

    make geth
    
  2. 构建成功后将bin文件复制到/usr/local/bin

    cp cp build/bin/geth /usr/local/bin
    
  3. 配置环境变量(因为之前已经创建了Geth,因此这里可以修改一下)

    vi /etc/profile
    export PATH=$PATH:/data/blockchain/go-ethereum-meitu/build/bin
    source /etc/profile
    
    # 验证
    geth version
    
2.1 创建Coinbase账户

在/data/blockchain/privatechain-meitu创建三个文件夹data0,data1,data2存放三个节点的数据存储位置

mkdir data0 data1 data2

先进入控制台

geth --datadir "./data0" console

创建账户

personal.newAccount()

根据提示输入两次密码即可生成账户地址,这个地址记录一下,下面启动节点的时候要用到

节点2和节点3依次执行上述操作

生成完账户后,删除data0、data1、data2文件夹下的geth文件夹和geth.ipc文件,只保留keystore

2.2 初始化节点

三个节点互连创世块文件必须一样

初始化第一个节点

cd /data/blockchain/privatechain-meitu

geth --datadir data0 init first.json

初始化第二个节点

geth --datadir data1 init first.json

初始化第三个节点

geth --datadir data2 init first.json

其中validators就是之前创建的Coinbase账户

first.json文件示例

{
	"config": {
		"chainId": 1002,
        "eip155Block": 0,
        "eip158Block": 0,
        "byzantiumBlock":0,
        "dpos":{
            "validators":[
                "0x8faccf6413e4e3901aab5f63ad516bad033c9368",
                "0xf93560dfe7adc3fb7bf63d65e595ffdceb6abd39",
                "0x2b2cf292a6eb2f037651b2e2c6623b0ddbc7753e"
            ]
        }
	},
	"alloc": {},
	"coinbase": "0x0000000000000000000000000000000000000000",
	"difficulty": "0x20000",
	"extraData": "",
	"gasLimit": "0x2fefd8",
	"nonce": "0x0000000000000042",
	"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
	"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
	"timestamp": "0x00"
}

创世配置参数说明:

  • nonce:64位随机数,用于挖矿
  • timestamp:创世块的时间戳
  • parentHash:上一个区块的hash值,因为是创世块,所以这个值是0
  • mixHash:与nonce配合用于挖矿,由上一个区块的一部分生成hash
  • extraData:附加信息,任意填写
  • gasLimit:对GAS的消耗总量限制,用来限制区块能包含的交易信息总和
  • difficulty:难度值,越大越难
  • coinbase:矿工账号,第一个区块挖出后将给这个矿工账号发送奖励的以太币
  • alloc:预设账号以及账号的以太币数量,测试链挖矿比较容易可以不配置
  • chainId:指定了独立的区块链网络ID,不同ID网络的节点无法互相连接
2.3 启动节点

新版本使用的是http,旧版本使用的是rpc,命令变化具体可查看命令提示 geth --help

参数详解

  • –unlock: 解锁以太坊内部账户,就是前面创建的账户
  • –password: 解锁以太坊内部账户密码(之前在控制台设置的密码),必须是文件形式的密码
  • –rpc:启动Http服务
  • –rpcaddr:Http服务地址
  • –rpcport:Http服务端口
  • –rpcapi:Http服务的API支持
  • –rpccorsdomain:Http服务允许跨域
  • –datadir:节点数据存储位置
  • –port:P2P端口号,用于节点互连
  • –networkid: 主网配置为 1 ,其他3、4、5都是以太坊坊社区部署的测试网络,我们是建立自己的私链,与创世块文件一直定义为1002
  • –nodiscover: 是否主动扫描P2P节点

DPos的以太坊节点启动

第一个

nohup geth --unlock "0x0a9bb22c7fef02f3de71f9e68273d4b1416d0651" --password ./password.txt --rpc --rpcaddr=0.0.0.0 --rpcport 8545 --rpccorsdomain "*" --rpcapi "eth,net,web3,personal,web3" --datadir "./data0" --port 30303 --networkid 1002 --nodiscover >/dev/null 2>./geth0.log &

进入以太坊控制台

geth attach ipc:data0/geth.ipc

可以执行挖矿

miner.start()

第二个

nohup geth --unlock "0x4c8b14c7318725f27dc99b79607b6704e592766e" --password ./password.txt --rpc --rpcaddr=0.0.0.0 --rpcport 8546 --rpccorsdomain "*" --rpcapi "eth,net,web3,personal,web3" --datadir "./data1" --port 30304 --networkid 1002 --nodiscover >/dev/null 2>./geth1.log &

第三个

nohup geth --unlock "0x1f7851332e5e995b31db298d7156bf199bb36465" --password ./password.txt --rpc --rpcaddr=0.0.0.0 --rpcport 8547 --rpccorsdomain "*" --rpcapi "eth,net,web3,personal,web3" --datadir "./data2" --port 30305 --networkid 1002 --nodiscover >/dev/null 2>./geth2.log &
2.4 查看验证人是否设置成功
# 执行获取验证人列表命令
dpos.getValidators()
2.5 互连节点

第一个节点连接第二个,有一方连接即可

# 先查看第二个节点的连接信息
admin.nodeInfo
# 信息如下,复制
enode://c09eb6b390a3ef856bca49c72c50a0cf25ecdb83a58b4e63489308511f01295d823f53c63251b74aba16efe56f123d2df5ea113ba923f326811f2dab93b87075@127.0.0.1:30306

第一个节点添加第二个节点

admin.addPeer("enode://b0737a6fd9c8b980f7b3d235b0b29273edbcb56e6c18317a1a5b53a7cbeb19cc357a8ec7fee82545c0af5781f8e72414365dac092b1350a250c4aea5b295f8ff@192.168.0.106:30306")

@后的IP地址换成真实IP地址,?后的字符串删除

查看已经连接的节点

admin.peers
4. 以太坊控制台常用命令
# 查看账户
eth.accounts
# 创建账户,之后两次输入密码
personal.newAccount()
# 查看账户余额,单位是(wei,以太坊最小的单位)
eth.getBalance(eth.accounts[0])
# 查看账户余额有几个以太币
web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
# 挖矿
miner.start()
# 停止挖矿
miner.stop()
5. 安装solc(智能合约编译器)
npm install -g solc@0.5.0  # 根据智能合约头部版本进行安装
6. 安装web3j(智能合约生成Java代码)

Windows

使用powershell,管理员身份打开

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/web3j/web3j-installer/master/installer.ps1'))

Linux

curl -L get.web3j.io | sh && source ~/.web3j/source.sh
6.1 生成Java代码

智能合约编译成abi和bin文件

输出目录要提前创建好,根据报错提示创建目录

solcjs D:JavaProjectblockchain-apisrcmainresourcestrans.sol --bin --abi --optimize --output-dir D:SmartContarct

web3j生产java代码

web3j generate solidity -a YueNengToken_sol_ERC20Interface.abi -b YueNengToken_sol_ERC20Interface.bin -o D:JavaProjectblockchain-apisrcmainjava -p com.ncepu.blockchain.contract

/path/to/.bin:生成的bin文件的目录
/path/to/.abi:生成的abi文件的目录
D:JavaProjectblockchain-apisrcmainjava:生成的java文件的输出目录
com.ncepu.blockchain.contract:生成的java文件的包名

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/395703.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号