GitHub地址 https://github.com/TTCECO/gttc
基于以太坊go-ethereum的DPOS实现

一 构建以太坊

1 git clone https://github.com/TTCECO/gttc.git
  • 目录结构为~/github.com/TTCECO/gttc
2 在根目录make gttc(make all)

二.构建有多个节点的以太坊链

Before read this instruction, please make sure the gttc, bootnode
and puppeth already compiled and installed correctly in your server.

1 在目录 gttc/build/bin下创建节点目录

$ mkdir node1 node2

2 生成超级节点账号

$ gttc --datadir node1/ account new
$ gttc --datadir node2/ account new
  • 输入密码后会显示生成的地址node1_address和node2_address

3 把账号信息写入文件来启动节点

$ echo 'node1_address' >> account.txt
$ echo 'node2_address' >> account.txt
$ echo 'password1' >> node1/password.txt
$ echo 'password2' >> node2/password.txt

4 通过puppeth来构建创世配置文件

$ puppeth+-----------------------------------------------------------+
| Welcome to puppeth, your private network manager          |
|                                                           |
| This tool lets you create a new Ethereum network down to  |
| the genesis block, bootnodes, miners and ethstats servers |
| without the hassle that it would normally entail.         |
|                                                           |
| Puppeth uses SSH to dial in to remote servers, and builds |
| its network components out of Docker containers using the |
| docker-compose toolset.                                   |
+-----------------------------------------------------------+Please specify a network name to administer (no spaces or hyphens, please)
> devnetSweet, you can set this via --network=devnet next time!INFO [06-04|12:33:34] Administering Ethereum network           name=devnet
WARN [06-04|12:33:34] No previous configurations found         path=/Users/tataufo/.puppeth/devnetWhat would you like to do? (default = stats)1. Show network stats2. Configure new genesis3. Track new remote server4. Deploy network components
> 2Which consensus engine to use? (default = alien)1. Ethash - proof-of-work2. Clique - proof-of-authority3. Alien  - delegated-proof-of-stake
> 3How many seconds should blocks take? (default = 3)
> 4How many blocks create for one epoch? (default = 30000)
> 30What is the max number of signers? (default = 21)
> 3What is the minimize balance for valid voter ? (default = 10000TTC)
> 100How many minutes delay to create first block ? (default = 5 minutes)
> 5Which accounts are vote by themselves to seal the block?(least one, those accounts will be auto pre-funded)
(The follow two address can be found in account.txt)
> 0xfa846876ef5ed3826e483303f42d987a66af8e15
> 0x62739566c666df9a057d7e7c92898511d4e64c07
> 0xWhich accounts should be pre-funded? (advisable at least one)
> 0xSpecify your chain/network ID if you want an explicit one (default = random)
>
INFO [06-04|12:35:27] Configured new genesis blockWhat would you like to do? (default = stats)1. Show network stats2. Manage existing genesis3. Track new remote server4. Deploy network components
> 21. Modify existing fork rules2. Export genesis configuration3. Remove genesis configuration
> 2Which file to save the genesis into? (default = devnet.json)
> genesis.json
INFO [06-04|12:35:45] Exported existing genesis blockWhat would you like to do? (default = stats)1. Show network stats2. Manage existing genesis3. Track new remote server4. Deploy network components
> ^C

5 初始化节点数据

$ gttc --datadir node1/ init genesis.json
$ gttc --datadir node2/ init genesis.json

if old data in node folder, please remove them before initialize.

6 生成bootnode

$ bootnode -genkey boot.key

bootnode简化了Ethereum客户端实现,它只参与网络节点发现协议,但不运行任何高级应用程序协议。它可以用作轻量级的引导节点,以帮助在私有网络中找到对等点。
总而言之,就是一个用于节点发现或者说节点引导的轻量节点,方便联盟链的搭建~

7 运行bootnode

$ bootnode -nodekey boot.key -verbosity 9 -addr 127.0.0.1:30310

上面命令运行完,会打印类似下面的log

 enode://20940eac58b9e615706ea3c357c409aecbb44998d1388db49a8df61e727f92029019708b2ad69467f94eef9a49b5d4ffb2cc1e71bb06addeb134fe8bdbc62153@127.0.0.1:30310

encode后面的这么一长串东西,就是这个节点的ID信息,下面启动geth节点的时候要指定连接这个bootnode~

8 运行节点1和节点2

  • 下面命令中 unlock后面的地址为之前写入account.txt文件中的地址,以挖矿的形式启动
  • enode地址为上面第7步生成的encode。 (也可以不用第七步生成的encode节点地址作为下面的启动参数,后续直接将节点进行关联即可(第九步))
  • networkid 为genesis.json中的 ChinaId
$ gttc --datadir node1/ --syncmode 'full' --port 30311 --rpc --rpcaddr 'localhost' --rpcport 8501 --rpcapi 'personal,db,eth,net,web3,txpool,miner,alien,admin' --bootnodes 'enode://20940eac58b9e615706ea3c357c409aecbb44998d1388db49a8df61e727f92029019708b2ad69467f94eef9a49b5d4ffb2cc1e71bb06addeb134fe8bdbc62153@127.0.0.1:30310' --networkid 1014 --gasprice '1' -unlock 'fa846876ef5ed3826e483303f42d987a66af8e15' --password node1/password.txt --mine
后台启动方式:
nohup ./gwsc --datadir node1/ --syncmode 'full' --port 30311 --rpc --rpcaddr '127.0.0.1' --rpcport 8501 --rpcapi 'personal,db,eth,net,web3,txpool,miner,alien,admin' --networkid 1001 --gasprice '1' -unlock '6672c4a5d01751e92f86e5d0393feceb1513481b' --password node1/password.txt --mine >/dev/null 2>log &
$ gttc --datadir node2/ --syncmode 'full' --port 30312 --rpc --rpcaddr 'localhost' --rpcport 8502 --rpcapi 'personal,db,eth,net,web3,txpool,miner,alien,admin' --bootnodes 'enode://20940eac58b9e615706ea3c357c409aecbb44998d1388db49a8df61e727f92029019708b2ad69467f94eef9a49b5d4ffb2cc1e71bb06addeb134fe8bdbc62153@127.0.0.1:30310' --networkid 1014 --gasprice '1' -unlock '62739566c666df9a057d7e7c92898511d4e64c07' --password node2/password.txt --mine
不用第七步生成的encode节点地址作为下面的启动参数
gttc --datadir node1/ --syncmode 'full' --port 30311 --rpc --rpcaddr 'localhost' --rpcport 8501 --rpcapi 'personal,db,eth,net,web3,txpool,miner,alien,admin' --networkid 1001 --gasprice '1' -unlock 'e363576de44cc5ca22fd96b49daa0724a3d4f6e4' --password node1/password.txt --mine

9 节点互联
1 进入geth JavaScript控制台

 ./gttc attach rpc:http://127.0.0.1:8501./gttc attach rpc:http://127.0.0.1:8502

2 查看节点是否互联

admin.peers
[]

返回数据为[] 说明节点之间没有互相发现。
3 设置节点互联

admin.nodeInfo

记录下enode

"enode://7f2f1a5818b4bb7e756036ab08834386534807bbf5c5a305ddcbefa1ff9ea99028feb00cb78322ac39340501d5b7c6147e169aadbb028daf20f8d73dbdfea98e@[::]:30311"
"enode://6ab4f74058b9c1e43d2d0c6f55f538ea7f2f366dd9f8f560024f14603333f017d3404b9c9711538289fa76504fecf33cf0e36cce7b0414604f673abe93012413@[::]:30312"

4 进入node1 geth控制台

#添加节点2的监视器
admin.addPeer("enode://7f2f1a5818b4bb7e756036ab08834386534807bbf5c5a305ddcbefa1ff9ea99028feb00cb78322ac39340501d5b7c6147e169aadbb028daf20f8d73dbdfea98e@[::]:30311")

addPeer的时候注意如果节点不是在同一台服务器上,需要把@后面[::]换成当前节点所在机器的ip地址。

  • 进入node2 geth控制台 添加节点1的监视器

三 进行投票

投票操作也属于一笔交易,是从投票人给候选者进行投票。投票人的金额必须大于投票最小金额,否则投票无效。参数为:genesis.json中的minVoterBalance

  • ufo : prefix of custom data
  • 1 : custom info version
  • event : category of info (event, oplog …)
  • vote : vote event

The sample vote in console is like this

personal.sendTransaction({from:"t07544bf9c90d175da395b8d08fcaf34da0a3e0688",to:"t0aafeaaf6111762fea733ff7b4c8b59ac69316385",value:0,data:web3.toHex("ufo:1:event:vote")})

从A地址向B地址转移数量为0的代币,代表A投*票给B地址,而票数的计算则是A地址当前拥有货币的数量。

四 生成新的超级节点地址进行挖矿(方式跟node1和node2类似)

1 创建超级节点账户

./gttc --datadir super_node/ account new
  • 输入密码后会显示生成的地址暂且把地址记为:super_node_address

2 把密码写入super_node文件下

$ echo 'password' >> super_node/password.txt

3 初始化超级节点

$ gttc --datadir super_node/ init genesis.json

4 Run bootnode

$ bootnode -nodekey boot.key -verbosity 9 -addr 127.0.0.1:30310
  • boot.key使用之前运行node1生成的就可以了

5 运行超级节点进行挖矿(同理也可以不用第4步生成的encode地址参数)

$ gttc --datadir super_node/ --syncmode 'full' --port 30313 --rpc --rpcaddr 'localhost' --rpcport 8503 --rpcapi 'personal,db,eth,net,web3,txpool,miner,net' --bootnodes 'enode://20940eac58b9e615706ea3c357c409aecbb44998d1388db49a8df61e727f92029019708b2ad69467f94eef9a49b5d4ffb2cc1e71bb06addeb134fe8bdbc62153@127.0.0.1:30310' --networkid 1014 --gasprice '1' -unlock '62739566c666df9a057d7e7c92898511d4e64c07' --password super_node/password.txt --mine

6 节点互联

  • 进入node1的geth控制台 添加super_node的监视器(addPeer) 。node2 同理
  • 进入super_node的geth控制台 添加node1和node2的监视器。进行节点之间互联。
  • 超级节点地址需要有人投票并且成为有效见证人后才能挖矿。
    用户投票是有最小投票金额限制的,否则无效。
    参数为:genesis.json中的minVoterBalance

参数:

 alien.getSnapshotAtNumber(48){confirmedNumber: 44,confirms: {41: ["t08feba63259ef7e79da13246dc20ff79fe446a478", "t0cc9c08721c7d8a792e238e80f6c20cb066e919a1", "t07c352585cd7549bfbc0a7e88bf820fa574174598"],42: ["t07c352585cd7549bfbc0a7e88bf820fa574174598", "t0cc9c08721c7d8a792e238e80f6c20cb066e919a1", "t08feba63259ef7e79da13246dc20ff79fe446a478"],43: ["t0cc9c08721c7d8a792e238e80f6c20cb066e919a1", "t07c352585cd7549bfbc0a7e88bf820fa574174598", "t08feba63259ef7e79da13246dc20ff79fe446a478"],44: ["t07c352585cd7549bfbc0a7e88bf820fa574174598", "t0cc9c08721c7d8a792e238e80f6c20cb066e919a1", "t08feba63259ef7e79da13246dc20ff79fe446a478"],45: ["t08feba63259ef7e79da13246dc20ff79fe446a478", "t07c352585cd7549bfbc0a7e88bf820fa574174598", "t0cc9c08721c7d8a792e238e80f6c20cb066e919a1"],46: ["t08feba63259ef7e79da13246dc20ff79fe446a478", "t0cc9c08721c7d8a792e238e80f6c20cb066e919a1", "t07c352585cd7549bfbc0a7e88bf820fa574174598"]},hash: "t027009a5d7480cb2802e45b9d0ef2547ce7ad5e720d9281b0d628f314998a6416",headerTime: 1533341653,historyHash: ["t0fb741ff569db0a9277111285d157a0412c4dc6e30509834e7e87ce84755db336", "t0855589fcf6fb8157b29df69cba0393737a1c15a7427666f5e84b34c8a5680523", "t07b37e235e0686c8defaa0068b0508fe55921bd5e27bf0f1ee3e6909184dc74f4", "t0664bb4e6889acfd8bd4c277ba109cd9fbaf1366ce8472761b050451c01cf1a04", "t0d3d64b715e8568be7d86a82dbfd9a801013132d4229d96963f3869b584426f7a", "t068a1241b27c209ab584155a670a0473f29ae302eb2fe47d1a75b1eea45898ab2", "t04c8e6e969c950810c2acf128866f2aa416dc56b1ef2987281de4812622ebb44f", "t03c7047ba4574bf1e49c9e068d82e1b2c3f59e958658d897f4836db23f6ffcc3c", "t0c05b07cb1c00be507742bd9de8702a42d8cf77f43c566f52196f5b0bc47d084c", "t0d1f96774a2feb4c21add4aeb14ac0d92d5357b1cdc53cead0ed9df459ce308ac", "t0c95bd9b4fd9f9d4ca5a38d2433f6f9d6f48027098316d8b9d95fa1436639338d", "t0300addbe720652487d69c62b37d7281298200b2c7c68170a24dad8503c73940e", "t06ede482139d9a8f5a7bc385b16c5d3c59ad11715091ad1609aa451f605fcc633", "t027009a5d7480cb2802e45b9d0ef2547ce7ad5e720d9281b0d628f314998a6416"],loopStartTime: 1533341639,number: 48,period: 4,punished: {t07c352585cd7549bfbc0a7e88bf820fa574174598: 880,t08feba63259ef7e79da13246dc20ff79fe446a478: 950,t0cc9c08721c7d8a792e238e80f6c20cb066e919a1: 1370},signers: ["t07c352585cd7549bfbc0a7e88bf820fa574174598", "t08feba63259ef7e79da13246dc20ff79fe446a478", "t0cc9c08721c7d8a792e238e80f6c20cb066e919a1", "t07c352585cd7549bfbc0a7e88bf820fa574174598", "t08feba63259ef7e79da13246dc20ff79fe446a478", "t0cc9c08721c7d8a792e238e80f6c20cb066e919a1", "t07c352585cd7549bfbc0a7e88bf820fa574174598"],tally: {t07c352585cd7549bfbc0a7e88bf820fa574174598: 9.046256971665328e+74,t08feba63259ef7e79da13246dc20ff79fe446a478: 9.046256971665328e+74,t0cc9c08721c7d8a792e238e80f6c20cb066e919a1: 9.046256971665328e+74},voters: {t07c352585cd7549bfbc0a7e88bf820fa574174598: 0,t08feba63259ef7e79da13246dc20ff79fe446a478: 0,t0cc9c08721c7d8a792e238e80f6c20cb066e919a1: 0},votes: {t07c352585cd7549bfbc0a7e88bf820fa574174598: {Candidate: "t07c352585cd7549bfbc0a7e88bf820fa574174598",Stake: 9.046256971665328e+74,Voter: "t07c352585cd7549bfbc0a7e88bf820fa574174598"},t08feba63259ef7e79da13246dc20ff79fe446a478: {Candidate: "t08feba63259ef7e79da13246dc20ff79fe446a478",Stake: 9.046256971665328e+74,Voter: "t08feba63259ef7e79da13246dc20ff79fe446a478"},t0cc9c08721c7d8a792e238e80f6c20cb066e919a1: {Candidate: "t0cc9c08721c7d8a792e238e80f6c20cb066e919a1",Stake: 9.046256971665328e+74,Voter: "t0cc9c08721c7d8a792e238e80f6c20cb066e919a1"}}}
  • signers : Signers queue in current loop (每一轮的超级节点队列)
  • loopStartTime: Start Time of the current loop, used to calculate the right miner(signer) by time(每一轮的开始时间)
  • 重新选取超级节点时间:当出块数=节点数*轮数时,会重重选一次超级节点。
    轮数参数:consensus/alien/alien.go文件中的defauleLoopCntRecalculateSigners = 10(默认为10轮)
  • period: 4 每4秒出一个块

> 投票规则: 假如超级节点为3个。则每出30个块(10轮)signers中的节点会重新选取3个超级节点。每出三个块(一轮12秒),loopStartTime会变一次,同时signers的顺序也会变一次。但是不换出块节点,只有当出了30个块则更换节点

> 超级节点挖矿的收益
go-ethereum consensus/alien/alien.go中方法accumulateRewards

主要代码如下:secondsPerYear     = 365 * 24 * 3600//config.Alien.Period:为多少秒出一次块blockNumPerYear := secondsPerYear / config.Alien.PeriodinitSignerBlockReward := new(big.Int).Div(totalBlockReward, big.NewInt(int64(2*blockNumPerYear)))yearCount := header.Number.Uint64() / blockNumPerYear//根据块数计算当前年数  再进行右位移运算  得到当前挖出一块的总收益blockReward := new(big.Int).Rsh(initSignerBlockReward, uint(yearCount))minerReward := new(big.Int).Set(blockReward)minerReward.Mul(minerReward, new(big.Int).SetUint64(snap.MinerReward))//minerReward为挖矿人的收益。minerReward.Div(minerReward, big.NewInt(1000)) // cause the reward is calculate by cnt per thousand//votersReward 投票人获得的返佣收益(投票人平分)votersReward := blockReward.Sub(blockReward, minerReward)

blockReward = minerReward + votersReward。

基于以太坊dpos实现相关推荐

  1. 以太坊又一次大拥堵何去何从?深度对话美图以太坊DPoS算法实现团队

    最近,以太坊又一次出现大拥堵,美图基于以太坊框架实现了 DPoS 算法并且对代码进行了开源(链接见文末),希望借助此方案能让以太坊发展有更多的选择的可能. 图:最近一周以太坊交易又出现大范围拥堵 有些 ...

  2. 建立基于以太坊的私有网络和智能合约

    本文欢迎转载,转载请标明出处 freewolf 资深IT从业者,关注微服务.区块链.敏捷开发.前端技术等,不是大神,只是出于热爱.有问题可以到 github.com/freew01f/bl- 进行交流 ...

  3. 基于以太坊发布属于自己的数字货币(代币)完整版

    https://blog.csdn.net/JAVA_HHHH/article/details/79771752 本文单纯从技术角度详细介绍如何基于以太坊ERC20创建代币的流程(此案例是部署的eth ...

  4. 向别人网页注入js_区块链研究实验室 | Web3 .js基于以太坊的Javascript API

    web3.js是一个库集合,你可以使用HTTP或IPC连接本地或远程以太它节点进行交互. web3的JavaScript库能够与以太坊区块链交互. 它可以检索用户帐户,发送交易,与智能合约交互等. V ...

  5. 基于以太坊的去中心化存储协议Swarm计划在2季度发布1.0版

    基于以太坊的去中心化存储协议Swarm表示,下一个重要里程碑Swarm 1.0版本预计在今年第二季度发布,在此之前将以约14天的间隔发布定期更新.除此之外,Swarm计划提前在以太坊Goerli测试网 ...

  6. 基于以太坊的58同城 | DApp开发与应用案例

    基于以太坊的58同城 | DApp开发与应用案例 今天,Origin开发团队很高兴地宣布在以太坊Rinkeby测试网络上推出Origin Protocol Demo DApp ! 在这个DApp中,你 ...

  7. 基于以太坊ICO的安全合约架构

    基于以太坊ICO的安全合约架构 概述 随着比特币.以太坊的崛起,通过ICO来筹集早期资金的项目越来越多.其中,大多数项目都采用基于以太坊的ERC20 token来发放代币.以ERC20 token为标 ...

  8. 干货|破解遗传算法——CryptoPups旺财,基于以太坊的区块链游戏(分享实录)

    CryptoPups旺财是一个类似谜恋猫的游戏,即将推出新的手机中文版.本文将通过CryptoPups旺财来分享基于以太坊的区块链游戏. 1 游戏结构和技术概述 其实我个人认为谜恋猫跟传统的游戏比起来 ...

  9. 干货|破解遗传算法——CryptoPups旺财,基于以太坊的区块链游戏(分享实录)...

    CryptoPups旺财是一个类似谜恋猫的游戏,即将推出新的手机中文版.本文将通过CryptoPups旺财来分享基于以太坊的区块链游戏. 1 游戏结构和技术概述 其实我个人认为谜恋猫跟传统的游戏比起来 ...

最新文章

  1. Angular中使用HttpClientModule模块实现get请求数据和post提交数据
  2. 微软全部正版软件下载地址和序列号索取
  3. OpenCV均值漂移meanshift algorithm算法的实例(附完整代码)
  4. 当初怎么就入了VS的坑
  5. 实验1 熟悉实验环境
  6. android确认密码代码,Android手机卫士之确认密码对话框
  7. vim-录制命令的使用
  8. 11.history命令历史
  9. 为什么黑客都用python-为什么大多数黑客都使用Python!
  10. 华为鸿蒙mate,华为MatePad Pro发布亮相!华为首款鸿蒙平板全新体验!
  11. 【UVA524】Prime Ring Problem(素数环--递归回溯+全局变量的一个小坑点---水题)
  12. think php5关联模型,thinkphp5 关联模型
  13. BP神经网络预测matlab程序销售量预测
  14. 2021-09-09 一个python代码验证身份证号码
  15. 手机输入法哪家好用?用户目前最喜爱这4款,有你正在使用的吗
  16. 个人认为比较有意思的文章
  17. 大学毕业4年-回顾和总结(9)-股权投资1年,给自己一个答卷(好狗狗、皇包车、职业梦、比呀比、易途8)(创业有风险,投资需谨慎)
  18. java-net-php-python-SSM的美工接单系统计算机毕业设计程序
  19. 深度学习实战(4)如何向BERT词汇表中添加token,新增特殊占位符
  20. 2019年前端road map

热门文章

  1. 使用 C# 开发智能手机软件:推箱子(十一)
  2. SQL Server 2022下载安装及配置
  3. 什么是服务治理平台?
  4. Tomcat面试题目
  5. 正则表达式匹配中文域名和英文域名和IP地址
  6. 通达信可以使用实盘接口吗?这有你需要了解的。
  7. 卫士通Linux C面试笔试题
  8. 未来学习规划 - java篇
  9. uni-app 运行环境判断与跨端兼容
  10. 网易云信iOSSDK集成遇到的坑