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. SpringBoot同时集成Redis和Guava作为缓存组件--进一步分析代码
  2. Python进阶_wxpy学习:消息处理
  3. 第三课——MFC编程
  4. [Android]在Dagger 2中使用RxJava来进行异步注入(翻译)
  5. 计算机谭音乐同桌的你,同桌的你_Ava_clover_新浪博客
  6. 解决firefox的button按钮文字不能垂直居中
  7. java实现文件下载的两种方式6_struts2实现文件下载功能
  8. 怎样把ACCESS导入SQL数据库
  9. c#期末考试知识点_c#期末考试复习题及答案
  10. matlab逻辑电路图,基于.matlab的数字逻辑电路仿真.doc
  11. litepal更好的操作sqlite3,配置与基本操作
  12. java开发团队认知_一个优秀的研发团队应该具备什么特征
  13. 2021-2027全球与中国医疗废物容器市场现状及未来发展趋势
  14. How to Register/Update Ad Muncher using TOR
  15. 植物突变体库(二)——EMS诱变
  16. 九种常用输入法特殊符号功能大揭密
  17. jsp通过<%@include file=“bottom.txt“ %>指令引入txt乱码的解决方法
  18. 符号“∑”和“Π”的用法
  19. cadence 页间连接符标号的 删除,添加,更新
  20. 复旦大学计算机专业好还是浙大好,复旦大学和浙江大学,哪个更强一点?很多人都猜错了...

热门文章

  1. 【immutable学习记录】immutable 中 Seq 的用法
  2. 俄罗斯离美国有多近?只有3701米
  3. properties文件html,properties的中文意思
  4. openmediavault安装OMV-Extras插件
  5. hexo+github个人博客简易快速上手
  6. 关于个体工商户的15个财税要点,你清楚吗?
  7. OpenSSh 下载地址
  8. Vim教程2 在文件中的移动
  9. 计算机考研复试看脸吗,考研经验:考研复试也看脸,颜值也是蛮拼的
  10. 个人博客模板 html5