IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> 区块链技术——框架&基本原型 -> 正文阅读

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

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

一、区块链技术框架

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。
  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-10-16 19:41:44  更:2021-10-16 19:42:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:43:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码