之前的博文已经实现了区块连的基本的工作原理,但在比特币系统中有一个很重要的概念:工作量证明POW,在比特币系统中它的作用就是在十分钟左右的时间内只有一个有能够记帐并得到奖励

在之前的博文中,区块的哈希值是我自己创建的,那么在这里需要将原区块函数更改为以下的样子

func NewBlock(data string, prevBlockHash []byte) *Block {
//initial block data
block := &Block{
Version:,
PreBlockHash:prevBlockHash,
//Hash:[]
TimeStamp:time.Now().Unix(),
TargetBits:targetBits,
Nonce:,
MerkelRoot:[]byte{},
Data:[]byte(data),
}
//block.SetHash() //get block hash
pow := NewProofOfWork(block)
nonce, hash := pow.Run()
block.Nonce = nonce
block.Hash = hash
return block
}

新建一个工作证明proofofwork.go的文件

package main

import (
"math/big"
"bytes"
"math"
"crypto/sha256"
"fmt"
) const targetBits = type ProofOfWork struct {
block *Block
targetBit *big.Int
} func NewProofOfWork(block *Block) *ProofOfWork {
var IntTarget = big.NewInt()
IntTarget.Lsh(IntTarget, uint( - targetBits))
return &ProofOfWork{block, IntTarget}
} func (pow *ProofOfWork)PrepareRowData(nonce int64) []byte {
block := pow.block
tmp := [][]byte{
IntToByte(block.Version),
block.PreBlockHash,
IntToByte(block.TimeStamp),
block.MerkelRoot,
IntToByte(nonce),
IntToByte(targetBits),
block.Data,
}
data := bytes.Join(tmp, []byte{})//join接收两个参数,第一个二维数组,第二个这里设置为空的连接符
return data
} func (pow *ProofOfWork)Run() (int64, []byte) {
var nonce int64
var hash []byte
var HashInt big.Int
fmt.Printf("Begin mining....")
fmt.Printf("Target Hash : %x\n", pow.targetBit.Bytes())
for nonce < math.MaxInt64 {
data := pow.PrepareRowData(nonce)
hash = sha256.Sum256(data)
HashInt.SetBytes(hash[:])
if HashInt.Cmp(pow.targetBit) == - {
fmt.Printf("found hash: %x\n", hash)
break
} else {
nonce++
}
}
return nonce, hash[:]
} func (pow *ProofOfWork)IsValid() bool {
data := pow.PrepareRowData(pow.block.Nonce)
hash := sha256.Sum256(data)
var IntHash big.Int
IntHash.SetBytes(hash[:])
return IntHash.Cmp(pow.targetBit) == -
}

系统就会自动进行运算,go build *.go之后 ,执行结果为

baylor@baylor-virtual-machine:~/go/src/v2$ ./blockchain
Begin mining....Target Hash :
found hash: 0000009d511471179142f674a5efc491ce2e6c53aa941866037eaceb2864c364
Begin mining....Target Hash :
found hash: 000000dc2edb49477aef1e99eb9dfd50c54ce5978a105071006a9ce0095de6fa
Begin mining....Target Hash :
found hash: 000000c983192057f57ecfa3da5dab35701f67daa9a3556674e5d93bb75be142
============= block num :
Version
PreBlockHash:
Hash: 0000009d511471179142f674a5efc491ce2e6c53aa941866037eaceb2864c364
TimeStamp: 5bc053cb
Nonce: 25d497c
MerkelRoot:
Data: Gensis Block!
IsValid : true
============= block num :
Version
PreBlockHash: 0000009d511471179142f674a5efc491ce2e6c53aa941866037eaceb2864c364
Hash: 000000dc2edb49477aef1e99eb9dfd50c54ce5978a105071006a9ce0095de6fa
TimeStamp: 5bc053f2
Nonce: 19a5b8
MerkelRoot:
Data: 班长转给老师一枚BTC
IsValid : true
============= block num :
Version
PreBlockHash: 000000dc2edb49477aef1e99eb9dfd50c54ce5978a105071006a9ce0095de6fa
Hash: 000000c983192057f57ecfa3da5dab35701f67daa9a3556674e5d93bb75be142
TimeStamp: 5bc053f4
Nonce:
MerkelRoot:
Data: 班长又转给老师一枚BTC
IsValid : true

[GO]使用go语言实现比特币的工作量证明的更多相关文章

  1. 【区块链Go语言实现】Part 2:工作量证明机制POW

    0x00 介绍 在上一篇文章中,我们建立了一个非常简单的数据结构,它是区块链数据库的本质.并且,我们实现了以类似链条关系的方式向其中添加区块的功能:每个区块都会链接到前一区块.然而,我们实现的区块链有 ...

  2. cpp 区块链模拟示例(四) 区块链工作量证明

    本文主要在之前的区块链原形上添加了工作量证明,并且为后继的交易功能做好准备. 上一个章节我们已经创建了区块链的基本原形,但是区块的哈希计算和加入太过于简单,如果按照这种速度添加区块那么区块链估计一个小 ...

  3. Go实现Pow工作量证明

    之前使用python编写了一段代码实现了工作量证明机制,近期由于参与以太坊智能合约开发钱包的工作接触到golang语言,所以借此以go来实现Pow(Proof of work). 实现代码如下: // ...

  4. 用python阐释工作量证明(proof of work)

    了解比特币的都知道挖矿非常耗电,这是由于比特币用到了工作量证明. 工作量证明是指系统为达到某目标而设置的工作度量方法.一開始是用在网络攻防上,大大提高攻击者的计算量,攻击成本也就上去了. 工作量证明须 ...

  5. 区块链共识机制之工作量证明(POW)

    像比特币.以太坊.NXT.Bitshares等这些区块链系统,其本质上是一种加密经济组织,它建立在点对点网络上,是去中心化.无管辖的,由密码学.经济学和社会共识来共同维护.这些加密网络因各种原因有着多 ...

  6. [转帖]Proof Of Work 工作量证明

    Proof Of Work 工作量证明 https://www.cnblogs.com/zhang-qc/p/10451817.html 借鉴了 哈希现金(Hashcash)-1997年 英国密码学专 ...

  7. 详解POW工作量证明原理

    原文地址  来自 微信公众号 区块链大师 POW工作量证明(英文全称为Proof of Work)早在比特币出现之前就已经有人探索,常见的是利用HASH运算的复杂度进行CPU运算实现工作量确定,当然你 ...

  8. [GO]go语言实现区块链工作证明(pow)原理

    package main import ( "math/big" "bytes" "math" "crypto/sha256&qu ...

  9. [转]工作量证明(PoW)权益证明(PoS)和委任权益证明(DPoS)区别

    原文链接 Both in the glossary and in some of our previous posts we've touched on mining and the two main ...

随机推荐

  1. databaseDesgin-temple

    ylbtech-dbs:ylbtech-storebook- A, 返回顶部 1, 2, B,返回顶部 1, 2, C,返回顶部 作者:ylbtech出处:http://storebook.cnblo ...

  2. 安装FreePBX的ISO版本

    下载地址:http://schmoozecom.com/distro-download.php 这个相当于系统了,第一步:安装程序会提示选择你想安装Asterisk的版本:现在出现了11版本,这个根据 ...

  3. Linux下压缩与解压

    转自:http://www.mike.org.cn/blog/index.php?load=read&id=218###pp=0 [在解压或压缩的时候,一般还使用-v选项来现实正在处理的文件信 ...

  4. 十六 在沉睡中停止(在sleep() 状态下停止线程)

    1 如果线程在sleep()状态下停止线程,会是什么效果? 答案: 如果在sleep状态下停止某一线程,会进入sleep的catch块中, 抛出InterruptedException 异常,并且清除 ...

  5. 安装git之后,桌面图标出现很多的蓝色问号

    今天在搞git之后,开机发现多了好多的问号: 这是因为我们在桌面创建了版本库了. 这个时候我们在系统中吧隐藏的文件夹显示出来.这个时候会看到桌面上有一个隐藏的git文件夹.把这个文件夹删除掉之后,刷新 ...

  6. 防火墙启动失败,提示最后一行出错【COMMIT】

    使用 /etc/init.d/iptables save  后 iptables配置文件发生变化 并生成iptables.save vim iptables.save    [配置内容则是原来的] s ...

  7. Python Twisted系列教程22:结束

    作者:dave@http://krondo.com/part-22-the-end/  译者: Cheng Luo 你可以从”第一部分 Twist理论基础“开始阅读:也可以从”Twisted 入门!“ ...

  8. Netty入门二:开发第一个Netty应用程序

    Netty入门二:开发第一个Netty应用程序 时间 2014-05-07 18:25:43  CSDN博客 原文  http://blog.csdn.net/suifeng3051/article/ ...

  9. UNITY中使用不安全代码的相关设置

    必须执行以下三个步骤 1,在工程属性中设置:属性-生成-允许不安全代码 2,在Assets目录下增加 smcs.rsp(若打包设置中使用了.net 2.0 subset)或 gmcs.rsp(若打包设 ...

  10. popup non topmost

    public class PopupNonTopmost : Popup { public static DependencyProperty TopmostProperty = Window.Top ...