PoW——工作量证明 go实现

Proof-of-Work 简称 PoW,即为工作量证明

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

⚫网络中只有最快解密的区块,才会添加的账本中,其他的节点进行复制,这样就保 证了整个账本的唯一性

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

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()
	firstblock.Diff = 4
	firstblock.Data = data
	firstblock.Index = 1
	firstblock.Nonce = 0
	//计算哈希,HashCode
	firstblock.HashCode = GenerationHashValue(firstblock)
	return firstblock
}

func GenerationHashValue(block Block) string {
	var hashdata = strconv.Itoa(block.Nonce) + strconv.Itoa(block.Diff) +
		strconv.Itoa(block.Index) + block.TimeStamp
	//计算哈希
	var sha = sha256.New()
	sha.Write([]byte(hashdata))
	hashed := sha.Sum(nil)
	return hex.EncodeToString(hashed)
}

//产生新的区块
func GenerateNextBlock(data string, oldBlock Block) Block {
	var newBlock Block
	newBlock.TimeStamp = time.Now().String()
	newBlock.Diff = 4
	newBlock.Index = 2
	newBlock.Data = data
	newBlock.PreHash = oldBlock.HashCode
	newBlock.Nonce = 0
	//实现pow
	newBlock.HashCode = pow(newBlock.Diff, &newBlock)
	return newBlock
}

func pow(diff int, block *Block) string {
	//实现挖矿
	for {
		hash := GenerationHashValue(*block)
		fmt.Println(hash)
		if strings.HasPrefix(hash, strings.Repeat("0", diff)) {
			//挖矿成功
			fmt.Println("挖矿成功")
			return hash
		} else {
			//随机值自增
			block.Nonce++
		}
	}
}
  1. 优点
  1. 挖矿机制本身比较复杂,难度的自动调整,区块奖励逐步减半,这些是基于经济学原理,能吸引和鼓励更多人参与其中
  2. 越先参与的获得越多,会促使加密货币初始阶段迅速发展,网络节点迅速扩大,比特币吸引了N多人参与挖矿
  3. 通过挖矿,发行新币,把比特币分散给了个人,实现了相对的公平
  1. 缺点
  1. 算力是计算机硬件提供的,直接耗费电力,对能源的直接消耗
  2. 随着发展,算力已经不是单纯CPU能搞定的了,GPU,FPGA,以及ASIC矿机,这些可能不是个人能轻松实现的,导致算力中心化,长远来看,与去中心和背道而驰,网络的安全受到威胁
  3. 比特币区块奖励每4年减半,挖矿成本越来越高,当挖矿成本高于挖矿收益时,挖矿的积极性降低,整体网络不稳定

 

你可能感兴趣的:(go)