区块链基本原型

区块的结构:
  1、在区块链中,存储有效信息的是区块
  2、Timestamp是当前时间戳,也就是创建区块的时间
  3、PrevBlockHash存储前一个区块的哈希值
  4、Data是区块存储的实际有效的信息
  5、Hash是当前区块的哈希值

package core

import (
	"time"
	"strconv"
	"bytes"
	"crypto/sha256"
)

//Block keeps block header
type Block struct {
	Timestamp 		int64 	//区块创建的时间
	Data 	  		[]byte 	//区块包含的数据
	PrevBlockHash   []byte  //前一个区块的哈希值
	Hash 			[]byte  //区块自身的哈希值,用于校验区块数据有效
}

//NewBlock create and returns Block
func NewBlock(data string, prevBlockHash []byte) *Block {
	block := &Block{
		Timestamp:time.Now().Unix(),
		Data: []byte(data),
		PrevBlockHash: prevBlockHash,
		Hash: []byte{},
	}
	block.SetHash()
	return block
}

func (b *Block) SetHash() {
	timestamp := []byte(strconv.FormatInt(b.Timestamp, 10))
	headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp},[]byte{})
	hash := sha256.Sum256(headers)
	b.Hash = hash[:]
}

//NewGenesisBlock create and returns genesis Block
func NewGenesisBlock() *Block {
	return NewBlock("Genesis Block", []byte{})
}

区块组成链式结构:
  1、区块链是有着特定结构的数据库,一个有序向后连接的列表
  2、区块按照插入顺序进行存储,每个块都被链接到前一个块
  3、快速的获取链上的最新块,并且高效的通过哈希来校验一个块

package core

//BlockChain keeps a sequence of Blocks
type BlockChain struct {
	Blocks []*Block
}

//AddBlock save provided data as a block in the blockchain
func (bc *BlockChain)AddBlock(data string) {
	prevBlock := bc.Blocks[len(bc.Blocks)-1]
	newBlock := NewBlock(data, prevBlock.Hash)
	bc.Blocks = append(bc.Blocks, newBlock)
}

//NewBlockChain create a new BlockChain with genesis block
func NewBlockChain() *BlockChain {
	return &BlockChain{[]*Block{NewGenesisBlock()}}
}

 

package main

import (
	"core"
	"fmt"
)

func main() {

	bc := core.NewBlockChain()

	bc.AddBlock("Send 1 BC to Ivan")
	bc.AddBlock("Send more BC to Ivan")

	for _,block := range bc.Blocks {
		fmt.Printf("Prev hash: %x\n", block.PrevBlockHash)
		fmt.Printf("Data: %s\n", block.Data)
		fmt.Printf("Hash: %x\n", block.Hash)
		fmt.Println()
	}

}

  

打印结果:

Prev hash:
Data: Genesis Block
Hash: 4577853922f097265b130464cb5392785b2fd045b724d9525dad859a629e4b0d

Prev hash: 4577853922f097265b130464cb5392785b2fd045b724d9525dad859a629e4b0d
Data: Send 1 BC to Ivan
Hash: e8bc5d03b38799140e32d662376731705f716c0443e1a17c1a45782fa1531c81

Prev hash: e8bc5d03b38799140e32d662376731705f716c0443e1a17c1a45782fa1531c81
Data: Send more BC to Ivan
Hash: 790c1a271f5a138aa2093cd236ffeadb5d6d905f841ceccb04606e3aec5b2735

  

猜你喜欢

转载自www.cnblogs.com/coder-886/p/9772135.html