pow介绍

工作量证明(PoW,Proof of Work)。
通过计算一个数值(nonce ),使得拼揍上交易数据后内容的 Hash 值满足规定的上限。在节点成功找到满足的Hash值之后,会马上对全网进行广播打包区块,网络的节点收到广播打包区块,会立刻对其进行验证。

如果验证通过,则表明已经有节点成功解迷,自己就不再竞争当前区块打包,而是选择接受这个区块,记录到自己的账本中,然后进行下一个区块的竞争猜谜。 网络中只有最快解谜的区块,才会添加的账本中,其他的节点进行复制,这样就保证了整个账本的唯一性。

假如节点有任何的作弊行为,都会导致网络的节点验证不通过,直接丢弃其打包的区块,这个区块就无法记录到总账本中,作弊的节点耗费的成本就白费了,因此在巨大的挖矿成本下,也使得矿工自觉自愿的遵守比特币系统的共识协议,也就确保了整个系统的安全。
参考黎跃春的翻译

pow优缺点

  • 优点:完全去中心化,节点自由进出;
  • 缺点:目前bitcoin已经吸引全球大部分的算力,其它再用Pow共识机制的区块链应用很难获得相同的算力来保障自身的安全;挖矿造成大量的资源浪费;共识达成的周期较长,不适合商业应用

go实现pow共识算法

代码出处

依赖软件

  • spew 在控制台中格式化输出相应的结果。
    $ go get github.com/davecgh/go-spew/spew
  • gorilla/mux 是编写web处理程序的流行软件包。
    $ go get github.com/gorilla/mux
  • godotenv 可以从我们项目的根目录的 .env 文件中读取数据。
    $ go get github.com/joho/godotenv

.env

ADDR=8080

main.go

package mainimport ("crypto/sha256""encoding/hex""encoding/json""fmt""io""log""net/http""os""strconv""strings""sync""time""github.com/davecgh/go-spew/spew""github.com/gorilla/mux""github.com/joho/godotenv"
)const difficulty = 1type Block struct {Index      intTimestamp  stringBPM        intHash       stringPrevHash   stringDifficulty intNonce      string
}var Blockchain []Blocktype Message struct {BPM int
}var mutex = &sync.Mutex{}func generateBlock(oldBlock Block, BPM int) Block {var newBlock Blockt := time.Now()newBlock.Index = oldBlock.Index + 1newBlock.Timestamp = t.String()newBlock.BPM = BPMnewBlock.PrevHash = oldBlock.HashnewBlock.Difficulty = difficultyfor i := 0; ; i++ {hex := fmt.Sprintf("%x", i)newBlock.Nonce = hexif !isHashValid(calculateHash(newBlock), newBlock.Difficulty) {fmt.Println(calculateHash(newBlock), " do more work!")time.Sleep(time.Second)continue} else {fmt.Println(calculateHash(newBlock), " work done!")newBlock.Hash = calculateHash(newBlock)break}}return newBlock
}func isHashValid(hash string, difficulty int) bool {//复制 difficulty 个0,并返回新字符串,当 difficulty 为2 ,则 prefix 为 00prefix := strings.Repeat("0", difficulty)// HasPrefix判断字符串 hash 是否包含前缀 prefixreturn strings.HasPrefix(hash, prefix)
}func calculateHash(block Block) string {record := strconv.Itoa(block.Index) + block.Timestamp + strconv.Itoa(block.BPM) + block.PrevHash + block.Nonceh := sha256.New()h.Write([]byte(record))hashed := h.Sum(nil)return hex.EncodeToString(hashed)
}func isBlockValid(newBlock, oldBlock Block) bool {if oldBlock.Index+1 != newBlock.Index {return false}if oldBlock.Hash != newBlock.PrevHash {return false}if calculateHash(newBlock) != newBlock.Hash {return false}return true
}func run() error {mux := makeMuxRouter()httpAddr := os.Getenv("ADDR")log.Println("Listening on ", os.Getenv("ADDR"))s := &http.Server{Addr:           ":" + httpAddr,Handler:        mux,ReadTimeout:    10 * time.Second,WriteTimeout:   10 * time.Second,MaxHeaderBytes: 1 << 20,}if err := s.ListenAndServe(); err != nil {return err}return nil
}func makeMuxRouter() http.Handler {muxRouter := mux.NewRouter()muxRouter.HandleFunc("/", handleGetBlockchain).Methods("GET")muxRouter.HandleFunc("/", handleWriteBlock).Methods("POST")return muxRouter
}func handleGetBlockchain(w http.ResponseWriter, r *http.Request) {bytes, err := json.MarshalIndent(Blockchain, "", "  ")if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}io.WriteString(w, string(bytes))
}func handleWriteBlock(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "application/json")var m Messagedecoder := json.NewDecoder(r.Body)if err := decoder.Decode(&m); err != nil {respondWithJSON(w, r, http.StatusBadRequest, r.Body)return}   defer r.Body.Close()//ensure atomicity when creating new blockmutex.Lock()newBlock := generateBlock(Blockchain[len(Blockchain)-1], m.BPM)mutex.Unlock()if isBlockValid(newBlock, Blockchain[len(Blockchain)-1]) {Blockchain = append(Blockchain, newBlock)spew.Dump(Blockchain)}   respondWithJSON(w, r, http.StatusCreated, newBlock)}func respondWithJSON(w http.ResponseWriter, r *http.Request, code int, payload interface{}) {w.Header().Set("Content-Type", "application/json")response, err := json.MarshalIndent(payload, "", "  ")if err != nil {w.WriteHeader(http.StatusInternalServerError)w.Write([]byte("HTTP 500: Internal Server Error"))return}w.WriteHeader(code)w.Write(response)
}func main() {err := godotenv.Load()if err != nil {log.Fatal(err)}   go func() {t := time.Now()genesisBlock := Block{}genesisBlock = Block{0, t.String(), 0, calculateHash(genesisBlock), "", difficulty, ""} spew.Dump(genesisBlock)mutex.Lock()Blockchain = append(Blockchain, genesisBlock)mutex.Unlock()}() log.Fatal(run())}

【go共识算法】-POW相关推荐

  1. 共识算法POW原理及实现

    POW简介 Proof of Work,工作证明. POW共识算法主要是通过计算难度值来决定谁来出块.POW的工作量是指方程式求解,谁先解出来,谁就有权利出块.方程式是通过前一个区块的哈希值和随机值n ...

  2. 详解DPoS共识算法

    一.DPoS 的诞生 想象这样一家公司:公司员工总数有1000人,每个人都持有数额不等的公司股份.每隔一段时间,员工可以把手里的票投向自己最认可的10个人来领导公司,其中每个员工的票权和他手里持有的股 ...

  3. 以太坊目前所使用的共识算法介绍

    如果别人问你"以太坊目前所使用的共识算法"是什么?如果你此时去浏览器搜索发现有些文章说是PoS,又有些说是PoW. 完整且正确的说法应该是这样的,这其实也是PoW共识机制与以太坊的 ...

  4. 区块链共识算法的发展现状与展望

    来源:平行区块链 摘 要 共识算法是区块链技术的核心要素, 也是近年来分布式系统研究的热点. 本文系统性地梳理和讨论了区块链发展过程中的 32 种重要共识算法, 介绍了传统分布式一致性算法以及分布式共 ...

  5. 共识算法(POW、POS、PBFT、DPOS)介绍-

    POW:Proof of Work,工作证明 比特币在Block的生成过程中使用了POW机制,一个符合要求的Block Hash由N个前导零构成,零的个数取决于网络的难度值.要得到合理的Block H ...

  6. 分布式共识四】POW共识算法

    下面我来说说Bitcoin是如何通过Pow算法解决拜占庭将军问题的. 比特币 2008年,中本聪介绍了一个点对点的电子现金系统--比特币.比特币的基石是拜占庭共识协议.比特币怎样实现了拜占庭共识协议将 ...

  7. Java实现pow共识算法_POW+POS混合共识算法

    上一章节说过,实际运用pos是需要借助其他算法才能实现的.本章节主要学习点点币的共识算法,该算法是基于POW改进的POS算法. 混合共识算法的定义 现在很多公链都是在用基于xx和xx算法的混合共识算法 ...

  8. 共识算法介绍与分析(PoW、PBFT、Paxos、Raft)

    前言: 读书报告非得做区块链攻防综述相关的,那我这个共识算法的报告就白做了咯 那就放上来和大家一起分享呗 正文: 摘要 在分布式系统中,我们需要制定一定的规则使得多个服务节点对某一个提案达成一致的意见 ...

  9. [区块链]共识算法(POW,POS,DPOS,PBFT)介绍和心得

    POW:Proof of Work,工作证明. 比特币在Block的生成过程中使用了POW机制,一个符合要求的Block Hash由N个前导零构成,零的个数取决于网络的难度值.要得到合理的Block ...

  10. 区块链共识算法之POW

    简介 POW,proof of work,即工作量证明,是著名公链bitcoin所采用的共识算法.那么POW到底是什么玩意呢?简单来说,pow就是一个证明,证明你确实做了一定量符合要求的工作.通常&q ...

最新文章

  1. OpenGL学习(hello)
  2. Codeforces Round #703 (Div. 2)(A ~ F)超高质量题解【每日亿题2 / 19】
  3. 深入浅出Istio:Service mesh快速入门与实践-读书笔记(By GisonWin)
  4. LiveQing视频流媒体开放平台利用 webpack 打包压缩后端代码
  5. cnn卷积神经网络_5分钟内卷积神经网络(CNN)
  6. 电脑睡眠快捷键_电脑快速进入睡眠的快捷键是什么?
  7. thinkPHP利用ajax异步上传图片并显示、删除
  8. [转载] 必须要会回答的Java面试题(字符串篇)
  9. 高通宣布与华为达成新专利授权协议,华为砸下18亿美元
  10. 【clickhouse】clickhouse 表引擎 之 AggregatingMergeTree
  11. javascript Declarations
  12. Win XP环境Tuxedo8.1安装、配置指南
  13. OpenCV-获取图像中直线上的数据
  14. 20169302 2016-2017-2 《网络攻防实践》课程总结
  15. 【步步为赢】如何使用手机号码批量归属地查询分拣并且分类批量导出TXT文本EXCEL
  16. 聚搜-聚合搜索引擎网页模板
  17. [IOS][已越狱]配合网易云音乐,使用Bridge快速免iTunes导入音乐到“音乐”
  18. aws saa 认证价值大吗?aws认证指的是什么?
  19. Python「剪藏」网页为 PDF
  20. mvp中的m作用_将M放入MVP

热门文章

  1. html语言怎么让字体加粗,css怎么让字体加粗?
  2. 教你5分钟实现百度首页搜索框,2分钟即时上线
  3. Unity中作2D藤曼生长效果
  4. 网络传输协议 kcp 原理解析
  5. HTML实现单选和多选
  6. 为什么选择Python作为编程入门语言
  7. 学习 SpringCloud 服务消费者(rest+ribbon)小结
  8. Windows asar工具安装使用与破解StarUml
  9. linux中miniconda软件的安装及环境配置
  10. 室内施工图LiSP_AutoLISP在巷道断面施工图绘制中的应用