区块链技术——框架&基本原型

Posted 焕HAN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链技术——框架&基本原型相关的知识,希望对你有一定的参考价值。

区块链技术框架&区块链基本原型

一、区块链技术框架

1.区块链的定义

一个分布式的共享账本和数据库。

2.区块链的特点

加密货币+智能合约。
使用去中心化的分布式网络,有很多个终端。
具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。

3.比特币和区块链的关系

区块链在2009年诞生,比特币是基于它的第一个系统,也就是说,区块链是比特币的底层技术。

4.区块链的核心技术

①分布式存储
②密码学技术:哈希算法、对称加密、非对称加密、数字签名
③智能合约:一个自动担保账户,例如,当特定的条件满足时,程序就会释放和转移资金;智能合约是编程在区块链上的汇编语言,代码的执行是自动的:要么成功执行,或者所有的状态变化都撤消
④共识机制:一个预设的规则来指导各方节点在数据处理上达成一致,最开始的是:所有参与的节点通过比拼计算能力来竞争记账权

二、区块链基本原型

5.调用的算法

sha256算法:对于任意长度(按bit计算)的消息,sha256都会产生一个32个字节长度数据,称作消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据是否发生改变,即验证其完整性。

6.go语言语法必要介绍
//hello.go文件
package main

import "fmt"

func main() 
{
    fmt.Println("Hello, World!")
}

运行的命令:go run hello.go
需要注意的是 ‘{ ’不能单独放在一行,但是下面为了展示得更加清晰,所以做了处理!!!
需要注意的是 ‘{ ’不能单独放在一行,但是下面为了展示得更加清晰,所以做了处理!!!
需要注意的是 ‘{ ’不能单独放在一行,但是下面为了展示得更加清晰,所以做了处理!!!

7.目录

bin:可执行文件目录
pkg:包目录
src:源码目录

8.定义区块(block)结构体
type Block struct 
{
	Timestamp      int64           //时间戳:区块创建的时间
	Data           []byte		   //区块包含的数据
	PrevBlockHash  []byte		   //前一个区块的哈希值
	Hash           []byte		   //区块自身的哈希值,用于校验区块数据有效
}
9.自定义方法:创建一个区块
// NewBlock 初始化,创建一个新区块
func NewBlock(data string,prevBlockHash []byte) *Block 
{
	block :=&Block
	{
		Timestamp: time.Now().Unix(),
		Data: []byte(data),
		//前一个区块哈希值为空
		PrevBlockHash: prevBlockHash,Hash: []byte{}
	}
	//设置哈希值
	block.SetHash()
	return block
}
10.自定义方法:设置哈希值
// SetHash 设置哈希值
func (b *Block) SetHash()  
{
	//把时间戳转成字节数组
	timestamp :=[]byte(strconv.FormatInt(b.Timestamp,10))
	//所有的字节连在一起
	headers :=bytes.Join([][]byte{b.PrevBlockHash,b.Data,timestamp},[]byte{})
	//做校验,sha256算法
	hash :=sha256.Sum256(headers)
	
	b.Hash=hash[:]
}
11.定义区块链(blockchain)数组
// Blockchain 数组
type Blockchain struct 
{
	Blocks []*Block
}
12.自定义方法:区块链中添加一个区块
// AddBlock 加入新的block,传入data,而不是区块
func (bc *Blockchain) AddBlock(data string)  
{
	prevBlock :=bc.Blocks[len(bc.Blocks)-1]
	//确保数据没有被伪造
	newBlock :=NewBlock(data,prevBlock.Hash)
	bc.Blocks =append(bc.Blocks,newBlock)
}
13.自定义方法:创建第一个区块
func NewGenesisBlock() *Block
 {
	return NewBlock( "Genesis Block",[]byte{})
}
14.自定义方法:创建一个区块链
func NewBlockchain() *Blockchain 
{
	return &Blockchain{Blocks: []*Block{NewGenesisBlock()}}
}
15.main.go文件
package main
import 
(
	"../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()
	}
		//fmt.Println("Hello, World!")
}
16.block.go文件
package core

import
 (
	"bytes"
	"crypto/sha256"
	"strconv"
	"time"
)

type Block struct 
{
	Timestamp      int64           
	Data           []byte		   
	PrevBlockHash  []byte		   
	Hash           []byte		   
}

func NewBlock(data string,prevBlockHash []byte) *Block 
{
	block :=&Block
	{
		Timestamp: time.Now().Unix(),
		Data: []byte(data),
		PrevBlockHash: prevBlockHash,Hash: []byte{}
	}
	block.SetHash()
	return block
}

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[:]
}

func NewGenesisBlock() *Block
 {
	return NewBlock( "Genesis Block",[]byte{})
}

17.blockchain.go文件
package core

type Blockchain struct 
{
	Blocks []*Block
}
func (bc *Blockchain) AddBlock(data string)  
{
	prevBlock :=bc.Blocks[len(bc.Blocks)-1]
	newBlock :=NewBlock(data,prevBlock.Hash)
	bc.Blocks =append(bc.Blocks,newBlock)
}

func NewBlockchain() *Blockchain 
{
	return &Blockchain{Blocks: []*Block{NewGenesisBlock()}}
}
18.运行结果展示

打开终端(如图or在左下角找到终端or利用快捷键Alt+F12)

利用命令执行main.go文件

19.运行结果解释:

首先创建了一个区块链:
里面有三个区块:

  1. Prev. hash:
    Data: Genesis Block
    Hash: 4b8a18fbf804e8120bde13bca2f3789ba39c016baf3d7bce770d4b271c952b8e
  2. Prev. hash: 4b8a18fbf804e8120bde13bca2f3789ba39c016baf3d7bce770d4b271c952b8e
    Data: Send 1 BTC to Ivan
    Hash: 4f1364f0a2291bf5bc6492af47aa1ead56b655e81857691565a8d0196e0439fc
  3. Prev. hash: 4f1364f0a2291bf5bc6492af47aa1ead56b655e81857691565a8d0196e0439fc
    Data: Send 2 more BTC to Ivan
    Hash: 2e8e6b0888a471a942365c51c2c68d8c247d097bad22e69edd6751163a25ff98
20.总结:
	区块按照插入的顺序进行存储。
	可以通过哈希高效地检索一个块。
	区块链中存储有效信息的是区块;而区块中存储的实际有效信息是data。

以上是关于区块链技术——框架&基本原型的主要内容,如果未能解决你的问题,请参考以下文章

基于Java语言构建区块链—— 基本原型

用 Go 构建一个区块链 ---- Part 1: 基本原型

区块链Go语言实现第一部分:区块链基本原型

300行ABAP代码实现一个最简单的区块链原型

300行ABAP代码实现一个最简单的区块链原型

区块链中节点和区块的关系&区块链的基本概念