区块链实验二 : 区块链编程1

实验报告02orz

      • 实验目的及要求
      • 实验基本原理
      • 实验实施环境
      • 实验概述
      • 实验内容
        • 学习第3章 区块链基本原型
        • 实现区块链基本原型代码编写
          • 项目目录截图
          • 原型代码
          • 结果截图

实验目的及要求

了解编程语言的基本逻辑,理解编程语言运行机理。熟悉区块链的原理。能正确使用编程语言搭建区块和区块链。

实验基本原理

通过课堂理论教学准备,动手使用实验软件平台,完成慕课实验项目的要求。

实验实施环境

Goland & GoSDK

实验概述

登入IDE软件,使用软件,熟悉界面。查看软件功能。熟悉常用快捷键。编写区块链基本原型,能够使用调试。

实验内容

学习第3章 区块链基本原型

imooc学习网址:3-1 区块链基本原型

学习之后将其总结为俩部分,分别是实现区块的结构和区块组成链式结构,并实现代码的编写。

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

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

实现区块链基本原型代码编写

项目目录截图

区块链实验二 : 区块链编程1_第1张图片

原型代码

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运行文件或者鼠标右键编译运行得到结果截图

区块链实验二 : 区块链编程1_第2张图片
控制台输出结果截图
区块链实验二 : 区块链编程1_第3张图片

你可能感兴趣的:(区块链,编程语言,区块链,go,Goland)