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

实验目的及要求

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

实验基本原理

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

实验实施环境

Goland & GoSDK

实验概述

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

实验内容

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

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

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

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

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

实现区块链基本原型代码编写
项目目录截图

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

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值