
原理就不介紹了,具體可以去看我的另一篇通過一個(gè)App Demo的演示深入理解區(qū)塊鏈運(yùn)行原理 代碼只是最簡(jiǎn)單的,只是簡(jiǎn)單的實(shí)現(xiàn)了對(duì)一個(gè)區(qū)塊的定義以及區(qū)塊之間的聯(lián)系。在這里p2p,激勵(lì),共識(shí)都沒有。
區(qū)塊鏈重要的 數(shù)據(jù)層、網(wǎng)絡(luò)層、共識(shí)層、激勵(lì)層
下面的代碼只是展示了數(shù)據(jù)層上面的東西,后續(xù)會(huì)把剩余的補(bǔ)充上,好好學(xué)習(xí),天天向上。加油。

package main
import (
"bytes"
"crypto/sha256"
"encoding/binary"
"fmt"
"os"
"time"
)
// 實(shí)現(xiàn)int轉(zhuǎn)換成byte數(shù)組
func Int2Byte(num int64) []byte {
var buffer bytes.Buffer
err := binary.Write(&buffer, binary.BigEndian, num)
CheckErr(err)
return buffer.Bytes()
}
func CheckErr(err error) {
if err != nil {
fmt.Println("err:", err)
os.Exit(1)
}
}
//區(qū)塊的結(jié)構(gòu)
type Block struct {
Version int64
PrevBlockHash []byte
Hash []byte
TimeStamp int64
TargetBits int64
Nonce int64
MerkeRoot []byte
Data []byte
}
func NewBlock(data string, prevBlockHash []byte) *Block {
block := &Block{
Version: 1,
PrevBlockHash: prevBlockHash,
TimeStamp: time.Now().Unix(),
TargetBits: 10,
Nonce: 5,
MerkeRoot: []byte{},
Data: []byte(data)}
block.SetHash()
return block
}
// int -> byte
func (block *Block) SetHash() {
tmp := [][]byte{
//實(shí)現(xiàn)將int轉(zhuǎn)成byte數(shù)組的函數(shù)
Int2Byte(block.Version),
block.PrevBlockHash,
Int2Byte(block.TimeStamp),
block.MerkeRoot,
Int2Byte(block.Nonce),
block.Data}
//將區(qū)塊個(gè)字段連接成一個(gè)切片,使用[]byte{}進(jìn)行連接
data := bytes.Join(tmp, []byte{})
//算出hash的值
hash := sha256.Sum256(data)
block.Hash = hash[:]
}
func NewGenesisBlock() *Block {
return NewBlock("Genesis Block!", []byte{})
}
type BlockChian struct {
//使用切片保存區(qū)塊,用于模擬區(qū)塊鏈
blocks []*Block
}
func NewBlockChain() *BlockChian {
//創(chuàng)建一個(gè)區(qū)塊鏈
return &BlockChian{[]*Block{NewGenesisBlock()}}
}
func (bc *BlockChian) AddBlock(data string) {
// 防止區(qū)塊越界
if len(bc.blocks) <= 0 {
os.Exit(1)
}
lastBlock := bc.blocks[len(bc.blocks)-1]
block := NewBlock(data, lastBlock.Hash)
bc.blocks = append(bc.blocks, block)
}
func main() {
// 實(shí)例化一個(gè)區(qū)塊鏈
bc := NewBlockChain()
//添加block
bc.AddBlock("測(cè)試第一個(gè)BTC")
bc.AddBlock("測(cè)試第二個(gè)EOS")
//打印出信息
for i, block := range bc.blocks {
fmt.Println("=========block num:", i)
fmt.Println("data", string(block.Data))
fmt.Println("Version:", block.Version)
fmt.Printf("Hash:%x\n", block.Hash)
fmt.Printf("TimeStamp:%d\n", block.TimeStamp)
fmt.Printf("MerkeRoot:%x\n", block.MerkeRoot)
fmt.Printf("None:%d\n", block.Nonce)
}
}
