go 计算文件sha-256_Furein:运用go 完结Proof-of-Work 一致机制

本文介绍了Proof-of-Work(PoW)机制,通过Go语言实现计算文件的SHA-256哈希并满足特定前缀要求。通过不断调整nonce,最终找到满足条件的哈希值,确保区块的安全和一致性。同时讨论了PoW机制的优缺点,如去中心化、资源浪费和一致性延迟问题。
摘要由CSDN通过智能技术生成

Furein讲到Proof-of-Work简称 PoW,即为工作量证明。Furein经过核算一个数值(nonce),Furein这使得拼揍上买卖数据后内容的Hash值满意规矩的上限。在节点成功找到满意的Hash值之后,会马上对全网进行播送打包区块,网络的节点收到播送打包区块,会马上对其进行验证。

假设验证经过,则标明现已有节点成功解迷,自己就不再竞赛当时区块打包,而是挑选承受这个区块,记载到自己的账本中,然后进行下一个区块的竞赛猜谜。网络中只要最快解谜的区块,才会增加的账本中,其他的节点进行仿制,这样就保证了整个账本的唯一性。

假设节点有任何的做弊行为,都会导致网络的节点验证不经过,直接丢掉其打包的区块,这个区块就无法记载到总账本中,做弊的节点消耗的本钱就白费了,因此在巨大的挖矿本钱下,也使得矿工自觉自愿的恪守比特币体系的一致协议,也就保证了整个体系的安全。

工作量证明的优缺陷

ac4b81d87f89972e847026e84363bba9.png

长处:完全去中心化,节点自在进出;

缺陷:现在bitcoin现已招引全球大部分的算力,其它再用Pow一致机制的区块链运用很难取得相同的算力来保证本身的安全;挖矿形成很多的资源糟蹋;一致到达的周期较长,不适合商业运用。

工作量证明的简略的比如

举个比如,给定的一个根本的字符串"Hello, world!",咱们给出的工作量要求是,能够在这个字符串后边增加一个叫做nonce的整数值,对改动后(增加nonce)的字符串进行SHA256哈希运算,假设得到的哈希成果(以16进制的方式表明)是以"0000"最初的,则验证经过。为了到达这个工作量证明的方针。咱们需求不断的递加nonce值,对得到的新字符串进行SHA256哈希运算。依照这个规矩,咱们需求经过4251次核算才干找到刚好前4位为0的哈希散列。

"Hello, world!0" => 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64"Hello, world!1" => e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8"Hello, world!2" => ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7..."Hello, world!4248" => 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965"Hello, world!4249" => c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6"Hello, world!4250" => 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

完结 Proof-of-Work一致机制

装置依靠软件

$ go get github.com/davecgh/go-spew/spew$ go get github.com/gorilla/mux$ go get github.com/joho/godotenv

spew在操控台中格式化输出相应的成果。

gorilla/mux是编写web处理程序的盛行软件包。

godotenv能够从咱们项目的根目录的 .env文件中读取数据。

完结 PoW一致机制

新建 .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 int Timestamp string BPM int Hash string PrevHash string Difficulty int Nonce string}var Blockchain Blocktype Message struct { BPM int}var mutex = &sync.Mutex{}

difficulty代表难度系数,假设赋值为 1,则需求判别生成区块时所发生的Hash 前缀至少包括1个0

Block代表区块的结构体。

Index是区块链中数据记载的方位

Timestamp是主动确认的,并且是写入数据的时刻

BPM是每分钟跳动的次数,是你的脉率

Hash是代表这个数据记载的SHA256标识符

PrevHash是链中上一条记载的SHA256标识符

Difficulty是当时区块的难度系数

Nonce是 PoW挖矿中契合条件的数字

Blockchain是寄存区块数据的调集

Message是运用 POST恳求传递的数据

mutex是为了避免同一时刻发生多个区块

生成区块

func generateBlock(oldBlock Block, BPM int) Block { var newBlock Block t := time.Now newBlock.Index = oldBlock.Index + 1 newBlock.Timestamp = t.String newBlock.BPM = BPM newBlock.PrevHash = oldBlock.Hash newBlock.Difficulty = difficulty for i := 0; ; i++ { hex := fmt.Sprintf("%x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值