3.POW挖矿验证算法实现

Pow(Proof Of Work)的中文翻译是:工作量证明,是区块链共识机制的一种。

我们都知道比特币系统是由全球无数个节点支撑着整个系统的正常运转。每打包一个区块(记一笔账),也就是把上一个区块和当前区块的所有的交易(上节中我们讲到区块结构的data)打包在一个区块链上并广播给其他的节点。

那么问题来了:
1.全球这么多节点中每个节点都有权利打包区块,区块由谁去打包。
2.我为什么要耗费我的电脑系统资源去参与到打包区块(记账)中去。

Pow简单点来说就是我随机出一个数,谁先猜到了就由谁来记账。当然因为你的积极参与,也会得到一笔比特币作为奖励。系统会自动通过当前全网的算力将区块产出的速度控制在10分钟左右,那么开辟一个新区块就叫做我们经常听到的挖矿下面我们就来实现这么一个算法

先来简单回顾一下我们上节中区块组成的基本结构

type Block struct {
    Height    int64
    Data      []byte
    Timestamp int64
    PrevHash  []byte
    Hash      []byte
}

本节中新增的属性

Nonce int64

还记得我之前讲的“谁先猜到了就由谁来记账”这句话吗?既然是猜,那么肯定是通过某个值,不断的去改变他的值然后进行判断看他是否符合我们需要的结果。

所以这个nonce就派上用场了。

block.info上查看到的区块信息,看到了吗?比特币区块中的nonce

image.png

每次创建区块,都要去验证。新创建一个对象,专门处理挖矿验证。

func NewBlock(height int64, data []byte, prev []byte) *Block {
    block := &Block{
        height,
        data,
        time.Now().Unix(),
        prev,
        nil,
        0,
    }
    //以前的Hash是这么来的
    //block.Hash = block.SetHash()

    //现在的Hash
    //1.创建pow的对象得到区块和难度值
    pow := NewProofOfWork(block)

    //2.开始挖矿验证区块
    hash, nonce  := pow.Run()

    //3.给区块进行赋值
    block.Nonce = nonce
    block.Hash = hash

    return block
}

工作量证明的结构

type ProofOfWork struct {
    Block  *Block   //当前要验证的区块
    diff *big.Int //大数据存储
}

创建新的工作量证明,设置难度值
原理:如果随机生成的Hash(二进制)小于难度值则挖矿成功
实现过程:
将1左移(256-20(由常量定义的targetBit值))位。然后转换成二进制格式如下

//前面有20个零
diff :`0000 0000 0000 0000 00010000...0000`

左移的方法:

diff := diffBig.Lsh(diffBig, 256-targetBit)

创建工作量证明的完整函数:

//创建新的工作量证明
const targetBit = 20
func NewProofOfWork(block *Block) *ProofOfWork {
    //设置好难度
    diffBig := big.NewInt(1)
    diff := diffBig.Lsh(diffBig, 256-targetBit)
    return &ProofOfWork{block, diff}
}

开始运行,用死循环去不断累积nonce当找到符合要求的就退出循环。满足条件(当随机到的值小于难度值算成功)

func (pow *ProofOfWork) Run() ([]byte, int64) {
    //1. 将Block的属性拼接成字节数组
    nonce := 0
    var hashInt big.Int //存储新生成的HASH
    var hash [32]byte
    for {
        //准备数据
        dataBytes := pow.prepareData(nonce)
        hash = sha256.Sum256(dataBytes)
        fmt.Printf("\r%x :", hash)
        //将hash存储到hashInt
        hashInt.SetBytes(hash[:])
        //fmt.Println(hashInt)
        //判断hashInt是否小于Block里面的target //3. 判断hash有效性,如果满足条件,跳出循环
        if pow.diff.Cmp(&hashInt) == 1 {
            break
        }

        //通过nonce值不断变化求结果
        nonce = nonce + 1
    }
    return hash[:], int64(nonce)
}

今天的内容你是否学会了呢?如果没有可以去下载源码自己进行编译,调试去跟踪一下执行过程。很快就明白了。
https://gitee.com/itgjz/blockchain_learn/tree/master/block_chain_learn3

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • 1 货币的演变——从贝壳到比特币 当社会分工产生之后,人类就产生了商品交换的需求。在货币被发明之前,人类是以以物换...
    longlee阅读 7,624评论 1 23
  • 一、快速术语检索 比特币地址:(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串...
    不如假如阅读 15,913评论 4 87
  • 辜负的时光, 敷衍的生活, 日后总有一天, 我们都得不回来, 我们都得偿还。 ………… 孩子,你不能这样 今天由于...
    西瓜vs开心果阅读 303评论 0 0
  • 满心以为,过去的2017年已是最糟糕的一年,可未曾想,2018年才是更加惆怅的日子。 一个失落彷徨迷惘寂静的夜晚
    钱先森森阅读 382评论 0 0
  • 我啊总觉得自己是不一样的一只,觉得应该很特殊,在这茫茫宇宙里我有我自己的思维,很神奇,注定不平凡,(可能所有人都是...
    酒香爱馒头阅读 154评论 0 0