最近,需要接触区块链项目的主链开发,在EOS、BTC、ethereum、超级账本这几种区块链技术当中,相互对比后,最终还是以go-ethereum为解决方案。
以ethereum为基准去找解决方案,最终找到了2个符合自己要求的方案,分别如下:美图、gttc。本来是想用gttc的这个解决方案的,但是它是基于go-ethereum最新源码来进行二次开发的,相对不稳定,因此还是用美图的解决方案了,毕竟这公司大一点,没那么多坑。
为了方便测试,我们需要将节点最大验证器数修改一下,这样便于我们进行简单测试
修改consensus/dpos/dpos.go文件的maxValidator
注意:构建过程中会用到build\env.sh文件,会提示无权限,因此你需要给该文件赋予执行权限。
sudo chmod 777 build\env.sh 四、部署 1. 创建节点数据目录最好事先创建好相应的目录,否则运行后,动态创建目录,会有权限的问题,当然也可以通过命令进行设置目录的权限。
mkdir ~/data mkdir ~/data/meitu mkdir ~/data/meitu/node1 mkdir ~/data/meitu/node2 mkdir ~/data/meitu/node3 2. 编写docker-compose.yml文件 version: '3' services: meitu_node_1: image: meitugeth container_name: meitu_node_1 build: context: . command: --ipcpath "/root/.ethereum/geth.ipc" --port 30303 ports: - 15450:8545 - 15460:8546 - 10303:30303 - 10303:30303/udp - 10304:30304/udp volumes: - /etc/localtime:/etc/localtime - ~/data/meitu/node1/:/root/.ethereum/ environment: TZ: Asia/Shanghai meitu_node_2: image: meitugeth container_name: meitu_node_2 build: context: . command: --ipcpath "/root/.ethereum/geth.ipc" --port 30303 depends_on: - meitu_node_1 ports: - 25450:8545 - 25460:8546 - 20303:30303 - 20303:30303/udp - 20304:30304/udp volumes: - /etc/localtime:/etc/localtime - ~/data/meitu/node2/:/root/.ethereum/ environment: TZ: Asia/Shanghai meitu_node_3: image: meitugeth container_name: meitu_node_3 build: context: . command: --ipcpath "/root/.ethereum/geth.ipc" --port 30303 depends_on: - meitu_node_1 ports: - 45450:8545 - 45460:8546 - 40303:30303 - 40303:30303/udp - 40304:30304/udp volumes: - /etc/localtime:/etc/localtime - ~/data/meitu/node3/:/root/.ethereum/ environment: TZ: Asia/Shanghai 3. 启动节点在根目录下启动3个以太坊节点
docker-compose up --build -d 4. 启动思路美图以太坊这块有2种启动网络:
在创世块里配置好第一验证节点,然后启动
混合POW和DPOS,用POW进行投票,产生第一批验证节点,并自动切换到DPOS
5. 首次启动 1. 进入容器进入容器命令如下:
# 模板 docker exec -it [容器名|容器ID] /bin/sh # 例子 docker exec -it meitu_node_1 /bin/sh docker exec -it meitu_node_2 /bin/sh docker exec -it meitu_node_3 /bin/sh 2. 进入geth JavaScript控制台 # 方式一 geth attach ipc:/root/.ethereum/geth.ipc # 方式二 docker exec -it meitu_node_1 geth attach ipc:/root/.ethereum/geth.ipc # 方式三:使用别名 alias geth="docker exec -it meitu_node_1 geth attach ipc:/root/.ethereum/geth.ipc" 3. 创建账户进入geth JavaScript 控制台后,需哟啊创建账户,命令如下;
# 模板 personal.newAccount('名称') # 例子 personal.newAccount('test001') "0x849f9442198282fb21539351edb0378463e4c251" personal.newAccount('test002') "0x2c08f54d5b324c0175ea53b997f5ce1f61a7e4ed" personal.newAccount('test003') "0xc4118320f3d3c37a2ca8dad5c2f2a40f2a23ba02"创建成功后,需要将返回的地址记录起来
loop:重复1-3步骤,在node1、node2、node3分别创建账户
4. 编写创世块配置文件将上一步操作生成的地址写入到创世块文件中,三个节点的地址分别为:
0x849f9442198282fb21539351edb0378463e4c251 0x2c08f54d5b324c0175ea53b997f5ce1f61a7e4ed 0xc4118320f3d3c37a2ca8dad5c2f2a40f2a23ba02将3个节点地址列入第一批验证人列表
{ "config": { "chainId": 7777, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock":0, "dpos":{ "validators":[ "0x849f9442198282fb21539351edb0378463e4c251", "0x2c08f54d5b324c0175ea53b997f5ce1f61a7e4ed", "0xc4118320f3d3c37a2ca8dad5c2f2a40f2a23ba02" ] } }, "nonce": "0x0000000000000042", "difficulty": "0x020000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0x500000", "alloc": {} }创世配置参数说明:
nonce:64位随机数,用于挖矿
timestamp:创世块的时间戳
parentHash:上一个区块的hash值,因为是创世块,所以这个值是0
mixHash:与nonce配合用于挖矿,由上一个区块的一部分生成hash
extraData:附加信息,任意填写
gasLimit:对GAS的消耗总量限制,用来限制区块能包含的交易信息总和
difficulty:难度值,越大越难
coinbase:矿工账号,第一个区块挖出后将给这个矿工账号发送奖励的以太币
alloc:预设账号以及账号的以太币数量,测试链挖矿比较容易可以不配置
chainId:指定了独立的区块链网络ID,不同ID网络的节点无法互相连接
5. 初始化创世目录 1. 删除每个节点下geth目录,保留keystore