区块链是什么?用Go语言实现区块链技术,通过Golang秒懂区块链
ztj100 2025-01-11 18:54 16 浏览 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实现具体的区块链结构,我们可以看出来,所谓的“去中心化”,并不是字面意义上的去掉中心,而是中心的多元化,任何节点都可以成为中心,任何中心也都不是持久化的,中心对每个节点不具备强制作用,只需要达成“少数服从多数”的共识即可。
相关推荐
- Whoosh,纯python编写轻量级搜索工具
-
引言在许多应用程序中,搜索功能是至关重要的。Whoosh是一个纯Python编写的轻量级搜索引擎库,可以帮助我们快速构建搜索功能。无论是在网站、博客还是本地应用程序中,Whoosh都能提供高效的全文搜...
- 如何用Python实现二分搜索算法(python二分法查找代码)
-
如何用Python实现二分搜索算法二分搜索(BinarySearch)是一种高效的查找算法,适用于在有序数组中快速定位目标值。其核心思想是通过不断缩小搜索范围,每次将问题规模减半,时间复杂度为(O...
- 路径扫描 -- dirsearch(路径查找器怎么使用)
-
外表干净是尊重别人,内心干净是尊重自己,干净,在今天这个时代,应该是一种极高的赞美和珍贵。。。----网易云热评一、软件介绍Dirsearch是一种命令行工具,可以强制获取web服务器中的目录和文件...
- 78行Python代码帮你复现微信撤回消息!
-
来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。...
- 从零开始学习 Python!2《进阶知识》 Python进阶之路
-
欢迎来到Python学习的进阶篇章!如果你说已经掌握了基础语法,那么这篇就是你开启高手之路的大门。我们将一起探讨面向对象编程...
- 白帽黑客如何通过dirsearch脚本工具扫描和收集网站敏感文件
-
一、背景介绍...
- Python之txt数据预定替换word预定义定位标记生成word报告(四)
-
续接Python之txt数据预定替换word预定义定位标记生成word报告(一)https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=748...
- Python——字符串和正则表达式中的反斜杠('\')问题详解
-
在本篇文章里小编给大家整理的是关于Python字符串和正则表达式中的反斜杠('\')问题以及相关知识点,有需要的朋友们可以学习下。在Python普通字符串中在Python中,我们用'\'来转义某些普通...
- Python re模块:正则表达式综合指南
-
Python...
- python之re模块(python re模块sub)
-
re模块一.re模块的介绍1.什么是正则表达式"定义:正则表达式是一种对字符和特殊字符操作的一种逻辑公式,从特定的字符中,用正则表达字符来过滤的逻辑。(也是一种文本模式;)2、正则表达式可以帮助我们...
- MySQL、PostgreSQL、SQL Server 数据库导入导出实操全解
-
在数字化时代,数据是关键资产,数据库的导入导出操作则是连接数据与应用场景的桥梁。以下是常见数据库导入导出的实用方法及代码,包含更多细节和特殊情况处理,助你应对各种实际场景。一、MySQL数据库...
- Zabbix监控系统系列之六:监控 mysql
-
zabbix监控mysql1、监控规划在创建监控项之前要尽量考虑清楚要监控什么,怎么监控,监控数据如何存储,监控数据如何展现,如何处理报警等。要进行监控的系统规划需要对Zabbix很了解,这里只是...
- mysql系列之一文详解Navicat工具的使用(二)
-
本章内容是系列内容的第二部分,主要介绍Navicat工具的使用。若查看第一部分请见:...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Whoosh,纯python编写轻量级搜索工具
- 如何用Python实现二分搜索算法(python二分法查找代码)
- 路径扫描 -- dirsearch(路径查找器怎么使用)
- 78行Python代码帮你复现微信撤回消息!
- 从零开始学习 Python!2《进阶知识》 Python进阶之路
- 白帽黑客如何通过dirsearch脚本工具扫描和收集网站敏感文件
- Python之txt数据预定替换word预定义定位标记生成word报告(四)
- 假期苦短,我用Python!这有个自动回复拜年信息的小程序
- Python——字符串和正则表达式中的反斜杠('\')问题详解
- Python re模块:正则表达式综合指南
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- node卸载 (33)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- exceptionininitializererror (33)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)