脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - 使用go实现简易比特币区块链公链功能

使用go实现简易比特币区块链公链功能

2021-03-27 00:59sgentle Golang

这篇文章主要介绍了使用go实现简易比特币区块链公链功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

使用go语言实现具备以下功能的简易区块链

  • 区块与区块链
  • 共识机制
  • 数据库
  • Cli命令行操作
  • 交易管理
  • 密码学
  • 数字签名
  • 交易缓存池
  • P2P网络管理

由于平时还要进行论文工作,项目不定时更新

2021.1.1实现了区块结构、区块链结构、工作量证明pow,剩下部分陆续更新

1.实现区块结构

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package BLC
 
import (
    "bytes"
    "crypto/sha256"
    "time"
)
 
//实现一个最基本的区块结构
type Block struct {
    TimeStamp int64 //时间戳,区块产生的时间
    Heigth int64//区块高度(索引、号码)代表当前区块的高度
    PreBlockHash []byte//前一个区块(父区块)的哈希
    Hash []byte//当前区块的哈希
    Data []byte//交易数据
}
//创建一个新的区块
func NewBlock(height int64,preBlockHash []byte,Data []byte) *Block {
    var block Block
    block=Block{Heigth: height,PreBlockHash: preBlockHash,Data: Data,TimeStamp: time.Now().Unix()}
    block.SetHash()
    return &block
}
//计算区块哈希
func (b *Block)SetHash() {
    //int64转换成字节数组
    //高度转换
    heightBytes:=IntToHex(b.Heigth)
    //时间转换
    timeStampBytes:=IntToHex(b.TimeStamp)
//拼接所有属性进行hash
    blockBytes:=bytes.Join([][]byte{heightBytes,timeStampBytes,b.PreBlockHash,b.Data},[]byte{})
    hash:=sha256.Sum256(blockBytes)
    b.Hash=hash[:]
}

2.实现区块链结构

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package BLC
 
type BlockChain struct {
    Blocks []*Block //存储有序的区块
}
//初始化区块链
func CreateBlockChainWithGenesisBlock() *BlockChain {
    //添加创世区块
    genesisBlock:=CreateGenesisBlock("the init of blockchain")
 
    return &BlockChain{[]*Block{genesisBlock}}
}
//添加新的区块到区块链中
func (bc *BlockChain)AddBlock(height int64,data []byte,prevBlockHash []byte){
    newBlock := NewBlock(height,prevBlockHash,data)
    bc.Blocks=append(bc.Blocks,newBlock)
}

3.实现工作量证明

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package BLC
 
import (
    "bytes"
    "crypto/sha256"
    "fmt"
    "math/big"
)
 
//目标难度值,生成的hash前 targetBit 位为0才满足条件
const targetBit =16
//工作量证明
type ProofOfWork struct {
    Block *Block //对指定的区块进行验证
    target *big.Int //大数据存储
}
//创建新的pow对象
func NewProofOfWork(block *Block) *ProofOfWork {
    target:=big.NewInt(1)
    target=target.Lsh(target,256-targetBit)
    return &ProofOfWork{block,target}
}
//开始工作量证明
func (proofOfWork *ProofOfWork)Run() ([]byte,int64) {
    //数据拼接
    var nonce=0 //碰撞次数
    var hash [32]byte //生成的hash
    var hashInt big.Int //存储转换后的hash
    for {
        dataBytes:=proofOfWork.prepareData(nonce)
        hash=sha256.Sum256(dataBytes)
        hashInt.SetBytes(hash[:])
        fmt.Printf("hash:\r%x",hash)
        //难度比较
        if proofOfWork.target.Cmp(&hashInt)==1{
            break
        }
        nonce++
    }
    fmt.Printf("碰撞次数:%d\n",nonce)
    return hash[:],int64(nonce)
}
//准备数据,将区块属性拼接起来,返回字节数组
func (pow *ProofOfWork)prepareData(nonce int) []byte {
    data:=bytes.Join([][]byte{
        pow.Block.PreBlockHash,
        pow.Block.Data,
        IntToHex(pow.Block.TimeStamp),
        IntToHex(pow.Block.Heigth),
        IntToHex(int64(nonce)),
        IntToHex(targetBit),
    },[]byte{})
    return data
}

4.当前运行结果

使用go实现简易比特币区块链公链功能

到此这篇关于使用go实现简易比特币区块链公链功能的文章就介绍到这了,更多相关go实现比特币区块链公链内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/sgentle/article/details/112062364

延伸 · 阅读

精彩推荐
  • Golanggolang 通过ssh代理连接mysql的操作

    golang 通过ssh代理连接mysql的操作

    这篇文章主要介绍了golang 通过ssh代理连接mysql的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    a165861639710342021-03-08
  • Golanggolang json.Marshal 特殊html字符被转义的解决方法

    golang json.Marshal 特殊html字符被转义的解决方法

    今天小编就为大家分享一篇golang json.Marshal 特殊html字符被转义的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    李浩的life12792020-05-27
  • Golanggo语言制作端口扫描器

    go语言制作端口扫描器

    本文给大家分享的是使用go语言编写的TCP端口扫描器,可以选择IP范围,扫描的端口,以及多线程,有需要的小伙伴可以参考下。 ...

    脚本之家3642020-04-25
  • Golanggo日志系统logrus显示文件和行号的操作

    go日志系统logrus显示文件和行号的操作

    这篇文章主要介绍了go日志系统logrus显示文件和行号的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang的httpserver优雅重启方法详解

    golang的httpserver优雅重启方法详解

    这篇文章主要给大家介绍了关于golang的httpserver优雅重启的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    helight2992020-05-14
  • Golanggolang如何使用struct的tag属性的详细介绍

    golang如何使用struct的tag属性的详细介绍

    这篇文章主要介绍了golang如何使用struct的tag属性的详细介绍,从例子说起,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看...

    Go语言中文网11352020-05-21
  • GolangGolang中Bit数组的实现方式

    Golang中Bit数组的实现方式

    这篇文章主要介绍了Golang中Bit数组的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    天易独尊11682021-06-09
  • GolangGolang通脉之数据类型详情

    Golang通脉之数据类型详情

    这篇文章主要介绍了Golang通脉之数据类型,在编程语言中标识符就是定义的具有某种意义的词,比如变量名、常量名、函数名等等,Go语言中标识符允许由...

    4272021-11-24