区块链,中心去,何曾着眼看君王?用Go语言实现区块链技术,通过Golang秒懂区块链

区块,中心,何曾,眼看,君王,go,语言,实现,技术,通过,golang · 浏览次数 : 511

小编点评

**代码结构:** ```go type Block struct { Data string Hash string PrevBlockHash string } // NodeBlock 生成创世区块 func NodeBlock(data string, prevhash string) *Block { block := &Block{data, Sha256(data), prevhash} return block } ``` **步骤:** 1. **初始化创世区块:** ```go newblock := InitBlock("创世区块数据") ``` 2. **创建普通区块:** ```go block2 := NodeBlock("第二个区块数据", blockchain[len(blockchain)-1].Hash) ``` 3. **添加区块链:** ```go blockchain = append(blockchain, block2) ``` 4. **打印区块链:** ```go fmt.Println(blockchain) ``` **完整流程:** ```go 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)) return hex.EncodeToString(m.Sum(nil)) } 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("创世区块数据") // 创建普通区块 block2 := NodeBlock("第二个区块数据", blockchain[len(blockchain)-1].Hash) // 添加区块链 blockchain = append(blockchain, block2) // 打印区块链 fmt.Println(blockchain) } ``` **输出:** ``` &{创世区块数据 62a034a244fbffbffda75fbe9c0ca7b86e40ce5329c957c180847ed210e1225a } ``` **说明:** * `NodeBlock()` 函数负责生成创世区块并返回其指针。 * `InitBlock()` 函数用于初始化创世区块。 * `block2` 是 `nodeBlock()` 中生成的第二个区块数据。 * `blockchain` 是一个指针数组,用于存储区块链。

正文

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

去中心化

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

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

什么是“上级”?

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

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

换句话说,绝对中心化系统往往会带来一个负面,那就是:信息不对等(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实现具体的区块链结构,我们可以看出来,所谓的“去中心化”,并不是字面意义上的去掉中心,而是中心的多元化,任何节点都可以成为中心,任何中心也都不是持久化的,中心对每个节点不具备强制作用,只需要达成“少数服从多数”的共识即可。

与区块链,中心去,何曾着眼看君王?用Go语言实现区块链技术,通过Golang秒懂区块链相似的内容:

区块链,中心去,何曾着眼看君王?用Go语言实现区块链技术,通过Golang秒懂区块链

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

新版以太坊Ethereum库ethersV5.0配合后端Golang1.18实时链接区块链钱包(Metamask/Okc)以及验签操作

区块链去中心化思想无处不在,比如最近使用个体抗原自检替代大规模的中心化核酸检测,就是去中心化思想的落地实践,避免了大规模聚集导致的交叉感染,提高了检测效率,本次我们使用Ethereum最新的ethersV5.0以上版本链接去中心化区块链钱包,并且通过后端Golang1.18服务进行验签。 在之前的一

基于Web3.0的区块链图片上传

开始前,我们先简单了解一下基本的概念,我大致归纳为以下几个点 什么是Web3.0,和区块链又有什么关系?(上回的文章不就派上用场了) 需求:开发一个基于Python的Web 3.0图片上传系统。这个系统将允许用户上传图片,并将图片存储在去中心化的网络上,同时记录交易信息在区块链上。 本就是写着玩的,

Web3开发者技术选型:前端视角(next.js)

引言 在现代Web开发的世界中,Web3技术的兴起为前端开发者开辟了新的可能性。Web3技术主要指的是建立在区块链基础上的分布式网络,使用户能够通过智能合约和去中心化应用(DApps)直接交互,而无需传统的中介机构。为了有效地开发Web3应用,前端开发者需要掌握一些关键的技术和工具,其中Next.j

Solidity入门

### 什么是 Solidity? Solidity 是一种用于编写智能合约的高级编程语言,主要用于以太坊平台。智能合约是一种在区块链上自动执行的计算机程序。Solidity 使开发人员能够创建可靠和安全的智能合约,这些合约可以用于多种用途,例如去中心化应用(DApps)的创建、数字资产的管理等。

面试日记 | 金证股份

> 2023年校招,区块链开发工程师 ## 初面 + 自我介绍 + 对区块链有什么了解? + Merkel树结构在区块链中的作用?零知识证明的应用 + 研究内容:创新点(自己设计的算法) + 还有什么问题 + 职业规划 + 对公司有什么了解? ## 二面 - 密码 - - 擅长使用哪一个密码库? -

Merkle Tree 简介

Merkle 树(Merkle Tree)是一种树状数据结构,通常用于验证大规模数据集的完整性和一致性。它的名字来源于其发明者 Ralph Merkle。Merkle 树在密码学、分布式系统和区块链等领域得到广泛应用,尤其在区块链中,它用于验证交易和区块的完整性,确保数据不被篡改。 下面是 Merk

Fabric配置块结构解析

本文是区块链浏览器系列的第二篇。 上一篇介绍了交易块中的数据结构,这一篇介绍区块链网络中的配置块数据结构。 这两种区块中数据结构内容的区别主要Payload结构体中的Data域中的内容,接下来将以类图的形式来解析Data域包含的信息: classDiagram class Payload{ Head

基于密码学的身份混淆系统 -- idmix

## 简介 Hyperledger Fabric的Idemix是一个基于密码学的身份混淆系统,它提供了一种在区块链网络中实现用户隐私的方法。Idemix的主要特性是它的零知识证明系统,这是一种允许用户证明他们拥有某些属性,而无需透露任何其他信息的技术。 以下是一些更详细的关于Idemix的信息: 1

Fabric区块链浏览器(2)

本文是区块链浏览器系列的第四篇。 在[上一篇文章](https://mengbin.top/2023-08-13-blockBrowser/)介绍如何解析区块数据时,使用`session`对客户端上传的pb文件进行区分,到期后自动删除。 在这片文章中,会着重介绍下认证系统的实现,主要分为三部分: -