老师,请问有源码吗?能分享一下给大家吗?
package core
import (
"fmt"
"log"
)
type Blockchain struct {
Blocks []*Block
}
//创世区块链
func NewBlockChain() *Blockchain {
genesis := GenerateOriginBlock()
blockchain := Blockchain{}
blockchain.AppendBlock(&genesis)
return &blockchain
}
//每一个新数据都创建一个区块,方便外部调用
func (bc *Blockchain)SendData(data string) {
preBlock := bc.Blocks[len(bc.Blocks) - 1]
newBlock := GenerateNewBlock(*preBlock, data)
bc.AppendBlock(&newBlock)
}
//往区块链里添加区块
func (bc *Blockchain) AppendBlock(newBlock *Block) {
if len(bc.Blocks) == 0 {//第一个区块
bc.Blocks = append(bc.Blocks,newBlock)
return
}
if !isValid(*newBlock,*bc.Blocks[len(bc.Blocks) - 1]) {
log.Fatal("Invalid block")
}
bc.Blocks = append(bc.Blocks,newBlock)
}
//打印区块链
func (bc *Blockchain) Print() {
for _,block := range bc.Blocks {
fmt.Printf("Index:%d\n",block.Index)
fmt.Printf("PrevHash:%s\n",block.PrevBlockHash)
fmt.Printf("Hash:%s\n",block.Hash)
fmt.Printf("Timestamp:%d\n",block.Timestamp)
fmt.Printf("Data:%s\n",block.Data)
}
}
//新区块校验
func isValid(newBlock Block,oldBlock Block) bool {
if newBlock.Index - 1 != oldBlock.Index {
return false
}
if newBlock.PrevBlockHash != oldBlock.Hash {
return false
}
if calculateHash(newBlock) != newBlock.Hash {
return false
}
return true
}package core
import (
"fmt"
"log"
)
type Blockchain struct {
Blocks []*Block
}
//创世区块链
func NewBlockChain() *Blockchain {
genesis := GenerateOriginBlock()
blockchain := Blockchain{}
blockchain.AppendBlock(&genesis)
return &blockchain
}
//每一个新数据都创建一个区块,方便外部调用
func (bc *Blockchain)SendData(data string) {
preBlock := bc.Blocks[len(bc.Blocks) - 1]
newBlock := GenerateNewBlock(*preBlock, data)
bc.AppendBlock(&newBlock)
}
//往区块链里添加区块
func (bc *Blockchain) AppendBlock(newBlock *Block) {
if len(bc.Blocks) == 0 {//第一个区块
bc.Blocks = append(bc.Blocks,newBlock)
return
}
if !isValid(*newBlock,*bc.Blocks[len(bc.Blocks) - 1]) {
log.Fatal("Invalid block")
}
bc.Blocks = append(bc.Blocks,newBlock)
}
//打印区块链
func (bc *Blockchain) Print() {
for _,block := range bc.Blocks {
fmt.Printf("Index:%d\n",block.Index)
fmt.Printf("PrevHash:%s\n",block.PrevBlockHash)
fmt.Printf("Hash:%s\n",block.Hash)
fmt.Printf("Timestamp:%d\n",block.Timestamp)
fmt.Printf("Data:%s\n",block.Data)
}
}
//新区块校验
func isValid(newBlock Block,oldBlock Block) bool {
if newBlock.Index - 1 != oldBlock.Index {
return false
}
if newBlock.PrevBlockHash != oldBlock.Hash {
return false
}
if calculateHash(newBlock) != newBlock.Hash {
return false
}
return true
}