百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

区块链是什么?用Go语言实现区块链技术,通过Golang秒懂区块链

ztj100 2025-01-11 18:54 21 浏览 0 评论

区块链技术并不是什么高级概念,它并不比量子力学、泡利不相容原则、哥德巴赫猜想更难以理解,但却也不是什么类似“时间就是金钱”这种妇孺皆知的浅显道理。区块链其实是一套统筹组织记录的方法论,或者说的更准确一些,一种“去中心化”的组织架构系统。

去中心化

众所周知,任何一个公司、组织、或者是机构,都遵循同一套组织架构原则,那就是“下级服从上级、少数服从多数”原则。而对于区块链技术来说,只遵循这个原则的后半句,那就是“少数服从多数”,不存在“下级服从上级”。

进而言之,在区块链中,根本就没有什么所谓“上级”的概念。

什么是“上级”?

一艘在大海中航行的货船上,一定会有一位船长,游荡在非洲大草原上的狮群里,一定会有一个狮王,同样的,群狼之首,是为头狼,群猴之首,是为猴王。在地球上生活着的群居动物中,你很难找出一种群体是没有“首领”或者是“上级”的。

这就是最朴素的“中心化”概念,绝对中心化系统负责制定系统规则,负责监控系统运作,负责系统未来走向,中心化系统可以是一个个体,也可以由多个个体组成的小群体,中心化系统以外的个体,则没有中心化本身的权力。

换句话说,绝对中心化系统往往会带来一个负面,那就是:信息不对等(asymmetric information)。指在中心化群体中,中心化主体掌握的信息比较充分,往往处于比较有利的地位,而其他信息贫乏的个体,则处于比较不利的地位。

去中心化,就是把绝对中心化这一套拿掉,所有个体都是平等的,所有行为都记录在数据区块中,行为的合法性遵循“少数服从多数”原则。

说白了,就是一个班级里,没有了“老师”的概念,大家都是学生,或者说,大家也都可以是“老师”,每个人都有主导个体行为的能力,而行为的合法性需要所有个体“投票”决定,这就是所谓的去中心化。

区块链(BlockChain)

区块链本质上就是实现上面去中心化组织架构系统的一种容器,或者说的更准确一些,区块链是一种特殊的数据结构。

一个区块链,就和其他基于数组的数据结构一样,由一个一个的区块构成,它可以存储一个数据集,以及一些把区块合并在一起的机制。

区块链有一个显著的特性,就是有序:

下标	区块
0	第一个区块
1	第二个区块
2	第三个区块

但是区块链本身是可变的,所以多个区块的逻辑连接成一个序列,通常可以采用指针的形式,指向存储器中前一个区块和后一个区块的网络地址:

下标	区块	上一个下标	下一个下标
0	第一个区块	-	1
1	第二个区块	0	2

除此之外,每一个区块还存储前一个区块的 Hash。不连续和随机离散的 Hash 非常适合检查数据的完整性,因为如果输入的数据有哪怕一位字符的变化,它产生的 Hash 也将明显不同。说白了就是把具体数据通过哈希算法散列成对应的字符串,这些字符串可以验证区块的合法性:

下标  上一个区块的 Hash 内容  上一个区块   下一个区块
0   创世块 第一个区块  -   1
1   哈希    第二个区块 0   2
2   哈希    第三个区块   2   3

需要注意的是,第一个区块是没有上一个区块的Hash值的,也被称之为“创世区块”,这个区块是唯一的,所有通过合法性验证的区块往回追溯,一定可以追溯至创世区块的位置。

也就是说,所有在回溯路线上的区块,都是合法的,没有被篡改过的区块。

具体实现

根据区跨链特点,我们应该先实现区块链中的区块:

type Block struct {
	Data          string
	Hash          string
	PrevBlockHash string
}

这里定义一个结构体,字段有三个,分别存储区块数据,当前区块数据散列后的哈希以及上一个区块数据的哈希。

随后定义加密算法函数:

func Sha256(src string) string {
	m := sha256.New()
	m.Write([]byte(src))
	res := hex.EncodeToString(m.Sum(nil))
	return res
}

该函数可以将具体数据散列成为hash

接着定义创世区块函数:

func InitBlock(data string) *Block {
	block := &Block{data, Sha256(data), ""}

	return block
}

创世区块并不存储上一个区块的hash,因为它是开风气之先的区块。

随后声明创建普通区块函数:

func NodeBlock(data string, prevhash string) *Block {
	block := &Block{data, Sha256(data), prevhash}

	return block
}

该函数负责生成创世区块其后的区块,将会存储之前一个区块的数据hash。

开始创建创世区块:

newblock := InitBlock("创世区块数据")

fmt.Println(newblock)

数据返回:

&{创世区块数据 62a034a244fbffbffda75fbe9c0ca7b86e40ce5329c957c180847ed210e1225a }

接着声明区块链对象:

blockchain := []*Block{}

这里我们使用切片,切片的每一个元素是区块结构体指针。

将创世区块添加到区块链中:

newblock := InitBlock("创世区块数据")

fmt.Println(newblock)

blockchain := []*Block{}

blockchain = append(blockchain, newblock)

fmt.Println(blockchain)

程序返回:

&{创世区块数据 62a034a244fbffbffda75fbe9c0ca7b86e40ce5329c957c180847ed210e1225a }
[0x14000114180]

如此,创世区块就“上链”了,接着添加普通区块:

block2 := NodeBlock("第二个区块数据", blockchain[len(blockchain)-1].Hash)

blockchain = append(blockchain, block2)

block3 := NodeBlock("第三个区块数据", blockchain[len(blockchain)-1].Hash)

blockchain = append(blockchain, block3)

fmt.Println(blockchain)

每一个普通区块都会存储上一个区块的数据hash,程序返回:

&{创世区块数据 62a034a244fbffbffda75fbe9c0ca7b86e40ce5329c957c180847ed210e1225a }
[0x1400006e180]
[0x1400006e180 0x1400006e1e0 0x1400006e210]

完整流程:

package main

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
)

type Block struct {
	Data          string
	Hash          string
	PrevBlockHash string
}

func Sha256(src string) string {
	m := sha256.New()
	m.Write([]byte(src))
	res := hex.EncodeToString(m.Sum(nil))
	return res
}

func InitBlock(data string) *Block {
	block := &Block{data, Sha256(data), ""}

	return block
}

func NodeBlock(data string, prevhash string) *Block {
	block := &Block{data, Sha256(data), prevhash}

	return block
}

func main() {

	newblock := InitBlock("创世区块数据")

	fmt.Println(newblock)

	blockchain := []*Block{}

	blockchain = append(blockchain, newblock)

	fmt.Println(blockchain)

	block2 := NodeBlock("第二个区块数据", blockchain[len(blockchain)-1].Hash)

	blockchain = append(blockchain, block2)

	block3 := NodeBlock("第三个区块数据", blockchain[len(blockchain)-1].Hash)

	blockchain = append(blockchain, block3)

	fmt.Println(blockchain)
}

至此,一个完整的区块链实体结构就完成了。

结语

通过golang实现具体的区块链结构,我们可以看出来,所谓的“去中心化”,并不是字面意义上的去掉中心,而是中心的多元化,任何节点都可以成为中心,任何中心也都不是持久化的,中心对每个节点不具备强制作用,只需要达成“少数服从多数”的共识即可。

相关推荐

再说圆的面积-蒙特卡洛(蒙特卡洛方法求圆周率的matlab程序)

在微积分-圆的面积和周长(1)介绍微积分方法求解圆的面积,本文使用蒙特卡洛方法求解圆面积。...

python编程:如何使用python代码绘制出哪些常见的机器学习图像?

专栏推荐...

python创建分类器小结(pytorch分类数据集创建)

简介:分类是指利用数据的特性将其分成若干类型的过程。监督学习分类器就是用带标记的训练数据建立一个模型,然后对未知数据进行分类。...

matplotlib——绘制散点图(matplotlib散点图颜色和图例)

绘制散点图不同条件(维度)之间的内在关联关系观察数据的离散聚合程度...

python实现实时绘制数据(python如何绘制)

方法一importmatplotlib.pyplotaspltimportnumpyasnpimporttimefrommathimport*plt.ion()#...

简单学Python——matplotlib库3——绘制散点图

前面我们学习了用matplotlib绘制折线图,今天我们学习绘制散点图。其实简单的散点图与折线图的语法基本相同,只是作图函数由plot()变成了scatter()。下面就绘制一个散点图:import...

数据分析-相关性分析可视化(相关性分析数据处理)

前面介绍了相关性分析的原理、流程和常用的皮尔逊相关系数和斯皮尔曼相关系数,具体可以参考...

免费Python机器学习课程一:线性回归算法

学习线性回归的概念并从头开始在python中开发完整的线性回归算法最基本的机器学习算法必须是具有单个变量的线性回归算法。如今,可用的高级机器学习算法,库和技术如此之多,以至于线性回归似乎并不重要。但是...

用Python进行机器学习(2)之逻辑回归

前面介绍了线性回归,本次介绍的是逻辑回归。逻辑回归虽然名字里面带有“回归”两个字,但是它是一种分类算法,通常用于解决二分类问题,比如某个邮件是否是广告邮件,比如某个评价是否为正向的评价。逻辑回归也可以...

【Python机器学习系列】拟合和回归傻傻分不清?一文带你彻底搞懂

一、拟合和回归的区别拟合...

推荐2个十分好用的pandas数据探索分析神器

作者:俊欣来源:关于数据分析与可视化...

向量数据库:解锁大模型记忆的关键!选型指南+实战案例全解析

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...

用Python进行机器学习(11)-主成分分析PCA

我们在机器学习中有时候需要处理很多个参数,但是这些参数有时候彼此之间是有着各种关系的,这个时候我们就会想:是否可以找到一种方式来降低参数的个数呢?这就是今天我们要介绍的主成分分析,英文是Princip...

神经网络基础深度解析:从感知机到反向传播

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...

Python实现基于机器学习的RFM模型

CDA数据分析师出品作者:CDALevelⅠ持证人岗位:数据分析师行业:大数据...

取消回复欢迎 发表评论: