实验目的及要求
了解编程语言的基本逻辑,理解编程语言运行机理。熟悉区块链的原理。能正确使用编程语言搭建区块和区块链。
实验基本原理
通过课堂理论教学准备,动手使用实验软件平台,完成慕课实验项目的要求。
实验实施环境
Goland & GoSDK
实验概述
登入IDE软件,使用软件,熟悉界面。查看软件功能。熟悉常用快捷键。编写区块链基本原型,能够使用调试。
实验内容
学习第3章 区块链基本原型
imooc学习网址:3-1 区块链基本原型
学习之后将其总结为俩部分,分别是实现区块的结构和区块组成链式结构,并实现代码的编写。
实现区块的结构
在区块链中,存储有效信息的是区块
Timestamp是当前的时间戳,也就是区块创建的时间
PrevBlockHash存储的是前一个区块的哈希值
Data是区块存储的实际有效的信息
Hash是当前本区块的哈希值
区块组成链式结构
区块链是有着特定结构的数据库,有个有序后向链接的列表
区块按照插入的顺序进行存储,每个块都被链接到前一个块
快速地获取链上的最新块,并且高效地通过哈希来检索一个块
实现区块链基本原型代码编写
项目目录截图
原型代码
1.main.go
package main
import (
"awesomeProject/src/core"
"fmt"
)
func main() {
bc := core.NewBlockchain() //初始看区块链,创建第一个区块(创世纪区块)
bc.AddBlock("Send 1 BTC to Ivan") //加入一个区块,发送以一个比特币给伊文
bc.AddBlock("Send 2 more BTC 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()
}
}
2.blockchain.go
package core
//Blcokchain keeps a sequence of Blocks
type Blockchain struct {
Blocks []*Block //数组
}
//AddBlock saves provided data as a block in the block in the blockchain
func (bc *Blockchain) AddBlock(data string) {
preBlock := bc.Blocks[len(bc.Blocks)-1]
newBlock := NewBlock(data,preBlock.Hash) //保证hash的存在,确保数据没有被伪造,保存数据形成完整链条,不可修改
bc.Blocks = append(bc.Blocks,newBlock)
}
//创世纪块,data固定/默认,没有前一个块
//NewGenesisBlock creates and returns genesis Block
func NewGenesisBlcok() *Block {
return NewBlock("Genesis Block",[]byte{})
}
//创建一个新的区块链
//NewBlockchain creates a new Blockchain with genesis Blcok
func NewBlockchain() *Blockchain {
return &Blockchain{Blocks: []*Block{NewGenesisBlcok()}}
}
3.core.go
package core
import (
"bytes"
"crypto/sha256"
"strconv"
"time"
)
//Block keeps block headers
type Block struct {
Timestamp int64 //区块创建时间戳
Data []byte //区块包含的数据
PrevBlockHash []byte //前一个区块的哈希值
Hash []byte //区块自身的哈希值,用于校验区块数据有效
}
//NewBlock creates 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
}
//SetHash calculates and sets block hash
//sha安全散列算法,位数越高安全程度越高
//sha256计算散列值
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[:]
}
结果截图
打开Terminal进入src文件夹目录生成coin运行文件或者鼠标右键编译运行得到结果截图👇
控制台输出结果截图👇