/*
工作量证明步骤:
1、准备公开数据data
2、使用一个计数器counter,初始化为0
3、计算data + counter 的hash值
4、检查条件是否满足某种要求:满足结束,不满足,counter+1,然后重复3-4步骤
*/
package main
import (
"bytes"
"crypto/sha256"
"encoding/binary"
"fmt"
"log"
"math"
"math/big"
)
func main() {
//proof of work的核心算法,挖矿
var hashInt big.Int
var hash [32]byte
nonce := 0
maxNonce := math.MaxInt64
for nonce < maxNonce {
data := bytes.Join([][]byte{[]byte("aabbcc"), IntToHex(int64(nonce))}, []byte{})
hash = sha256.Sum256(data)
// hash转换成Big Integer,方便做比较
hashInt.SetBytes(hash[:])
fmt.Printf("\r%x", hash)
// 比较hashInt和target的大小。hashInt<target时返回-1;hashInt>target时返回+1;否则返回0。
if hashInt.Cmp(target()) == -1 {
break
} else {
nonce++
}
}
// fmt.Printf("%x", hash)
}
func IntToHex(num int64) []byte {
buff := new(bytes.Buffer)
err := binary.Write(buff, binary.BigEndian, num)
if err != nil {
log.Panic(err)
}
return buff.Bytes()
}
func target() *big.Int {
//设置big.NewInt的初始化位1
target := big.NewInt(1)
//左移256-24位,也就是
target.Lsh(target, uint(256-24))
return target
}
区块链共识机制POW(工作证明Proof of Work)
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 目录 用python构建区块链(1)---基本结构用python构建区块链(2)---工作量证明共识算法(pow)...
- 区块链可以理解为一个不可篡改的公共账本,所有参与者都能验证交易并进行记账,即为分布式账本。那到底由谁来记账?又如何...
- 文章摘要:PoW讲究的是劳有所得,不劳而获在它的规则下是不可能存在的。 原创声明 本文作者:Minlu Kuo 已...
- 工作量证明(Proof of Work,简称POW)是共识机制的一种,可简单理解为一份 证明,证明你做过一定量的工...