初一叙事作文:冬日暖阳 1
区块链实战
| 字节 | 字段 | 声明 |
|---|---|---|
| 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 inte***ce{ }) 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言措辞语区块链实战完成复杂的区块与区块链的具体内容 ,更多关于go言语完成区块与区块链的材料请存眷完竣下载此外相干文章 !
上一篇:炉石传说魂魄窃强度分化引见
下一篇:摩尔庄园手游改名卡在哪






















