我们都知道Simplechain是一种主子链架构,主链Simplechain是POW共识算法的公链。那如何快速创建一条属于自己的子链呢?下面我们就是快速部署一条子链流程。首先clone 源码, 然后按照下面流程操作。

部署DPOS共识子链网络

  1. 创世区块

{ "config": { "chainId": 10388, "dpos": { "period": 3, "epoch": 300, "maxSignersCount": 21, "minVoterBalance": 100000000000000000000, "genesisTimestamp": 1554004800, "signers": [ "3d50e12fa9c76e4e517cd4ace1b36c453e6a9bcd", "f97df7fe5e064a9fe4b996141c2d9fb8a3e2b53e", "ef90068860527015097cd031bd2425cb90985a40" ], "pbft": false, "voterReward": true } }, "nonce": "0x0", "timestamp": "0x5ca03b40", "extraData": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x47b760", "difficulty": "0x1", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "alloc": { "3d50e12fa9c76e4e517cd4ace1b36c453e6a9bcd": { "balance": "0x21e19e0c9bab2400000" }, "ef90068860527015097cd031bd2425cb90985a40": { "balance": "0x21e19e0c9bab2400000" }, "f97df7fe5e064a9fe4b996141c2d9fb8a3e2b53e": { "balance": "0x21e19e0c9bab2400000" } }, "number": "0x0", "gasUsed": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" }
  • period dpos出块间隔时间,单位为秒

  • epoch dpos间隔多少个块定期清除投票(清除后需要投票者重新发起投票交易)

  • maxSignersCount dpos最大允许的生产者数量

  • minVoterBalance dpos最小允许的投票额度,单位为Wei

  • voterReward dpos投票者能否获得奖励(若开启,则在生产者出块时投票者也能获得分红)

  • genesisTimestamp dpos允许初始块出块的时间,并通过此时间计算后续出块的时间与生产者

  • signers dpos初始生产者列表

  • pbft dpos是否在每轮出块后使用pbft的方式确认每一个区块

  • alloc dpos初始生产者抵押投票数额

  1. 子链初始化流程 方式一. 使用sipe初始化 1.创建或导入生产者账户

sipe --datadir=dposdata account new

2.将创建或导入的生产者地址写入genesis.json中,同时写入初始投票数额(参考1.创世区块)

3.初始化子链节点


sipe --datadir=dposdata --role=subchain init genesis.json

方式二. 使用consensus工具一键初始化集群 在cmd/consensus目录下运行init_dpos.sh


cd cmd/consensus ./init_dpos.sh --numNodes 3
  • numNodes 生成集群节点数量

初始化完成后,会在cmd/consensus/dposdata目录下建立对应节点文件

  1. 子链启动流程
  2. 启动节点

sipe --datadir=dposdata --mine --etherbase=<生产者地址> --unlock=<生产者地址> --password=<密码文件> --port=30303 --role=subchain --v5disc
  1. 连接其他节点

sipe --datadir=dposdata --mine --etherbase=<生产者地址> --unlock=<生产者地址> --password=<密码文件> --port=30304 --role=subchain --v5disc --bootnodesv5={enode1} --bootnodesv4={enode1}
  1. 投票与提案

4.1 发起投票交易


> eth.sendTransaction({from:"<投票地址>",to:"<被投票地址>",value:0,data:web3.toHex("dpos:1:event:vote")})

4.2 发起取消投票交易


> eth.sendTransaction({from:"<投票地址>",to:"<投票地址>",value:0,data:web3.toHex("dpos:1:event:devote")})

4.3 发起更改矿工奖励的提案

  • 将矿工区块奖励比例改为666‰

> eth.sendTransaction({from:"<提案地址>",to:"<提案地址>",value:0,data:web3.toHex("dpos:1:event:proposal:proposal_type:3:mrpt:666")})

4.4 发起更改最小允许投票额度的提案

  • 将最小允许投票额度改为10 ether

> eth.sendTransaction({from:"<提案地址>",to:"<提案地址>",value:0,data:web3.toHex("dpos:1:event:proposal:proposal_type:6:mvb:10")})

4.5 通过或反对提案

  • yes通过提案,no反对提案

> eth.sendTransaction({from:"<投票地址>",to:"<投票地址>",value:0,data:web3.toHex("dpos:1:event:declare:hash:<提案hash值>:decision:yes")})
  1. 查看共识状态

> dpos.getSnapshot()
  • candidates 矿工候选者名单

  • confirmedNumber 确认的区块高度

  • historyHash 最近两轮出块的块hash,用来计算新一轮的生产者出块顺序

  • minerReward 每个块生产者获得的奖励千分比,若开启voterReward,剩下的为投票者的奖励

  • signers 列举生产者名单与出块顺序

  • punished 列举每个生产者因未按时出块受到的惩罚信息

  • tally 列举每个候选人的总得票数

  • votes 列举投票信息

  • voters 投票人发起投票的区块高度

  • proposals 提案列表

部署PBFT共识子链网络

  1. 创世区块

{ "config": { "chainId": 10388, "istanbul": { "epoch": 30000, "policy": 0 } }, "nonce": "0x0", "timestamp": "0x0", "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f843f83f941c46d10e91eafaac430718df3658b1a496b827bd94b67ee9395542b227c99941eb4168e3f3c6502dd8949d6510b637970085962c908c69e63e9d36a36cb480c0", "gasLimit": "0xe0000000", "difficulty": "0x1", "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", "coinbase": "0x0000000000000000000000000000000000000000", "alloc": {}, "number": "0x0", "gasUsed": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" }
  • epoch pbft间隔多少个块定期清除投票

  • policy pbft提议者轮询方式,0为roundRobin(按顺序更换),1为sticky(提议者未出错时不更换提议者)

  • mixHash pbft区块须将mixHash指定为0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365

  • extraData pbft初始生产者计算后得到的header.extra

  • alloc pbft暂无区块奖励,因此需要提前分配代币

  1. 子链初始化流程 方式一. 使用sipe初始化 1.创建或导入生产者账户

sipe --datadir=pbftdata account new

2.使用consensus工具生成extraData,写入到genesis.json中(参考1.创世区块)


cd cmd/consensus ./init_pbft.sh --numNodes 1 --validator <生产者地址>

3.初始化子链节点


sipe --datadir=pbftdata --role=subchain init genesis.json
  1. 将节点的nodekey写入到pbftdata/static-nodes.json中(nodekey公钥为生产者公钥)

方式二. 使用consensus工具一键初始化集群 在cmd/consensus目录下运行init_pbft.sh


cd cmd/consensus ./init_pbft.sh --numNodes 3 --ip 127.0.0.1 127.0.0.2 127.0.0.3 --port 21001 21002 21003
  • numNodes 生成集群节点数量

  • ip 指定节点的ip列表(默认ip为127.0.0.1)

  • port 指定节点的端口列表(默认端口为21001~2100x,x为numNodes)

初始化完成后,会在cmd/consensus/pbftdata目录下建立对应节点文件

  1. 子链启动流程

sipe --datadir=pbftdata --istanbul.requesttimeout=10000 --istanbul.blockperiod=5 --syncmode=full --mine --minerthreads=1 --port=21001 --role=subchain
  • port 需要和static-nodes.json中配置的enode保持一致

  • istanbul.requesttimeout pbft每个view的过期时间,单位毫秒,默认值为10000

  • istanbul.blockperiod pbft出块间隔,单位秒,默认值为1

4.查看共识状态


> istanbul.getSnapshot()
  • validators pbft区块生产者名单

  • votes 新增validator或移除validator的投票

  • tally 总投票情况

部署RAFT共识子链网络

  1. 创世区块

{ "config": { "chainId": 10, "raft": true }, "nonce": "0x0", "timestamp": "0x0", "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0xe0000000", "difficulty": "0x0", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "alloc": { "1e69ebb349e802e25c7eb3b41adb6d18a4ae8591": { "balance": "0x21e19e0c9bab2400000" }, "73ce1d55593827ab5a680e750e347bf57485a511": { "balance": "0x21e19e0c9bab2400000" }, "b8564a5657fa7dc51605b58f271b5bafad93b984": { "balance": "0x21e19e0c9bab2400000" } }, "number": "0x0", "gasUsed": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" }
  • raft true为使用raft共识

  • alloc raft共识只有存在交易的时候才打包区块,因此需要提前分配代币

  1. 子链初始化流程 方式一. 使用sipe初始化 1.创建或导入生产者账户

sipe --datadir=raftdata account new

2.初始化子链节点


sipe --datadir=raftdata --role=subchain init genesis.json

4.将节点的nodekey写入raftdata/static-nodes.json中(nodekey公钥为生产者公钥)

方式二. 使用consensus工具一键初始化集群 在cmd/consensus目录下运行init_pbft.sh


cd cmd/consensus ./init_raft.sh --numNodes 3 --ip 127.0.0.1 127.0.0.2 127.0.0.3 --port 21001 21002 21003 --raftport 50401 50402 50403
  • numNodes 生成集群节点数量

  • ip 指定节点的ip列表(默认ip为127.0.0.1)

  • port 指定节点的端口列表(默认端口为21001~2100x,x为numNodes)

  • raftport 指定节点的raft通信端口列表(默认端口为50401~5040x,x为numNodes)

初始化完成后,会在cmd/consensus/raftdata目录下建立对应节点文件

  1. 子链启动流程

sipe --datadir=raftdata --raft --port=21001 --raftport=50401 --role=subchain
  • port 需要和static-nodes.json中配置的enode保持一致

  • raft 使用raft模式

  • raftport raft端口号,需要和static-nodes.json中配置的enode保持一致

4.查看共识状态


> istanbul.getSnapshot()
  • validators pbft区块生产者名单

  • votes 新增validator或移除validator的投票

  • tally 总投票情况

上面就是部署不同共识子链的流程,不久我们的区块链管理平台将支持一键部署子链,届时我们的社区开发者和爱好者可以更方便的部署一条子链,加入到Simpelchain的生态中

如何快速部署一条Simplechain子链的更多相关文章

  1. Hexo快速部署教程

    一直有建立博客的需要,使用过Wordpress动态博客,一直访问速度比较慢,刚开始以为是空间域名的解析的问题,尝试使用Hexo静态博客,部署后感觉速度正常很多,特意发文快速部署教程 准备 本文是在wi ...

  2. Docker+Nextcloud快速部署个人网盘

    各位大佬好,,,萌新顾北清又回来更新了,今天要快速部署一个人网盘. 有多快呢,,,5分钟吧,因为我们使用Docker部署. Docker基础可以看看我之前的博文.(点这里点这里) 那么,,,开始吧. ...

  3. •搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机

    本节所讲内容: 实战:搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机 LAMP架构:??? Linux+Apache+Mysql+PHP Linux+Apache+Mysql/MariaDB ...

  4. 使用Docker快速部署ELK分析Nginx日志实践(二)

    Kibana汉化使用中文界面实践 一.背景 笔者在上一篇文章使用Docker快速部署ELK分析Nginx日志实践当中有提到如何快速搭建ELK分析Nginx日志,但是这只是第一步,后面还有很多仪表盘需要 ...

  5. 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群

    本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...

  6. [转帖]centos7 使用kubeadm 快速部署 kubernetes 国内源

    centos7 使用kubeadm 快速部署 kubernetes 国内源 https://www.cnblogs.com/qingfeng2010/p/10540832.html 前言 搭建kube ...

  7. 快速部署ldap服务

    快速部署ldap服务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.LDAP概述 .什么是目录服务 ()目录是一类为了浏览和搜索数据二十几的特殊的数据库,例如:最知名的的微软公 ...

  8. 【k8s】kubeadm快速部署Kubernetes

    1.Kubernetes 架构图 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Mast ...

  9. 以windows服务方式快速部署免安装版Postgres数据库

    目录 以windows服务方式快速部署免安装版Postgres数据库 1.下载Postgresql数据库免安装包 2.安装环境准备及验证 解压文件 测试环境依赖 3.创建并初始化数据目录 创建数据目录 ...

随机推荐

  1. 关于linux免密登录及ssh客户端的使用

    操作系统环境: CentOS Linux release 7.7.1908 (Core) 1.首先在linux服务器上,使用ssh-keygen命令生成密钥对文件(一直回车即可,默认使用rsa算法), ...

  2. Mysql索引扫盲总结

    本文总结了一些MySQL索引的基本概念和原理,如果可以快速清晰回答这些问题可以出门左转提提宝贵建议. 什么是索引?索引为什么查询快,索引的数据结构是什么? 聚簇索引/非聚簇索引区别? 什么是覆盖索引? ...

  3. SmokePing 快速搭建

    SmokePing介绍 smokeping是来监控IDC机房网络质量情况,可以从监控图上的延时与丢包情况分辨出机房的网络是否稳定,是否为多线,是否为BGP机房以及到各城市的三个运行商网络各是什么情况. ...

  4. JS 姓氏,区域,消息组成的随机内容定时随机展示

    var surname_g = "\u8D75\u94B1\u5B59\u674E\u5468\u5434\u90D1\u738B\u51AF\u9648\u891A\u536B\u848B ...

  5. 讨论session共享方案设计

    默认情况下,php的session文件是保存在磁盘文件中. 在php.ini配置文件中的配置项如下: session.save_handler = files session.save_path = ...

  6. python基础:如何使用 pip 安装第三方库

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 在这个生活中处处都是大数据和人工智能的时代,总是能在各种角落看到 Pyth ...

  7. @codeforces - 506C@ Mr. Kitayuta vs. Bamboos

    目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个竹子,第 i 个竹子初始高度 hi,在每天结束时将长高 a ...

  8. Java复习目录

    还是寒假用了十多天的时间在b站把基础部分学习完了,现在刚开学开始上Java课,以博客的方式复习前面学习的内容. 总结: ①吸取前面MySQL学习的教训,每天固定学习的内容,学习效果很有提升,但临近开学 ...

  9. 2019-02-04 Linux的一些常用命令学习

    今天在电脑里用装了个ubuntu的虚拟机,学习了一下基本操作 ls ls用于查看文件夹的文件 mkdir mkdir可以创建一个文件夹(directory) cd 目录切换 pwd print wor ...

  10. IP地址和端口

    IP地址是网络中计算机的唯一标识.没有IP地址,计算机无法接入互联网. IPv4地址32bit,用点分十进制表示,如202.38.64.3 IPv6地址128bit,用冒号分割十六进制表示,如2001 ...