共识算法POW原理及实现
POW简介
Proof of Work,工作证明。
POW共识算法主要是通过计算难度值来决定谁来出块。POW的工作量是指方程式求解,谁先解出来,谁就有权利出块。方程式是通过前一个区块的哈希值和随机值nonce来计算下一个区块的哈希值,谁先找到nonce,谁就能最先计算出下一个区块的哈希值,这种方式之所以被称为计算难度值是因为方程式没有固定解法,只能不断的尝试,这种解方程式的方式称为哈希碰撞,是概率事件,碰撞的次数越多,方程式求解的难度就会越大。比特币就是采用POW共识算法
算法具体实现原理
这里涉及到两个重要的概念,一个是难度系数,一个是nonce,nonce可以理解为一个随机数,就是挖矿中要找到一个符合条件的nonce值。
这里假设难度系数是4(比特币初始难度系数就是4),将一个区块中的数据加上nonce值打包,nonce值从0开始一直递增,将这打包的数据计算hash值,hash满足最前面有4个0,就是挖矿成功。难度系数为多少,hash最前面就需要满足多少个0。
代码简单实现其原理
package mainimport ("strconv""time""crypto/sha256""strings""encoding/hex""fmt"
)//pow 挖矿算法//定义难度系数
const difiiculty = 4type Block struct {Index int // 区块高度TimeStamp int64Data string //交易记录Hash stringPrehash stringNonce intDifficulty int //难度系数
}//创建区块链
var BlockChain []Block//创世区块
func GenesisBlock() *Block {var geneBlock = Block{0, time.Now().Unix(), "", "", "", 0, difiiculty}geneBlock.Hash = hex.EncodeToString(BlockHash(geneBlock))return &geneBlock}func BlockHash(block Block) []byte {re := strconv.Itoa(block.Index) + strconv.Itoa(int(block.TimeStamp)) + block.Data + block.Prehash +strconv.Itoa(block.Nonce) + strconv.Itoa(block.Difficulty)h := sha256.New()h.Write([]byte(re))hashed := h.Sum(nil)return hashed}func isBlockValid(block Block) bool {prefix := strings.Repeat("0", block.Difficulty)return strings.HasPrefix(block.Hash, prefix)
}//创建新区块 pow挖矿
func CreateNewBlock(lastBlock *Block, data string) *Block {var newBlock BlocknewBlock.Index = lastBlock.Index + 1newBlock.TimeStamp = time.Now().Unix()newBlock.Data = datanewBlock.Prehash = lastBlock.HashnewBlock.Difficulty = difiicultynewBlock.Nonce = 0//开挖-当前区块的hash值的前面的0的个数与难度系数值相同for {//计算hashcuhash := hex.EncodeToString(BlockHash(newBlock))fmt.Println("挖矿中",cuhash)newBlock.Hash = cuhashif isBlockValid(newBlock) {//校验区块if VerflyBlock(newBlock, *lastBlock) {fmt.Println("挖矿成功")return &newBlock}}newBlock.Nonce ++}
}//校验新的区块是否合法
func VerflyBlock(newblock Block, lastBlock Block) bool {if lastBlock.Index +1 !=newblock.Index {return false}if newblock.Prehash !=lastBlock.Hash {return false}return true}func main() {var genBlock = GenesisBlock()newBlock := CreateNewBlock(genBlock,"新区块")fmt.Println(newBlock)}
输出
挖矿中 ac6665903c0cd2f000e17483fbcf6e3e8fa365de2b55663e7c94167f816d1489
挖矿中 a46e18c7938ccb2d0554232f94c6e8db933fae509adafd4091f5f0b51951e6ae
挖矿中 3738b5eb5f8f956974fc767058a6d7c94da0fc406e86df2d508b9b87fc109171
挖矿中 0000694b1acaec754175f0a49a1aa190e122b58e9f58125bd18ceec898f8d811
挖矿成功
&{1 1530267247 新区块 0000694b1acaec754175f0a49a1aa190e122b58e9f58125bd18ceec898f8d811 a8df431924b17633bdf0303763661aa7a41c2608cd99f6527542e1326c718152 12167 4}
共识算法POW原理及实现相关推荐
- 缺失的白皮书:DPOS共识算法工作原理及鲁棒性根源分析
雷锋网(公众号:雷锋网)按:本文发表于Steem,作者是dantheman.译者是万云首席技术官奚海峰,首发公众号万云BaaS.奚海峰曾任IBM研究院工程师和高级咨询顾问,Sempra Commodi ...
- 15种区块链共识算法全面详解
1,摘要 本文尽可能列出所有主要的共识算法,评估各自的优劣之处.共识算法是区块链的核心技术,本文会跟随作者的理解,持续更新.如果读者发现有所遗漏,或是存在错误,希望能通过评论指出. 2,区块链共识算法 ...
- 详解DPoS共识算法
一.DPoS 的诞生 想象这样一家公司:公司员工总数有1000人,每个人都持有数额不等的公司股份.每隔一段时间,员工可以把手里的票投向自己最认可的10个人来领导公司,其中每个员工的票权和他手里持有的股 ...
- 以太坊目前所使用的共识算法介绍
如果别人问你"以太坊目前所使用的共识算法"是什么?如果你此时去浏览器搜索发现有些文章说是PoS,又有些说是PoW. 完整且正确的说法应该是这样的,这其实也是PoW共识机制与以太坊的 ...
- 区块链共识算法的发展现状与展望
来源:平行区块链 摘 要 共识算法是区块链技术的核心要素, 也是近年来分布式系统研究的热点. 本文系统性地梳理和讨论了区块链发展过程中的 32 种重要共识算法, 介绍了传统分布式一致性算法以及分布式共 ...
- 共识算法(POW、POS、PBFT、DPOS)介绍-
POW:Proof of Work,工作证明 比特币在Block的生成过程中使用了POW机制,一个符合要求的Block Hash由N个前导零构成,零的个数取决于网络的难度值.要得到合理的Block H ...
- 共识算法介绍与分析(PoW、PBFT、Paxos、Raft)
前言: 读书报告非得做区块链攻防综述相关的,那我这个共识算法的报告就白做了咯 那就放上来和大家一起分享呗 正文: 摘要 在分布式系统中,我们需要制定一定的规则使得多个服务节点对某一个提案达成一致的意见 ...
- [区块链]共识算法(POW,POS,DPOS,PBFT)介绍和心得
POW:Proof of Work,工作证明. 比特币在Block的生成过程中使用了POW机制,一个符合要求的Block Hash由N个前导零构成,零的个数取决于网络的难度值.要得到合理的Block ...
- 区块链共识算法之POW
简介 POW,proof of work,即工作量证明,是著名公链bitcoin所采用的共识算法.那么POW到底是什么玩意呢?简单来说,pow就是一个证明,证明你确实做了一定量符合要求的工作.通常&q ...
最新文章
- SAP 序列号与库存关联起来?
- Tomcat unable to start within 45 seconds.
- HDLBits 系列(31)Serial Receiver and Datapath
- usaco3.33Camelot(BFS)
- IE浏览器报错 ‘Rowspan’ 为空或不是对象
- C++中的static 成员变量的一些注意点
- 获取Linux命令源代码的方法
- 家里有古玩古董摆放在家中好吗?
- (二)MR之reduce多目录输出
- matlab差分方程实验报告,实验二微分方程与差分方程模型matlab求解.doc
- JAVA基础—适配器设计模式
- 悬崖帝国中文版下载|悬崖帝国中文破解版下载 v1.0绿色免安装版
- 计算机无本地安全策略,如何打开本地安全策略、如何解决“未授予用户在此计算机上的请求登录类型”...
- Windows下制作苹果电脑U盘启动
- 某程序员披露华为外包员工现状:工作氛围好,没有歧视,但转正后也不算正式员工?...
- python运用ico图标,处理Django中的favicon.ico图标实例方法
- 超详细|开关电源电路图及原理讲解;以UC3842为中心的开关电源介绍,重点是以光耦和电流互感器为关键的反馈电路,以及在此基础上的过压欠压短路等各种保护稳压电路措施
- 谷歌大脑组合模型霸榜 SuperGLUE,什么模型这么高?
- alert转换成html,如何修改alert弹窗的具体样式?
- C# Bitmap引用System.Drawing报错 “...不存在类型命名空间名...”的修复