区块链浏览器

1. 工作目标

区块链浏览器是用户通过浏览器的方式查看区块链的所有信息。我们本节的目标就是实现这一功能。

我们不仅提供查看功能,还提供了了管理功能。在真实的区块链项目中,一般会提供多种交互方式,比如提供客户端命令行方式、 websocket 方式等等,最终由区块链server提供统一的rpc服务。我们目前先实现浏览器方式,以后会逐步扩充。

 

2. Http Server

在golang中写一个http server非常简单,三两行代码就可以实现。

http.HandleFunc("/", handleIndex)
http.ListenAndServe(":8080", nil)

我们的区块链浏览器就是使用了 golang 标准包里的 http 服务完成的。使用起来非常简单,调用 NewBlockBrower 创建一个区块链浏览器对象,然后调用 Start 方法就可以工作了:

//启动区块链浏览器,您可以通过浏览器 http://SERVER_ADDR:8080 访问

NewBlockBrower(bc).Start()

 

3. 区块链浏览器

区块链浏览器的结构比较简单,一个通知退出的 channel 和当前区块链对象 BlockChain:

type BlockBrower struct {
	//中止BrowserServer通道
	chanQuit chan bool

	//当前区块链
	blockChain *BlockChain
}

启动区块链浏览器方法 Start:

目前区块链服务器共能处理四种Url:"/"、"/shutdown"、"/getblocks"和"/generateblock",监听8080端口。

如果MiniBC运行后,如果通过本机器打开浏览器,可直接输入:http://localhost:8080

func (bb *BlockBrower) Start() {
	fmt.Println("====================================")
	fmt.Println("MiniBC 区块链浏览器已经启动,请通过浏览器http://" + SERVER_ADDR + ":8080访问....")
	fmt.Println("====================================")

	http.HandleFunc("/", bb.handleIndex)
	http.HandleFunc("/shutdown", bb.handleShutdown)
	http.HandleFunc("/getblocks", bb.handleGetBlocks)
	http.HandleFunc("/generateblock", bb.handleGenerateBlock)

	go http.ListenAndServe(":8080", nil)

	//只有接到退出通知,才能结束
	select {
		case <-bb.chanQuit:
	}
}

实现了4个Url处理函数:

// 处理Url为 http://SERVER_ADDR:8080/ 的请求,显示区块链浏览器首页信息。

func (bb *BlockBrower) handleIndex(response http.ResponseWriter, request *http.Request) {
	content := "<html><br>"
	content = content + "<b>MiniBC区块链区块浏览器</b><br><br>"
	content = content + "<a href=\"shutdown\">关闭MiniBC</a>"
	content = content + "<a href=\"getblocks\">查看区块链</a>"
	content = content + "</html>"

	response.Write([]byte(content))
}

// 处理Url为 http://SERVER_ADDR:8080/shutdown 的请求,关闭区块链浏览器,退出系统。

func (bb *BlockBrower) handleShutdown(response http.ResponseWriter, request *http.Request) { fmt.Println("") fmt.Println("") fmt.Println("=================================") fmt.Println("MiniBC 区块链和远程管理结束,谢谢使用!") fmt.Println("=================================") bb.chanQuit <- true } // 处理Url为 http://SERVER_ADDR:8080/getblocks 的请求,打印所有区块链信息。 func (bb *BlockBrower) handleGetBlocks(response http.ResponseWriter, request *http.Request) { //获取区块链高度 blockHeight := strconv.Itoa(bb.blockChain.Iterator().GetCount()) content := "<html><br>" content = content + "<a href=\"/\">返回首页</a>" content = content + "<a href=\"generateblock\">生成新区块</a><br>" content = content + "<br><b>当前MiniBC区块链高度:" + blockHeight + "</b><br><br>" //遍历区块链,打印每一个区块的详细信息 iterator := bb.blockChain.Iterator() for { block := iterator.Next() if block == nil { break } content = content + "当前区块哈希值:0x" + BytesToHex(block.GetHash()) + "<br>" content = content + "当前区块内容为:" + string(block.Data) + "<br>" content = content + "前一区块哈希值:0x" + BytesToHex(block.HashPrevBlock) + "<br>" content = content + "=======================" + "<br>" } content = content + "</html>" response.Write([]byte(content)) } //处理Url为 http://SERVER_ADDR:8080/generateblock 的请求,生成新区块 func (bb *BlockBrower) handleGenerateBlock(response http.ResponseWriter, request *http.Request) { //获取区块链高度 height := bb.blockChain.Iterator().GetCount() //创建新的区块 bb.blockChain.AddBlock("Mini block " + strconv.Itoa(height)) blockHeight := strconv.Itoa(bb.blockChain.Iterator().GetCount()) content := "<html><br>" content = content + "<a href=\"/\">返回首页</a>" content = content + "<a href=\"generateblock\">生成新区块</a><br>" content = content + "<br><b>当前MiniBC区块链高度:" + blockHeight + "</b><br><br>" //遍历区块链 iterator := bb.blockChain.Iterator() for { block := iterator.Next() if block == nil { break } content = content + "当前区块哈希值:0x" + BytesToHex(block.GetHash()) + "<br>" content = content + "当前区块内容为:" + string(block.Data) + "<br>" content = content + "前一区块哈希值:0x" + BytesToHex(block.HashPrevBlock) + "<br>" content = content + "========================" + "<br>" } content = content + "</html>" response.Write([]byte(content)) }

 

4. 运行区块链

运行后输出:

5. 我们实现的和将要实现的目标

我们已经构建了一个简单的区块链,并且实现了一个简易的KV数据库和区块链浏览器,下一步来实现工作量证明 pow 共识算法。

源码地址:https://github.com/wangshizebin/minibc

区块链工作量证明 POW:共识算法:在整个区块链工作过程中,会有很多的机器加入其中,每一台机器成为一个节点,它们互相协作,来共同维护区块链的安全和数据的一致。其中,生成新的区块就是一项很重要的工作。因为新的区块里面包含很多新产生的重要数据,比如交易信息等。为了让这项工作有序和可控,通常会在所有节点上通过竞争选出一个节点,由这个胜出的节点负责打包新产生的数据,并通知和传播给其它节点。