PoW算法


前言

提示:以下是本篇文章正文内容,下面案例可供参考

一、PoW——工作量证明

⚫ Proof-of-Work 简称 PoW,即为工作量证明
⚫ 通过计算一个数值,使得拼揍上交易数据后内容的值满足规定的上限,在节点成功
找到满足的 Hash 值之后,会马上对全网进行广播打包区块,网络的节点收到广播
打包区块,会立刻对其进行验证
⚫ 网络中只有最快解密的区块,才会添加的账本中,其他的节点进行复制,这样就保
证了整个账本的唯一性
⚫ 假如节点有任何的作弊行为,都会导致网络的节点验证不通过,直接丢弃其打包的
区块,这个区块就无法记录到总账本中,作弊的节点耗费的成本就白费了,因此在
巨大的挖矿成本下,也使得矿工自觉自愿的遵守比特币系统的共识协议,也就确保
了整个系统的安全

二、go语言简单案例

package main

import (
	"time"
	"strconv"
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"strings"
)

//通过代码,实现PoW挖矿

//定义区块
type Block struct {
	//上一个区块的哈希
	PreHash string
	//当前区块的哈希
	HashCode string
	//时间戳
	TimeStamp string
	//难度系数
	Diff int
	//交易信息
	Data string
	//区块高度
	Index int
	//随机值
	Nonce int
}

//第一个区块:创世区块
func GenerateFirstBlock(data string) Block {
	//创建第一个Block
	var firstblock Block
	firstblock.PreHash = "0"
	firstblock.TimeStamp = time.Now().String()
	//暂设为4
	firstblock.Diff = 4
	//交易信息
	firstblock.Data = data
	firstblock.Index = 1
	firstblock.Nonce = 0
	//通过sha256得到自己的哈希
	firstblock.HashCode = GenerationHashValue(firstblock)
	return firstblock
}

//生成区块的哈希值
func GenerationHashValue(block Block) string {
	//按照比特币的写法,将区块的所有属性拼接后做哈希运算
	//int转为字符串
	var hashdata = strconv.Itoa(block.Index) + strconv.Itoa(block.Nonce) +
		strconv.Itoa(block.Diff) + block.TimeStamp
	//算哈希
	var sha = sha256.New()
	sha.Write([]byte(hashdata))
	hashed := sha.Sum(nil)
	return hex.EncodeToString(hashed)
}

func main() {
	//测试创建创世区块
	var firstBlock = GenerateFirstBlock("创世区块")
	fmt.Println(firstBlock)
	fmt.Println(firstBlock.Data)

	//需要生成下一个区块
	GenerateNextBlock("第二区块", firstBlock)
}

//产生新的区块
func GenerateNextBlock(data string, oldBolock Block) Block {
	//产生一个新的区块
	var newBlock Block
	newBlock.TimeStamp = time.Now().String()
	//难度系数
	newBlock.Diff = 5
	//高度
	newBlock.Index = 2
	newBlock.Data = data
	newBlock.PreHash = oldBolock.HashCode
	newBlock.Nonce = 0

	//创建pow()算法的方法
	//计算前导0为4个的哈希值
	newBlock.HashCode = pow(newBlock.Diff, &newBlock)
	return newBlock
}

//pow算法
func pow(diff int, block *Block) string {
	//实现不停地去挖矿
	for {
		//认为是挖了一次矿了
		hash := GenerationHashValue(*block)
		//挖矿过程的哈希打印
		fmt.Println(hash)
		//判断哈希值前导0是否为diff个0
		//strings.Repeat:判断hash是否有diff个0,写1,就判断为有多少个1
		if strings.HasPrefix(hash, strings.Repeat("0", diff)) {
			//挖矿成功
			fmt.Println("挖矿成功")
			return hash
		} else {
			//没挖到
			//随机值自增
			block.Nonce++
		}
	}
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
工作量证明算法(Proof of Work)是一种共识算法,它在区块链中起到了重要的作用。Python中可以实现工作量证明算法的一种方法是使用哈希函数和随机数。具体步骤如下: 1. 首先,我们需要定义一个区块的数据结构,其中包含区块的索引、时间戳、交易数据、上一个区块的哈希值和一个随机数(Nonce)。 2. 接下来,我们需要选择一个哈希函数,比如SHA-256,来对区块的数据进行哈希运算。 3. 然后,我们需要设定一个目标值,也称为难度目标。目标值是一个由前导零位数决定的字符串,比如"0000"。我们的目标是找到一个Nonce,使得区块的哈希值满足前导零的要求。 4. 开始挖矿。挖矿的过程就是通过不断尝试不同的Nonce值来计算区块的哈希值,直到找到一个满足难度目标的哈希值为止。 5. 一旦找到一个满足难度目标的哈希值,我们就可以将该区块添加到区块链中,并将其广播给网络中的其他节点。 6. 其他节点会验证该区块的哈希值是否满足难度目标,并进行相应的确认和更新操作。 请注意,Python只是一种编程语言,可以用来实现各种共识算法,包括工作量证明算法。在实际应用中,还需要考虑到其他因素,如难度调整、共识规则等。因此,实现一个完整的Python POW共识算法可能需要更复杂的代码和逻辑。以上只是一个简单的示例,希望能为您提供一些参考。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [15个区块链共识算法的开源实现【BFT/Raft/Paxos/Pow/PoS】](https://download.csdn.net/download/weixin_38723027/14887677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【毕设教程】python区块链实现 - proof of work工作量证明共识算法](https://blog.csdn.net/HUXINY/article/details/125848088)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [视频教程-共识算法PoW算法及其实现-区块链](https://blog.csdn.net/weixin_28698089/article/details/106512656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值