怎么用go语言区块链实战实现简单的区块与区块链
发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,本篇内容介绍了"怎么用go语言区块链实战实现简单的区块与区块链"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学
千家信息网最后更新 2025年01月17日怎么用go语言区块链实战实现简单的区块与区块链
本篇内容介绍了"怎么用go语言区块链实战实现简单的区块与区块链"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
区块链实战
字节 | 字段 | 说明 |
---|---|---|
4 | 版本 | 区块版本号,表示本区块遵守的验证规则 |
32 | 父区块头哈希值 | 前一区块的Merkle树根的哈希值,同样采取SHA256计算 |
32 | Merkle根 | 该区块中交易的Merkle树根的哈希值,同样采用SHA256计算 |
4 | 时间戳 | 该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11各区块的时间的中值,同时全节点也会拒接那些超过自己两个小时的时间戳的区块 |
4 | 难度目标 | 该区块工作量证明算法的难度目标,已经使用特定算法编码 |
4 | Nonce | 未来找到满足难度目标所设定的随机数,为了解决32为随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均改变,以此扩展nonce的位数 |
注意:区块不存储hash值,节点接受区块后独立计算并存储在本地。
Version 1
区块相关:
1.定义一个区块的结构Block
a.区块头:6个字段
b.区块体:字符串表示data
2.提供一个创建区块的方法
NewBlock(参数)
区块链相关
定义一个区块链结构BlockChain
Block数组
提供一个创建BlockChain()的方法
NewBlockChain()
提供一个添加区块的方法
AddBlock(参数)
block.go文件
package mainimport ( "bytes" "crypto/sha256" "time")/*1.定义一个区块的结构Blocka.区块头:6个字段b.区块体:字符串表示data*///区块type Block struct { Version int64 //版本 PerBlockHash []byte //前一个区块的hash值 Hash []byte //当前区块的hash值,是为了简化代码 MerKelRoot []byte //梅克尔根 TimeStamp int64 //时间抽 Bits int64 //难度值 Nonce int64 //随机值//区块体 Data []byte //交易信息}/*提供一个创建区块的方法NewBlock(参数)*/func NewBlock(data string ,prevBlockHash []byte) *Block { var block Block block = Block{ Version: 1, PerBlockHash: prevBlockHash, //Hash: []byte{}, //区块不存储hash值,节点接受区块后独立计算并存储在本地。 MerKelRoot: []byte{}, TimeStamp: time.Now().Unix(), Bits: 1, Nonce: 1, Data: []byte(data), } block.SetHash() //填充Hash return &block}func (block *Block) SetHash() { // 源码里面是要传二维切片 func Join(s [][]byte, sep []byte) []byte tmp :=[][]byte{ IntToByte(block.Version), block.PerBlockHash, block.MerKelRoot, IntToByte(block.TimeStamp), IntToByte(block.Bits), IntToByte(block.Nonce), } data:=bytes.Join(tmp,[]byte{}) //之后再计算hash hash := sha256.Sum256(data) block.Hash = hash[:] //变切片}//创始块func NewGensisBlock() *Block{ return NewBlock("Genesis Block!",[]byte{})}
blockChain.go文件
package main/*1. 定义一个区块链结构BlockChain Block数组*/type BlockChain struct { blocks []*Block}/*2. 提供一个创建BlockChain()的方法 NewBlockChain()*/func NewBlockChain() *BlockChain { block := NewGensisBlock() return &BlockChain{blocks:[]*Block{block}} //创建只有一个元素的区块链,初始化}/*3. 提供一个添加区块的方法 AddBlock(参数)*/func (bc *BlockChain)AddBlock(data string) { PerBlockHash := bc.blocks[len(bc.blocks)-1].Hash //这一个区块的哈希是前一块的哈希值 block := NewBlock(data,PerBlockHash) bc.blocks = append(bc.blocks,block)}
utils.go文件
package mainimport ( "bytes" "encoding/binary" "fmt" "os")func IntToByte(num int64) []byte { //func Write(w io.Writer, order ByteOrder, data interface{}) error { var buffer bytes.Buffer err := binary.Write(&buffer, binary.BigEndian, num) CheckErr("IntToByte",err) return buffer.Bytes()}func CheckErr(position string,err error) { if err != nil { fmt.Println("error ,pos:",position,err) os.Exit(1) }}
main.go文件
package mainimport "fmt"func main() { bc := NewBlockChain() bc.AddBlock("A send B 1BTC") bc.AddBlock("B send C 1BTC") for _,block := range bc.blocks { fmt.Printf("Version : %d\n",block.Version) fmt.Printf("PerBlockHash : %x\n",block.PerBlockHash) fmt.Printf("Hash : %x\n",block.Hash) fmt.Printf("MerKelRoot : %x\n",block.MerKelRoot) fmt.Printf("TimeStamp : %d\n",block.TimeStamp) fmt.Printf("Bits : %d\n",block.Bits) fmt.Printf("Nonce : %d\n",block.Nonce) fmt.Printf("Data : %s\n",block.Data) }}
执行结果
"怎么用go语言区块链实战实现简单的区块与区块链"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
区块
时间
方法
哈希
参数
文件
结构
难度
存储
实战
块体
块头
字段
版本
目标
节点
交易
语言
信息
内容
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库中的表一定有关系吗
街篮服务器g和h
软件开发中的硬件怎么处理
梦幻互通版什么服务器好
数据库删除一个表数据
小鹏电控嵌入式软件开发
软件开发之益缘益购
陇西天气预报软件开发
电脑服务器一直响显示屏连不上
网络安全特征有哪些方面
计算机网络技术王协瑞视频
服务器 h330
软件开发是不是英语要好
丽水网络安全周
怎样计算机网络安全方案
快云服务器
图数据库安装下载
我的世界如何炸ice服务器
代码数据库导不进去
海南专业软件开发多少钱
南通信息网络技术常见问题
网络安全 的应急预案
网易游戏更新无法连接服务器
服务器怎么管理虚拟空间
dell服务器报错e118
镇江网络安全准入控制系统售价
招标法软件开发属于什么
互联网科技工程学院
兰溪学软件开发
恒创软件服务器域名解析