新建blockchain.go
package main
import (
"github.com/boltdb/bolt"
"log"
"fmt"
)
const dbFile = "blockchain.db"
const blockBucket = "blocks"
type Blockchain struct{
tip []byte //最近的一个区块的hash值
db * bolt.DB
}
func (bc * Blockchain) AddBlock(){
var lasthash []byte
err := bc.db.View(func(tx * bolt.Tx) error{
b:= tx.Bucket([]byte(blockBucket))
lasthash = b.Get([]byte("l"))
return nil
})
if err!=nil{
log.Panic(err)
}
newBlock := NewBlock(lasthash)
bc.db.Update(func(tx *bolt.Tx) error {
b:=tx.Bucket([]byte(blockBucket))
err:= b.Put(newBlock.Hash,newBlock.Serialize())
if err!=nil{
log.Panic(err)
}
err = b.Put([]byte("l"),newBlock.Hash)
if err!=nil{
log.Panic(err)
}
bc.tip = newBlock.Hash
return nil
})
}
func NewBlockchain() * Blockchain{
var tip []byte
db,err := bolt.Open(dbFile,0600,nil)
if err!=nil{
log.Panic(err)
}
err = db.Update(func(tx * bolt.Tx) error{
b:= tx.Bucket([]byte(blockBucket))
if b==nil{
fmt.Println("区块链不存在,创建一个新的区块链")
genesis := NewGensisBlock()
b,err:=tx.CreateBucket([]byte(blockBucket))
if err!=nil{
log.Panic(err)
}
err = b.Put(genesis.Hash,genesis.Serialize())
if err!=nil{
log.Panic(err)
}
err = b.Put([]byte("l"),genesis.Hash)
tip = genesis.Hash
}else{
tip = b.Get([]byte("l"))
}
return nil
})
if err!=nil{
log.Panic(err)
}
bc:=Blockchain{tip,db}
return &bc
}
增加newBlock的方法,根据前一个区块的hash创建区块:
func NewBlock(prevBlockHash []byte) * Block{
block := &Block{
2,
prevBlockHash,
[]byte{},
[]byte{},
int32(time.Now().Unix()),
404454260,
0,
[]*Transation{},
}
pow := NewProofofWork(block)
nonce,hash := pow.Run()
block.Hash = hash
block.Nonce = nonce
return block
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First Mobile Web
Lyza Danger Gardner、Jason Grigsby / O'Reilly Media / 2011-12 / $ 50.84
Despite the huge number of mobile devices and apps in use today, your business still needs a website. You just need it to be mobile. Head First Mobile Web walks you through the process of making a con......一起来看看 《Head First Mobile Web》 这本书的介绍吧!